1 //===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the code-completion semantic actions. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "clang/Sema/SemaInternal.h" 14 #include "clang/Sema/Lookup.h" 15 #include "clang/Sema/Overload.h" 16 #include "clang/Sema/CodeCompleteConsumer.h" 17 #include "clang/Sema/ExternalSemaSource.h" 18 #include "clang/Sema/Scope.h" 19 #include "clang/Sema/ScopeInfo.h" 20 #include "clang/AST/DeclObjC.h" 21 #include "clang/AST/ExprCXX.h" 22 #include "clang/AST/ExprObjC.h" 23 #include "clang/Lex/HeaderSearch.h" 24 #include "clang/Lex/MacroInfo.h" 25 #include "clang/Lex/Preprocessor.h" 26 #include "llvm/ADT/DenseSet.h" 27 #include "llvm/ADT/SmallBitVector.h" 28 #include "llvm/ADT/SmallPtrSet.h" 29 #include "llvm/ADT/SmallString.h" 30 #include "llvm/ADT/StringExtras.h" 31 #include "llvm/ADT/StringSwitch.h" 32 #include "llvm/ADT/Twine.h" 33 #include <list> 34 #include <map> 35 #include <vector> 36 37 using namespace clang; 38 using namespace sema; 39 40 namespace { 41 /// \brief A container of code-completion results. 42 class ResultBuilder { 43 public: 44 /// \brief The type of a name-lookup filter, which can be provided to the 45 /// name-lookup routines to specify which declarations should be included in 46 /// the result set (when it returns true) and which declarations should be 47 /// filtered out (returns false). 48 typedef bool (ResultBuilder::*LookupFilter)(NamedDecl *) const; 49 50 typedef CodeCompletionResult Result; 51 52 private: 53 /// \brief The actual results we have found. 54 std::vector<Result> Results; 55 56 /// \brief A record of all of the declarations we have found and placed 57 /// into the result set, used to ensure that no declaration ever gets into 58 /// the result set twice. 59 llvm::SmallPtrSet<Decl*, 16> AllDeclsFound; 60 61 typedef std::pair<NamedDecl *, unsigned> DeclIndexPair; 62 63 /// \brief An entry in the shadow map, which is optimized to store 64 /// a single (declaration, index) mapping (the common case) but 65 /// can also store a list of (declaration, index) mappings. 66 class ShadowMapEntry { 67 typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 68 69 /// \brief Contains either the solitary NamedDecl * or a vector 70 /// of (declaration, index) pairs. 71 llvm::PointerUnion<NamedDecl *, DeclIndexPairVector*> DeclOrVector; 72 73 /// \brief When the entry contains a single declaration, this is 74 /// the index associated with that entry. 75 unsigned SingleDeclIndex; 76 77 public: 78 ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 79 80 void Add(NamedDecl *ND, unsigned Index) { 81 if (DeclOrVector.isNull()) { 82 // 0 - > 1 elements: just set the single element information. 83 DeclOrVector = ND; 84 SingleDeclIndex = Index; 85 return; 86 } 87 88 if (NamedDecl *PrevND = DeclOrVector.dyn_cast<NamedDecl *>()) { 89 // 1 -> 2 elements: create the vector of results and push in the 90 // existing declaration. 91 DeclIndexPairVector *Vec = new DeclIndexPairVector; 92 Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 93 DeclOrVector = Vec; 94 } 95 96 // Add the new element to the end of the vector. 97 DeclOrVector.get<DeclIndexPairVector*>()->push_back( 98 DeclIndexPair(ND, Index)); 99 } 100 101 void Destroy() { 102 if (DeclIndexPairVector *Vec 103 = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 104 delete Vec; 105 DeclOrVector = ((NamedDecl *)0); 106 } 107 } 108 109 // Iteration. 110 class iterator; 111 iterator begin() const; 112 iterator end() const; 113 }; 114 115 /// \brief A mapping from declaration names to the declarations that have 116 /// this name within a particular scope and their index within the list of 117 /// results. 118 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 119 120 /// \brief The semantic analysis object for which results are being 121 /// produced. 122 Sema &SemaRef; 123 124 /// \brief The allocator used to allocate new code-completion strings. 125 CodeCompletionAllocator &Allocator; 126 127 CodeCompletionTUInfo &CCTUInfo; 128 129 /// \brief If non-NULL, a filter function used to remove any code-completion 130 /// results that are not desirable. 131 LookupFilter Filter; 132 133 /// \brief Whether we should allow declarations as 134 /// nested-name-specifiers that would otherwise be filtered out. 135 bool AllowNestedNameSpecifiers; 136 137 /// \brief If set, the type that we would prefer our resulting value 138 /// declarations to have. 139 /// 140 /// Closely matching the preferred type gives a boost to a result's 141 /// priority. 142 CanQualType PreferredType; 143 144 /// \brief A list of shadow maps, which is used to model name hiding at 145 /// different levels of, e.g., the inheritance hierarchy. 146 std::list<ShadowMap> ShadowMaps; 147 148 /// \brief If we're potentially referring to a C++ member function, the set 149 /// of qualifiers applied to the object type. 150 Qualifiers ObjectTypeQualifiers; 151 152 /// \brief Whether the \p ObjectTypeQualifiers field is active. 153 bool HasObjectTypeQualifiers; 154 155 /// \brief The selector that we prefer. 156 Selector PreferredSelector; 157 158 /// \brief The completion context in which we are gathering results. 159 CodeCompletionContext CompletionContext; 160 161 /// \brief If we are in an instance method definition, the \@implementation 162 /// object. 163 ObjCImplementationDecl *ObjCImplementation; 164 165 void AdjustResultPriorityForDecl(Result &R); 166 167 void MaybeAddConstructorResults(Result R); 168 169 public: 170 explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 171 CodeCompletionTUInfo &CCTUInfo, 172 const CodeCompletionContext &CompletionContext, 173 LookupFilter Filter = 0) 174 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo), 175 Filter(Filter), 176 AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 177 CompletionContext(CompletionContext), 178 ObjCImplementation(0) 179 { 180 // If this is an Objective-C instance method definition, dig out the 181 // corresponding implementation. 182 switch (CompletionContext.getKind()) { 183 case CodeCompletionContext::CCC_Expression: 184 case CodeCompletionContext::CCC_ObjCMessageReceiver: 185 case CodeCompletionContext::CCC_ParenthesizedExpression: 186 case CodeCompletionContext::CCC_Statement: 187 case CodeCompletionContext::CCC_Recovery: 188 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 189 if (Method->isInstanceMethod()) 190 if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 191 ObjCImplementation = Interface->getImplementation(); 192 break; 193 194 default: 195 break; 196 } 197 } 198 199 /// \brief Whether we should include code patterns in the completion 200 /// results. 201 bool includeCodePatterns() const { 202 return SemaRef.CodeCompleter && 203 SemaRef.CodeCompleter->includeCodePatterns(); 204 } 205 206 /// \brief Set the filter used for code-completion results. 207 void setFilter(LookupFilter Filter) { 208 this->Filter = Filter; 209 } 210 211 Result *data() { return Results.empty()? 0 : &Results.front(); } 212 unsigned size() const { return Results.size(); } 213 bool empty() const { return Results.empty(); } 214 215 /// \brief Specify the preferred type. 216 void setPreferredType(QualType T) { 217 PreferredType = SemaRef.Context.getCanonicalType(T); 218 } 219 220 /// \brief Set the cv-qualifiers on the object type, for us in filtering 221 /// calls to member functions. 222 /// 223 /// When there are qualifiers in this set, they will be used to filter 224 /// out member functions that aren't available (because there will be a 225 /// cv-qualifier mismatch) or prefer functions with an exact qualifier 226 /// match. 227 void setObjectTypeQualifiers(Qualifiers Quals) { 228 ObjectTypeQualifiers = Quals; 229 HasObjectTypeQualifiers = true; 230 } 231 232 /// \brief Set the preferred selector. 233 /// 234 /// When an Objective-C method declaration result is added, and that 235 /// method's selector matches this preferred selector, we give that method 236 /// a slight priority boost. 237 void setPreferredSelector(Selector Sel) { 238 PreferredSelector = Sel; 239 } 240 241 /// \brief Retrieve the code-completion context for which results are 242 /// being collected. 243 const CodeCompletionContext &getCompletionContext() const { 244 return CompletionContext; 245 } 246 247 /// \brief Specify whether nested-name-specifiers are allowed. 248 void allowNestedNameSpecifiers(bool Allow = true) { 249 AllowNestedNameSpecifiers = Allow; 250 } 251 252 /// \brief Return the semantic analysis object for which we are collecting 253 /// code completion results. 254 Sema &getSema() const { return SemaRef; } 255 256 /// \brief Retrieve the allocator used to allocate code completion strings. 257 CodeCompletionAllocator &getAllocator() const { return Allocator; } 258 259 CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; } 260 261 /// \brief Determine whether the given declaration is at all interesting 262 /// as a code-completion result. 263 /// 264 /// \param ND the declaration that we are inspecting. 265 /// 266 /// \param AsNestedNameSpecifier will be set true if this declaration is 267 /// only interesting when it is a nested-name-specifier. 268 bool isInterestingDecl(NamedDecl *ND, bool &AsNestedNameSpecifier) const; 269 270 /// \brief Check whether the result is hidden by the Hiding declaration. 271 /// 272 /// \returns true if the result is hidden and cannot be found, false if 273 /// the hidden result could still be found. When false, \p R may be 274 /// modified to describe how the result can be found (e.g., via extra 275 /// qualification). 276 bool CheckHiddenResult(Result &R, DeclContext *CurContext, 277 NamedDecl *Hiding); 278 279 /// \brief Add a new result to this result set (if it isn't already in one 280 /// of the shadow maps), or replace an existing result (for, e.g., a 281 /// redeclaration). 282 /// 283 /// \param R the result to add (if it is unique). 284 /// 285 /// \param CurContext the context in which this result will be named. 286 void MaybeAddResult(Result R, DeclContext *CurContext = 0); 287 288 /// \brief Add a new result to this result set, where we already know 289 /// the hiding declation (if any). 290 /// 291 /// \param R the result to add (if it is unique). 292 /// 293 /// \param CurContext the context in which this result will be named. 294 /// 295 /// \param Hiding the declaration that hides the result. 296 /// 297 /// \param InBaseClass whether the result was found in a base 298 /// class of the searched context. 299 void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 300 bool InBaseClass); 301 302 /// \brief Add a new non-declaration result to this result set. 303 void AddResult(Result R); 304 305 /// \brief Enter into a new scope. 306 void EnterNewScope(); 307 308 /// \brief Exit from the current scope. 309 void ExitScope(); 310 311 /// \brief Ignore this declaration, if it is seen again. 312 void Ignore(Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 313 314 /// \name Name lookup predicates 315 /// 316 /// These predicates can be passed to the name lookup functions to filter the 317 /// results of name lookup. All of the predicates have the same type, so that 318 /// 319 //@{ 320 bool IsOrdinaryName(NamedDecl *ND) const; 321 bool IsOrdinaryNonTypeName(NamedDecl *ND) const; 322 bool IsIntegralConstantValue(NamedDecl *ND) const; 323 bool IsOrdinaryNonValueName(NamedDecl *ND) const; 324 bool IsNestedNameSpecifier(NamedDecl *ND) const; 325 bool IsEnum(NamedDecl *ND) const; 326 bool IsClassOrStruct(NamedDecl *ND) const; 327 bool IsUnion(NamedDecl *ND) const; 328 bool IsNamespace(NamedDecl *ND) const; 329 bool IsNamespaceOrAlias(NamedDecl *ND) const; 330 bool IsType(NamedDecl *ND) const; 331 bool IsMember(NamedDecl *ND) const; 332 bool IsObjCIvar(NamedDecl *ND) const; 333 bool IsObjCMessageReceiver(NamedDecl *ND) const; 334 bool IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const; 335 bool IsObjCCollection(NamedDecl *ND) const; 336 bool IsImpossibleToSatisfy(NamedDecl *ND) const; 337 //@} 338 }; 339 } 340 341 class ResultBuilder::ShadowMapEntry::iterator { 342 llvm::PointerUnion<NamedDecl*, const DeclIndexPair*> DeclOrIterator; 343 unsigned SingleDeclIndex; 344 345 public: 346 typedef DeclIndexPair value_type; 347 typedef value_type reference; 348 typedef std::ptrdiff_t difference_type; 349 typedef std::input_iterator_tag iterator_category; 350 351 class pointer { 352 DeclIndexPair Value; 353 354 public: 355 pointer(const DeclIndexPair &Value) : Value(Value) { } 356 357 const DeclIndexPair *operator->() const { 358 return &Value; 359 } 360 }; 361 362 iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 363 364 iterator(NamedDecl *SingleDecl, unsigned Index) 365 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 366 367 iterator(const DeclIndexPair *Iterator) 368 : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 369 370 iterator &operator++() { 371 if (DeclOrIterator.is<NamedDecl *>()) { 372 DeclOrIterator = (NamedDecl *)0; 373 SingleDeclIndex = 0; 374 return *this; 375 } 376 377 const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 378 ++I; 379 DeclOrIterator = I; 380 return *this; 381 } 382 383 /*iterator operator++(int) { 384 iterator tmp(*this); 385 ++(*this); 386 return tmp; 387 }*/ 388 389 reference operator*() const { 390 if (NamedDecl *ND = DeclOrIterator.dyn_cast<NamedDecl *>()) 391 return reference(ND, SingleDeclIndex); 392 393 return *DeclOrIterator.get<const DeclIndexPair*>(); 394 } 395 396 pointer operator->() const { 397 return pointer(**this); 398 } 399 400 friend bool operator==(const iterator &X, const iterator &Y) { 401 return X.DeclOrIterator.getOpaqueValue() 402 == Y.DeclOrIterator.getOpaqueValue() && 403 X.SingleDeclIndex == Y.SingleDeclIndex; 404 } 405 406 friend bool operator!=(const iterator &X, const iterator &Y) { 407 return !(X == Y); 408 } 409 }; 410 411 ResultBuilder::ShadowMapEntry::iterator 412 ResultBuilder::ShadowMapEntry::begin() const { 413 if (DeclOrVector.isNull()) 414 return iterator(); 415 416 if (NamedDecl *ND = DeclOrVector.dyn_cast<NamedDecl *>()) 417 return iterator(ND, SingleDeclIndex); 418 419 return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 420 } 421 422 ResultBuilder::ShadowMapEntry::iterator 423 ResultBuilder::ShadowMapEntry::end() const { 424 if (DeclOrVector.is<NamedDecl *>() || DeclOrVector.isNull()) 425 return iterator(); 426 427 return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 428 } 429 430 /// \brief Compute the qualification required to get from the current context 431 /// (\p CurContext) to the target context (\p TargetContext). 432 /// 433 /// \param Context the AST context in which the qualification will be used. 434 /// 435 /// \param CurContext the context where an entity is being named, which is 436 /// typically based on the current scope. 437 /// 438 /// \param TargetContext the context in which the named entity actually 439 /// resides. 440 /// 441 /// \returns a nested name specifier that refers into the target context, or 442 /// NULL if no qualification is needed. 443 static NestedNameSpecifier * 444 getRequiredQualification(ASTContext &Context, 445 DeclContext *CurContext, 446 DeclContext *TargetContext) { 447 SmallVector<DeclContext *, 4> TargetParents; 448 449 for (DeclContext *CommonAncestor = TargetContext; 450 CommonAncestor && !CommonAncestor->Encloses(CurContext); 451 CommonAncestor = CommonAncestor->getLookupParent()) { 452 if (CommonAncestor->isTransparentContext() || 453 CommonAncestor->isFunctionOrMethod()) 454 continue; 455 456 TargetParents.push_back(CommonAncestor); 457 } 458 459 NestedNameSpecifier *Result = 0; 460 while (!TargetParents.empty()) { 461 DeclContext *Parent = TargetParents.back(); 462 TargetParents.pop_back(); 463 464 if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 465 if (!Namespace->getIdentifier()) 466 continue; 467 468 Result = NestedNameSpecifier::Create(Context, Result, Namespace); 469 } 470 else if (TagDecl *TD = dyn_cast<TagDecl>(Parent)) 471 Result = NestedNameSpecifier::Create(Context, Result, 472 false, 473 Context.getTypeDeclType(TD).getTypePtr()); 474 } 475 return Result; 476 } 477 478 bool ResultBuilder::isInterestingDecl(NamedDecl *ND, 479 bool &AsNestedNameSpecifier) const { 480 AsNestedNameSpecifier = false; 481 482 ND = ND->getUnderlyingDecl(); 483 unsigned IDNS = ND->getIdentifierNamespace(); 484 485 // Skip unnamed entities. 486 if (!ND->getDeclName()) 487 return false; 488 489 // Friend declarations and declarations introduced due to friends are never 490 // added as results. 491 if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 492 return false; 493 494 // Class template (partial) specializations are never added as results. 495 if (isa<ClassTemplateSpecializationDecl>(ND) || 496 isa<ClassTemplatePartialSpecializationDecl>(ND)) 497 return false; 498 499 // Using declarations themselves are never added as results. 500 if (isa<UsingDecl>(ND)) 501 return false; 502 503 // Some declarations have reserved names that we don't want to ever show. 504 if (const IdentifierInfo *Id = ND->getIdentifier()) { 505 // __va_list_tag is a freak of nature. Find it and skip it. 506 if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 507 return false; 508 509 // Filter out names reserved for the implementation (C99 7.1.3, 510 // C++ [lib.global.names]) if they come from a system header. 511 // 512 // FIXME: Add predicate for this. 513 if (Id->getLength() >= 2) { 514 const char *Name = Id->getNameStart(); 515 if (Name[0] == '_' && 516 (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 517 (ND->getLocation().isInvalid() || 518 SemaRef.SourceMgr.isInSystemHeader( 519 SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 520 return false; 521 } 522 } 523 524 if (Filter == &ResultBuilder::IsNestedNameSpecifier || 525 ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 526 Filter != &ResultBuilder::IsNamespace && 527 Filter != &ResultBuilder::IsNamespaceOrAlias && 528 Filter != 0)) 529 AsNestedNameSpecifier = true; 530 531 // Filter out any unwanted results. 532 if (Filter && !(this->*Filter)(ND)) { 533 // Check whether it is interesting as a nested-name-specifier. 534 if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus && 535 IsNestedNameSpecifier(ND) && 536 (Filter != &ResultBuilder::IsMember || 537 (isa<CXXRecordDecl>(ND) && 538 cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 539 AsNestedNameSpecifier = true; 540 return true; 541 } 542 543 return false; 544 } 545 // ... then it must be interesting! 546 return true; 547 } 548 549 bool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 550 NamedDecl *Hiding) { 551 // In C, there is no way to refer to a hidden name. 552 // FIXME: This isn't true; we can find a tag name hidden by an ordinary 553 // name if we introduce the tag type. 554 if (!SemaRef.getLangOpts().CPlusPlus) 555 return true; 556 557 DeclContext *HiddenCtx = R.Declaration->getDeclContext()->getRedeclContext(); 558 559 // There is no way to qualify a name declared in a function or method. 560 if (HiddenCtx->isFunctionOrMethod()) 561 return true; 562 563 if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 564 return true; 565 566 // We can refer to the result with the appropriate qualification. Do it. 567 R.Hidden = true; 568 R.QualifierIsInformative = false; 569 570 if (!R.Qualifier) 571 R.Qualifier = getRequiredQualification(SemaRef.Context, 572 CurContext, 573 R.Declaration->getDeclContext()); 574 return false; 575 } 576 577 /// \brief A simplified classification of types used to determine whether two 578 /// types are "similar enough" when adjusting priorities. 579 SimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 580 switch (T->getTypeClass()) { 581 case Type::Builtin: 582 switch (cast<BuiltinType>(T)->getKind()) { 583 case BuiltinType::Void: 584 return STC_Void; 585 586 case BuiltinType::NullPtr: 587 return STC_Pointer; 588 589 case BuiltinType::Overload: 590 case BuiltinType::Dependent: 591 return STC_Other; 592 593 case BuiltinType::ObjCId: 594 case BuiltinType::ObjCClass: 595 case BuiltinType::ObjCSel: 596 return STC_ObjectiveC; 597 598 default: 599 return STC_Arithmetic; 600 } 601 602 case Type::Complex: 603 return STC_Arithmetic; 604 605 case Type::Pointer: 606 return STC_Pointer; 607 608 case Type::BlockPointer: 609 return STC_Block; 610 611 case Type::LValueReference: 612 case Type::RValueReference: 613 return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 614 615 case Type::ConstantArray: 616 case Type::IncompleteArray: 617 case Type::VariableArray: 618 case Type::DependentSizedArray: 619 return STC_Array; 620 621 case Type::DependentSizedExtVector: 622 case Type::Vector: 623 case Type::ExtVector: 624 return STC_Arithmetic; 625 626 case Type::FunctionProto: 627 case Type::FunctionNoProto: 628 return STC_Function; 629 630 case Type::Record: 631 return STC_Record; 632 633 case Type::Enum: 634 return STC_Arithmetic; 635 636 case Type::ObjCObject: 637 case Type::ObjCInterface: 638 case Type::ObjCObjectPointer: 639 return STC_ObjectiveC; 640 641 default: 642 return STC_Other; 643 } 644 } 645 646 /// \brief Get the type that a given expression will have if this declaration 647 /// is used as an expression in its "typical" code-completion form. 648 QualType clang::getDeclUsageType(ASTContext &C, NamedDecl *ND) { 649 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 650 651 if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 652 return C.getTypeDeclType(Type); 653 if (ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 654 return C.getObjCInterfaceType(Iface); 655 656 QualType T; 657 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 658 T = Function->getCallResultType(); 659 else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 660 T = Method->getSendResultType(); 661 else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 662 T = FunTmpl->getTemplatedDecl()->getCallResultType(); 663 else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 664 T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 665 else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 666 T = Property->getType(); 667 else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 668 T = Value->getType(); 669 else 670 return QualType(); 671 672 // Dig through references, function pointers, and block pointers to 673 // get down to the likely type of an expression when the entity is 674 // used. 675 do { 676 if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 677 T = Ref->getPointeeType(); 678 continue; 679 } 680 681 if (const PointerType *Pointer = T->getAs<PointerType>()) { 682 if (Pointer->getPointeeType()->isFunctionType()) { 683 T = Pointer->getPointeeType(); 684 continue; 685 } 686 687 break; 688 } 689 690 if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 691 T = Block->getPointeeType(); 692 continue; 693 } 694 695 if (const FunctionType *Function = T->getAs<FunctionType>()) { 696 T = Function->getResultType(); 697 continue; 698 } 699 700 break; 701 } while (true); 702 703 return T; 704 } 705 706 void ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 707 // If this is an Objective-C method declaration whose selector matches our 708 // preferred selector, give it a priority boost. 709 if (!PreferredSelector.isNull()) 710 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 711 if (PreferredSelector == Method->getSelector()) 712 R.Priority += CCD_SelectorMatch; 713 714 // If we have a preferred type, adjust the priority for results with exactly- 715 // matching or nearly-matching types. 716 if (!PreferredType.isNull()) { 717 QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 718 if (!T.isNull()) { 719 CanQualType TC = SemaRef.Context.getCanonicalType(T); 720 // Check for exactly-matching types (modulo qualifiers). 721 if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 722 R.Priority /= CCF_ExactTypeMatch; 723 // Check for nearly-matching types, based on classification of each. 724 else if ((getSimplifiedTypeClass(PreferredType) 725 == getSimplifiedTypeClass(TC)) && 726 !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 727 R.Priority /= CCF_SimilarTypeMatch; 728 } 729 } 730 } 731 732 void ResultBuilder::MaybeAddConstructorResults(Result R) { 733 if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration || 734 !CompletionContext.wantConstructorResults()) 735 return; 736 737 ASTContext &Context = SemaRef.Context; 738 NamedDecl *D = R.Declaration; 739 CXXRecordDecl *Record = 0; 740 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 741 Record = ClassTemplate->getTemplatedDecl(); 742 else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 743 // Skip specializations and partial specializations. 744 if (isa<ClassTemplateSpecializationDecl>(Record)) 745 return; 746 } else { 747 // There are no constructors here. 748 return; 749 } 750 751 Record = Record->getDefinition(); 752 if (!Record) 753 return; 754 755 756 QualType RecordTy = Context.getTypeDeclType(Record); 757 DeclarationName ConstructorName 758 = Context.DeclarationNames.getCXXConstructorName( 759 Context.getCanonicalType(RecordTy)); 760 for (DeclContext::lookup_result Ctors = Record->lookup(ConstructorName); 761 Ctors.first != Ctors.second; ++Ctors.first) { 762 R.Declaration = *Ctors.first; 763 R.CursorKind = getCursorKindForDecl(R.Declaration); 764 Results.push_back(R); 765 } 766 } 767 768 void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 769 assert(!ShadowMaps.empty() && "Must enter into a results scope"); 770 771 if (R.Kind != Result::RK_Declaration) { 772 // For non-declaration results, just add the result. 773 Results.push_back(R); 774 return; 775 } 776 777 // Look through using declarations. 778 if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 779 MaybeAddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext); 780 return; 781 } 782 783 Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 784 unsigned IDNS = CanonDecl->getIdentifierNamespace(); 785 786 bool AsNestedNameSpecifier = false; 787 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 788 return; 789 790 // C++ constructors are never found by name lookup. 791 if (isa<CXXConstructorDecl>(R.Declaration)) 792 return; 793 794 ShadowMap &SMap = ShadowMaps.back(); 795 ShadowMapEntry::iterator I, IEnd; 796 ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 797 if (NamePos != SMap.end()) { 798 I = NamePos->second.begin(); 799 IEnd = NamePos->second.end(); 800 } 801 802 for (; I != IEnd; ++I) { 803 NamedDecl *ND = I->first; 804 unsigned Index = I->second; 805 if (ND->getCanonicalDecl() == CanonDecl) { 806 // This is a redeclaration. Always pick the newer declaration. 807 Results[Index].Declaration = R.Declaration; 808 809 // We're done. 810 return; 811 } 812 } 813 814 // This is a new declaration in this scope. However, check whether this 815 // declaration name is hidden by a similarly-named declaration in an outer 816 // scope. 817 std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 818 --SMEnd; 819 for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 820 ShadowMapEntry::iterator I, IEnd; 821 ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 822 if (NamePos != SM->end()) { 823 I = NamePos->second.begin(); 824 IEnd = NamePos->second.end(); 825 } 826 for (; I != IEnd; ++I) { 827 // A tag declaration does not hide a non-tag declaration. 828 if (I->first->hasTagIdentifierNamespace() && 829 (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 830 Decl::IDNS_ObjCProtocol))) 831 continue; 832 833 // Protocols are in distinct namespaces from everything else. 834 if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 835 || (IDNS & Decl::IDNS_ObjCProtocol)) && 836 I->first->getIdentifierNamespace() != IDNS) 837 continue; 838 839 // The newly-added result is hidden by an entry in the shadow map. 840 if (CheckHiddenResult(R, CurContext, I->first)) 841 return; 842 843 break; 844 } 845 } 846 847 // Make sure that any given declaration only shows up in the result set once. 848 if (!AllDeclsFound.insert(CanonDecl)) 849 return; 850 851 // If the filter is for nested-name-specifiers, then this result starts a 852 // nested-name-specifier. 853 if (AsNestedNameSpecifier) { 854 R.StartsNestedNameSpecifier = true; 855 R.Priority = CCP_NestedNameSpecifier; 856 } else 857 AdjustResultPriorityForDecl(R); 858 859 // If this result is supposed to have an informative qualifier, add one. 860 if (R.QualifierIsInformative && !R.Qualifier && 861 !R.StartsNestedNameSpecifier) { 862 DeclContext *Ctx = R.Declaration->getDeclContext(); 863 if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 864 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 865 else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 866 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 867 SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 868 else 869 R.QualifierIsInformative = false; 870 } 871 872 // Insert this result into the set of results and into the current shadow 873 // map. 874 SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 875 Results.push_back(R); 876 877 if (!AsNestedNameSpecifier) 878 MaybeAddConstructorResults(R); 879 } 880 881 void ResultBuilder::AddResult(Result R, DeclContext *CurContext, 882 NamedDecl *Hiding, bool InBaseClass = false) { 883 if (R.Kind != Result::RK_Declaration) { 884 // For non-declaration results, just add the result. 885 Results.push_back(R); 886 return; 887 } 888 889 // Look through using declarations. 890 if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 891 AddResult(Result(Using->getTargetDecl(), R.Qualifier), CurContext, Hiding); 892 return; 893 } 894 895 bool AsNestedNameSpecifier = false; 896 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 897 return; 898 899 // C++ constructors are never found by name lookup. 900 if (isa<CXXConstructorDecl>(R.Declaration)) 901 return; 902 903 if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 904 return; 905 906 // Make sure that any given declaration only shows up in the result set once. 907 if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 908 return; 909 910 // If the filter is for nested-name-specifiers, then this result starts a 911 // nested-name-specifier. 912 if (AsNestedNameSpecifier) { 913 R.StartsNestedNameSpecifier = true; 914 R.Priority = CCP_NestedNameSpecifier; 915 } 916 else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 917 isa<CXXRecordDecl>(R.Declaration->getDeclContext() 918 ->getRedeclContext())) 919 R.QualifierIsInformative = true; 920 921 // If this result is supposed to have an informative qualifier, add one. 922 if (R.QualifierIsInformative && !R.Qualifier && 923 !R.StartsNestedNameSpecifier) { 924 DeclContext *Ctx = R.Declaration->getDeclContext(); 925 if (NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 926 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 927 else if (TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 928 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 929 SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 930 else 931 R.QualifierIsInformative = false; 932 } 933 934 // Adjust the priority if this result comes from a base class. 935 if (InBaseClass) 936 R.Priority += CCD_InBaseClass; 937 938 AdjustResultPriorityForDecl(R); 939 940 if (HasObjectTypeQualifiers) 941 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 942 if (Method->isInstance()) { 943 Qualifiers MethodQuals 944 = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 945 if (ObjectTypeQualifiers == MethodQuals) 946 R.Priority += CCD_ObjectQualifierMatch; 947 else if (ObjectTypeQualifiers - MethodQuals) { 948 // The method cannot be invoked, because doing so would drop 949 // qualifiers. 950 return; 951 } 952 } 953 954 // Insert this result into the set of results. 955 Results.push_back(R); 956 957 if (!AsNestedNameSpecifier) 958 MaybeAddConstructorResults(R); 959 } 960 961 void ResultBuilder::AddResult(Result R) { 962 assert(R.Kind != Result::RK_Declaration && 963 "Declaration results need more context"); 964 Results.push_back(R); 965 } 966 967 /// \brief Enter into a new scope. 968 void ResultBuilder::EnterNewScope() { 969 ShadowMaps.push_back(ShadowMap()); 970 } 971 972 /// \brief Exit from the current scope. 973 void ResultBuilder::ExitScope() { 974 for (ShadowMap::iterator E = ShadowMaps.back().begin(), 975 EEnd = ShadowMaps.back().end(); 976 E != EEnd; 977 ++E) 978 E->second.Destroy(); 979 980 ShadowMaps.pop_back(); 981 } 982 983 /// \brief Determines whether this given declaration will be found by 984 /// ordinary name lookup. 985 bool ResultBuilder::IsOrdinaryName(NamedDecl *ND) const { 986 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 987 988 unsigned IDNS = Decl::IDNS_Ordinary; 989 if (SemaRef.getLangOpts().CPlusPlus) 990 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 991 else if (SemaRef.getLangOpts().ObjC1) { 992 if (isa<ObjCIvarDecl>(ND)) 993 return true; 994 } 995 996 return ND->getIdentifierNamespace() & IDNS; 997 } 998 999 /// \brief Determines whether this given declaration will be found by 1000 /// ordinary name lookup but is not a type name. 1001 bool ResultBuilder::IsOrdinaryNonTypeName(NamedDecl *ND) const { 1002 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 1003 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 1004 return false; 1005 1006 unsigned IDNS = Decl::IDNS_Ordinary; 1007 if (SemaRef.getLangOpts().CPlusPlus) 1008 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1009 else if (SemaRef.getLangOpts().ObjC1) { 1010 if (isa<ObjCIvarDecl>(ND)) 1011 return true; 1012 } 1013 1014 return ND->getIdentifierNamespace() & IDNS; 1015 } 1016 1017 bool ResultBuilder::IsIntegralConstantValue(NamedDecl *ND) const { 1018 if (!IsOrdinaryNonTypeName(ND)) 1019 return 0; 1020 1021 if (ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1022 if (VD->getType()->isIntegralOrEnumerationType()) 1023 return true; 1024 1025 return false; 1026 } 1027 1028 /// \brief Determines whether this given declaration will be found by 1029 /// ordinary name lookup. 1030 bool ResultBuilder::IsOrdinaryNonValueName(NamedDecl *ND) const { 1031 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 1032 1033 unsigned IDNS = Decl::IDNS_Ordinary; 1034 if (SemaRef.getLangOpts().CPlusPlus) 1035 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 1036 1037 return (ND->getIdentifierNamespace() & IDNS) && 1038 !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 1039 !isa<ObjCPropertyDecl>(ND); 1040 } 1041 1042 /// \brief Determines whether the given declaration is suitable as the 1043 /// start of a C++ nested-name-specifier, e.g., a class or namespace. 1044 bool ResultBuilder::IsNestedNameSpecifier(NamedDecl *ND) const { 1045 // Allow us to find class templates, too. 1046 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1047 ND = ClassTemplate->getTemplatedDecl(); 1048 1049 return SemaRef.isAcceptableNestedNameSpecifier(ND); 1050 } 1051 1052 /// \brief Determines whether the given declaration is an enumeration. 1053 bool ResultBuilder::IsEnum(NamedDecl *ND) const { 1054 return isa<EnumDecl>(ND); 1055 } 1056 1057 /// \brief Determines whether the given declaration is a class or struct. 1058 bool ResultBuilder::IsClassOrStruct(NamedDecl *ND) const { 1059 // Allow us to find class templates, too. 1060 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1061 ND = ClassTemplate->getTemplatedDecl(); 1062 1063 if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1064 return RD->getTagKind() == TTK_Class || 1065 RD->getTagKind() == TTK_Struct; 1066 1067 return false; 1068 } 1069 1070 /// \brief Determines whether the given declaration is a union. 1071 bool ResultBuilder::IsUnion(NamedDecl *ND) const { 1072 // Allow us to find class templates, too. 1073 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1074 ND = ClassTemplate->getTemplatedDecl(); 1075 1076 if (RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1077 return RD->getTagKind() == TTK_Union; 1078 1079 return false; 1080 } 1081 1082 /// \brief Determines whether the given declaration is a namespace. 1083 bool ResultBuilder::IsNamespace(NamedDecl *ND) const { 1084 return isa<NamespaceDecl>(ND); 1085 } 1086 1087 /// \brief Determines whether the given declaration is a namespace or 1088 /// namespace alias. 1089 bool ResultBuilder::IsNamespaceOrAlias(NamedDecl *ND) const { 1090 return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 1091 } 1092 1093 /// \brief Determines whether the given declaration is a type. 1094 bool ResultBuilder::IsType(NamedDecl *ND) const { 1095 if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1096 ND = Using->getTargetDecl(); 1097 1098 return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 1099 } 1100 1101 /// \brief Determines which members of a class should be visible via 1102 /// "." or "->". Only value declarations, nested name specifiers, and 1103 /// using declarations thereof should show up. 1104 bool ResultBuilder::IsMember(NamedDecl *ND) const { 1105 if (UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1106 ND = Using->getTargetDecl(); 1107 1108 return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1109 isa<ObjCPropertyDecl>(ND); 1110 } 1111 1112 static bool isObjCReceiverType(ASTContext &C, QualType T) { 1113 T = C.getCanonicalType(T); 1114 switch (T->getTypeClass()) { 1115 case Type::ObjCObject: 1116 case Type::ObjCInterface: 1117 case Type::ObjCObjectPointer: 1118 return true; 1119 1120 case Type::Builtin: 1121 switch (cast<BuiltinType>(T)->getKind()) { 1122 case BuiltinType::ObjCId: 1123 case BuiltinType::ObjCClass: 1124 case BuiltinType::ObjCSel: 1125 return true; 1126 1127 default: 1128 break; 1129 } 1130 return false; 1131 1132 default: 1133 break; 1134 } 1135 1136 if (!C.getLangOpts().CPlusPlus) 1137 return false; 1138 1139 // FIXME: We could perform more analysis here to determine whether a 1140 // particular class type has any conversions to Objective-C types. For now, 1141 // just accept all class types. 1142 return T->isDependentType() || T->isRecordType(); 1143 } 1144 1145 bool ResultBuilder::IsObjCMessageReceiver(NamedDecl *ND) const { 1146 QualType T = getDeclUsageType(SemaRef.Context, ND); 1147 if (T.isNull()) 1148 return false; 1149 1150 T = SemaRef.Context.getBaseElementType(T); 1151 return isObjCReceiverType(SemaRef.Context, T); 1152 } 1153 1154 bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(NamedDecl *ND) const { 1155 if (IsObjCMessageReceiver(ND)) 1156 return true; 1157 1158 VarDecl *Var = dyn_cast<VarDecl>(ND); 1159 if (!Var) 1160 return false; 1161 1162 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 1163 } 1164 1165 bool ResultBuilder::IsObjCCollection(NamedDecl *ND) const { 1166 if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) || 1167 (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1168 return false; 1169 1170 QualType T = getDeclUsageType(SemaRef.Context, ND); 1171 if (T.isNull()) 1172 return false; 1173 1174 T = SemaRef.Context.getBaseElementType(T); 1175 return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1176 T->isObjCIdType() || 1177 (SemaRef.getLangOpts().CPlusPlus && T->isRecordType()); 1178 } 1179 1180 bool ResultBuilder::IsImpossibleToSatisfy(NamedDecl *ND) const { 1181 return false; 1182 } 1183 1184 /// \brief Determines whether the given declaration is an Objective-C 1185 /// instance variable. 1186 bool ResultBuilder::IsObjCIvar(NamedDecl *ND) const { 1187 return isa<ObjCIvarDecl>(ND); 1188 } 1189 1190 namespace { 1191 /// \brief Visible declaration consumer that adds a code-completion result 1192 /// for each visible declaration. 1193 class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 1194 ResultBuilder &Results; 1195 DeclContext *CurContext; 1196 1197 public: 1198 CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 1199 : Results(Results), CurContext(CurContext) { } 1200 1201 virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1202 bool InBaseClass) { 1203 bool Accessible = true; 1204 if (Ctx) 1205 Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 1206 1207 ResultBuilder::Result Result(ND, 0, false, Accessible); 1208 Results.AddResult(Result, CurContext, Hiding, InBaseClass); 1209 } 1210 }; 1211 } 1212 1213 /// \brief Add type specifiers for the current language as keyword results. 1214 static void AddTypeSpecifierResults(const LangOptions &LangOpts, 1215 ResultBuilder &Results) { 1216 typedef CodeCompletionResult Result; 1217 Results.AddResult(Result("short", CCP_Type)); 1218 Results.AddResult(Result("long", CCP_Type)); 1219 Results.AddResult(Result("signed", CCP_Type)); 1220 Results.AddResult(Result("unsigned", CCP_Type)); 1221 Results.AddResult(Result("void", CCP_Type)); 1222 Results.AddResult(Result("char", CCP_Type)); 1223 Results.AddResult(Result("int", CCP_Type)); 1224 Results.AddResult(Result("float", CCP_Type)); 1225 Results.AddResult(Result("double", CCP_Type)); 1226 Results.AddResult(Result("enum", CCP_Type)); 1227 Results.AddResult(Result("struct", CCP_Type)); 1228 Results.AddResult(Result("union", CCP_Type)); 1229 Results.AddResult(Result("const", CCP_Type)); 1230 Results.AddResult(Result("volatile", CCP_Type)); 1231 1232 if (LangOpts.C99) { 1233 // C99-specific 1234 Results.AddResult(Result("_Complex", CCP_Type)); 1235 Results.AddResult(Result("_Imaginary", CCP_Type)); 1236 Results.AddResult(Result("_Bool", CCP_Type)); 1237 Results.AddResult(Result("restrict", CCP_Type)); 1238 } 1239 1240 CodeCompletionBuilder Builder(Results.getAllocator(), 1241 Results.getCodeCompletionTUInfo()); 1242 if (LangOpts.CPlusPlus) { 1243 // C++-specific 1244 Results.AddResult(Result("bool", CCP_Type + 1245 (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 1246 Results.AddResult(Result("class", CCP_Type)); 1247 Results.AddResult(Result("wchar_t", CCP_Type)); 1248 1249 // typename qualified-id 1250 Builder.AddTypedTextChunk("typename"); 1251 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1252 Builder.AddPlaceholderChunk("qualifier"); 1253 Builder.AddTextChunk("::"); 1254 Builder.AddPlaceholderChunk("name"); 1255 Results.AddResult(Result(Builder.TakeString())); 1256 1257 if (LangOpts.CPlusPlus0x) { 1258 Results.AddResult(Result("auto", CCP_Type)); 1259 Results.AddResult(Result("char16_t", CCP_Type)); 1260 Results.AddResult(Result("char32_t", CCP_Type)); 1261 1262 Builder.AddTypedTextChunk("decltype"); 1263 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1264 Builder.AddPlaceholderChunk("expression"); 1265 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1266 Results.AddResult(Result(Builder.TakeString())); 1267 } 1268 } 1269 1270 // GNU extensions 1271 if (LangOpts.GNUMode) { 1272 // FIXME: Enable when we actually support decimal floating point. 1273 // Results.AddResult(Result("_Decimal32")); 1274 // Results.AddResult(Result("_Decimal64")); 1275 // Results.AddResult(Result("_Decimal128")); 1276 1277 Builder.AddTypedTextChunk("typeof"); 1278 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1279 Builder.AddPlaceholderChunk("expression"); 1280 Results.AddResult(Result(Builder.TakeString())); 1281 1282 Builder.AddTypedTextChunk("typeof"); 1283 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1284 Builder.AddPlaceholderChunk("type"); 1285 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1286 Results.AddResult(Result(Builder.TakeString())); 1287 } 1288 } 1289 1290 static void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 1291 const LangOptions &LangOpts, 1292 ResultBuilder &Results) { 1293 typedef CodeCompletionResult Result; 1294 // Note: we don't suggest either "auto" or "register", because both 1295 // are pointless as storage specifiers. Elsewhere, we suggest "auto" 1296 // in C++0x as a type specifier. 1297 Results.AddResult(Result("extern")); 1298 Results.AddResult(Result("static")); 1299 } 1300 1301 static void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 1302 const LangOptions &LangOpts, 1303 ResultBuilder &Results) { 1304 typedef CodeCompletionResult Result; 1305 switch (CCC) { 1306 case Sema::PCC_Class: 1307 case Sema::PCC_MemberTemplate: 1308 if (LangOpts.CPlusPlus) { 1309 Results.AddResult(Result("explicit")); 1310 Results.AddResult(Result("friend")); 1311 Results.AddResult(Result("mutable")); 1312 Results.AddResult(Result("virtual")); 1313 } 1314 // Fall through 1315 1316 case Sema::PCC_ObjCInterface: 1317 case Sema::PCC_ObjCImplementation: 1318 case Sema::PCC_Namespace: 1319 case Sema::PCC_Template: 1320 if (LangOpts.CPlusPlus || LangOpts.C99) 1321 Results.AddResult(Result("inline")); 1322 break; 1323 1324 case Sema::PCC_ObjCInstanceVariableList: 1325 case Sema::PCC_Expression: 1326 case Sema::PCC_Statement: 1327 case Sema::PCC_ForInit: 1328 case Sema::PCC_Condition: 1329 case Sema::PCC_RecoveryInFunction: 1330 case Sema::PCC_Type: 1331 case Sema::PCC_ParenthesizedExpression: 1332 case Sema::PCC_LocalDeclarationSpecifiers: 1333 break; 1334 } 1335 } 1336 1337 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1338 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1339 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 1340 ResultBuilder &Results, 1341 bool NeedAt); 1342 static void AddObjCImplementationResults(const LangOptions &LangOpts, 1343 ResultBuilder &Results, 1344 bool NeedAt); 1345 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 1346 ResultBuilder &Results, 1347 bool NeedAt); 1348 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1349 1350 static void AddTypedefResult(ResultBuilder &Results) { 1351 CodeCompletionBuilder Builder(Results.getAllocator(), 1352 Results.getCodeCompletionTUInfo()); 1353 Builder.AddTypedTextChunk("typedef"); 1354 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1355 Builder.AddPlaceholderChunk("type"); 1356 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1357 Builder.AddPlaceholderChunk("name"); 1358 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1359 } 1360 1361 static bool WantTypesInContext(Sema::ParserCompletionContext CCC, 1362 const LangOptions &LangOpts) { 1363 switch (CCC) { 1364 case Sema::PCC_Namespace: 1365 case Sema::PCC_Class: 1366 case Sema::PCC_ObjCInstanceVariableList: 1367 case Sema::PCC_Template: 1368 case Sema::PCC_MemberTemplate: 1369 case Sema::PCC_Statement: 1370 case Sema::PCC_RecoveryInFunction: 1371 case Sema::PCC_Type: 1372 case Sema::PCC_ParenthesizedExpression: 1373 case Sema::PCC_LocalDeclarationSpecifiers: 1374 return true; 1375 1376 case Sema::PCC_Expression: 1377 case Sema::PCC_Condition: 1378 return LangOpts.CPlusPlus; 1379 1380 case Sema::PCC_ObjCInterface: 1381 case Sema::PCC_ObjCImplementation: 1382 return false; 1383 1384 case Sema::PCC_ForInit: 1385 return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 1386 } 1387 1388 llvm_unreachable("Invalid ParserCompletionContext!"); 1389 } 1390 1391 static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1392 const Preprocessor &PP) { 1393 PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 1394 Policy.AnonymousTagLocations = false; 1395 Policy.SuppressStrongLifetime = true; 1396 Policy.SuppressUnwrittenScope = true; 1397 return Policy; 1398 } 1399 1400 /// \brief Retrieve a printing policy suitable for code completion. 1401 static PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1402 return getCompletionPrintingPolicy(S.Context, S.PP); 1403 } 1404 1405 /// \brief Retrieve the string representation of the given type as a string 1406 /// that has the appropriate lifetime for code completion. 1407 /// 1408 /// This routine provides a fast path where we provide constant strings for 1409 /// common type names. 1410 static const char *GetCompletionTypeString(QualType T, 1411 ASTContext &Context, 1412 const PrintingPolicy &Policy, 1413 CodeCompletionAllocator &Allocator) { 1414 if (!T.getLocalQualifiers()) { 1415 // Built-in type names are constant strings. 1416 if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 1417 return BT->getNameAsCString(Policy); 1418 1419 // Anonymous tag types are constant strings. 1420 if (const TagType *TagT = dyn_cast<TagType>(T)) 1421 if (TagDecl *Tag = TagT->getDecl()) 1422 if (!Tag->getIdentifier() && !Tag->getTypedefNameForAnonDecl()) { 1423 switch (Tag->getTagKind()) { 1424 case TTK_Struct: return "struct <anonymous>"; 1425 case TTK_Class: return "class <anonymous>"; 1426 case TTK_Union: return "union <anonymous>"; 1427 case TTK_Enum: return "enum <anonymous>"; 1428 } 1429 } 1430 } 1431 1432 // Slow path: format the type as a string. 1433 std::string Result; 1434 T.getAsStringInternal(Result, Policy); 1435 return Allocator.CopyString(Result); 1436 } 1437 1438 /// \brief Add a completion for "this", if we're in a member function. 1439 static void addThisCompletion(Sema &S, ResultBuilder &Results) { 1440 QualType ThisTy = S.getCurrentThisType(); 1441 if (ThisTy.isNull()) 1442 return; 1443 1444 CodeCompletionAllocator &Allocator = Results.getAllocator(); 1445 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 1446 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 1447 Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 1448 S.Context, 1449 Policy, 1450 Allocator)); 1451 Builder.AddTypedTextChunk("this"); 1452 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1453 } 1454 1455 /// \brief Add language constructs that show up for "ordinary" names. 1456 static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 1457 Scope *S, 1458 Sema &SemaRef, 1459 ResultBuilder &Results) { 1460 CodeCompletionAllocator &Allocator = Results.getAllocator(); 1461 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 1462 PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1463 1464 typedef CodeCompletionResult Result; 1465 switch (CCC) { 1466 case Sema::PCC_Namespace: 1467 if (SemaRef.getLangOpts().CPlusPlus) { 1468 if (Results.includeCodePatterns()) { 1469 // namespace <identifier> { declarations } 1470 Builder.AddTypedTextChunk("namespace"); 1471 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1472 Builder.AddPlaceholderChunk("identifier"); 1473 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1474 Builder.AddPlaceholderChunk("declarations"); 1475 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1476 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1477 Results.AddResult(Result(Builder.TakeString())); 1478 } 1479 1480 // namespace identifier = identifier ; 1481 Builder.AddTypedTextChunk("namespace"); 1482 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1483 Builder.AddPlaceholderChunk("name"); 1484 Builder.AddChunk(CodeCompletionString::CK_Equal); 1485 Builder.AddPlaceholderChunk("namespace"); 1486 Results.AddResult(Result(Builder.TakeString())); 1487 1488 // Using directives 1489 Builder.AddTypedTextChunk("using"); 1490 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1491 Builder.AddTextChunk("namespace"); 1492 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1493 Builder.AddPlaceholderChunk("identifier"); 1494 Results.AddResult(Result(Builder.TakeString())); 1495 1496 // asm(string-literal) 1497 Builder.AddTypedTextChunk("asm"); 1498 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1499 Builder.AddPlaceholderChunk("string-literal"); 1500 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1501 Results.AddResult(Result(Builder.TakeString())); 1502 1503 if (Results.includeCodePatterns()) { 1504 // Explicit template instantiation 1505 Builder.AddTypedTextChunk("template"); 1506 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1507 Builder.AddPlaceholderChunk("declaration"); 1508 Results.AddResult(Result(Builder.TakeString())); 1509 } 1510 } 1511 1512 if (SemaRef.getLangOpts().ObjC1) 1513 AddObjCTopLevelResults(Results, true); 1514 1515 AddTypedefResult(Results); 1516 // Fall through 1517 1518 case Sema::PCC_Class: 1519 if (SemaRef.getLangOpts().CPlusPlus) { 1520 // Using declaration 1521 Builder.AddTypedTextChunk("using"); 1522 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1523 Builder.AddPlaceholderChunk("qualifier"); 1524 Builder.AddTextChunk("::"); 1525 Builder.AddPlaceholderChunk("name"); 1526 Results.AddResult(Result(Builder.TakeString())); 1527 1528 // using typename qualifier::name (only in a dependent context) 1529 if (SemaRef.CurContext->isDependentContext()) { 1530 Builder.AddTypedTextChunk("using"); 1531 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1532 Builder.AddTextChunk("typename"); 1533 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1534 Builder.AddPlaceholderChunk("qualifier"); 1535 Builder.AddTextChunk("::"); 1536 Builder.AddPlaceholderChunk("name"); 1537 Results.AddResult(Result(Builder.TakeString())); 1538 } 1539 1540 if (CCC == Sema::PCC_Class) { 1541 AddTypedefResult(Results); 1542 1543 // public: 1544 Builder.AddTypedTextChunk("public"); 1545 if (Results.includeCodePatterns()) 1546 Builder.AddChunk(CodeCompletionString::CK_Colon); 1547 Results.AddResult(Result(Builder.TakeString())); 1548 1549 // protected: 1550 Builder.AddTypedTextChunk("protected"); 1551 if (Results.includeCodePatterns()) 1552 Builder.AddChunk(CodeCompletionString::CK_Colon); 1553 Results.AddResult(Result(Builder.TakeString())); 1554 1555 // private: 1556 Builder.AddTypedTextChunk("private"); 1557 if (Results.includeCodePatterns()) 1558 Builder.AddChunk(CodeCompletionString::CK_Colon); 1559 Results.AddResult(Result(Builder.TakeString())); 1560 } 1561 } 1562 // Fall through 1563 1564 case Sema::PCC_Template: 1565 case Sema::PCC_MemberTemplate: 1566 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) { 1567 // template < parameters > 1568 Builder.AddTypedTextChunk("template"); 1569 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1570 Builder.AddPlaceholderChunk("parameters"); 1571 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1572 Results.AddResult(Result(Builder.TakeString())); 1573 } 1574 1575 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1576 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1577 break; 1578 1579 case Sema::PCC_ObjCInterface: 1580 AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true); 1581 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1582 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1583 break; 1584 1585 case Sema::PCC_ObjCImplementation: 1586 AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true); 1587 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1588 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1589 break; 1590 1591 case Sema::PCC_ObjCInstanceVariableList: 1592 AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true); 1593 break; 1594 1595 case Sema::PCC_RecoveryInFunction: 1596 case Sema::PCC_Statement: { 1597 AddTypedefResult(Results); 1598 1599 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() && 1600 SemaRef.getLangOpts().CXXExceptions) { 1601 Builder.AddTypedTextChunk("try"); 1602 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1603 Builder.AddPlaceholderChunk("statements"); 1604 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1605 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1606 Builder.AddTextChunk("catch"); 1607 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1608 Builder.AddPlaceholderChunk("declaration"); 1609 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1610 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1611 Builder.AddPlaceholderChunk("statements"); 1612 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1613 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1614 Results.AddResult(Result(Builder.TakeString())); 1615 } 1616 if (SemaRef.getLangOpts().ObjC1) 1617 AddObjCStatementResults(Results, true); 1618 1619 if (Results.includeCodePatterns()) { 1620 // if (condition) { statements } 1621 Builder.AddTypedTextChunk("if"); 1622 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1623 if (SemaRef.getLangOpts().CPlusPlus) 1624 Builder.AddPlaceholderChunk("condition"); 1625 else 1626 Builder.AddPlaceholderChunk("expression"); 1627 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1628 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1629 Builder.AddPlaceholderChunk("statements"); 1630 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1631 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1632 Results.AddResult(Result(Builder.TakeString())); 1633 1634 // switch (condition) { } 1635 Builder.AddTypedTextChunk("switch"); 1636 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1637 if (SemaRef.getLangOpts().CPlusPlus) 1638 Builder.AddPlaceholderChunk("condition"); 1639 else 1640 Builder.AddPlaceholderChunk("expression"); 1641 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1642 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1643 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1644 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1645 Results.AddResult(Result(Builder.TakeString())); 1646 } 1647 1648 // Switch-specific statements. 1649 if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 1650 // case expression: 1651 Builder.AddTypedTextChunk("case"); 1652 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1653 Builder.AddPlaceholderChunk("expression"); 1654 Builder.AddChunk(CodeCompletionString::CK_Colon); 1655 Results.AddResult(Result(Builder.TakeString())); 1656 1657 // default: 1658 Builder.AddTypedTextChunk("default"); 1659 Builder.AddChunk(CodeCompletionString::CK_Colon); 1660 Results.AddResult(Result(Builder.TakeString())); 1661 } 1662 1663 if (Results.includeCodePatterns()) { 1664 /// while (condition) { statements } 1665 Builder.AddTypedTextChunk("while"); 1666 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1667 if (SemaRef.getLangOpts().CPlusPlus) 1668 Builder.AddPlaceholderChunk("condition"); 1669 else 1670 Builder.AddPlaceholderChunk("expression"); 1671 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1672 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1673 Builder.AddPlaceholderChunk("statements"); 1674 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1675 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1676 Results.AddResult(Result(Builder.TakeString())); 1677 1678 // do { statements } while ( expression ); 1679 Builder.AddTypedTextChunk("do"); 1680 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1681 Builder.AddPlaceholderChunk("statements"); 1682 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1683 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1684 Builder.AddTextChunk("while"); 1685 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1686 Builder.AddPlaceholderChunk("expression"); 1687 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1688 Results.AddResult(Result(Builder.TakeString())); 1689 1690 // for ( for-init-statement ; condition ; expression ) { statements } 1691 Builder.AddTypedTextChunk("for"); 1692 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1693 if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99) 1694 Builder.AddPlaceholderChunk("init-statement"); 1695 else 1696 Builder.AddPlaceholderChunk("init-expression"); 1697 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1698 Builder.AddPlaceholderChunk("condition"); 1699 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1700 Builder.AddPlaceholderChunk("inc-expression"); 1701 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1702 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1703 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1704 Builder.AddPlaceholderChunk("statements"); 1705 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1706 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1707 Results.AddResult(Result(Builder.TakeString())); 1708 } 1709 1710 if (S->getContinueParent()) { 1711 // continue ; 1712 Builder.AddTypedTextChunk("continue"); 1713 Results.AddResult(Result(Builder.TakeString())); 1714 } 1715 1716 if (S->getBreakParent()) { 1717 // break ; 1718 Builder.AddTypedTextChunk("break"); 1719 Results.AddResult(Result(Builder.TakeString())); 1720 } 1721 1722 // "return expression ;" or "return ;", depending on whether we 1723 // know the function is void or not. 1724 bool isVoid = false; 1725 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 1726 isVoid = Function->getResultType()->isVoidType(); 1727 else if (ObjCMethodDecl *Method 1728 = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 1729 isVoid = Method->getResultType()->isVoidType(); 1730 else if (SemaRef.getCurBlock() && 1731 !SemaRef.getCurBlock()->ReturnType.isNull()) 1732 isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1733 Builder.AddTypedTextChunk("return"); 1734 if (!isVoid) { 1735 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1736 Builder.AddPlaceholderChunk("expression"); 1737 } 1738 Results.AddResult(Result(Builder.TakeString())); 1739 1740 // goto identifier ; 1741 Builder.AddTypedTextChunk("goto"); 1742 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1743 Builder.AddPlaceholderChunk("label"); 1744 Results.AddResult(Result(Builder.TakeString())); 1745 1746 // Using directives 1747 Builder.AddTypedTextChunk("using"); 1748 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1749 Builder.AddTextChunk("namespace"); 1750 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1751 Builder.AddPlaceholderChunk("identifier"); 1752 Results.AddResult(Result(Builder.TakeString())); 1753 } 1754 1755 // Fall through (for statement expressions). 1756 case Sema::PCC_ForInit: 1757 case Sema::PCC_Condition: 1758 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1759 // Fall through: conditions and statements can have expressions. 1760 1761 case Sema::PCC_ParenthesizedExpression: 1762 if (SemaRef.getLangOpts().ObjCAutoRefCount && 1763 CCC == Sema::PCC_ParenthesizedExpression) { 1764 // (__bridge <type>)<expression> 1765 Builder.AddTypedTextChunk("__bridge"); 1766 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1767 Builder.AddPlaceholderChunk("type"); 1768 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1769 Builder.AddPlaceholderChunk("expression"); 1770 Results.AddResult(Result(Builder.TakeString())); 1771 1772 // (__bridge_transfer <Objective-C type>)<expression> 1773 Builder.AddTypedTextChunk("__bridge_transfer"); 1774 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1775 Builder.AddPlaceholderChunk("Objective-C type"); 1776 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1777 Builder.AddPlaceholderChunk("expression"); 1778 Results.AddResult(Result(Builder.TakeString())); 1779 1780 // (__bridge_retained <CF type>)<expression> 1781 Builder.AddTypedTextChunk("__bridge_retained"); 1782 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1783 Builder.AddPlaceholderChunk("CF type"); 1784 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1785 Builder.AddPlaceholderChunk("expression"); 1786 Results.AddResult(Result(Builder.TakeString())); 1787 } 1788 // Fall through 1789 1790 case Sema::PCC_Expression: { 1791 if (SemaRef.getLangOpts().CPlusPlus) { 1792 // 'this', if we're in a non-static member function. 1793 addThisCompletion(SemaRef, Results); 1794 1795 // true 1796 Builder.AddResultTypeChunk("bool"); 1797 Builder.AddTypedTextChunk("true"); 1798 Results.AddResult(Result(Builder.TakeString())); 1799 1800 // false 1801 Builder.AddResultTypeChunk("bool"); 1802 Builder.AddTypedTextChunk("false"); 1803 Results.AddResult(Result(Builder.TakeString())); 1804 1805 if (SemaRef.getLangOpts().RTTI) { 1806 // dynamic_cast < type-id > ( expression ) 1807 Builder.AddTypedTextChunk("dynamic_cast"); 1808 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1809 Builder.AddPlaceholderChunk("type"); 1810 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1811 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1812 Builder.AddPlaceholderChunk("expression"); 1813 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1814 Results.AddResult(Result(Builder.TakeString())); 1815 } 1816 1817 // static_cast < type-id > ( expression ) 1818 Builder.AddTypedTextChunk("static_cast"); 1819 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1820 Builder.AddPlaceholderChunk("type"); 1821 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1822 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1823 Builder.AddPlaceholderChunk("expression"); 1824 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1825 Results.AddResult(Result(Builder.TakeString())); 1826 1827 // reinterpret_cast < type-id > ( expression ) 1828 Builder.AddTypedTextChunk("reinterpret_cast"); 1829 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1830 Builder.AddPlaceholderChunk("type"); 1831 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1832 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1833 Builder.AddPlaceholderChunk("expression"); 1834 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1835 Results.AddResult(Result(Builder.TakeString())); 1836 1837 // const_cast < type-id > ( expression ) 1838 Builder.AddTypedTextChunk("const_cast"); 1839 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1840 Builder.AddPlaceholderChunk("type"); 1841 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1842 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1843 Builder.AddPlaceholderChunk("expression"); 1844 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1845 Results.AddResult(Result(Builder.TakeString())); 1846 1847 if (SemaRef.getLangOpts().RTTI) { 1848 // typeid ( expression-or-type ) 1849 Builder.AddResultTypeChunk("std::type_info"); 1850 Builder.AddTypedTextChunk("typeid"); 1851 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1852 Builder.AddPlaceholderChunk("expression-or-type"); 1853 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1854 Results.AddResult(Result(Builder.TakeString())); 1855 } 1856 1857 // new T ( ... ) 1858 Builder.AddTypedTextChunk("new"); 1859 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1860 Builder.AddPlaceholderChunk("type"); 1861 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1862 Builder.AddPlaceholderChunk("expressions"); 1863 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1864 Results.AddResult(Result(Builder.TakeString())); 1865 1866 // new T [ ] ( ... ) 1867 Builder.AddTypedTextChunk("new"); 1868 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1869 Builder.AddPlaceholderChunk("type"); 1870 Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1871 Builder.AddPlaceholderChunk("size"); 1872 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1873 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1874 Builder.AddPlaceholderChunk("expressions"); 1875 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1876 Results.AddResult(Result(Builder.TakeString())); 1877 1878 // delete expression 1879 Builder.AddResultTypeChunk("void"); 1880 Builder.AddTypedTextChunk("delete"); 1881 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1882 Builder.AddPlaceholderChunk("expression"); 1883 Results.AddResult(Result(Builder.TakeString())); 1884 1885 // delete [] expression 1886 Builder.AddResultTypeChunk("void"); 1887 Builder.AddTypedTextChunk("delete"); 1888 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1889 Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1890 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1891 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1892 Builder.AddPlaceholderChunk("expression"); 1893 Results.AddResult(Result(Builder.TakeString())); 1894 1895 if (SemaRef.getLangOpts().CXXExceptions) { 1896 // throw expression 1897 Builder.AddResultTypeChunk("void"); 1898 Builder.AddTypedTextChunk("throw"); 1899 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1900 Builder.AddPlaceholderChunk("expression"); 1901 Results.AddResult(Result(Builder.TakeString())); 1902 } 1903 1904 // FIXME: Rethrow? 1905 1906 if (SemaRef.getLangOpts().CPlusPlus0x) { 1907 // nullptr 1908 Builder.AddResultTypeChunk("std::nullptr_t"); 1909 Builder.AddTypedTextChunk("nullptr"); 1910 Results.AddResult(Result(Builder.TakeString())); 1911 1912 // alignof 1913 Builder.AddResultTypeChunk("size_t"); 1914 Builder.AddTypedTextChunk("alignof"); 1915 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1916 Builder.AddPlaceholderChunk("type"); 1917 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1918 Results.AddResult(Result(Builder.TakeString())); 1919 1920 // noexcept 1921 Builder.AddResultTypeChunk("bool"); 1922 Builder.AddTypedTextChunk("noexcept"); 1923 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1924 Builder.AddPlaceholderChunk("expression"); 1925 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1926 Results.AddResult(Result(Builder.TakeString())); 1927 1928 // sizeof... expression 1929 Builder.AddResultTypeChunk("size_t"); 1930 Builder.AddTypedTextChunk("sizeof..."); 1931 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1932 Builder.AddPlaceholderChunk("parameter-pack"); 1933 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1934 Results.AddResult(Result(Builder.TakeString())); 1935 } 1936 } 1937 1938 if (SemaRef.getLangOpts().ObjC1) { 1939 // Add "super", if we're in an Objective-C class with a superclass. 1940 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1941 // The interface can be NULL. 1942 if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 1943 if (ID->getSuperClass()) { 1944 std::string SuperType; 1945 SuperType = ID->getSuperClass()->getNameAsString(); 1946 if (Method->isInstanceMethod()) 1947 SuperType += " *"; 1948 1949 Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 1950 Builder.AddTypedTextChunk("super"); 1951 Results.AddResult(Result(Builder.TakeString())); 1952 } 1953 } 1954 1955 AddObjCExpressionResults(Results, true); 1956 } 1957 1958 if (SemaRef.getLangOpts().C11) { 1959 // _Alignof 1960 Builder.AddResultTypeChunk("size_t"); 1961 if (SemaRef.getASTContext().Idents.get("alignof").hasMacroDefinition()) 1962 Builder.AddTypedTextChunk("alignof"); 1963 else 1964 Builder.AddTypedTextChunk("_Alignof"); 1965 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1966 Builder.AddPlaceholderChunk("type"); 1967 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1968 Results.AddResult(Result(Builder.TakeString())); 1969 } 1970 1971 // sizeof expression 1972 Builder.AddResultTypeChunk("size_t"); 1973 Builder.AddTypedTextChunk("sizeof"); 1974 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1975 Builder.AddPlaceholderChunk("expression-or-type"); 1976 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1977 Results.AddResult(Result(Builder.TakeString())); 1978 break; 1979 } 1980 1981 case Sema::PCC_Type: 1982 case Sema::PCC_LocalDeclarationSpecifiers: 1983 break; 1984 } 1985 1986 if (WantTypesInContext(CCC, SemaRef.getLangOpts())) 1987 AddTypeSpecifierResults(SemaRef.getLangOpts(), Results); 1988 1989 if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type) 1990 Results.AddResult(Result("operator")); 1991 } 1992 1993 /// \brief If the given declaration has an associated type, add it as a result 1994 /// type chunk. 1995 static void AddResultTypeChunk(ASTContext &Context, 1996 const PrintingPolicy &Policy, 1997 NamedDecl *ND, 1998 CodeCompletionBuilder &Result) { 1999 if (!ND) 2000 return; 2001 2002 // Skip constructors and conversion functions, which have their return types 2003 // built into their names. 2004 if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 2005 return; 2006 2007 // Determine the type of the declaration (if it has a type). 2008 QualType T; 2009 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 2010 T = Function->getResultType(); 2011 else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 2012 T = Method->getResultType(); 2013 else if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) 2014 T = FunTmpl->getTemplatedDecl()->getResultType(); 2015 else if (EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2016 T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2017 else if (isa<UnresolvedUsingValueDecl>(ND)) { 2018 /* Do nothing: ignore unresolved using declarations*/ 2019 } else if (ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2020 T = Value->getType(); 2021 } else if (ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2022 T = Property->getType(); 2023 2024 if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2025 return; 2026 2027 Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2028 Result.getAllocator())); 2029 } 2030 2031 static void MaybeAddSentinel(ASTContext &Context, NamedDecl *FunctionOrMethod, 2032 CodeCompletionBuilder &Result) { 2033 if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2034 if (Sentinel->getSentinel() == 0) { 2035 if (Context.getLangOpts().ObjC1 && 2036 Context.Idents.get("nil").hasMacroDefinition()) 2037 Result.AddTextChunk(", nil"); 2038 else if (Context.Idents.get("NULL").hasMacroDefinition()) 2039 Result.AddTextChunk(", NULL"); 2040 else 2041 Result.AddTextChunk(", (void*)0"); 2042 } 2043 } 2044 2045 static std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 2046 std::string Result; 2047 if (ObjCQuals & Decl::OBJC_TQ_In) 2048 Result += "in "; 2049 else if (ObjCQuals & Decl::OBJC_TQ_Inout) 2050 Result += "inout "; 2051 else if (ObjCQuals & Decl::OBJC_TQ_Out) 2052 Result += "out "; 2053 if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 2054 Result += "bycopy "; 2055 else if (ObjCQuals & Decl::OBJC_TQ_Byref) 2056 Result += "byref "; 2057 if (ObjCQuals & Decl::OBJC_TQ_Oneway) 2058 Result += "oneway "; 2059 return Result; 2060 } 2061 2062 static std::string FormatFunctionParameter(ASTContext &Context, 2063 const PrintingPolicy &Policy, 2064 ParmVarDecl *Param, 2065 bool SuppressName = false, 2066 bool SuppressBlock = false) { 2067 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 2068 if (Param->getType()->isDependentType() || 2069 !Param->getType()->isBlockPointerType()) { 2070 // The argument for a dependent or non-block parameter is a placeholder 2071 // containing that parameter's type. 2072 std::string Result; 2073 2074 if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 2075 Result = Param->getIdentifier()->getName(); 2076 2077 Param->getType().getAsStringInternal(Result, Policy); 2078 2079 if (ObjCMethodParam) { 2080 Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 2081 + Result + ")"; 2082 if (Param->getIdentifier() && !SuppressName) 2083 Result += Param->getIdentifier()->getName(); 2084 } 2085 return Result; 2086 } 2087 2088 // The argument for a block pointer parameter is a block literal with 2089 // the appropriate type. 2090 FunctionTypeLoc *Block = 0; 2091 FunctionProtoTypeLoc *BlockProto = 0; 2092 TypeLoc TL; 2093 if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 2094 TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 2095 while (true) { 2096 // Look through typedefs. 2097 if (!SuppressBlock) { 2098 if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { 2099 if (TypeSourceInfo *InnerTSInfo 2100 = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo()) { 2101 TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2102 continue; 2103 } 2104 } 2105 2106 // Look through qualified types 2107 if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { 2108 TL = QualifiedTL->getUnqualifiedLoc(); 2109 continue; 2110 } 2111 } 2112 2113 // Try to get the function prototype behind the block pointer type, 2114 // then we're done. 2115 if (BlockPointerTypeLoc *BlockPtr 2116 = dyn_cast<BlockPointerTypeLoc>(&TL)) { 2117 TL = BlockPtr->getPointeeLoc().IgnoreParens(); 2118 Block = dyn_cast<FunctionTypeLoc>(&TL); 2119 BlockProto = dyn_cast<FunctionProtoTypeLoc>(&TL); 2120 } 2121 break; 2122 } 2123 } 2124 2125 if (!Block) { 2126 // We were unable to find a FunctionProtoTypeLoc with parameter names 2127 // for the block; just use the parameter type as a placeholder. 2128 std::string Result; 2129 if (!ObjCMethodParam && Param->getIdentifier()) 2130 Result = Param->getIdentifier()->getName(); 2131 2132 Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 2133 2134 if (ObjCMethodParam) { 2135 Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 2136 + Result + ")"; 2137 if (Param->getIdentifier()) 2138 Result += Param->getIdentifier()->getName(); 2139 } 2140 2141 return Result; 2142 } 2143 2144 // We have the function prototype behind the block pointer type, as it was 2145 // written in the source. 2146 std::string Result; 2147 QualType ResultType = Block->getTypePtr()->getResultType(); 2148 if (!ResultType->isVoidType() || SuppressBlock) 2149 ResultType.getAsStringInternal(Result, Policy); 2150 2151 // Format the parameter list. 2152 std::string Params; 2153 if (!BlockProto || Block->getNumArgs() == 0) { 2154 if (BlockProto && BlockProto->getTypePtr()->isVariadic()) 2155 Params = "(...)"; 2156 else 2157 Params = "(void)"; 2158 } else { 2159 Params += "("; 2160 for (unsigned I = 0, N = Block->getNumArgs(); I != N; ++I) { 2161 if (I) 2162 Params += ", "; 2163 Params += FormatFunctionParameter(Context, Policy, Block->getArg(I), 2164 /*SuppressName=*/false, 2165 /*SuppressBlock=*/true); 2166 2167 if (I == N - 1 && BlockProto->getTypePtr()->isVariadic()) 2168 Params += ", ..."; 2169 } 2170 Params += ")"; 2171 } 2172 2173 if (SuppressBlock) { 2174 // Format as a parameter. 2175 Result = Result + " (^"; 2176 if (Param->getIdentifier()) 2177 Result += Param->getIdentifier()->getName(); 2178 Result += ")"; 2179 Result += Params; 2180 } else { 2181 // Format as a block literal argument. 2182 Result = '^' + Result; 2183 Result += Params; 2184 2185 if (Param->getIdentifier()) 2186 Result += Param->getIdentifier()->getName(); 2187 } 2188 2189 return Result; 2190 } 2191 2192 /// \brief Add function parameter chunks to the given code completion string. 2193 static void AddFunctionParameterChunks(ASTContext &Context, 2194 const PrintingPolicy &Policy, 2195 FunctionDecl *Function, 2196 CodeCompletionBuilder &Result, 2197 unsigned Start = 0, 2198 bool InOptional = false) { 2199 bool FirstParameter = true; 2200 2201 for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 2202 ParmVarDecl *Param = Function->getParamDecl(P); 2203 2204 if (Param->hasDefaultArg() && !InOptional) { 2205 // When we see an optional default argument, put that argument and 2206 // the remaining default arguments into a new, optional string. 2207 CodeCompletionBuilder Opt(Result.getAllocator(), 2208 Result.getCodeCompletionTUInfo()); 2209 if (!FirstParameter) 2210 Opt.AddChunk(CodeCompletionString::CK_Comma); 2211 AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2212 Result.AddOptionalChunk(Opt.TakeString()); 2213 break; 2214 } 2215 2216 if (FirstParameter) 2217 FirstParameter = false; 2218 else 2219 Result.AddChunk(CodeCompletionString::CK_Comma); 2220 2221 InOptional = false; 2222 2223 // Format the placeholder string. 2224 std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 2225 Param); 2226 2227 if (Function->isVariadic() && P == N - 1) 2228 PlaceholderStr += ", ..."; 2229 2230 // Add the placeholder string. 2231 Result.AddPlaceholderChunk( 2232 Result.getAllocator().CopyString(PlaceholderStr)); 2233 } 2234 2235 if (const FunctionProtoType *Proto 2236 = Function->getType()->getAs<FunctionProtoType>()) 2237 if (Proto->isVariadic()) { 2238 if (Proto->getNumArgs() == 0) 2239 Result.AddPlaceholderChunk("..."); 2240 2241 MaybeAddSentinel(Context, Function, Result); 2242 } 2243 } 2244 2245 /// \brief Add template parameter chunks to the given code completion string. 2246 static void AddTemplateParameterChunks(ASTContext &Context, 2247 const PrintingPolicy &Policy, 2248 TemplateDecl *Template, 2249 CodeCompletionBuilder &Result, 2250 unsigned MaxParameters = 0, 2251 unsigned Start = 0, 2252 bool InDefaultArg = false) { 2253 bool FirstParameter = true; 2254 2255 TemplateParameterList *Params = Template->getTemplateParameters(); 2256 TemplateParameterList::iterator PEnd = Params->end(); 2257 if (MaxParameters) 2258 PEnd = Params->begin() + MaxParameters; 2259 for (TemplateParameterList::iterator P = Params->begin() + Start; 2260 P != PEnd; ++P) { 2261 bool HasDefaultArg = false; 2262 std::string PlaceholderStr; 2263 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 2264 if (TTP->wasDeclaredWithTypename()) 2265 PlaceholderStr = "typename"; 2266 else 2267 PlaceholderStr = "class"; 2268 2269 if (TTP->getIdentifier()) { 2270 PlaceholderStr += ' '; 2271 PlaceholderStr += TTP->getIdentifier()->getName(); 2272 } 2273 2274 HasDefaultArg = TTP->hasDefaultArgument(); 2275 } else if (NonTypeTemplateParmDecl *NTTP 2276 = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2277 if (NTTP->getIdentifier()) 2278 PlaceholderStr = NTTP->getIdentifier()->getName(); 2279 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 2280 HasDefaultArg = NTTP->hasDefaultArgument(); 2281 } else { 2282 assert(isa<TemplateTemplateParmDecl>(*P)); 2283 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 2284 2285 // Since putting the template argument list into the placeholder would 2286 // be very, very long, we just use an abbreviation. 2287 PlaceholderStr = "template<...> class"; 2288 if (TTP->getIdentifier()) { 2289 PlaceholderStr += ' '; 2290 PlaceholderStr += TTP->getIdentifier()->getName(); 2291 } 2292 2293 HasDefaultArg = TTP->hasDefaultArgument(); 2294 } 2295 2296 if (HasDefaultArg && !InDefaultArg) { 2297 // When we see an optional default argument, put that argument and 2298 // the remaining default arguments into a new, optional string. 2299 CodeCompletionBuilder Opt(Result.getAllocator(), 2300 Result.getCodeCompletionTUInfo()); 2301 if (!FirstParameter) 2302 Opt.AddChunk(CodeCompletionString::CK_Comma); 2303 AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2304 P - Params->begin(), true); 2305 Result.AddOptionalChunk(Opt.TakeString()); 2306 break; 2307 } 2308 2309 InDefaultArg = false; 2310 2311 if (FirstParameter) 2312 FirstParameter = false; 2313 else 2314 Result.AddChunk(CodeCompletionString::CK_Comma); 2315 2316 // Add the placeholder string. 2317 Result.AddPlaceholderChunk( 2318 Result.getAllocator().CopyString(PlaceholderStr)); 2319 } 2320 } 2321 2322 /// \brief Add a qualifier to the given code-completion string, if the 2323 /// provided nested-name-specifier is non-NULL. 2324 static void 2325 AddQualifierToCompletionString(CodeCompletionBuilder &Result, 2326 NestedNameSpecifier *Qualifier, 2327 bool QualifierIsInformative, 2328 ASTContext &Context, 2329 const PrintingPolicy &Policy) { 2330 if (!Qualifier) 2331 return; 2332 2333 std::string PrintedNNS; 2334 { 2335 llvm::raw_string_ostream OS(PrintedNNS); 2336 Qualifier->print(OS, Policy); 2337 } 2338 if (QualifierIsInformative) 2339 Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 2340 else 2341 Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2342 } 2343 2344 static void 2345 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2346 FunctionDecl *Function) { 2347 const FunctionProtoType *Proto 2348 = Function->getType()->getAs<FunctionProtoType>(); 2349 if (!Proto || !Proto->getTypeQuals()) 2350 return; 2351 2352 // FIXME: Add ref-qualifier! 2353 2354 // Handle single qualifiers without copying 2355 if (Proto->getTypeQuals() == Qualifiers::Const) { 2356 Result.AddInformativeChunk(" const"); 2357 return; 2358 } 2359 2360 if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2361 Result.AddInformativeChunk(" volatile"); 2362 return; 2363 } 2364 2365 if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2366 Result.AddInformativeChunk(" restrict"); 2367 return; 2368 } 2369 2370 // Handle multiple qualifiers. 2371 std::string QualsStr; 2372 if (Proto->isConst()) 2373 QualsStr += " const"; 2374 if (Proto->isVolatile()) 2375 QualsStr += " volatile"; 2376 if (Proto->isRestrict()) 2377 QualsStr += " restrict"; 2378 Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2379 } 2380 2381 /// \brief Add the name of the given declaration 2382 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 2383 NamedDecl *ND, CodeCompletionBuilder &Result) { 2384 DeclarationName Name = ND->getDeclName(); 2385 if (!Name) 2386 return; 2387 2388 switch (Name.getNameKind()) { 2389 case DeclarationName::CXXOperatorName: { 2390 const char *OperatorName = 0; 2391 switch (Name.getCXXOverloadedOperator()) { 2392 case OO_None: 2393 case OO_Conditional: 2394 case NUM_OVERLOADED_OPERATORS: 2395 OperatorName = "operator"; 2396 break; 2397 2398 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2399 case OO_##Name: OperatorName = "operator" Spelling; break; 2400 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2401 #include "clang/Basic/OperatorKinds.def" 2402 2403 case OO_New: OperatorName = "operator new"; break; 2404 case OO_Delete: OperatorName = "operator delete"; break; 2405 case OO_Array_New: OperatorName = "operator new[]"; break; 2406 case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2407 case OO_Call: OperatorName = "operator()"; break; 2408 case OO_Subscript: OperatorName = "operator[]"; break; 2409 } 2410 Result.AddTypedTextChunk(OperatorName); 2411 break; 2412 } 2413 2414 case DeclarationName::Identifier: 2415 case DeclarationName::CXXConversionFunctionName: 2416 case DeclarationName::CXXDestructorName: 2417 case DeclarationName::CXXLiteralOperatorName: 2418 Result.AddTypedTextChunk( 2419 Result.getAllocator().CopyString(ND->getNameAsString())); 2420 break; 2421 2422 case DeclarationName::CXXUsingDirective: 2423 case DeclarationName::ObjCZeroArgSelector: 2424 case DeclarationName::ObjCOneArgSelector: 2425 case DeclarationName::ObjCMultiArgSelector: 2426 break; 2427 2428 case DeclarationName::CXXConstructorName: { 2429 CXXRecordDecl *Record = 0; 2430 QualType Ty = Name.getCXXNameType(); 2431 if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 2432 Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 2433 else if (const InjectedClassNameType *InjectedTy 2434 = Ty->getAs<InjectedClassNameType>()) 2435 Record = InjectedTy->getDecl(); 2436 else { 2437 Result.AddTypedTextChunk( 2438 Result.getAllocator().CopyString(ND->getNameAsString())); 2439 break; 2440 } 2441 2442 Result.AddTypedTextChunk( 2443 Result.getAllocator().CopyString(Record->getNameAsString())); 2444 if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 2445 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2446 AddTemplateParameterChunks(Context, Policy, Template, Result); 2447 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2448 } 2449 break; 2450 } 2451 } 2452 } 2453 2454 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 2455 CodeCompletionAllocator &Allocator, 2456 CodeCompletionTUInfo &CCTUInfo, 2457 bool IncludeBriefComments) { 2458 return CreateCodeCompletionString(S.Context, S.PP, Allocator, CCTUInfo, 2459 IncludeBriefComments); 2460 } 2461 2462 /// \brief If possible, create a new code completion string for the given 2463 /// result. 2464 /// 2465 /// \returns Either a new, heap-allocated code completion string describing 2466 /// how to use this result, or NULL to indicate that the string or name of the 2467 /// result is all that is needed. 2468 CodeCompletionString * 2469 CodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2470 Preprocessor &PP, 2471 CodeCompletionAllocator &Allocator, 2472 CodeCompletionTUInfo &CCTUInfo, 2473 bool IncludeBriefComments) { 2474 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 2475 2476 PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2477 if (Kind == RK_Pattern) { 2478 Pattern->Priority = Priority; 2479 Pattern->Availability = Availability; 2480 2481 if (Declaration) { 2482 Result.addParentContext(Declaration->getDeclContext()); 2483 Pattern->ParentKind = Result.getParentKind(); 2484 Pattern->ParentName = Result.getParentName(); 2485 } 2486 2487 return Pattern; 2488 } 2489 2490 if (Kind == RK_Keyword) { 2491 Result.AddTypedTextChunk(Keyword); 2492 return Result.TakeString(); 2493 } 2494 2495 if (Kind == RK_Macro) { 2496 MacroInfo *MI = PP.getMacroInfo(Macro); 2497 assert(MI && "Not a macro?"); 2498 2499 Result.AddTypedTextChunk( 2500 Result.getAllocator().CopyString(Macro->getName())); 2501 2502 if (!MI->isFunctionLike()) 2503 return Result.TakeString(); 2504 2505 // Format a function-like macro with placeholders for the arguments. 2506 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2507 MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2508 2509 // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2510 if (MI->isC99Varargs()) { 2511 --AEnd; 2512 2513 if (A == AEnd) { 2514 Result.AddPlaceholderChunk("..."); 2515 } 2516 } 2517 2518 for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 2519 if (A != MI->arg_begin()) 2520 Result.AddChunk(CodeCompletionString::CK_Comma); 2521 2522 if (MI->isVariadic() && (A+1) == AEnd) { 2523 SmallString<32> Arg = (*A)->getName(); 2524 if (MI->isC99Varargs()) 2525 Arg += ", ..."; 2526 else 2527 Arg += "..."; 2528 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2529 break; 2530 } 2531 2532 // Non-variadic macros are simple. 2533 Result.AddPlaceholderChunk( 2534 Result.getAllocator().CopyString((*A)->getName())); 2535 } 2536 Result.AddChunk(CodeCompletionString::CK_RightParen); 2537 return Result.TakeString(); 2538 } 2539 2540 assert(Kind == RK_Declaration && "Missed a result kind?"); 2541 NamedDecl *ND = Declaration; 2542 Result.addParentContext(ND->getDeclContext()); 2543 2544 if (IncludeBriefComments) { 2545 // Add documentation comment, if it exists. 2546 if (const RawComment *RC = Ctx.getRawCommentForAnyRedecl(ND)) { 2547 Result.addBriefComment(RC->getBriefText(Ctx)); 2548 } 2549 } 2550 2551 if (StartsNestedNameSpecifier) { 2552 Result.AddTypedTextChunk( 2553 Result.getAllocator().CopyString(ND->getNameAsString())); 2554 Result.AddTextChunk("::"); 2555 return Result.TakeString(); 2556 } 2557 2558 for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 2559 if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 2560 Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 2561 } 2562 } 2563 2564 AddResultTypeChunk(Ctx, Policy, ND, Result); 2565 2566 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 2567 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2568 Ctx, Policy); 2569 AddTypedNameChunk(Ctx, Policy, ND, Result); 2570 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2571 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2572 Result.AddChunk(CodeCompletionString::CK_RightParen); 2573 AddFunctionTypeQualsToCompletionString(Result, Function); 2574 return Result.TakeString(); 2575 } 2576 2577 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 2578 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2579 Ctx, Policy); 2580 FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2581 AddTypedNameChunk(Ctx, Policy, Function, Result); 2582 2583 // Figure out which template parameters are deduced (or have default 2584 // arguments). 2585 llvm::SmallBitVector Deduced; 2586 Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 2587 unsigned LastDeducibleArgument; 2588 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 2589 --LastDeducibleArgument) { 2590 if (!Deduced[LastDeducibleArgument - 1]) { 2591 // C++0x: Figure out if the template argument has a default. If so, 2592 // the user doesn't need to type this argument. 2593 // FIXME: We need to abstract template parameters better! 2594 bool HasDefaultArg = false; 2595 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2596 LastDeducibleArgument - 1); 2597 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 2598 HasDefaultArg = TTP->hasDefaultArgument(); 2599 else if (NonTypeTemplateParmDecl *NTTP 2600 = dyn_cast<NonTypeTemplateParmDecl>(Param)) 2601 HasDefaultArg = NTTP->hasDefaultArgument(); 2602 else { 2603 assert(isa<TemplateTemplateParmDecl>(Param)); 2604 HasDefaultArg 2605 = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 2606 } 2607 2608 if (!HasDefaultArg) 2609 break; 2610 } 2611 } 2612 2613 if (LastDeducibleArgument) { 2614 // Some of the function template arguments cannot be deduced from a 2615 // function call, so we introduce an explicit template argument list 2616 // containing all of the arguments up to the first deducible argument. 2617 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2618 AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 2619 LastDeducibleArgument); 2620 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2621 } 2622 2623 // Add the function parameters 2624 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2625 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2626 Result.AddChunk(CodeCompletionString::CK_RightParen); 2627 AddFunctionTypeQualsToCompletionString(Result, Function); 2628 return Result.TakeString(); 2629 } 2630 2631 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 2632 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2633 Ctx, Policy); 2634 Result.AddTypedTextChunk( 2635 Result.getAllocator().CopyString(Template->getNameAsString())); 2636 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2637 AddTemplateParameterChunks(Ctx, Policy, Template, Result); 2638 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2639 return Result.TakeString(); 2640 } 2641 2642 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 2643 Selector Sel = Method->getSelector(); 2644 if (Sel.isUnarySelector()) { 2645 Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2646 Sel.getNameForSlot(0))); 2647 return Result.TakeString(); 2648 } 2649 2650 std::string SelName = Sel.getNameForSlot(0).str(); 2651 SelName += ':'; 2652 if (StartParameter == 0) 2653 Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2654 else { 2655 Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2656 2657 // If there is only one parameter, and we're past it, add an empty 2658 // typed-text chunk since there is nothing to type. 2659 if (Method->param_size() == 1) 2660 Result.AddTypedTextChunk(""); 2661 } 2662 unsigned Idx = 0; 2663 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 2664 PEnd = Method->param_end(); 2665 P != PEnd; (void)++P, ++Idx) { 2666 if (Idx > 0) { 2667 std::string Keyword; 2668 if (Idx > StartParameter) 2669 Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2670 if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2671 Keyword += II->getName(); 2672 Keyword += ":"; 2673 if (Idx < StartParameter || AllParametersAreInformative) 2674 Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2675 else 2676 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 2677 } 2678 2679 // If we're before the starting parameter, skip the placeholder. 2680 if (Idx < StartParameter) 2681 continue; 2682 2683 std::string Arg; 2684 2685 if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2686 Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 2687 else { 2688 (*P)->getType().getAsStringInternal(Arg, Policy); 2689 Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 2690 + Arg + ")"; 2691 if (IdentifierInfo *II = (*P)->getIdentifier()) 2692 if (DeclaringEntity || AllParametersAreInformative) 2693 Arg += II->getName(); 2694 } 2695 2696 if (Method->isVariadic() && (P + 1) == PEnd) 2697 Arg += ", ..."; 2698 2699 if (DeclaringEntity) 2700 Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 2701 else if (AllParametersAreInformative) 2702 Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 2703 else 2704 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2705 } 2706 2707 if (Method->isVariadic()) { 2708 if (Method->param_size() == 0) { 2709 if (DeclaringEntity) 2710 Result.AddTextChunk(", ..."); 2711 else if (AllParametersAreInformative) 2712 Result.AddInformativeChunk(", ..."); 2713 else 2714 Result.AddPlaceholderChunk(", ..."); 2715 } 2716 2717 MaybeAddSentinel(Ctx, Method, Result); 2718 } 2719 2720 return Result.TakeString(); 2721 } 2722 2723 if (Qualifier) 2724 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2725 Ctx, Policy); 2726 2727 Result.AddTypedTextChunk( 2728 Result.getAllocator().CopyString(ND->getNameAsString())); 2729 return Result.TakeString(); 2730 } 2731 2732 CodeCompletionString * 2733 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 2734 unsigned CurrentArg, 2735 Sema &S, 2736 CodeCompletionAllocator &Allocator, 2737 CodeCompletionTUInfo &CCTUInfo) const { 2738 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2739 2740 // FIXME: Set priority, availability appropriately. 2741 CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 2742 FunctionDecl *FDecl = getFunction(); 2743 AddResultTypeChunk(S.Context, Policy, FDecl, Result); 2744 const FunctionProtoType *Proto 2745 = dyn_cast<FunctionProtoType>(getFunctionType()); 2746 if (!FDecl && !Proto) { 2747 // Function without a prototype. Just give the return type and a 2748 // highlighted ellipsis. 2749 const FunctionType *FT = getFunctionType(); 2750 Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 2751 S.Context, Policy, 2752 Result.getAllocator())); 2753 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2754 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2755 Result.AddChunk(CodeCompletionString::CK_RightParen); 2756 return Result.TakeString(); 2757 } 2758 2759 if (FDecl) 2760 Result.AddTextChunk( 2761 Result.getAllocator().CopyString(FDecl->getNameAsString())); 2762 else 2763 Result.AddTextChunk( 2764 Result.getAllocator().CopyString( 2765 Proto->getResultType().getAsString(Policy))); 2766 2767 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2768 unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 2769 for (unsigned I = 0; I != NumParams; ++I) { 2770 if (I) 2771 Result.AddChunk(CodeCompletionString::CK_Comma); 2772 2773 std::string ArgString; 2774 QualType ArgType; 2775 2776 if (FDecl) { 2777 ArgString = FDecl->getParamDecl(I)->getNameAsString(); 2778 ArgType = FDecl->getParamDecl(I)->getOriginalType(); 2779 } else { 2780 ArgType = Proto->getArgType(I); 2781 } 2782 2783 ArgType.getAsStringInternal(ArgString, Policy); 2784 2785 if (I == CurrentArg) 2786 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 2787 Result.getAllocator().CopyString(ArgString)); 2788 else 2789 Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 2790 } 2791 2792 if (Proto && Proto->isVariadic()) { 2793 Result.AddChunk(CodeCompletionString::CK_Comma); 2794 if (CurrentArg < NumParams) 2795 Result.AddTextChunk("..."); 2796 else 2797 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2798 } 2799 Result.AddChunk(CodeCompletionString::CK_RightParen); 2800 2801 return Result.TakeString(); 2802 } 2803 2804 unsigned clang::getMacroUsagePriority(StringRef MacroName, 2805 const LangOptions &LangOpts, 2806 bool PreferredTypeIsPointer) { 2807 unsigned Priority = CCP_Macro; 2808 2809 // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2810 if (MacroName.equals("nil") || MacroName.equals("NULL") || 2811 MacroName.equals("Nil")) { 2812 Priority = CCP_Constant; 2813 if (PreferredTypeIsPointer) 2814 Priority = Priority / CCF_SimilarTypeMatch; 2815 } 2816 // Treat "YES", "NO", "true", and "false" as constants. 2817 else if (MacroName.equals("YES") || MacroName.equals("NO") || 2818 MacroName.equals("true") || MacroName.equals("false")) 2819 Priority = CCP_Constant; 2820 // Treat "bool" as a type. 2821 else if (MacroName.equals("bool")) 2822 Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2823 2824 2825 return Priority; 2826 } 2827 2828 CXCursorKind clang::getCursorKindForDecl(Decl *D) { 2829 if (!D) 2830 return CXCursor_UnexposedDecl; 2831 2832 switch (D->getKind()) { 2833 case Decl::Enum: return CXCursor_EnumDecl; 2834 case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2835 case Decl::Field: return CXCursor_FieldDecl; 2836 case Decl::Function: 2837 return CXCursor_FunctionDecl; 2838 case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2839 case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2840 case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2841 2842 case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2843 case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2844 case Decl::ObjCMethod: 2845 return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2846 ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2847 case Decl::CXXMethod: return CXCursor_CXXMethod; 2848 case Decl::CXXConstructor: return CXCursor_Constructor; 2849 case Decl::CXXDestructor: return CXCursor_Destructor; 2850 case Decl::CXXConversion: return CXCursor_ConversionFunction; 2851 case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2852 case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2853 case Decl::ParmVar: return CXCursor_ParmDecl; 2854 case Decl::Typedef: return CXCursor_TypedefDecl; 2855 case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2856 case Decl::Var: return CXCursor_VarDecl; 2857 case Decl::Namespace: return CXCursor_Namespace; 2858 case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2859 case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2860 case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2861 case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2862 case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2863 case Decl::ClassTemplate: return CXCursor_ClassTemplate; 2864 case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2865 case Decl::ClassTemplatePartialSpecialization: 2866 return CXCursor_ClassTemplatePartialSpecialization; 2867 case Decl::UsingDirective: return CXCursor_UsingDirective; 2868 case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2869 2870 case Decl::Using: 2871 case Decl::UnresolvedUsingValue: 2872 case Decl::UnresolvedUsingTypename: 2873 return CXCursor_UsingDeclaration; 2874 2875 case Decl::ObjCPropertyImpl: 2876 switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2877 case ObjCPropertyImplDecl::Dynamic: 2878 return CXCursor_ObjCDynamicDecl; 2879 2880 case ObjCPropertyImplDecl::Synthesize: 2881 return CXCursor_ObjCSynthesizeDecl; 2882 } 2883 2884 default: 2885 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2886 switch (TD->getTagKind()) { 2887 case TTK_Struct: return CXCursor_StructDecl; 2888 case TTK_Class: return CXCursor_ClassDecl; 2889 case TTK_Union: return CXCursor_UnionDecl; 2890 case TTK_Enum: return CXCursor_EnumDecl; 2891 } 2892 } 2893 } 2894 2895 return CXCursor_UnexposedDecl; 2896 } 2897 2898 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2899 bool TargetTypeIsPointer = false) { 2900 typedef CodeCompletionResult Result; 2901 2902 Results.EnterNewScope(); 2903 2904 for (Preprocessor::macro_iterator M = PP.macro_begin(), 2905 MEnd = PP.macro_end(); 2906 M != MEnd; ++M) { 2907 Results.AddResult(Result(M->first, 2908 getMacroUsagePriority(M->first->getName(), 2909 PP.getLangOpts(), 2910 TargetTypeIsPointer))); 2911 } 2912 2913 Results.ExitScope(); 2914 2915 } 2916 2917 static void AddPrettyFunctionResults(const LangOptions &LangOpts, 2918 ResultBuilder &Results) { 2919 typedef CodeCompletionResult Result; 2920 2921 Results.EnterNewScope(); 2922 2923 Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 2924 Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 2925 if (LangOpts.C99 || LangOpts.CPlusPlus0x) 2926 Results.AddResult(Result("__func__", CCP_Constant)); 2927 Results.ExitScope(); 2928 } 2929 2930 static void HandleCodeCompleteResults(Sema *S, 2931 CodeCompleteConsumer *CodeCompleter, 2932 CodeCompletionContext Context, 2933 CodeCompletionResult *Results, 2934 unsigned NumResults) { 2935 if (CodeCompleter) 2936 CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 2937 } 2938 2939 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 2940 Sema::ParserCompletionContext PCC) { 2941 switch (PCC) { 2942 case Sema::PCC_Namespace: 2943 return CodeCompletionContext::CCC_TopLevel; 2944 2945 case Sema::PCC_Class: 2946 return CodeCompletionContext::CCC_ClassStructUnion; 2947 2948 case Sema::PCC_ObjCInterface: 2949 return CodeCompletionContext::CCC_ObjCInterface; 2950 2951 case Sema::PCC_ObjCImplementation: 2952 return CodeCompletionContext::CCC_ObjCImplementation; 2953 2954 case Sema::PCC_ObjCInstanceVariableList: 2955 return CodeCompletionContext::CCC_ObjCIvarList; 2956 2957 case Sema::PCC_Template: 2958 case Sema::PCC_MemberTemplate: 2959 if (S.CurContext->isFileContext()) 2960 return CodeCompletionContext::CCC_TopLevel; 2961 if (S.CurContext->isRecord()) 2962 return CodeCompletionContext::CCC_ClassStructUnion; 2963 return CodeCompletionContext::CCC_Other; 2964 2965 case Sema::PCC_RecoveryInFunction: 2966 return CodeCompletionContext::CCC_Recovery; 2967 2968 case Sema::PCC_ForInit: 2969 if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 2970 S.getLangOpts().ObjC1) 2971 return CodeCompletionContext::CCC_ParenthesizedExpression; 2972 else 2973 return CodeCompletionContext::CCC_Expression; 2974 2975 case Sema::PCC_Expression: 2976 case Sema::PCC_Condition: 2977 return CodeCompletionContext::CCC_Expression; 2978 2979 case Sema::PCC_Statement: 2980 return CodeCompletionContext::CCC_Statement; 2981 2982 case Sema::PCC_Type: 2983 return CodeCompletionContext::CCC_Type; 2984 2985 case Sema::PCC_ParenthesizedExpression: 2986 return CodeCompletionContext::CCC_ParenthesizedExpression; 2987 2988 case Sema::PCC_LocalDeclarationSpecifiers: 2989 return CodeCompletionContext::CCC_Type; 2990 } 2991 2992 llvm_unreachable("Invalid ParserCompletionContext!"); 2993 } 2994 2995 /// \brief If we're in a C++ virtual member function, add completion results 2996 /// that invoke the functions we override, since it's common to invoke the 2997 /// overridden function as well as adding new functionality. 2998 /// 2999 /// \param S The semantic analysis object for which we are generating results. 3000 /// 3001 /// \param InContext This context in which the nested-name-specifier preceding 3002 /// the code-completion point 3003 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 3004 ResultBuilder &Results) { 3005 // Look through blocks. 3006 DeclContext *CurContext = S.CurContext; 3007 while (isa<BlockDecl>(CurContext)) 3008 CurContext = CurContext->getParent(); 3009 3010 3011 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 3012 if (!Method || !Method->isVirtual()) 3013 return; 3014 3015 // We need to have names for all of the parameters, if we're going to 3016 // generate a forwarding call. 3017 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3018 PEnd = Method->param_end(); 3019 P != PEnd; 3020 ++P) { 3021 if (!(*P)->getDeclName()) 3022 return; 3023 } 3024 3025 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3026 for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3027 MEnd = Method->end_overridden_methods(); 3028 M != MEnd; ++M) { 3029 CodeCompletionBuilder Builder(Results.getAllocator(), 3030 Results.getCodeCompletionTUInfo()); 3031 CXXMethodDecl *Overridden = const_cast<CXXMethodDecl *>(*M); 3032 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3033 continue; 3034 3035 // If we need a nested-name-specifier, add one now. 3036 if (!InContext) { 3037 NestedNameSpecifier *NNS 3038 = getRequiredQualification(S.Context, CurContext, 3039 Overridden->getDeclContext()); 3040 if (NNS) { 3041 std::string Str; 3042 llvm::raw_string_ostream OS(Str); 3043 NNS->print(OS, Policy); 3044 Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3045 } 3046 } else if (!InContext->Equals(Overridden->getDeclContext())) 3047 continue; 3048 3049 Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3050 Overridden->getNameAsString())); 3051 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3052 bool FirstParam = true; 3053 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3054 PEnd = Method->param_end(); 3055 P != PEnd; ++P) { 3056 if (FirstParam) 3057 FirstParam = false; 3058 else 3059 Builder.AddChunk(CodeCompletionString::CK_Comma); 3060 3061 Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3062 (*P)->getIdentifier()->getName())); 3063 } 3064 Builder.AddChunk(CodeCompletionString::CK_RightParen); 3065 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3066 CCP_SuperCompletion, 3067 CXCursor_CXXMethod, 3068 CXAvailability_Available, 3069 Overridden)); 3070 Results.Ignore(Overridden); 3071 } 3072 } 3073 3074 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3075 ModuleIdPath Path) { 3076 typedef CodeCompletionResult Result; 3077 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3078 CodeCompleter->getCodeCompletionTUInfo(), 3079 CodeCompletionContext::CCC_Other); 3080 Results.EnterNewScope(); 3081 3082 CodeCompletionAllocator &Allocator = Results.getAllocator(); 3083 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3084 typedef CodeCompletionResult Result; 3085 if (Path.empty()) { 3086 // Enumerate all top-level modules. 3087 llvm::SmallVector<Module *, 8> Modules; 3088 PP.getHeaderSearchInfo().collectAllModules(Modules); 3089 for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3090 Builder.AddTypedTextChunk( 3091 Builder.getAllocator().CopyString(Modules[I]->Name)); 3092 Results.AddResult(Result(Builder.TakeString(), 3093 CCP_Declaration, 3094 CXCursor_NotImplemented, 3095 Modules[I]->isAvailable() 3096 ? CXAvailability_Available 3097 : CXAvailability_NotAvailable)); 3098 } 3099 } else { 3100 // Load the named module. 3101 Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3102 Module::AllVisible, 3103 /*IsInclusionDirective=*/false); 3104 // Enumerate submodules. 3105 if (Mod) { 3106 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3107 SubEnd = Mod->submodule_end(); 3108 Sub != SubEnd; ++Sub) { 3109 3110 Builder.AddTypedTextChunk( 3111 Builder.getAllocator().CopyString((*Sub)->Name)); 3112 Results.AddResult(Result(Builder.TakeString(), 3113 CCP_Declaration, 3114 CXCursor_NotImplemented, 3115 (*Sub)->isAvailable() 3116 ? CXAvailability_Available 3117 : CXAvailability_NotAvailable)); 3118 } 3119 } 3120 } 3121 Results.ExitScope(); 3122 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3123 Results.data(),Results.size()); 3124 } 3125 3126 void Sema::CodeCompleteOrdinaryName(Scope *S, 3127 ParserCompletionContext CompletionContext) { 3128 typedef CodeCompletionResult Result; 3129 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3130 CodeCompleter->getCodeCompletionTUInfo(), 3131 mapCodeCompletionContext(*this, CompletionContext)); 3132 Results.EnterNewScope(); 3133 3134 // Determine how to filter results, e.g., so that the names of 3135 // values (functions, enumerators, function templates, etc.) are 3136 // only allowed where we can have an expression. 3137 switch (CompletionContext) { 3138 case PCC_Namespace: 3139 case PCC_Class: 3140 case PCC_ObjCInterface: 3141 case PCC_ObjCImplementation: 3142 case PCC_ObjCInstanceVariableList: 3143 case PCC_Template: 3144 case PCC_MemberTemplate: 3145 case PCC_Type: 3146 case PCC_LocalDeclarationSpecifiers: 3147 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 3148 break; 3149 3150 case PCC_Statement: 3151 case PCC_ParenthesizedExpression: 3152 case PCC_Expression: 3153 case PCC_ForInit: 3154 case PCC_Condition: 3155 if (WantTypesInContext(CompletionContext, getLangOpts())) 3156 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3157 else 3158 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3159 3160 if (getLangOpts().CPlusPlus) 3161 MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 3162 break; 3163 3164 case PCC_RecoveryInFunction: 3165 // Unfiltered 3166 break; 3167 } 3168 3169 // If we are in a C++ non-static member function, check the qualifiers on 3170 // the member function to filter/prioritize the results list. 3171 if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 3172 if (CurMethod->isInstance()) 3173 Results.setObjectTypeQualifiers( 3174 Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 3175 3176 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3177 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3178 CodeCompleter->includeGlobals()); 3179 3180 AddOrdinaryNameResults(CompletionContext, S, *this, Results); 3181 Results.ExitScope(); 3182 3183 switch (CompletionContext) { 3184 case PCC_ParenthesizedExpression: 3185 case PCC_Expression: 3186 case PCC_Statement: 3187 case PCC_RecoveryInFunction: 3188 if (S->getFnParent()) 3189 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3190 break; 3191 3192 case PCC_Namespace: 3193 case PCC_Class: 3194 case PCC_ObjCInterface: 3195 case PCC_ObjCImplementation: 3196 case PCC_ObjCInstanceVariableList: 3197 case PCC_Template: 3198 case PCC_MemberTemplate: 3199 case PCC_ForInit: 3200 case PCC_Condition: 3201 case PCC_Type: 3202 case PCC_LocalDeclarationSpecifiers: 3203 break; 3204 } 3205 3206 if (CodeCompleter->includeMacros()) 3207 AddMacroResults(PP, Results); 3208 3209 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3210 Results.data(),Results.size()); 3211 } 3212 3213 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3214 ParsedType Receiver, 3215 IdentifierInfo **SelIdents, 3216 unsigned NumSelIdents, 3217 bool AtArgumentExpression, 3218 bool IsSuper, 3219 ResultBuilder &Results); 3220 3221 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3222 bool AllowNonIdentifiers, 3223 bool AllowNestedNameSpecifiers) { 3224 typedef CodeCompletionResult Result; 3225 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3226 CodeCompleter->getCodeCompletionTUInfo(), 3227 AllowNestedNameSpecifiers 3228 ? CodeCompletionContext::CCC_PotentiallyQualifiedName 3229 : CodeCompletionContext::CCC_Name); 3230 Results.EnterNewScope(); 3231 3232 // Type qualifiers can come after names. 3233 Results.AddResult(Result("const")); 3234 Results.AddResult(Result("volatile")); 3235 if (getLangOpts().C99) 3236 Results.AddResult(Result("restrict")); 3237 3238 if (getLangOpts().CPlusPlus) { 3239 if (AllowNonIdentifiers) { 3240 Results.AddResult(Result("operator")); 3241 } 3242 3243 // Add nested-name-specifiers. 3244 if (AllowNestedNameSpecifiers) { 3245 Results.allowNestedNameSpecifiers(); 3246 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 3247 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3248 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 3249 CodeCompleter->includeGlobals()); 3250 Results.setFilter(0); 3251 } 3252 } 3253 Results.ExitScope(); 3254 3255 // If we're in a context where we might have an expression (rather than a 3256 // declaration), and what we've seen so far is an Objective-C type that could 3257 // be a receiver of a class message, this may be a class message send with 3258 // the initial opening bracket '[' missing. Add appropriate completions. 3259 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3260 DS.getTypeSpecType() == DeclSpec::TST_typename && 3261 DS.getStorageClassSpecAsWritten() == DeclSpec::SCS_unspecified && 3262 !DS.isThreadSpecified() && !DS.isExternInLinkageSpec() && 3263 DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3264 DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3265 DS.getTypeQualifiers() == 0 && 3266 S && 3267 (S->getFlags() & Scope::DeclScope) != 0 && 3268 (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3269 Scope::FunctionPrototypeScope | 3270 Scope::AtCatchScope)) == 0) { 3271 ParsedType T = DS.getRepAsType(); 3272 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 3273 AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results); 3274 } 3275 3276 // Note that we intentionally suppress macro results here, since we do not 3277 // encourage using macros to produce the names of entities. 3278 3279 HandleCodeCompleteResults(this, CodeCompleter, 3280 Results.getCompletionContext(), 3281 Results.data(), Results.size()); 3282 } 3283 3284 struct Sema::CodeCompleteExpressionData { 3285 CodeCompleteExpressionData(QualType PreferredType = QualType()) 3286 : PreferredType(PreferredType), IntegralConstantExpression(false), 3287 ObjCCollection(false) { } 3288 3289 QualType PreferredType; 3290 bool IntegralConstantExpression; 3291 bool ObjCCollection; 3292 SmallVector<Decl *, 4> IgnoreDecls; 3293 }; 3294 3295 /// \brief Perform code-completion in an expression context when we know what 3296 /// type we're looking for. 3297 void Sema::CodeCompleteExpression(Scope *S, 3298 const CodeCompleteExpressionData &Data) { 3299 typedef CodeCompletionResult Result; 3300 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3301 CodeCompleter->getCodeCompletionTUInfo(), 3302 CodeCompletionContext::CCC_Expression); 3303 if (Data.ObjCCollection) 3304 Results.setFilter(&ResultBuilder::IsObjCCollection); 3305 else if (Data.IntegralConstantExpression) 3306 Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3307 else if (WantTypesInContext(PCC_Expression, getLangOpts())) 3308 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3309 else 3310 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3311 3312 if (!Data.PreferredType.isNull()) 3313 Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3314 3315 // Ignore any declarations that we were told that we don't care about. 3316 for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3317 Results.Ignore(Data.IgnoreDecls[I]); 3318 3319 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3320 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3321 CodeCompleter->includeGlobals()); 3322 3323 Results.EnterNewScope(); 3324 AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 3325 Results.ExitScope(); 3326 3327 bool PreferredTypeIsPointer = false; 3328 if (!Data.PreferredType.isNull()) 3329 PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3330 || Data.PreferredType->isMemberPointerType() 3331 || Data.PreferredType->isBlockPointerType(); 3332 3333 if (S->getFnParent() && 3334 !Data.ObjCCollection && 3335 !Data.IntegralConstantExpression) 3336 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3337 3338 if (CodeCompleter->includeMacros()) 3339 AddMacroResults(PP, Results, PreferredTypeIsPointer); 3340 HandleCodeCompleteResults(this, CodeCompleter, 3341 CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3342 Data.PreferredType), 3343 Results.data(),Results.size()); 3344 } 3345 3346 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3347 if (E.isInvalid()) 3348 CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3349 else if (getLangOpts().ObjC1) 3350 CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); 3351 } 3352 3353 /// \brief The set of properties that have already been added, referenced by 3354 /// property name. 3355 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 3356 3357 /// \brief Retrieve the container definition, if any? 3358 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3359 if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3360 if (Interface->hasDefinition()) 3361 return Interface->getDefinition(); 3362 3363 return Interface; 3364 } 3365 3366 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3367 if (Protocol->hasDefinition()) 3368 return Protocol->getDefinition(); 3369 3370 return Protocol; 3371 } 3372 return Container; 3373 } 3374 3375 static void AddObjCProperties(ObjCContainerDecl *Container, 3376 bool AllowCategories, 3377 bool AllowNullaryMethods, 3378 DeclContext *CurContext, 3379 AddedPropertiesSet &AddedProperties, 3380 ResultBuilder &Results) { 3381 typedef CodeCompletionResult Result; 3382 3383 // Retrieve the definition. 3384 Container = getContainerDef(Container); 3385 3386 // Add properties in this container. 3387 for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 3388 PEnd = Container->prop_end(); 3389 P != PEnd; 3390 ++P) { 3391 if (AddedProperties.insert(P->getIdentifier())) 3392 Results.MaybeAddResult(Result(*P, 0), CurContext); 3393 } 3394 3395 // Add nullary methods 3396 if (AllowNullaryMethods) { 3397 ASTContext &Context = Container->getASTContext(); 3398 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 3399 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 3400 MEnd = Container->meth_end(); 3401 M != MEnd; ++M) { 3402 if (M->getSelector().isUnarySelector()) 3403 if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 3404 if (AddedProperties.insert(Name)) { 3405 CodeCompletionBuilder Builder(Results.getAllocator(), 3406 Results.getCodeCompletionTUInfo()); 3407 AddResultTypeChunk(Context, Policy, *M, Builder); 3408 Builder.AddTypedTextChunk( 3409 Results.getAllocator().CopyString(Name->getName())); 3410 3411 Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3412 CCP_MemberDeclaration + CCD_MethodAsProperty), 3413 CurContext); 3414 } 3415 } 3416 } 3417 3418 3419 // Add properties in referenced protocols. 3420 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3421 for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 3422 PEnd = Protocol->protocol_end(); 3423 P != PEnd; ++P) 3424 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3425 AddedProperties, Results); 3426 } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3427 if (AllowCategories) { 3428 // Look through categories. 3429 for (ObjCCategoryDecl *Category = IFace->getCategoryList(); 3430 Category; Category = Category->getNextClassCategory()) 3431 AddObjCProperties(Category, AllowCategories, AllowNullaryMethods, 3432 CurContext, AddedProperties, Results); 3433 } 3434 3435 // Look through protocols. 3436 for (ObjCInterfaceDecl::all_protocol_iterator 3437 I = IFace->all_referenced_protocol_begin(), 3438 E = IFace->all_referenced_protocol_end(); I != E; ++I) 3439 AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 3440 AddedProperties, Results); 3441 3442 // Look in the superclass. 3443 if (IFace->getSuperClass()) 3444 AddObjCProperties(IFace->getSuperClass(), AllowCategories, 3445 AllowNullaryMethods, CurContext, 3446 AddedProperties, Results); 3447 } else if (const ObjCCategoryDecl *Category 3448 = dyn_cast<ObjCCategoryDecl>(Container)) { 3449 // Look through protocols. 3450 for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 3451 PEnd = Category->protocol_end(); 3452 P != PEnd; ++P) 3453 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3454 AddedProperties, Results); 3455 } 3456 } 3457 3458 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 3459 SourceLocation OpLoc, 3460 bool IsArrow) { 3461 if (!Base || !CodeCompleter) 3462 return; 3463 3464 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3465 if (ConvertedBase.isInvalid()) 3466 return; 3467 Base = ConvertedBase.get(); 3468 3469 typedef CodeCompletionResult Result; 3470 3471 QualType BaseType = Base->getType(); 3472 3473 if (IsArrow) { 3474 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 3475 BaseType = Ptr->getPointeeType(); 3476 else if (BaseType->isObjCObjectPointerType()) 3477 /*Do nothing*/ ; 3478 else 3479 return; 3480 } 3481 3482 enum CodeCompletionContext::Kind contextKind; 3483 3484 if (IsArrow) { 3485 contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 3486 } 3487 else { 3488 if (BaseType->isObjCObjectPointerType() || 3489 BaseType->isObjCObjectOrInterfaceType()) { 3490 contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 3491 } 3492 else { 3493 contextKind = CodeCompletionContext::CCC_DotMemberAccess; 3494 } 3495 } 3496 3497 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3498 CodeCompleter->getCodeCompletionTUInfo(), 3499 CodeCompletionContext(contextKind, 3500 BaseType), 3501 &ResultBuilder::IsMember); 3502 Results.EnterNewScope(); 3503 if (const RecordType *Record = BaseType->getAs<RecordType>()) { 3504 // Indicate that we are performing a member access, and the cv-qualifiers 3505 // for the base object type. 3506 Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 3507 3508 // Access to a C/C++ class, struct, or union. 3509 Results.allowNestedNameSpecifiers(); 3510 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3511 LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 3512 CodeCompleter->includeGlobals()); 3513 3514 if (getLangOpts().CPlusPlus) { 3515 if (!Results.empty()) { 3516 // The "template" keyword can follow "->" or "." in the grammar. 3517 // However, we only want to suggest the template keyword if something 3518 // is dependent. 3519 bool IsDependent = BaseType->isDependentType(); 3520 if (!IsDependent) { 3521 for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 3522 if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 3523 IsDependent = Ctx->isDependentContext(); 3524 break; 3525 } 3526 } 3527 3528 if (IsDependent) 3529 Results.AddResult(Result("template")); 3530 } 3531 } 3532 } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 3533 // Objective-C property reference. 3534 AddedPropertiesSet AddedProperties; 3535 3536 // Add property results based on our interface. 3537 const ObjCObjectPointerType *ObjCPtr 3538 = BaseType->getAsObjCInterfacePointerType(); 3539 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 3540 AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 3541 /*AllowNullaryMethods=*/true, CurContext, 3542 AddedProperties, Results); 3543 3544 // Add properties from the protocols in a qualified interface. 3545 for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 3546 E = ObjCPtr->qual_end(); 3547 I != E; ++I) 3548 AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 3549 AddedProperties, Results); 3550 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3551 (!IsArrow && BaseType->isObjCObjectType())) { 3552 // Objective-C instance variable access. 3553 ObjCInterfaceDecl *Class = 0; 3554 if (const ObjCObjectPointerType *ObjCPtr 3555 = BaseType->getAs<ObjCObjectPointerType>()) 3556 Class = ObjCPtr->getInterfaceDecl(); 3557 else 3558 Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 3559 3560 // Add all ivars from this class and its superclasses. 3561 if (Class) { 3562 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3563 Results.setFilter(&ResultBuilder::IsObjCIvar); 3564 LookupVisibleDecls(Class, LookupMemberName, Consumer, 3565 CodeCompleter->includeGlobals()); 3566 } 3567 } 3568 3569 // FIXME: How do we cope with isa? 3570 3571 Results.ExitScope(); 3572 3573 // Hand off the results found for code completion. 3574 HandleCodeCompleteResults(this, CodeCompleter, 3575 Results.getCompletionContext(), 3576 Results.data(),Results.size()); 3577 } 3578 3579 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3580 if (!CodeCompleter) 3581 return; 3582 3583 typedef CodeCompletionResult Result; 3584 ResultBuilder::LookupFilter Filter = 0; 3585 enum CodeCompletionContext::Kind ContextKind 3586 = CodeCompletionContext::CCC_Other; 3587 switch ((DeclSpec::TST)TagSpec) { 3588 case DeclSpec::TST_enum: 3589 Filter = &ResultBuilder::IsEnum; 3590 ContextKind = CodeCompletionContext::CCC_EnumTag; 3591 break; 3592 3593 case DeclSpec::TST_union: 3594 Filter = &ResultBuilder::IsUnion; 3595 ContextKind = CodeCompletionContext::CCC_UnionTag; 3596 break; 3597 3598 case DeclSpec::TST_struct: 3599 case DeclSpec::TST_class: 3600 Filter = &ResultBuilder::IsClassOrStruct; 3601 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3602 break; 3603 3604 default: 3605 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3606 } 3607 3608 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3609 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 3610 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3611 3612 // First pass: look for tags. 3613 Results.setFilter(Filter); 3614 LookupVisibleDecls(S, LookupTagName, Consumer, 3615 CodeCompleter->includeGlobals()); 3616 3617 if (CodeCompleter->includeGlobals()) { 3618 // Second pass: look for nested name specifiers. 3619 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 3620 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 3621 } 3622 3623 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3624 Results.data(),Results.size()); 3625 } 3626 3627 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3628 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3629 CodeCompleter->getCodeCompletionTUInfo(), 3630 CodeCompletionContext::CCC_TypeQualifiers); 3631 Results.EnterNewScope(); 3632 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 3633 Results.AddResult("const"); 3634 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 3635 Results.AddResult("volatile"); 3636 if (getLangOpts().C99 && 3637 !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 3638 Results.AddResult("restrict"); 3639 Results.ExitScope(); 3640 HandleCodeCompleteResults(this, CodeCompleter, 3641 Results.getCompletionContext(), 3642 Results.data(), Results.size()); 3643 } 3644 3645 void Sema::CodeCompleteCase(Scope *S) { 3646 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 3647 return; 3648 3649 SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3650 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3651 if (!type->isEnumeralType()) { 3652 CodeCompleteExpressionData Data(type); 3653 Data.IntegralConstantExpression = true; 3654 CodeCompleteExpression(S, Data); 3655 return; 3656 } 3657 3658 // Code-complete the cases of a switch statement over an enumeration type 3659 // by providing the list of 3660 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3661 if (EnumDecl *Def = Enum->getDefinition()) 3662 Enum = Def; 3663 3664 // Determine which enumerators we have already seen in the switch statement. 3665 // FIXME: Ideally, we would also be able to look *past* the code-completion 3666 // token, in case we are code-completing in the middle of the switch and not 3667 // at the end. However, we aren't able to do so at the moment. 3668 llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3669 NestedNameSpecifier *Qualifier = 0; 3670 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 3671 SC = SC->getNextSwitchCase()) { 3672 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 3673 if (!Case) 3674 continue; 3675 3676 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 3677 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 3678 if (EnumConstantDecl *Enumerator 3679 = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 3680 // We look into the AST of the case statement to determine which 3681 // enumerator was named. Alternatively, we could compute the value of 3682 // the integral constant expression, then compare it against the 3683 // values of each enumerator. However, value-based approach would not 3684 // work as well with C++ templates where enumerators declared within a 3685 // template are type- and value-dependent. 3686 EnumeratorsSeen.insert(Enumerator); 3687 3688 // If this is a qualified-id, keep track of the nested-name-specifier 3689 // so that we can reproduce it as part of code completion, e.g., 3690 // 3691 // switch (TagD.getKind()) { 3692 // case TagDecl::TK_enum: 3693 // break; 3694 // case XXX 3695 // 3696 // At the XXX, our completions are TagDecl::TK_union, 3697 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 3698 // TK_struct, and TK_class. 3699 Qualifier = DRE->getQualifier(); 3700 } 3701 } 3702 3703 if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3704 // If there are no prior enumerators in C++, check whether we have to 3705 // qualify the names of the enumerators that we suggest, because they 3706 // may not be visible in this scope. 3707 Qualifier = getRequiredQualification(Context, CurContext, Enum); 3708 } 3709 3710 // Add any enumerators that have not yet been mentioned. 3711 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3712 CodeCompleter->getCodeCompletionTUInfo(), 3713 CodeCompletionContext::CCC_Expression); 3714 Results.EnterNewScope(); 3715 for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 3716 EEnd = Enum->enumerator_end(); 3717 E != EEnd; ++E) { 3718 if (EnumeratorsSeen.count(*E)) 3719 continue; 3720 3721 CodeCompletionResult R(*E, Qualifier); 3722 R.Priority = CCP_EnumInCase; 3723 Results.AddResult(R, CurContext, 0, false); 3724 } 3725 Results.ExitScope(); 3726 3727 //We need to make sure we're setting the right context, 3728 //so only say we include macros if the code completer says we do 3729 enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 3730 if (CodeCompleter->includeMacros()) { 3731 AddMacroResults(PP, Results); 3732 kind = CodeCompletionContext::CCC_OtherWithMacros; 3733 } 3734 3735 HandleCodeCompleteResults(this, CodeCompleter, 3736 kind, 3737 Results.data(),Results.size()); 3738 } 3739 3740 namespace { 3741 struct IsBetterOverloadCandidate { 3742 Sema &S; 3743 SourceLocation Loc; 3744 3745 public: 3746 explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 3747 : S(S), Loc(Loc) { } 3748 3749 bool 3750 operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3751 return isBetterOverloadCandidate(S, X, Y, Loc); 3752 } 3753 }; 3754 } 3755 3756 static bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { 3757 if (Args.size() && !Args.data()) 3758 return true; 3759 3760 for (unsigned I = 0; I != Args.size(); ++I) 3761 if (!Args[I]) 3762 return true; 3763 3764 return false; 3765 } 3766 3767 void Sema::CodeCompleteCall(Scope *S, Expr *FnIn, 3768 llvm::ArrayRef<Expr *> Args) { 3769 if (!CodeCompleter) 3770 return; 3771 3772 // When we're code-completing for a call, we fall back to ordinary 3773 // name code-completion whenever we can't produce specific 3774 // results. We may want to revisit this strategy in the future, 3775 // e.g., by merging the two kinds of results. 3776 3777 Expr *Fn = (Expr *)FnIn; 3778 3779 // Ignore type-dependent call expressions entirely. 3780 if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 3781 Expr::hasAnyTypeDependentArguments(Args)) { 3782 CodeCompleteOrdinaryName(S, PCC_Expression); 3783 return; 3784 } 3785 3786 // Build an overload candidate set based on the functions we find. 3787 SourceLocation Loc = Fn->getExprLoc(); 3788 OverloadCandidateSet CandidateSet(Loc); 3789 3790 // FIXME: What if we're calling something that isn't a function declaration? 3791 // FIXME: What if we're calling a pseudo-destructor? 3792 // FIXME: What if we're calling a member function? 3793 3794 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 3795 SmallVector<ResultCandidate, 8> Results; 3796 3797 Expr *NakedFn = Fn->IgnoreParenCasts(); 3798 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 3799 AddOverloadedCallCandidates(ULE, Args, CandidateSet, 3800 /*PartialOverloading=*/ true); 3801 else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 3802 FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3803 if (FDecl) { 3804 if (!getLangOpts().CPlusPlus || 3805 !FDecl->getType()->getAs<FunctionProtoType>()) 3806 Results.push_back(ResultCandidate(FDecl)); 3807 else 3808 // FIXME: access? 3809 AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 3810 CandidateSet, false, /*PartialOverloading*/true); 3811 } 3812 } 3813 3814 QualType ParamType; 3815 3816 if (!CandidateSet.empty()) { 3817 // Sort the overload candidate set by placing the best overloads first. 3818 std::stable_sort(CandidateSet.begin(), CandidateSet.end(), 3819 IsBetterOverloadCandidate(*this, Loc)); 3820 3821 // Add the remaining viable overload candidates as code-completion reslults. 3822 for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3823 CandEnd = CandidateSet.end(); 3824 Cand != CandEnd; ++Cand) { 3825 if (Cand->Viable) 3826 Results.push_back(ResultCandidate(Cand->Function)); 3827 } 3828 3829 // From the viable candidates, try to determine the type of this parameter. 3830 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 3831 if (const FunctionType *FType = Results[I].getFunctionType()) 3832 if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 3833 if (Args.size() < Proto->getNumArgs()) { 3834 if (ParamType.isNull()) 3835 ParamType = Proto->getArgType(Args.size()); 3836 else if (!Context.hasSameUnqualifiedType( 3837 ParamType.getNonReferenceType(), 3838 Proto->getArgType(Args.size()).getNonReferenceType())) { 3839 ParamType = QualType(); 3840 break; 3841 } 3842 } 3843 } 3844 } else { 3845 // Try to determine the parameter type from the type of the expression 3846 // being called. 3847 QualType FunctionType = Fn->getType(); 3848 if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 3849 FunctionType = Ptr->getPointeeType(); 3850 else if (const BlockPointerType *BlockPtr 3851 = FunctionType->getAs<BlockPointerType>()) 3852 FunctionType = BlockPtr->getPointeeType(); 3853 else if (const MemberPointerType *MemPtr 3854 = FunctionType->getAs<MemberPointerType>()) 3855 FunctionType = MemPtr->getPointeeType(); 3856 3857 if (const FunctionProtoType *Proto 3858 = FunctionType->getAs<FunctionProtoType>()) { 3859 if (Args.size() < Proto->getNumArgs()) 3860 ParamType = Proto->getArgType(Args.size()); 3861 } 3862 } 3863 3864 if (ParamType.isNull()) 3865 CodeCompleteOrdinaryName(S, PCC_Expression); 3866 else 3867 CodeCompleteExpression(S, ParamType); 3868 3869 if (!Results.empty()) 3870 CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3871 Results.size()); 3872 } 3873 3874 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3875 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 3876 if (!VD) { 3877 CodeCompleteOrdinaryName(S, PCC_Expression); 3878 return; 3879 } 3880 3881 CodeCompleteExpression(S, VD->getType()); 3882 } 3883 3884 void Sema::CodeCompleteReturn(Scope *S) { 3885 QualType ResultType; 3886 if (isa<BlockDecl>(CurContext)) { 3887 if (BlockScopeInfo *BSI = getCurBlock()) 3888 ResultType = BSI->ReturnType; 3889 } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 3890 ResultType = Function->getResultType(); 3891 else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 3892 ResultType = Method->getResultType(); 3893 3894 if (ResultType.isNull()) 3895 CodeCompleteOrdinaryName(S, PCC_Expression); 3896 else 3897 CodeCompleteExpression(S, ResultType); 3898 } 3899 3900 void Sema::CodeCompleteAfterIf(Scope *S) { 3901 typedef CodeCompletionResult Result; 3902 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3903 CodeCompleter->getCodeCompletionTUInfo(), 3904 mapCodeCompletionContext(*this, PCC_Statement)); 3905 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3906 Results.EnterNewScope(); 3907 3908 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3909 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3910 CodeCompleter->includeGlobals()); 3911 3912 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3913 3914 // "else" block 3915 CodeCompletionBuilder Builder(Results.getAllocator(), 3916 Results.getCodeCompletionTUInfo()); 3917 Builder.AddTypedTextChunk("else"); 3918 if (Results.includeCodePatterns()) { 3919 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3920 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3921 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3922 Builder.AddPlaceholderChunk("statements"); 3923 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3924 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3925 } 3926 Results.AddResult(Builder.TakeString()); 3927 3928 // "else if" block 3929 Builder.AddTypedTextChunk("else"); 3930 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3931 Builder.AddTextChunk("if"); 3932 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3933 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3934 if (getLangOpts().CPlusPlus) 3935 Builder.AddPlaceholderChunk("condition"); 3936 else 3937 Builder.AddPlaceholderChunk("expression"); 3938 Builder.AddChunk(CodeCompletionString::CK_RightParen); 3939 if (Results.includeCodePatterns()) { 3940 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3941 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3942 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3943 Builder.AddPlaceholderChunk("statements"); 3944 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3945 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3946 } 3947 Results.AddResult(Builder.TakeString()); 3948 3949 Results.ExitScope(); 3950 3951 if (S->getFnParent()) 3952 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3953 3954 if (CodeCompleter->includeMacros()) 3955 AddMacroResults(PP, Results); 3956 3957 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3958 Results.data(),Results.size()); 3959 } 3960 3961 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 3962 if (LHS) 3963 CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 3964 else 3965 CodeCompleteOrdinaryName(S, PCC_Expression); 3966 } 3967 3968 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 3969 bool EnteringContext) { 3970 if (!SS.getScopeRep() || !CodeCompleter) 3971 return; 3972 3973 DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 3974 if (!Ctx) 3975 return; 3976 3977 // Try to instantiate any non-dependent declaration contexts before 3978 // we look in them. 3979 if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 3980 return; 3981 3982 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3983 CodeCompleter->getCodeCompletionTUInfo(), 3984 CodeCompletionContext::CCC_Name); 3985 Results.EnterNewScope(); 3986 3987 // The "template" keyword can follow "::" in the grammar, but only 3988 // put it into the grammar if the nested-name-specifier is dependent. 3989 NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 3990 if (!Results.empty() && NNS->isDependent()) 3991 Results.AddResult("template"); 3992 3993 // Add calls to overridden virtual functions, if there are any. 3994 // 3995 // FIXME: This isn't wonderful, because we don't know whether we're actually 3996 // in a context that permits expressions. This is a general issue with 3997 // qualified-id completions. 3998 if (!EnteringContext) 3999 MaybeAddOverrideCalls(*this, Ctx, Results); 4000 Results.ExitScope(); 4001 4002 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4003 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 4004 4005 HandleCodeCompleteResults(this, CodeCompleter, 4006 Results.getCompletionContext(), 4007 Results.data(),Results.size()); 4008 } 4009 4010 void Sema::CodeCompleteUsing(Scope *S) { 4011 if (!CodeCompleter) 4012 return; 4013 4014 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4015 CodeCompleter->getCodeCompletionTUInfo(), 4016 CodeCompletionContext::CCC_PotentiallyQualifiedName, 4017 &ResultBuilder::IsNestedNameSpecifier); 4018 Results.EnterNewScope(); 4019 4020 // If we aren't in class scope, we could see the "namespace" keyword. 4021 if (!S->isClassScope()) 4022 Results.AddResult(CodeCompletionResult("namespace")); 4023 4024 // After "using", we can see anything that would start a 4025 // nested-name-specifier. 4026 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4027 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4028 CodeCompleter->includeGlobals()); 4029 Results.ExitScope(); 4030 4031 HandleCodeCompleteResults(this, CodeCompleter, 4032 CodeCompletionContext::CCC_PotentiallyQualifiedName, 4033 Results.data(),Results.size()); 4034 } 4035 4036 void Sema::CodeCompleteUsingDirective(Scope *S) { 4037 if (!CodeCompleter) 4038 return; 4039 4040 // After "using namespace", we expect to see a namespace name or namespace 4041 // alias. 4042 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4043 CodeCompleter->getCodeCompletionTUInfo(), 4044 CodeCompletionContext::CCC_Namespace, 4045 &ResultBuilder::IsNamespaceOrAlias); 4046 Results.EnterNewScope(); 4047 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4048 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4049 CodeCompleter->includeGlobals()); 4050 Results.ExitScope(); 4051 HandleCodeCompleteResults(this, CodeCompleter, 4052 CodeCompletionContext::CCC_Namespace, 4053 Results.data(),Results.size()); 4054 } 4055 4056 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 4057 if (!CodeCompleter) 4058 return; 4059 4060 DeclContext *Ctx = (DeclContext *)S->getEntity(); 4061 if (!S->getParent()) 4062 Ctx = Context.getTranslationUnitDecl(); 4063 4064 bool SuppressedGlobalResults 4065 = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 4066 4067 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4068 CodeCompleter->getCodeCompletionTUInfo(), 4069 SuppressedGlobalResults 4070 ? CodeCompletionContext::CCC_Namespace 4071 : CodeCompletionContext::CCC_Other, 4072 &ResultBuilder::IsNamespace); 4073 4074 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 4075 // We only want to see those namespaces that have already been defined 4076 // within this scope, because its likely that the user is creating an 4077 // extended namespace declaration. Keep track of the most recent 4078 // definition of each namespace. 4079 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 4080 for (DeclContext::specific_decl_iterator<NamespaceDecl> 4081 NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 4082 NS != NSEnd; ++NS) 4083 OrigToLatest[NS->getOriginalNamespace()] = *NS; 4084 4085 // Add the most recent definition (or extended definition) of each 4086 // namespace to the list of results. 4087 Results.EnterNewScope(); 4088 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 4089 NS = OrigToLatest.begin(), 4090 NSEnd = OrigToLatest.end(); 4091 NS != NSEnd; ++NS) 4092 Results.AddResult(CodeCompletionResult(NS->second, 0), 4093 CurContext, 0, false); 4094 Results.ExitScope(); 4095 } 4096 4097 HandleCodeCompleteResults(this, CodeCompleter, 4098 Results.getCompletionContext(), 4099 Results.data(),Results.size()); 4100 } 4101 4102 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 4103 if (!CodeCompleter) 4104 return; 4105 4106 // After "namespace", we expect to see a namespace or alias. 4107 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4108 CodeCompleter->getCodeCompletionTUInfo(), 4109 CodeCompletionContext::CCC_Namespace, 4110 &ResultBuilder::IsNamespaceOrAlias); 4111 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4112 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4113 CodeCompleter->includeGlobals()); 4114 HandleCodeCompleteResults(this, CodeCompleter, 4115 Results.getCompletionContext(), 4116 Results.data(),Results.size()); 4117 } 4118 4119 void Sema::CodeCompleteOperatorName(Scope *S) { 4120 if (!CodeCompleter) 4121 return; 4122 4123 typedef CodeCompletionResult Result; 4124 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4125 CodeCompleter->getCodeCompletionTUInfo(), 4126 CodeCompletionContext::CCC_Type, 4127 &ResultBuilder::IsType); 4128 Results.EnterNewScope(); 4129 4130 // Add the names of overloadable operators. 4131 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4132 if (std::strcmp(Spelling, "?")) \ 4133 Results.AddResult(Result(Spelling)); 4134 #include "clang/Basic/OperatorKinds.def" 4135 4136 // Add any type names visible from the current scope 4137 Results.allowNestedNameSpecifiers(); 4138 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4139 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4140 CodeCompleter->includeGlobals()); 4141 4142 // Add any type specifiers 4143 AddTypeSpecifierResults(getLangOpts(), Results); 4144 Results.ExitScope(); 4145 4146 HandleCodeCompleteResults(this, CodeCompleter, 4147 CodeCompletionContext::CCC_Type, 4148 Results.data(),Results.size()); 4149 } 4150 4151 void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, 4152 CXXCtorInitializer** Initializers, 4153 unsigned NumInitializers) { 4154 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 4155 CXXConstructorDecl *Constructor 4156 = static_cast<CXXConstructorDecl *>(ConstructorD); 4157 if (!Constructor) 4158 return; 4159 4160 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4161 CodeCompleter->getCodeCompletionTUInfo(), 4162 CodeCompletionContext::CCC_PotentiallyQualifiedName); 4163 Results.EnterNewScope(); 4164 4165 // Fill in any already-initialized fields or base classes. 4166 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 4167 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 4168 for (unsigned I = 0; I != NumInitializers; ++I) { 4169 if (Initializers[I]->isBaseInitializer()) 4170 InitializedBases.insert( 4171 Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 4172 else 4173 InitializedFields.insert(cast<FieldDecl>( 4174 Initializers[I]->getAnyMember())); 4175 } 4176 4177 // Add completions for base classes. 4178 CodeCompletionBuilder Builder(Results.getAllocator(), 4179 Results.getCodeCompletionTUInfo()); 4180 bool SawLastInitializer = (NumInitializers == 0); 4181 CXXRecordDecl *ClassDecl = Constructor->getParent(); 4182 for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 4183 BaseEnd = ClassDecl->bases_end(); 4184 Base != BaseEnd; ++Base) { 4185 if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 4186 SawLastInitializer 4187 = NumInitializers > 0 && 4188 Initializers[NumInitializers - 1]->isBaseInitializer() && 4189 Context.hasSameUnqualifiedType(Base->getType(), 4190 QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 4191 continue; 4192 } 4193 4194 Builder.AddTypedTextChunk( 4195 Results.getAllocator().CopyString( 4196 Base->getType().getAsString(Policy))); 4197 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4198 Builder.AddPlaceholderChunk("args"); 4199 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4200 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4201 SawLastInitializer? CCP_NextInitializer 4202 : CCP_MemberDeclaration)); 4203 SawLastInitializer = false; 4204 } 4205 4206 // Add completions for virtual base classes. 4207 for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 4208 BaseEnd = ClassDecl->vbases_end(); 4209 Base != BaseEnd; ++Base) { 4210 if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 4211 SawLastInitializer 4212 = NumInitializers > 0 && 4213 Initializers[NumInitializers - 1]->isBaseInitializer() && 4214 Context.hasSameUnqualifiedType(Base->getType(), 4215 QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); 4216 continue; 4217 } 4218 4219 Builder.AddTypedTextChunk( 4220 Builder.getAllocator().CopyString( 4221 Base->getType().getAsString(Policy))); 4222 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4223 Builder.AddPlaceholderChunk("args"); 4224 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4225 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4226 SawLastInitializer? CCP_NextInitializer 4227 : CCP_MemberDeclaration)); 4228 SawLastInitializer = false; 4229 } 4230 4231 // Add completions for members. 4232 for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), 4233 FieldEnd = ClassDecl->field_end(); 4234 Field != FieldEnd; ++Field) { 4235 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 4236 SawLastInitializer 4237 = NumInitializers > 0 && 4238 Initializers[NumInitializers - 1]->isAnyMemberInitializer() && 4239 Initializers[NumInitializers - 1]->getAnyMember() == *Field; 4240 continue; 4241 } 4242 4243 if (!Field->getDeclName()) 4244 continue; 4245 4246 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4247 Field->getIdentifier()->getName())); 4248 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4249 Builder.AddPlaceholderChunk("args"); 4250 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4251 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4252 SawLastInitializer? CCP_NextInitializer 4253 : CCP_MemberDeclaration, 4254 CXCursor_MemberRef, 4255 CXAvailability_Available, 4256 *Field)); 4257 SawLastInitializer = false; 4258 } 4259 Results.ExitScope(); 4260 4261 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4262 Results.data(), Results.size()); 4263 } 4264 4265 /// \brief Determine whether this scope denotes a namespace. 4266 static bool isNamespaceScope(Scope *S) { 4267 DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); 4268 if (!DC) 4269 return false; 4270 4271 return DC->isFileContext(); 4272 } 4273 4274 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 4275 bool AfterAmpersand) { 4276 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4277 CodeCompleter->getCodeCompletionTUInfo(), 4278 CodeCompletionContext::CCC_Other); 4279 Results.EnterNewScope(); 4280 4281 // Note what has already been captured. 4282 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 4283 bool IncludedThis = false; 4284 for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 4285 CEnd = Intro.Captures.end(); 4286 C != CEnd; ++C) { 4287 if (C->Kind == LCK_This) { 4288 IncludedThis = true; 4289 continue; 4290 } 4291 4292 Known.insert(C->Id); 4293 } 4294 4295 // Look for other capturable variables. 4296 for (; S && !isNamespaceScope(S); S = S->getParent()) { 4297 for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 4298 D != DEnd; ++D) { 4299 VarDecl *Var = dyn_cast<VarDecl>(*D); 4300 if (!Var || 4301 !Var->hasLocalStorage() || 4302 Var->hasAttr<BlocksAttr>()) 4303 continue; 4304 4305 if (Known.insert(Var->getIdentifier())) 4306 Results.AddResult(CodeCompletionResult(Var), CurContext, 0, false); 4307 } 4308 } 4309 4310 // Add 'this', if it would be valid. 4311 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 4312 addThisCompletion(*this, Results); 4313 4314 Results.ExitScope(); 4315 4316 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4317 Results.data(), Results.size()); 4318 } 4319 4320 /// Macro that optionally prepends an "@" to the string literal passed in via 4321 /// Keyword, depending on whether NeedAt is true or false. 4322 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4323 4324 static void AddObjCImplementationResults(const LangOptions &LangOpts, 4325 ResultBuilder &Results, 4326 bool NeedAt) { 4327 typedef CodeCompletionResult Result; 4328 // Since we have an implementation, we can end it. 4329 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4330 4331 CodeCompletionBuilder Builder(Results.getAllocator(), 4332 Results.getCodeCompletionTUInfo()); 4333 if (LangOpts.ObjC2) { 4334 // @dynamic 4335 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4336 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4337 Builder.AddPlaceholderChunk("property"); 4338 Results.AddResult(Result(Builder.TakeString())); 4339 4340 // @synthesize 4341 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4342 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4343 Builder.AddPlaceholderChunk("property"); 4344 Results.AddResult(Result(Builder.TakeString())); 4345 } 4346 } 4347 4348 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 4349 ResultBuilder &Results, 4350 bool NeedAt) { 4351 typedef CodeCompletionResult Result; 4352 4353 // Since we have an interface or protocol, we can end it. 4354 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4355 4356 if (LangOpts.ObjC2) { 4357 // @property 4358 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4359 4360 // @required 4361 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4362 4363 // @optional 4364 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4365 } 4366 } 4367 4368 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 4369 typedef CodeCompletionResult Result; 4370 CodeCompletionBuilder Builder(Results.getAllocator(), 4371 Results.getCodeCompletionTUInfo()); 4372 4373 // @class name ; 4374 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4375 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4376 Builder.AddPlaceholderChunk("name"); 4377 Results.AddResult(Result(Builder.TakeString())); 4378 4379 if (Results.includeCodePatterns()) { 4380 // @interface name 4381 // FIXME: Could introduce the whole pattern, including superclasses and 4382 // such. 4383 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4384 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4385 Builder.AddPlaceholderChunk("class"); 4386 Results.AddResult(Result(Builder.TakeString())); 4387 4388 // @protocol name 4389 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4390 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4391 Builder.AddPlaceholderChunk("protocol"); 4392 Results.AddResult(Result(Builder.TakeString())); 4393 4394 // @implementation name 4395 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4396 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4397 Builder.AddPlaceholderChunk("class"); 4398 Results.AddResult(Result(Builder.TakeString())); 4399 } 4400 4401 // @compatibility_alias name 4402 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4403 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4404 Builder.AddPlaceholderChunk("alias"); 4405 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4406 Builder.AddPlaceholderChunk("class"); 4407 Results.AddResult(Result(Builder.TakeString())); 4408 } 4409 4410 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 4411 typedef CodeCompletionResult Result; 4412 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4413 CodeCompleter->getCodeCompletionTUInfo(), 4414 CodeCompletionContext::CCC_Other); 4415 Results.EnterNewScope(); 4416 if (isa<ObjCImplDecl>(CurContext)) 4417 AddObjCImplementationResults(getLangOpts(), Results, false); 4418 else if (CurContext->isObjCContainer()) 4419 AddObjCInterfaceResults(getLangOpts(), Results, false); 4420 else 4421 AddObjCTopLevelResults(Results, false); 4422 Results.ExitScope(); 4423 HandleCodeCompleteResults(this, CodeCompleter, 4424 CodeCompletionContext::CCC_Other, 4425 Results.data(),Results.size()); 4426 } 4427 4428 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 4429 typedef CodeCompletionResult Result; 4430 CodeCompletionBuilder Builder(Results.getAllocator(), 4431 Results.getCodeCompletionTUInfo()); 4432 4433 // @encode ( type-name ) 4434 const char *EncodeType = "char[]"; 4435 if (Results.getSema().getLangOpts().CPlusPlus || 4436 Results.getSema().getLangOpts().ConstStrings) 4437 EncodeType = "const char[]"; 4438 Builder.AddResultTypeChunk(EncodeType); 4439 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4440 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4441 Builder.AddPlaceholderChunk("type-name"); 4442 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4443 Results.AddResult(Result(Builder.TakeString())); 4444 4445 // @protocol ( protocol-name ) 4446 Builder.AddResultTypeChunk("Protocol *"); 4447 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4448 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4449 Builder.AddPlaceholderChunk("protocol-name"); 4450 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4451 Results.AddResult(Result(Builder.TakeString())); 4452 4453 // @selector ( selector ) 4454 Builder.AddResultTypeChunk("SEL"); 4455 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4456 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4457 Builder.AddPlaceholderChunk("selector"); 4458 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4459 Results.AddResult(Result(Builder.TakeString())); 4460 4461 // @"string" 4462 Builder.AddResultTypeChunk("NSString *"); 4463 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\"")); 4464 Builder.AddPlaceholderChunk("string"); 4465 Builder.AddTextChunk("\""); 4466 Results.AddResult(Result(Builder.TakeString())); 4467 4468 // @[objects, ...] 4469 Builder.AddResultTypeChunk("NSArray *"); 4470 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4471 Builder.AddPlaceholderChunk("objects, ..."); 4472 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4473 Results.AddResult(Result(Builder.TakeString())); 4474 4475 // @{key : object, ...} 4476 Builder.AddResultTypeChunk("NSDictionary *"); 4477 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4478 Builder.AddPlaceholderChunk("key"); 4479 Builder.AddChunk(CodeCompletionString::CK_Colon); 4480 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4481 Builder.AddPlaceholderChunk("object, ..."); 4482 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4483 Results.AddResult(Result(Builder.TakeString())); 4484 4485 // @(expression) 4486 Builder.AddResultTypeChunk("id"); 4487 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 4488 Builder.AddPlaceholderChunk("expression"); 4489 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4490 Results.AddResult(Result(Builder.TakeString())); 4491 } 4492 4493 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 4494 typedef CodeCompletionResult Result; 4495 CodeCompletionBuilder Builder(Results.getAllocator(), 4496 Results.getCodeCompletionTUInfo()); 4497 4498 if (Results.includeCodePatterns()) { 4499 // @try { statements } @catch ( declaration ) { statements } @finally 4500 // { statements } 4501 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4502 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4503 Builder.AddPlaceholderChunk("statements"); 4504 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4505 Builder.AddTextChunk("@catch"); 4506 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4507 Builder.AddPlaceholderChunk("parameter"); 4508 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4509 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4510 Builder.AddPlaceholderChunk("statements"); 4511 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4512 Builder.AddTextChunk("@finally"); 4513 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4514 Builder.AddPlaceholderChunk("statements"); 4515 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4516 Results.AddResult(Result(Builder.TakeString())); 4517 } 4518 4519 // @throw 4520 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4521 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4522 Builder.AddPlaceholderChunk("expression"); 4523 Results.AddResult(Result(Builder.TakeString())); 4524 4525 if (Results.includeCodePatterns()) { 4526 // @synchronized ( expression ) { statements } 4527 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4528 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4529 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4530 Builder.AddPlaceholderChunk("expression"); 4531 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4532 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4533 Builder.AddPlaceholderChunk("statements"); 4534 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4535 Results.AddResult(Result(Builder.TakeString())); 4536 } 4537 } 4538 4539 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 4540 ResultBuilder &Results, 4541 bool NeedAt) { 4542 typedef CodeCompletionResult Result; 4543 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4544 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4545 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4546 if (LangOpts.ObjC2) 4547 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4548 } 4549 4550 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4551 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4552 CodeCompleter->getCodeCompletionTUInfo(), 4553 CodeCompletionContext::CCC_Other); 4554 Results.EnterNewScope(); 4555 AddObjCVisibilityResults(getLangOpts(), Results, false); 4556 Results.ExitScope(); 4557 HandleCodeCompleteResults(this, CodeCompleter, 4558 CodeCompletionContext::CCC_Other, 4559 Results.data(),Results.size()); 4560 } 4561 4562 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 4563 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4564 CodeCompleter->getCodeCompletionTUInfo(), 4565 CodeCompletionContext::CCC_Other); 4566 Results.EnterNewScope(); 4567 AddObjCStatementResults(Results, false); 4568 AddObjCExpressionResults(Results, false); 4569 Results.ExitScope(); 4570 HandleCodeCompleteResults(this, CodeCompleter, 4571 CodeCompletionContext::CCC_Other, 4572 Results.data(),Results.size()); 4573 } 4574 4575 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 4576 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4577 CodeCompleter->getCodeCompletionTUInfo(), 4578 CodeCompletionContext::CCC_Other); 4579 Results.EnterNewScope(); 4580 AddObjCExpressionResults(Results, false); 4581 Results.ExitScope(); 4582 HandleCodeCompleteResults(this, CodeCompleter, 4583 CodeCompletionContext::CCC_Other, 4584 Results.data(),Results.size()); 4585 } 4586 4587 /// \brief Determine whether the addition of the given flag to an Objective-C 4588 /// property's attributes will cause a conflict. 4589 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4590 // Check if we've already added this flag. 4591 if (Attributes & NewFlag) 4592 return true; 4593 4594 Attributes |= NewFlag; 4595 4596 // Check for collisions with "readonly". 4597 if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4598 (Attributes & ObjCDeclSpec::DQ_PR_readwrite)) 4599 return true; 4600 4601 // Check for more than one of { assign, copy, retain, strong, weak }. 4602 unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4603 ObjCDeclSpec::DQ_PR_unsafe_unretained | 4604 ObjCDeclSpec::DQ_PR_copy | 4605 ObjCDeclSpec::DQ_PR_retain | 4606 ObjCDeclSpec::DQ_PR_strong | 4607 ObjCDeclSpec::DQ_PR_weak); 4608 if (AssignCopyRetMask && 4609 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4610 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4611 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4612 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4613 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong && 4614 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak) 4615 return true; 4616 4617 return false; 4618 } 4619 4620 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4621 if (!CodeCompleter) 4622 return; 4623 4624 unsigned Attributes = ODS.getPropertyAttributes(); 4625 4626 typedef CodeCompletionResult Result; 4627 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4628 CodeCompleter->getCodeCompletionTUInfo(), 4629 CodeCompletionContext::CCC_Other); 4630 Results.EnterNewScope(); 4631 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 4632 Results.AddResult(CodeCompletionResult("readonly")); 4633 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 4634 Results.AddResult(CodeCompletionResult("assign")); 4635 if (!ObjCPropertyFlagConflicts(Attributes, 4636 ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4637 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4638 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 4639 Results.AddResult(CodeCompletionResult("readwrite")); 4640 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 4641 Results.AddResult(CodeCompletionResult("retain")); 4642 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4643 Results.AddResult(CodeCompletionResult("strong")); 4644 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 4645 Results.AddResult(CodeCompletionResult("copy")); 4646 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 4647 Results.AddResult(CodeCompletionResult("nonatomic")); 4648 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 4649 Results.AddResult(CodeCompletionResult("atomic")); 4650 4651 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 4652 if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC) 4653 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak)) 4654 Results.AddResult(CodeCompletionResult("weak")); 4655 4656 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4657 CodeCompletionBuilder Setter(Results.getAllocator(), 4658 Results.getCodeCompletionTUInfo()); 4659 Setter.AddTypedTextChunk("setter"); 4660 Setter.AddTextChunk(" = "); 4661 Setter.AddPlaceholderChunk("method"); 4662 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 4663 } 4664 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4665 CodeCompletionBuilder Getter(Results.getAllocator(), 4666 Results.getCodeCompletionTUInfo()); 4667 Getter.AddTypedTextChunk("getter"); 4668 Getter.AddTextChunk(" = "); 4669 Getter.AddPlaceholderChunk("method"); 4670 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 4671 } 4672 Results.ExitScope(); 4673 HandleCodeCompleteResults(this, CodeCompleter, 4674 CodeCompletionContext::CCC_Other, 4675 Results.data(),Results.size()); 4676 } 4677 4678 /// \brief Describes the kind of Objective-C method that we want to find 4679 /// via code completion. 4680 enum ObjCMethodKind { 4681 MK_Any, ///< Any kind of method, provided it means other specified criteria. 4682 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 4683 MK_OneArgSelector ///< One-argument selector. 4684 }; 4685 4686 static bool isAcceptableObjCSelector(Selector Sel, 4687 ObjCMethodKind WantKind, 4688 IdentifierInfo **SelIdents, 4689 unsigned NumSelIdents, 4690 bool AllowSameLength = true) { 4691 if (NumSelIdents > Sel.getNumArgs()) 4692 return false; 4693 4694 switch (WantKind) { 4695 case MK_Any: break; 4696 case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4697 case MK_OneArgSelector: return Sel.getNumArgs() == 1; 4698 } 4699 4700 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4701 return false; 4702 4703 for (unsigned I = 0; I != NumSelIdents; ++I) 4704 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 4705 return false; 4706 4707 return true; 4708 } 4709 4710 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4711 ObjCMethodKind WantKind, 4712 IdentifierInfo **SelIdents, 4713 unsigned NumSelIdents, 4714 bool AllowSameLength = true) { 4715 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4716 NumSelIdents, AllowSameLength); 4717 } 4718 4719 namespace { 4720 /// \brief A set of selectors, which is used to avoid introducing multiple 4721 /// completions with the same selector into the result set. 4722 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4723 } 4724 4725 /// \brief Add all of the Objective-C methods in the given Objective-C 4726 /// container to the set of results. 4727 /// 4728 /// The container will be a class, protocol, category, or implementation of 4729 /// any of the above. This mether will recurse to include methods from 4730 /// the superclasses of classes along with their categories, protocols, and 4731 /// implementations. 4732 /// 4733 /// \param Container the container in which we'll look to find methods. 4734 /// 4735 /// \param WantInstanceMethods Whether to add instance methods (only); if 4736 /// false, this routine will add factory methods (only). 4737 /// 4738 /// \param CurContext the context in which we're performing the lookup that 4739 /// finds methods. 4740 /// 4741 /// \param AllowSameLength Whether we allow a method to be added to the list 4742 /// when it has the same number of parameters as we have selector identifiers. 4743 /// 4744 /// \param Results the structure into which we'll add results. 4745 static void AddObjCMethods(ObjCContainerDecl *Container, 4746 bool WantInstanceMethods, 4747 ObjCMethodKind WantKind, 4748 IdentifierInfo **SelIdents, 4749 unsigned NumSelIdents, 4750 DeclContext *CurContext, 4751 VisitedSelectorSet &Selectors, 4752 bool AllowSameLength, 4753 ResultBuilder &Results, 4754 bool InOriginalClass = true) { 4755 typedef CodeCompletionResult Result; 4756 Container = getContainerDef(Container); 4757 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 4758 MEnd = Container->meth_end(); 4759 M != MEnd; ++M) { 4760 if (M->isInstanceMethod() == WantInstanceMethods) { 4761 // Check whether the selector identifiers we've been given are a 4762 // subset of the identifiers for this particular method. 4763 if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, 4764 AllowSameLength)) 4765 continue; 4766 4767 if (!Selectors.insert(M->getSelector())) 4768 continue; 4769 4770 Result R = Result(*M, 0); 4771 R.StartParameter = NumSelIdents; 4772 R.AllParametersAreInformative = (WantKind != MK_Any); 4773 if (!InOriginalClass) 4774 R.Priority += CCD_InBaseClass; 4775 Results.MaybeAddResult(R, CurContext); 4776 } 4777 } 4778 4779 // Visit the protocols of protocols. 4780 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4781 if (Protocol->hasDefinition()) { 4782 const ObjCList<ObjCProtocolDecl> &Protocols 4783 = Protocol->getReferencedProtocols(); 4784 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4785 E = Protocols.end(); 4786 I != E; ++I) 4787 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4788 NumSelIdents, CurContext, Selectors, AllowSameLength, 4789 Results, false); 4790 } 4791 } 4792 4793 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 4794 if (!IFace || !IFace->hasDefinition()) 4795 return; 4796 4797 // Add methods in protocols. 4798 for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 4799 E = IFace->protocol_end(); 4800 I != E; ++I) 4801 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents, 4802 CurContext, Selectors, AllowSameLength, Results, false); 4803 4804 // Add methods in categories. 4805 for (ObjCCategoryDecl *CatDecl = IFace->getCategoryList(); CatDecl; 4806 CatDecl = CatDecl->getNextClassCategory()) { 4807 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4808 NumSelIdents, CurContext, Selectors, AllowSameLength, 4809 Results, InOriginalClass); 4810 4811 // Add a categories protocol methods. 4812 const ObjCList<ObjCProtocolDecl> &Protocols 4813 = CatDecl->getReferencedProtocols(); 4814 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4815 E = Protocols.end(); 4816 I != E; ++I) 4817 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4818 NumSelIdents, CurContext, Selectors, AllowSameLength, 4819 Results, false); 4820 4821 // Add methods in category implementations. 4822 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 4823 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4824 NumSelIdents, CurContext, Selectors, AllowSameLength, 4825 Results, InOriginalClass); 4826 } 4827 4828 // Add methods in superclass. 4829 if (IFace->getSuperClass()) 4830 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4831 SelIdents, NumSelIdents, CurContext, Selectors, 4832 AllowSameLength, Results, false); 4833 4834 // Add methods in our implementation, if any. 4835 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 4836 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4837 NumSelIdents, CurContext, Selectors, AllowSameLength, 4838 Results, InOriginalClass); 4839 } 4840 4841 4842 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 4843 typedef CodeCompletionResult Result; 4844 4845 // Try to find the interface where getters might live. 4846 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4847 if (!Class) { 4848 if (ObjCCategoryDecl *Category 4849 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4850 Class = Category->getClassInterface(); 4851 4852 if (!Class) 4853 return; 4854 } 4855 4856 // Find all of the potential getters. 4857 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4858 CodeCompleter->getCodeCompletionTUInfo(), 4859 CodeCompletionContext::CCC_Other); 4860 Results.EnterNewScope(); 4861 4862 VisitedSelectorSet Selectors; 4863 AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, 4864 /*AllowSameLength=*/true, Results); 4865 Results.ExitScope(); 4866 HandleCodeCompleteResults(this, CodeCompleter, 4867 CodeCompletionContext::CCC_Other, 4868 Results.data(),Results.size()); 4869 } 4870 4871 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 4872 typedef CodeCompletionResult Result; 4873 4874 // Try to find the interface where setters might live. 4875 ObjCInterfaceDecl *Class 4876 = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4877 if (!Class) { 4878 if (ObjCCategoryDecl *Category 4879 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4880 Class = Category->getClassInterface(); 4881 4882 if (!Class) 4883 return; 4884 } 4885 4886 // Find all of the potential getters. 4887 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4888 CodeCompleter->getCodeCompletionTUInfo(), 4889 CodeCompletionContext::CCC_Other); 4890 Results.EnterNewScope(); 4891 4892 VisitedSelectorSet Selectors; 4893 AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext, 4894 Selectors, /*AllowSameLength=*/true, Results); 4895 4896 Results.ExitScope(); 4897 HandleCodeCompleteResults(this, CodeCompleter, 4898 CodeCompletionContext::CCC_Other, 4899 Results.data(),Results.size()); 4900 } 4901 4902 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4903 bool IsParameter) { 4904 typedef CodeCompletionResult Result; 4905 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4906 CodeCompleter->getCodeCompletionTUInfo(), 4907 CodeCompletionContext::CCC_Type); 4908 Results.EnterNewScope(); 4909 4910 // Add context-sensitive, Objective-C parameter-passing keywords. 4911 bool AddedInOut = false; 4912 if ((DS.getObjCDeclQualifier() & 4913 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4914 Results.AddResult("in"); 4915 Results.AddResult("inout"); 4916 AddedInOut = true; 4917 } 4918 if ((DS.getObjCDeclQualifier() & 4919 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4920 Results.AddResult("out"); 4921 if (!AddedInOut) 4922 Results.AddResult("inout"); 4923 } 4924 if ((DS.getObjCDeclQualifier() & 4925 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4926 ObjCDeclSpec::DQ_Oneway)) == 0) { 4927 Results.AddResult("bycopy"); 4928 Results.AddResult("byref"); 4929 Results.AddResult("oneway"); 4930 } 4931 4932 // If we're completing the return type of an Objective-C method and the 4933 // identifier IBAction refers to a macro, provide a completion item for 4934 // an action, e.g., 4935 // IBAction)<#selector#>:(id)sender 4936 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4937 Context.Idents.get("IBAction").hasMacroDefinition()) { 4938 CodeCompletionBuilder Builder(Results.getAllocator(), 4939 Results.getCodeCompletionTUInfo(), 4940 CCP_CodePattern, CXAvailability_Available); 4941 Builder.AddTypedTextChunk("IBAction"); 4942 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4943 Builder.AddPlaceholderChunk("selector"); 4944 Builder.AddChunk(CodeCompletionString::CK_Colon); 4945 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4946 Builder.AddTextChunk("id"); 4947 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4948 Builder.AddTextChunk("sender"); 4949 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4950 } 4951 4952 // Add various builtin type names and specifiers. 4953 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 4954 Results.ExitScope(); 4955 4956 // Add the various type names 4957 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4958 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4959 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4960 CodeCompleter->includeGlobals()); 4961 4962 if (CodeCompleter->includeMacros()) 4963 AddMacroResults(PP, Results); 4964 4965 HandleCodeCompleteResults(this, CodeCompleter, 4966 CodeCompletionContext::CCC_Type, 4967 Results.data(), Results.size()); 4968 } 4969 4970 /// \brief When we have an expression with type "id", we may assume 4971 /// that it has some more-specific class type based on knowledge of 4972 /// common uses of Objective-C. This routine returns that class type, 4973 /// or NULL if no better result could be determined. 4974 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 4975 ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 4976 if (!Msg) 4977 return 0; 4978 4979 Selector Sel = Msg->getSelector(); 4980 if (Sel.isNull()) 4981 return 0; 4982 4983 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 4984 if (!Id) 4985 return 0; 4986 4987 ObjCMethodDecl *Method = Msg->getMethodDecl(); 4988 if (!Method) 4989 return 0; 4990 4991 // Determine the class that we're sending the message to. 4992 ObjCInterfaceDecl *IFace = 0; 4993 switch (Msg->getReceiverKind()) { 4994 case ObjCMessageExpr::Class: 4995 if (const ObjCObjectType *ObjType 4996 = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 4997 IFace = ObjType->getInterface(); 4998 break; 4999 5000 case ObjCMessageExpr::Instance: { 5001 QualType T = Msg->getInstanceReceiver()->getType(); 5002 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 5003 IFace = Ptr->getInterfaceDecl(); 5004 break; 5005 } 5006 5007 case ObjCMessageExpr::SuperInstance: 5008 case ObjCMessageExpr::SuperClass: 5009 break; 5010 } 5011 5012 if (!IFace) 5013 return 0; 5014 5015 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 5016 if (Method->isInstanceMethod()) 5017 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5018 .Case("retain", IFace) 5019 .Case("strong", IFace) 5020 .Case("autorelease", IFace) 5021 .Case("copy", IFace) 5022 .Case("copyWithZone", IFace) 5023 .Case("mutableCopy", IFace) 5024 .Case("mutableCopyWithZone", IFace) 5025 .Case("awakeFromCoder", IFace) 5026 .Case("replacementObjectFromCoder", IFace) 5027 .Case("class", IFace) 5028 .Case("classForCoder", IFace) 5029 .Case("superclass", Super) 5030 .Default(0); 5031 5032 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5033 .Case("new", IFace) 5034 .Case("alloc", IFace) 5035 .Case("allocWithZone", IFace) 5036 .Case("class", IFace) 5037 .Case("superclass", Super) 5038 .Default(0); 5039 } 5040 5041 // Add a special completion for a message send to "super", which fills in the 5042 // most likely case of forwarding all of our arguments to the superclass 5043 // function. 5044 /// 5045 /// \param S The semantic analysis object. 5046 /// 5047 /// \param S NeedSuperKeyword Whether we need to prefix this completion with 5048 /// the "super" keyword. Otherwise, we just need to provide the arguments. 5049 /// 5050 /// \param SelIdents The identifiers in the selector that have already been 5051 /// provided as arguments for a send to "super". 5052 /// 5053 /// \param NumSelIdents The number of identifiers in \p SelIdents. 5054 /// 5055 /// \param Results The set of results to augment. 5056 /// 5057 /// \returns the Objective-C method declaration that would be invoked by 5058 /// this "super" completion. If NULL, no completion was added. 5059 static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 5060 IdentifierInfo **SelIdents, 5061 unsigned NumSelIdents, 5062 ResultBuilder &Results) { 5063 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 5064 if (!CurMethod) 5065 return 0; 5066 5067 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 5068 if (!Class) 5069 return 0; 5070 5071 // Try to find a superclass method with the same selector. 5072 ObjCMethodDecl *SuperMethod = 0; 5073 while ((Class = Class->getSuperClass()) && !SuperMethod) { 5074 // Check in the class 5075 SuperMethod = Class->getMethod(CurMethod->getSelector(), 5076 CurMethod->isInstanceMethod()); 5077 5078 // Check in categories or class extensions. 5079 if (!SuperMethod) { 5080 for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 5081 Category = Category->getNextClassCategory()) 5082 if ((SuperMethod = Category->getMethod(CurMethod->getSelector(), 5083 CurMethod->isInstanceMethod()))) 5084 break; 5085 } 5086 } 5087 5088 if (!SuperMethod) 5089 return 0; 5090 5091 // Check whether the superclass method has the same signature. 5092 if (CurMethod->param_size() != SuperMethod->param_size() || 5093 CurMethod->isVariadic() != SuperMethod->isVariadic()) 5094 return 0; 5095 5096 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 5097 CurPEnd = CurMethod->param_end(), 5098 SuperP = SuperMethod->param_begin(); 5099 CurP != CurPEnd; ++CurP, ++SuperP) { 5100 // Make sure the parameter types are compatible. 5101 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 5102 (*SuperP)->getType())) 5103 return 0; 5104 5105 // Make sure we have a parameter name to forward! 5106 if (!(*CurP)->getIdentifier()) 5107 return 0; 5108 } 5109 5110 // We have a superclass method. Now, form the send-to-super completion. 5111 CodeCompletionBuilder Builder(Results.getAllocator(), 5112 Results.getCodeCompletionTUInfo()); 5113 5114 // Give this completion a return type. 5115 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 5116 Builder); 5117 5118 // If we need the "super" keyword, add it (plus some spacing). 5119 if (NeedSuperKeyword) { 5120 Builder.AddTypedTextChunk("super"); 5121 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5122 } 5123 5124 Selector Sel = CurMethod->getSelector(); 5125 if (Sel.isUnarySelector()) { 5126 if (NeedSuperKeyword) 5127 Builder.AddTextChunk(Builder.getAllocator().CopyString( 5128 Sel.getNameForSlot(0))); 5129 else 5130 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5131 Sel.getNameForSlot(0))); 5132 } else { 5133 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 5134 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 5135 if (I > NumSelIdents) 5136 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5137 5138 if (I < NumSelIdents) 5139 Builder.AddInformativeChunk( 5140 Builder.getAllocator().CopyString( 5141 Sel.getNameForSlot(I) + ":")); 5142 else if (NeedSuperKeyword || I > NumSelIdents) { 5143 Builder.AddTextChunk( 5144 Builder.getAllocator().CopyString( 5145 Sel.getNameForSlot(I) + ":")); 5146 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5147 (*CurP)->getIdentifier()->getName())); 5148 } else { 5149 Builder.AddTypedTextChunk( 5150 Builder.getAllocator().CopyString( 5151 Sel.getNameForSlot(I) + ":")); 5152 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5153 (*CurP)->getIdentifier()->getName())); 5154 } 5155 } 5156 } 5157 5158 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 5159 CCP_SuperCompletion)); 5160 return SuperMethod; 5161 } 5162 5163 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 5164 typedef CodeCompletionResult Result; 5165 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5166 CodeCompleter->getCodeCompletionTUInfo(), 5167 CodeCompletionContext::CCC_ObjCMessageReceiver, 5168 getLangOpts().CPlusPlus0x 5169 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 5170 : &ResultBuilder::IsObjCMessageReceiver); 5171 5172 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5173 Results.EnterNewScope(); 5174 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5175 CodeCompleter->includeGlobals()); 5176 5177 // If we are in an Objective-C method inside a class that has a superclass, 5178 // add "super" as an option. 5179 if (ObjCMethodDecl *Method = getCurMethodDecl()) 5180 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 5181 if (Iface->getSuperClass()) { 5182 Results.AddResult(Result("super")); 5183 5184 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); 5185 } 5186 5187 if (getLangOpts().CPlusPlus0x) 5188 addThisCompletion(*this, Results); 5189 5190 Results.ExitScope(); 5191 5192 if (CodeCompleter->includeMacros()) 5193 AddMacroResults(PP, Results); 5194 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5195 Results.data(), Results.size()); 5196 5197 } 5198 5199 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5200 IdentifierInfo **SelIdents, 5201 unsigned NumSelIdents, 5202 bool AtArgumentExpression) { 5203 ObjCInterfaceDecl *CDecl = 0; 5204 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5205 // Figure out which interface we're in. 5206 CDecl = CurMethod->getClassInterface(); 5207 if (!CDecl) 5208 return; 5209 5210 // Find the superclass of this class. 5211 CDecl = CDecl->getSuperClass(); 5212 if (!CDecl) 5213 return; 5214 5215 if (CurMethod->isInstanceMethod()) { 5216 // We are inside an instance method, which means that the message 5217 // send [super ...] is actually calling an instance method on the 5218 // current object. 5219 return CodeCompleteObjCInstanceMessage(S, 0, 5220 SelIdents, NumSelIdents, 5221 AtArgumentExpression, 5222 CDecl); 5223 } 5224 5225 // Fall through to send to the superclass in CDecl. 5226 } else { 5227 // "super" may be the name of a type or variable. Figure out which 5228 // it is. 5229 IdentifierInfo *Super = &Context.Idents.get("super"); 5230 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 5231 LookupOrdinaryName); 5232 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 5233 // "super" names an interface. Use it. 5234 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5235 if (const ObjCObjectType *Iface 5236 = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5237 CDecl = Iface->getInterface(); 5238 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 5239 // "super" names an unresolved type; we can't be more specific. 5240 } else { 5241 // Assume that "super" names some kind of value and parse that way. 5242 CXXScopeSpec SS; 5243 SourceLocation TemplateKWLoc; 5244 UnqualifiedId id; 5245 id.setIdentifier(Super, SuperLoc); 5246 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5247 false, false); 5248 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 5249 SelIdents, NumSelIdents, 5250 AtArgumentExpression); 5251 } 5252 5253 // Fall through 5254 } 5255 5256 ParsedType Receiver; 5257 if (CDecl) 5258 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 5259 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 5260 NumSelIdents, AtArgumentExpression, 5261 /*IsSuper=*/true); 5262 } 5263 5264 /// \brief Given a set of code-completion results for the argument of a message 5265 /// send, determine the preferred type (if any) for that argument expression. 5266 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5267 unsigned NumSelIdents) { 5268 typedef CodeCompletionResult Result; 5269 ASTContext &Context = Results.getSema().Context; 5270 5271 QualType PreferredType; 5272 unsigned BestPriority = CCP_Unlikely * 2; 5273 Result *ResultsData = Results.data(); 5274 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5275 Result &R = ResultsData[I]; 5276 if (R.Kind == Result::RK_Declaration && 5277 isa<ObjCMethodDecl>(R.Declaration)) { 5278 if (R.Priority <= BestPriority) { 5279 ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5280 if (NumSelIdents <= Method->param_size()) { 5281 QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5282 ->getType(); 5283 if (R.Priority < BestPriority || PreferredType.isNull()) { 5284 BestPriority = R.Priority; 5285 PreferredType = MyPreferredType; 5286 } else if (!Context.hasSameUnqualifiedType(PreferredType, 5287 MyPreferredType)) { 5288 PreferredType = QualType(); 5289 } 5290 } 5291 } 5292 } 5293 } 5294 5295 return PreferredType; 5296 } 5297 5298 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5299 ParsedType Receiver, 5300 IdentifierInfo **SelIdents, 5301 unsigned NumSelIdents, 5302 bool AtArgumentExpression, 5303 bool IsSuper, 5304 ResultBuilder &Results) { 5305 typedef CodeCompletionResult Result; 5306 ObjCInterfaceDecl *CDecl = 0; 5307 5308 // If the given name refers to an interface type, retrieve the 5309 // corresponding declaration. 5310 if (Receiver) { 5311 QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 5312 if (!T.isNull()) 5313 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5314 CDecl = Interface->getInterface(); 5315 } 5316 5317 // Add all of the factory methods in this Objective-C class, its protocols, 5318 // superclasses, categories, implementation, etc. 5319 Results.EnterNewScope(); 5320 5321 // If this is a send-to-super, try to add the special "super" send 5322 // completion. 5323 if (IsSuper) { 5324 if (ObjCMethodDecl *SuperMethod 5325 = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents, 5326 Results)) 5327 Results.Ignore(SuperMethod); 5328 } 5329 5330 // If we're inside an Objective-C method definition, prefer its selector to 5331 // others. 5332 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5333 Results.setPreferredSelector(CurMethod->getSelector()); 5334 5335 VisitedSelectorSet Selectors; 5336 if (CDecl) 5337 AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents, 5338 SemaRef.CurContext, Selectors, AtArgumentExpression, 5339 Results); 5340 else { 5341 // We're messaging "id" as a type; provide all class/factory methods. 5342 5343 // If we have an external source, load the entire class method 5344 // pool from the AST file. 5345 if (SemaRef.ExternalSource) { 5346 for (uint32_t I = 0, 5347 N = SemaRef.ExternalSource->GetNumExternalSelectors(); 5348 I != N; ++I) { 5349 Selector Sel = SemaRef.ExternalSource->GetExternalSelector(I); 5350 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5351 continue; 5352 5353 SemaRef.ReadMethodPool(Sel); 5354 } 5355 } 5356 5357 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5358 MEnd = SemaRef.MethodPool.end(); 5359 M != MEnd; ++M) { 5360 for (ObjCMethodList *MethList = &M->second.second; 5361 MethList && MethList->Method; 5362 MethList = MethList->Next) { 5363 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 5364 NumSelIdents)) 5365 continue; 5366 5367 Result R(MethList->Method, 0); 5368 R.StartParameter = NumSelIdents; 5369 R.AllParametersAreInformative = false; 5370 Results.MaybeAddResult(R, SemaRef.CurContext); 5371 } 5372 } 5373 } 5374 5375 Results.ExitScope(); 5376 } 5377 5378 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5379 IdentifierInfo **SelIdents, 5380 unsigned NumSelIdents, 5381 bool AtArgumentExpression, 5382 bool IsSuper) { 5383 5384 QualType T = this->GetTypeFromParser(Receiver); 5385 5386 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5387 CodeCompleter->getCodeCompletionTUInfo(), 5388 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 5389 T, SelIdents, NumSelIdents)); 5390 5391 AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents, 5392 AtArgumentExpression, IsSuper, Results); 5393 5394 // If we're actually at the argument expression (rather than prior to the 5395 // selector), we're actually performing code completion for an expression. 5396 // Determine whether we have a single, best method. If so, we can 5397 // code-complete the expression using the corresponding parameter type as 5398 // our preferred type, improving completion results. 5399 if (AtArgumentExpression) { 5400 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5401 NumSelIdents); 5402 if (PreferredType.isNull()) 5403 CodeCompleteOrdinaryName(S, PCC_Expression); 5404 else 5405 CodeCompleteExpression(S, PreferredType); 5406 return; 5407 } 5408 5409 HandleCodeCompleteResults(this, CodeCompleter, 5410 Results.getCompletionContext(), 5411 Results.data(), Results.size()); 5412 } 5413 5414 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5415 IdentifierInfo **SelIdents, 5416 unsigned NumSelIdents, 5417 bool AtArgumentExpression, 5418 ObjCInterfaceDecl *Super) { 5419 typedef CodeCompletionResult Result; 5420 5421 Expr *RecExpr = static_cast<Expr *>(Receiver); 5422 5423 // If necessary, apply function/array conversion to the receiver. 5424 // C99 6.7.5.3p[7,8]. 5425 if (RecExpr) { 5426 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5427 if (Conv.isInvalid()) // conversion failed. bail. 5428 return; 5429 RecExpr = Conv.take(); 5430 } 5431 QualType ReceiverType = RecExpr? RecExpr->getType() 5432 : Super? Context.getObjCObjectPointerType( 5433 Context.getObjCInterfaceType(Super)) 5434 : Context.getObjCIdType(); 5435 5436 // If we're messaging an expression with type "id" or "Class", check 5437 // whether we know something special about the receiver that allows 5438 // us to assume a more-specific receiver type. 5439 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) 5440 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5441 if (ReceiverType->isObjCClassType()) 5442 return CodeCompleteObjCClassMessage(S, 5443 ParsedType::make(Context.getObjCInterfaceType(IFace)), 5444 SelIdents, NumSelIdents, 5445 AtArgumentExpression, Super); 5446 5447 ReceiverType = Context.getObjCObjectPointerType( 5448 Context.getObjCInterfaceType(IFace)); 5449 } 5450 5451 // Build the set of methods we can see. 5452 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5453 CodeCompleter->getCodeCompletionTUInfo(), 5454 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 5455 ReceiverType, SelIdents, NumSelIdents)); 5456 5457 Results.EnterNewScope(); 5458 5459 // If this is a send-to-super, try to add the special "super" send 5460 // completion. 5461 if (Super) { 5462 if (ObjCMethodDecl *SuperMethod 5463 = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents, 5464 Results)) 5465 Results.Ignore(SuperMethod); 5466 } 5467 5468 // If we're inside an Objective-C method definition, prefer its selector to 5469 // others. 5470 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5471 Results.setPreferredSelector(CurMethod->getSelector()); 5472 5473 // Keep track of the selectors we've already added. 5474 VisitedSelectorSet Selectors; 5475 5476 // Handle messages to Class. This really isn't a message to an instance 5477 // method, so we treat it the same way we would treat a message send to a 5478 // class method. 5479 if (ReceiverType->isObjCClassType() || 5480 ReceiverType->isObjCQualifiedClassType()) { 5481 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5482 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 5483 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents, 5484 CurContext, Selectors, AtArgumentExpression, Results); 5485 } 5486 } 5487 // Handle messages to a qualified ID ("id<foo>"). 5488 else if (const ObjCObjectPointerType *QualID 5489 = ReceiverType->getAsObjCQualifiedIdType()) { 5490 // Search protocols for instance methods. 5491 for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5492 E = QualID->qual_end(); 5493 I != E; ++I) 5494 AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5495 Selectors, AtArgumentExpression, Results); 5496 } 5497 // Handle messages to a pointer to interface type. 5498 else if (const ObjCObjectPointerType *IFacePtr 5499 = ReceiverType->getAsObjCInterfacePointerType()) { 5500 // Search the class, its superclasses, etc., for instance methods. 5501 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5502 NumSelIdents, CurContext, Selectors, AtArgumentExpression, 5503 Results); 5504 5505 // Search protocols for instance methods. 5506 for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5507 E = IFacePtr->qual_end(); 5508 I != E; ++I) 5509 AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext, 5510 Selectors, AtArgumentExpression, Results); 5511 } 5512 // Handle messages to "id". 5513 else if (ReceiverType->isObjCIdType()) { 5514 // We're messaging "id", so provide all instance methods we know 5515 // about as code-completion results. 5516 5517 // If we have an external source, load the entire class method 5518 // pool from the AST file. 5519 if (ExternalSource) { 5520 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5521 I != N; ++I) { 5522 Selector Sel = ExternalSource->GetExternalSelector(I); 5523 if (Sel.isNull() || MethodPool.count(Sel)) 5524 continue; 5525 5526 ReadMethodPool(Sel); 5527 } 5528 } 5529 5530 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5531 MEnd = MethodPool.end(); 5532 M != MEnd; ++M) { 5533 for (ObjCMethodList *MethList = &M->second.first; 5534 MethList && MethList->Method; 5535 MethList = MethList->Next) { 5536 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 5537 NumSelIdents)) 5538 continue; 5539 5540 if (!Selectors.insert(MethList->Method->getSelector())) 5541 continue; 5542 5543 Result R(MethList->Method, 0); 5544 R.StartParameter = NumSelIdents; 5545 R.AllParametersAreInformative = false; 5546 Results.MaybeAddResult(R, CurContext); 5547 } 5548 } 5549 } 5550 Results.ExitScope(); 5551 5552 5553 // If we're actually at the argument expression (rather than prior to the 5554 // selector), we're actually performing code completion for an expression. 5555 // Determine whether we have a single, best method. If so, we can 5556 // code-complete the expression using the corresponding parameter type as 5557 // our preferred type, improving completion results. 5558 if (AtArgumentExpression) { 5559 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5560 NumSelIdents); 5561 if (PreferredType.isNull()) 5562 CodeCompleteOrdinaryName(S, PCC_Expression); 5563 else 5564 CodeCompleteExpression(S, PreferredType); 5565 return; 5566 } 5567 5568 HandleCodeCompleteResults(this, CodeCompleter, 5569 Results.getCompletionContext(), 5570 Results.data(),Results.size()); 5571 } 5572 5573 void Sema::CodeCompleteObjCForCollection(Scope *S, 5574 DeclGroupPtrTy IterationVar) { 5575 CodeCompleteExpressionData Data; 5576 Data.ObjCCollection = true; 5577 5578 if (IterationVar.getAsOpaquePtr()) { 5579 DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); 5580 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5581 if (*I) 5582 Data.IgnoreDecls.push_back(*I); 5583 } 5584 } 5585 5586 CodeCompleteExpression(S, Data); 5587 } 5588 5589 void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, 5590 unsigned NumSelIdents) { 5591 // If we have an external source, load the entire class method 5592 // pool from the AST file. 5593 if (ExternalSource) { 5594 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5595 I != N; ++I) { 5596 Selector Sel = ExternalSource->GetExternalSelector(I); 5597 if (Sel.isNull() || MethodPool.count(Sel)) 5598 continue; 5599 5600 ReadMethodPool(Sel); 5601 } 5602 } 5603 5604 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5605 CodeCompleter->getCodeCompletionTUInfo(), 5606 CodeCompletionContext::CCC_SelectorName); 5607 Results.EnterNewScope(); 5608 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5609 MEnd = MethodPool.end(); 5610 M != MEnd; ++M) { 5611 5612 Selector Sel = M->first; 5613 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) 5614 continue; 5615 5616 CodeCompletionBuilder Builder(Results.getAllocator(), 5617 Results.getCodeCompletionTUInfo()); 5618 if (Sel.isUnarySelector()) { 5619 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5620 Sel.getNameForSlot(0))); 5621 Results.AddResult(Builder.TakeString()); 5622 continue; 5623 } 5624 5625 std::string Accumulator; 5626 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 5627 if (I == NumSelIdents) { 5628 if (!Accumulator.empty()) { 5629 Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5630 Accumulator)); 5631 Accumulator.clear(); 5632 } 5633 } 5634 5635 Accumulator += Sel.getNameForSlot(I); 5636 Accumulator += ':'; 5637 } 5638 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5639 Results.AddResult(Builder.TakeString()); 5640 } 5641 Results.ExitScope(); 5642 5643 HandleCodeCompleteResults(this, CodeCompleter, 5644 CodeCompletionContext::CCC_SelectorName, 5645 Results.data(), Results.size()); 5646 } 5647 5648 /// \brief Add all of the protocol declarations that we find in the given 5649 /// (translation unit) context. 5650 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5651 bool OnlyForwardDeclarations, 5652 ResultBuilder &Results) { 5653 typedef CodeCompletionResult Result; 5654 5655 for (DeclContext::decl_iterator D = Ctx->decls_begin(), 5656 DEnd = Ctx->decls_end(); 5657 D != DEnd; ++D) { 5658 // Record any protocols we find. 5659 if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(*D)) 5660 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5661 Results.AddResult(Result(Proto, 0), CurContext, 0, false); 5662 } 5663 } 5664 5665 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 5666 unsigned NumProtocols) { 5667 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5668 CodeCompleter->getCodeCompletionTUInfo(), 5669 CodeCompletionContext::CCC_ObjCProtocolName); 5670 5671 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5672 Results.EnterNewScope(); 5673 5674 // Tell the result set to ignore all of the protocols we have 5675 // already seen. 5676 // FIXME: This doesn't work when caching code-completion results. 5677 for (unsigned I = 0; I != NumProtocols; ++I) 5678 if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 5679 Protocols[I].second)) 5680 Results.Ignore(Protocol); 5681 5682 // Add all protocols. 5683 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 5684 Results); 5685 5686 Results.ExitScope(); 5687 } 5688 5689 HandleCodeCompleteResults(this, CodeCompleter, 5690 CodeCompletionContext::CCC_ObjCProtocolName, 5691 Results.data(),Results.size()); 5692 } 5693 5694 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5695 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5696 CodeCompleter->getCodeCompletionTUInfo(), 5697 CodeCompletionContext::CCC_ObjCProtocolName); 5698 5699 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5700 Results.EnterNewScope(); 5701 5702 // Add all protocols. 5703 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 5704 Results); 5705 5706 Results.ExitScope(); 5707 } 5708 5709 HandleCodeCompleteResults(this, CodeCompleter, 5710 CodeCompletionContext::CCC_ObjCProtocolName, 5711 Results.data(),Results.size()); 5712 } 5713 5714 /// \brief Add all of the Objective-C interface declarations that we find in 5715 /// the given (translation unit) context. 5716 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 5717 bool OnlyForwardDeclarations, 5718 bool OnlyUnimplemented, 5719 ResultBuilder &Results) { 5720 typedef CodeCompletionResult Result; 5721 5722 for (DeclContext::decl_iterator D = Ctx->decls_begin(), 5723 DEnd = Ctx->decls_end(); 5724 D != DEnd; ++D) { 5725 // Record any interfaces we find. 5726 if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(*D)) 5727 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5728 (!OnlyUnimplemented || !Class->getImplementation())) 5729 Results.AddResult(Result(Class, 0), CurContext, 0, false); 5730 } 5731 } 5732 5733 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5734 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5735 CodeCompleter->getCodeCompletionTUInfo(), 5736 CodeCompletionContext::CCC_Other); 5737 Results.EnterNewScope(); 5738 5739 if (CodeCompleter->includeGlobals()) { 5740 // Add all classes. 5741 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5742 false, Results); 5743 } 5744 5745 Results.ExitScope(); 5746 5747 HandleCodeCompleteResults(this, CodeCompleter, 5748 CodeCompletionContext::CCC_ObjCInterfaceName, 5749 Results.data(),Results.size()); 5750 } 5751 5752 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5753 SourceLocation ClassNameLoc) { 5754 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5755 CodeCompleter->getCodeCompletionTUInfo(), 5756 CodeCompletionContext::CCC_ObjCInterfaceName); 5757 Results.EnterNewScope(); 5758 5759 // Make sure that we ignore the class we're currently defining. 5760 NamedDecl *CurClass 5761 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5762 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 5763 Results.Ignore(CurClass); 5764 5765 if (CodeCompleter->includeGlobals()) { 5766 // Add all classes. 5767 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5768 false, Results); 5769 } 5770 5771 Results.ExitScope(); 5772 5773 HandleCodeCompleteResults(this, CodeCompleter, 5774 CodeCompletionContext::CCC_ObjCInterfaceName, 5775 Results.data(),Results.size()); 5776 } 5777 5778 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5779 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5780 CodeCompleter->getCodeCompletionTUInfo(), 5781 CodeCompletionContext::CCC_Other); 5782 Results.EnterNewScope(); 5783 5784 if (CodeCompleter->includeGlobals()) { 5785 // Add all unimplemented classes. 5786 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5787 true, Results); 5788 } 5789 5790 Results.ExitScope(); 5791 5792 HandleCodeCompleteResults(this, CodeCompleter, 5793 CodeCompletionContext::CCC_ObjCInterfaceName, 5794 Results.data(),Results.size()); 5795 } 5796 5797 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5798 IdentifierInfo *ClassName, 5799 SourceLocation ClassNameLoc) { 5800 typedef CodeCompletionResult Result; 5801 5802 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5803 CodeCompleter->getCodeCompletionTUInfo(), 5804 CodeCompletionContext::CCC_ObjCCategoryName); 5805 5806 // Ignore any categories we find that have already been implemented by this 5807 // interface. 5808 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5809 NamedDecl *CurClass 5810 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5811 if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) 5812 for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 5813 Category = Category->getNextClassCategory()) 5814 CategoryNames.insert(Category->getIdentifier()); 5815 5816 // Add all of the categories we know about. 5817 Results.EnterNewScope(); 5818 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 5819 for (DeclContext::decl_iterator D = TU->decls_begin(), 5820 DEnd = TU->decls_end(); 5821 D != DEnd; ++D) 5822 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(*D)) 5823 if (CategoryNames.insert(Category->getIdentifier())) 5824 Results.AddResult(Result(Category, 0), CurContext, 0, false); 5825 Results.ExitScope(); 5826 5827 HandleCodeCompleteResults(this, CodeCompleter, 5828 CodeCompletionContext::CCC_ObjCCategoryName, 5829 Results.data(),Results.size()); 5830 } 5831 5832 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5833 IdentifierInfo *ClassName, 5834 SourceLocation ClassNameLoc) { 5835 typedef CodeCompletionResult Result; 5836 5837 // Find the corresponding interface. If we couldn't find the interface, the 5838 // program itself is ill-formed. However, we'll try to be helpful still by 5839 // providing the list of all of the categories we know about. 5840 NamedDecl *CurClass 5841 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5842 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 5843 if (!Class) 5844 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 5845 5846 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5847 CodeCompleter->getCodeCompletionTUInfo(), 5848 CodeCompletionContext::CCC_ObjCCategoryName); 5849 5850 // Add all of the categories that have have corresponding interface 5851 // declarations in this class and any of its superclasses, except for 5852 // already-implemented categories in the class itself. 5853 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5854 Results.EnterNewScope(); 5855 bool IgnoreImplemented = true; 5856 while (Class) { 5857 for (ObjCCategoryDecl *Category = Class->getCategoryList(); Category; 5858 Category = Category->getNextClassCategory()) 5859 if ((!IgnoreImplemented || !Category->getImplementation()) && 5860 CategoryNames.insert(Category->getIdentifier())) 5861 Results.AddResult(Result(Category, 0), CurContext, 0, false); 5862 5863 Class = Class->getSuperClass(); 5864 IgnoreImplemented = false; 5865 } 5866 Results.ExitScope(); 5867 5868 HandleCodeCompleteResults(this, CodeCompleter, 5869 CodeCompletionContext::CCC_ObjCCategoryName, 5870 Results.data(),Results.size()); 5871 } 5872 5873 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 5874 typedef CodeCompletionResult Result; 5875 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5876 CodeCompleter->getCodeCompletionTUInfo(), 5877 CodeCompletionContext::CCC_Other); 5878 5879 // Figure out where this @synthesize lives. 5880 ObjCContainerDecl *Container 5881 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5882 if (!Container || 5883 (!isa<ObjCImplementationDecl>(Container) && 5884 !isa<ObjCCategoryImplDecl>(Container))) 5885 return; 5886 5887 // Ignore any properties that have already been implemented. 5888 Container = getContainerDef(Container); 5889 for (DeclContext::decl_iterator D = Container->decls_begin(), 5890 DEnd = Container->decls_end(); 5891 D != DEnd; ++D) 5892 if (ObjCPropertyImplDecl *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(*D)) 5893 Results.Ignore(PropertyImpl->getPropertyDecl()); 5894 5895 // Add any properties that we find. 5896 AddedPropertiesSet AddedProperties; 5897 Results.EnterNewScope(); 5898 if (ObjCImplementationDecl *ClassImpl 5899 = dyn_cast<ObjCImplementationDecl>(Container)) 5900 AddObjCProperties(ClassImpl->getClassInterface(), false, 5901 /*AllowNullaryMethods=*/false, CurContext, 5902 AddedProperties, Results); 5903 else 5904 AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 5905 false, /*AllowNullaryMethods=*/false, CurContext, 5906 AddedProperties, Results); 5907 Results.ExitScope(); 5908 5909 HandleCodeCompleteResults(this, CodeCompleter, 5910 CodeCompletionContext::CCC_Other, 5911 Results.data(),Results.size()); 5912 } 5913 5914 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5915 IdentifierInfo *PropertyName) { 5916 typedef CodeCompletionResult Result; 5917 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5918 CodeCompleter->getCodeCompletionTUInfo(), 5919 CodeCompletionContext::CCC_Other); 5920 5921 // Figure out where this @synthesize lives. 5922 ObjCContainerDecl *Container 5923 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5924 if (!Container || 5925 (!isa<ObjCImplementationDecl>(Container) && 5926 !isa<ObjCCategoryImplDecl>(Container))) 5927 return; 5928 5929 // Figure out which interface we're looking into. 5930 ObjCInterfaceDecl *Class = 0; 5931 if (ObjCImplementationDecl *ClassImpl 5932 = dyn_cast<ObjCImplementationDecl>(Container)) 5933 Class = ClassImpl->getClassInterface(); 5934 else 5935 Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5936 ->getClassInterface(); 5937 5938 // Determine the type of the property we're synthesizing. 5939 QualType PropertyType = Context.getObjCIdType(); 5940 if (Class) { 5941 if (ObjCPropertyDecl *Property 5942 = Class->FindPropertyDeclaration(PropertyName)) { 5943 PropertyType 5944 = Property->getType().getNonReferenceType().getUnqualifiedType(); 5945 5946 // Give preference to ivars 5947 Results.setPreferredType(PropertyType); 5948 } 5949 } 5950 5951 // Add all of the instance variables in this class and its superclasses. 5952 Results.EnterNewScope(); 5953 bool SawSimilarlyNamedIvar = false; 5954 std::string NameWithPrefix; 5955 NameWithPrefix += '_'; 5956 NameWithPrefix += PropertyName->getName(); 5957 std::string NameWithSuffix = PropertyName->getName().str(); 5958 NameWithSuffix += '_'; 5959 for(; Class; Class = Class->getSuperClass()) { 5960 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5961 Ivar = Ivar->getNextIvar()) { 5962 Results.AddResult(Result(Ivar, 0), CurContext, 0, false); 5963 5964 // Determine whether we've seen an ivar with a name similar to the 5965 // property. 5966 if ((PropertyName == Ivar->getIdentifier() || 5967 NameWithPrefix == Ivar->getName() || 5968 NameWithSuffix == Ivar->getName())) { 5969 SawSimilarlyNamedIvar = true; 5970 5971 // Reduce the priority of this result by one, to give it a slight 5972 // advantage over other results whose names don't match so closely. 5973 if (Results.size() && 5974 Results.data()[Results.size() - 1].Kind 5975 == CodeCompletionResult::RK_Declaration && 5976 Results.data()[Results.size() - 1].Declaration == Ivar) 5977 Results.data()[Results.size() - 1].Priority--; 5978 } 5979 } 5980 } 5981 5982 if (!SawSimilarlyNamedIvar) { 5983 // Create ivar result _propName, that the user can use to synthesize 5984 // an ivar of the appropriate type. 5985 unsigned Priority = CCP_MemberDeclaration + 1; 5986 typedef CodeCompletionResult Result; 5987 CodeCompletionAllocator &Allocator = Results.getAllocator(); 5988 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 5989 Priority,CXAvailability_Available); 5990 5991 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 5992 Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 5993 Policy, Allocator)); 5994 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 5995 Results.AddResult(Result(Builder.TakeString(), Priority, 5996 CXCursor_ObjCIvarDecl)); 5997 } 5998 5999 Results.ExitScope(); 6000 6001 HandleCodeCompleteResults(this, CodeCompleter, 6002 CodeCompletionContext::CCC_Other, 6003 Results.data(),Results.size()); 6004 } 6005 6006 // Mapping from selectors to the methods that implement that selector, along 6007 // with the "in original class" flag. 6008 typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> > 6009 KnownMethodsMap; 6010 6011 /// \brief Find all of the methods that reside in the given container 6012 /// (and its superclasses, protocols, etc.) that meet the given 6013 /// criteria. Insert those methods into the map of known methods, 6014 /// indexed by selector so they can be easily found. 6015 static void FindImplementableMethods(ASTContext &Context, 6016 ObjCContainerDecl *Container, 6017 bool WantInstanceMethods, 6018 QualType ReturnType, 6019 KnownMethodsMap &KnownMethods, 6020 bool InOriginalClass = true) { 6021 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 6022 // Make sure we have a definition; that's what we'll walk. 6023 if (!IFace->hasDefinition()) 6024 return; 6025 6026 IFace = IFace->getDefinition(); 6027 Container = IFace; 6028 6029 const ObjCList<ObjCProtocolDecl> &Protocols 6030 = IFace->getReferencedProtocols(); 6031 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6032 E = Protocols.end(); 6033 I != E; ++I) 6034 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6035 KnownMethods, InOriginalClass); 6036 6037 // Add methods from any class extensions and categories. 6038 for (const ObjCCategoryDecl *Cat = IFace->getCategoryList(); Cat; 6039 Cat = Cat->getNextClassCategory()) 6040 FindImplementableMethods(Context, const_cast<ObjCCategoryDecl*>(Cat), 6041 WantInstanceMethods, ReturnType, 6042 KnownMethods, false); 6043 6044 // Visit the superclass. 6045 if (IFace->getSuperClass()) 6046 FindImplementableMethods(Context, IFace->getSuperClass(), 6047 WantInstanceMethods, ReturnType, 6048 KnownMethods, false); 6049 } 6050 6051 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6052 // Recurse into protocols. 6053 const ObjCList<ObjCProtocolDecl> &Protocols 6054 = Category->getReferencedProtocols(); 6055 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6056 E = Protocols.end(); 6057 I != E; ++I) 6058 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6059 KnownMethods, InOriginalClass); 6060 6061 // If this category is the original class, jump to the interface. 6062 if (InOriginalClass && Category->getClassInterface()) 6063 FindImplementableMethods(Context, Category->getClassInterface(), 6064 WantInstanceMethods, ReturnType, KnownMethods, 6065 false); 6066 } 6067 6068 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6069 // Make sure we have a definition; that's what we'll walk. 6070 if (!Protocol->hasDefinition()) 6071 return; 6072 Protocol = Protocol->getDefinition(); 6073 Container = Protocol; 6074 6075 // Recurse into protocols. 6076 const ObjCList<ObjCProtocolDecl> &Protocols 6077 = Protocol->getReferencedProtocols(); 6078 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6079 E = Protocols.end(); 6080 I != E; ++I) 6081 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6082 KnownMethods, false); 6083 } 6084 6085 // Add methods in this container. This operation occurs last because 6086 // we want the methods from this container to override any methods 6087 // we've previously seen with the same selector. 6088 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 6089 MEnd = Container->meth_end(); 6090 M != MEnd; ++M) { 6091 if (M->isInstanceMethod() == WantInstanceMethods) { 6092 if (!ReturnType.isNull() && 6093 !Context.hasSameUnqualifiedType(ReturnType, M->getResultType())) 6094 continue; 6095 6096 KnownMethods[M->getSelector()] = std::make_pair(*M, InOriginalClass); 6097 } 6098 } 6099 } 6100 6101 /// \brief Add the parenthesized return or parameter type chunk to a code 6102 /// completion string. 6103 static void AddObjCPassingTypeChunk(QualType Type, 6104 unsigned ObjCDeclQuals, 6105 ASTContext &Context, 6106 const PrintingPolicy &Policy, 6107 CodeCompletionBuilder &Builder) { 6108 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6109 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 6110 if (!Quals.empty()) 6111 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 6112 Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6113 Builder.getAllocator())); 6114 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6115 } 6116 6117 /// \brief Determine whether the given class is or inherits from a class by 6118 /// the given name. 6119 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 6120 StringRef Name) { 6121 if (!Class) 6122 return false; 6123 6124 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6125 return true; 6126 6127 return InheritsFromClassNamed(Class->getSuperClass(), Name); 6128 } 6129 6130 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6131 /// Key-Value Observing (KVO). 6132 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6133 bool IsInstanceMethod, 6134 QualType ReturnType, 6135 ASTContext &Context, 6136 VisitedSelectorSet &KnownSelectors, 6137 ResultBuilder &Results) { 6138 IdentifierInfo *PropName = Property->getIdentifier(); 6139 if (!PropName || PropName->getLength() == 0) 6140 return; 6141 6142 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 6143 6144 // Builder that will create each code completion. 6145 typedef CodeCompletionResult Result; 6146 CodeCompletionAllocator &Allocator = Results.getAllocator(); 6147 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6148 6149 // The selector table. 6150 SelectorTable &Selectors = Context.Selectors; 6151 6152 // The property name, copied into the code completion allocation region 6153 // on demand. 6154 struct KeyHolder { 6155 CodeCompletionAllocator &Allocator; 6156 StringRef Key; 6157 const char *CopiedKey; 6158 6159 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6160 : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6161 6162 operator const char *() { 6163 if (CopiedKey) 6164 return CopiedKey; 6165 6166 return CopiedKey = Allocator.CopyString(Key); 6167 } 6168 } Key(Allocator, PropName->getName()); 6169 6170 // The uppercased name of the property name. 6171 std::string UpperKey = PropName->getName(); 6172 if (!UpperKey.empty()) 6173 UpperKey[0] = toupper(UpperKey[0]); 6174 6175 bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6176 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6177 Property->getType()); 6178 bool ReturnTypeMatchesVoid 6179 = ReturnType.isNull() || ReturnType->isVoidType(); 6180 6181 // Add the normal accessor -(type)key. 6182 if (IsInstanceMethod && 6183 KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6184 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6185 if (ReturnType.isNull()) 6186 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6187 Context, Policy, Builder); 6188 6189 Builder.AddTypedTextChunk(Key); 6190 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6191 CXCursor_ObjCInstanceMethodDecl)); 6192 } 6193 6194 // If we have an integral or boolean property (or the user has provided 6195 // an integral or boolean return type), add the accessor -(type)isKey. 6196 if (IsInstanceMethod && 6197 ((!ReturnType.isNull() && 6198 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6199 (ReturnType.isNull() && 6200 (Property->getType()->isIntegerType() || 6201 Property->getType()->isBooleanType())))) { 6202 std::string SelectorName = (Twine("is") + UpperKey).str(); 6203 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6204 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6205 if (ReturnType.isNull()) { 6206 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6207 Builder.AddTextChunk("BOOL"); 6208 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6209 } 6210 6211 Builder.AddTypedTextChunk( 6212 Allocator.CopyString(SelectorId->getName())); 6213 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6214 CXCursor_ObjCInstanceMethodDecl)); 6215 } 6216 } 6217 6218 // Add the normal mutator. 6219 if (IsInstanceMethod && ReturnTypeMatchesVoid && 6220 !Property->getSetterMethodDecl()) { 6221 std::string SelectorName = (Twine("set") + UpperKey).str(); 6222 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6223 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6224 if (ReturnType.isNull()) { 6225 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6226 Builder.AddTextChunk("void"); 6227 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6228 } 6229 6230 Builder.AddTypedTextChunk( 6231 Allocator.CopyString(SelectorId->getName())); 6232 Builder.AddTypedTextChunk(":"); 6233 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6234 Context, Policy, Builder); 6235 Builder.AddTextChunk(Key); 6236 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6237 CXCursor_ObjCInstanceMethodDecl)); 6238 } 6239 } 6240 6241 // Indexed and unordered accessors 6242 unsigned IndexedGetterPriority = CCP_CodePattern; 6243 unsigned IndexedSetterPriority = CCP_CodePattern; 6244 unsigned UnorderedGetterPriority = CCP_CodePattern; 6245 unsigned UnorderedSetterPriority = CCP_CodePattern; 6246 if (const ObjCObjectPointerType *ObjCPointer 6247 = Property->getType()->getAs<ObjCObjectPointerType>()) { 6248 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6249 // If this interface type is not provably derived from a known 6250 // collection, penalize the corresponding completions. 6251 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6252 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6253 if (!InheritsFromClassNamed(IFace, "NSArray")) 6254 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6255 } 6256 6257 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6258 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6259 if (!InheritsFromClassNamed(IFace, "NSSet")) 6260 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6261 } 6262 } 6263 } else { 6264 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6265 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6266 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6267 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6268 } 6269 6270 // Add -(NSUInteger)countOf<key> 6271 if (IsInstanceMethod && 6272 (ReturnType.isNull() || ReturnType->isIntegerType())) { 6273 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 6274 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6275 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6276 if (ReturnType.isNull()) { 6277 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6278 Builder.AddTextChunk("NSUInteger"); 6279 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6280 } 6281 6282 Builder.AddTypedTextChunk( 6283 Allocator.CopyString(SelectorId->getName())); 6284 Results.AddResult(Result(Builder.TakeString(), 6285 std::min(IndexedGetterPriority, 6286 UnorderedGetterPriority), 6287 CXCursor_ObjCInstanceMethodDecl)); 6288 } 6289 } 6290 6291 // Indexed getters 6292 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6293 if (IsInstanceMethod && 6294 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6295 std::string SelectorName 6296 = (Twine("objectIn") + UpperKey + "AtIndex").str(); 6297 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6298 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6299 if (ReturnType.isNull()) { 6300 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6301 Builder.AddTextChunk("id"); 6302 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6303 } 6304 6305 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6306 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6307 Builder.AddTextChunk("NSUInteger"); 6308 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6309 Builder.AddTextChunk("index"); 6310 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6311 CXCursor_ObjCInstanceMethodDecl)); 6312 } 6313 } 6314 6315 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6316 if (IsInstanceMethod && 6317 (ReturnType.isNull() || 6318 (ReturnType->isObjCObjectPointerType() && 6319 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6320 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6321 ->getName() == "NSArray"))) { 6322 std::string SelectorName 6323 = (Twine(Property->getName()) + "AtIndexes").str(); 6324 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6325 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6326 if (ReturnType.isNull()) { 6327 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6328 Builder.AddTextChunk("NSArray *"); 6329 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6330 } 6331 6332 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6333 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6334 Builder.AddTextChunk("NSIndexSet *"); 6335 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6336 Builder.AddTextChunk("indexes"); 6337 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6338 CXCursor_ObjCInstanceMethodDecl)); 6339 } 6340 } 6341 6342 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6343 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6344 std::string SelectorName = (Twine("get") + UpperKey).str(); 6345 IdentifierInfo *SelectorIds[2] = { 6346 &Context.Idents.get(SelectorName), 6347 &Context.Idents.get("range") 6348 }; 6349 6350 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6351 if (ReturnType.isNull()) { 6352 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6353 Builder.AddTextChunk("void"); 6354 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6355 } 6356 6357 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6358 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6359 Builder.AddPlaceholderChunk("object-type"); 6360 Builder.AddTextChunk(" **"); 6361 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6362 Builder.AddTextChunk("buffer"); 6363 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6364 Builder.AddTypedTextChunk("range:"); 6365 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6366 Builder.AddTextChunk("NSRange"); 6367 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6368 Builder.AddTextChunk("inRange"); 6369 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6370 CXCursor_ObjCInstanceMethodDecl)); 6371 } 6372 } 6373 6374 // Mutable indexed accessors 6375 6376 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6377 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6378 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6379 IdentifierInfo *SelectorIds[2] = { 6380 &Context.Idents.get("insertObject"), 6381 &Context.Idents.get(SelectorName) 6382 }; 6383 6384 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6385 if (ReturnType.isNull()) { 6386 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6387 Builder.AddTextChunk("void"); 6388 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6389 } 6390 6391 Builder.AddTypedTextChunk("insertObject:"); 6392 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6393 Builder.AddPlaceholderChunk("object-type"); 6394 Builder.AddTextChunk(" *"); 6395 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6396 Builder.AddTextChunk("object"); 6397 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6398 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6399 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6400 Builder.AddPlaceholderChunk("NSUInteger"); 6401 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6402 Builder.AddTextChunk("index"); 6403 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6404 CXCursor_ObjCInstanceMethodDecl)); 6405 } 6406 } 6407 6408 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6409 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6410 std::string SelectorName = (Twine("insert") + UpperKey).str(); 6411 IdentifierInfo *SelectorIds[2] = { 6412 &Context.Idents.get(SelectorName), 6413 &Context.Idents.get("atIndexes") 6414 }; 6415 6416 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6417 if (ReturnType.isNull()) { 6418 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6419 Builder.AddTextChunk("void"); 6420 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6421 } 6422 6423 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6424 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6425 Builder.AddTextChunk("NSArray *"); 6426 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6427 Builder.AddTextChunk("array"); 6428 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6429 Builder.AddTypedTextChunk("atIndexes:"); 6430 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6431 Builder.AddPlaceholderChunk("NSIndexSet *"); 6432 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6433 Builder.AddTextChunk("indexes"); 6434 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6435 CXCursor_ObjCInstanceMethodDecl)); 6436 } 6437 } 6438 6439 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6440 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6441 std::string SelectorName 6442 = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 6443 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6444 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6445 if (ReturnType.isNull()) { 6446 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6447 Builder.AddTextChunk("void"); 6448 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6449 } 6450 6451 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6452 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6453 Builder.AddTextChunk("NSUInteger"); 6454 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6455 Builder.AddTextChunk("index"); 6456 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6457 CXCursor_ObjCInstanceMethodDecl)); 6458 } 6459 } 6460 6461 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6462 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6463 std::string SelectorName 6464 = (Twine("remove") + UpperKey + "AtIndexes").str(); 6465 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6466 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6467 if (ReturnType.isNull()) { 6468 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6469 Builder.AddTextChunk("void"); 6470 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6471 } 6472 6473 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6474 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6475 Builder.AddTextChunk("NSIndexSet *"); 6476 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6477 Builder.AddTextChunk("indexes"); 6478 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6479 CXCursor_ObjCInstanceMethodDecl)); 6480 } 6481 } 6482 6483 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6484 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6485 std::string SelectorName 6486 = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6487 IdentifierInfo *SelectorIds[2] = { 6488 &Context.Idents.get(SelectorName), 6489 &Context.Idents.get("withObject") 6490 }; 6491 6492 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6493 if (ReturnType.isNull()) { 6494 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6495 Builder.AddTextChunk("void"); 6496 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6497 } 6498 6499 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6500 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6501 Builder.AddPlaceholderChunk("NSUInteger"); 6502 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6503 Builder.AddTextChunk("index"); 6504 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6505 Builder.AddTypedTextChunk("withObject:"); 6506 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6507 Builder.AddTextChunk("id"); 6508 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6509 Builder.AddTextChunk("object"); 6510 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6511 CXCursor_ObjCInstanceMethodDecl)); 6512 } 6513 } 6514 6515 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6516 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6517 std::string SelectorName1 6518 = (Twine("replace") + UpperKey + "AtIndexes").str(); 6519 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6520 IdentifierInfo *SelectorIds[2] = { 6521 &Context.Idents.get(SelectorName1), 6522 &Context.Idents.get(SelectorName2) 6523 }; 6524 6525 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6526 if (ReturnType.isNull()) { 6527 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6528 Builder.AddTextChunk("void"); 6529 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6530 } 6531 6532 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6533 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6534 Builder.AddPlaceholderChunk("NSIndexSet *"); 6535 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6536 Builder.AddTextChunk("indexes"); 6537 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6538 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6539 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6540 Builder.AddTextChunk("NSArray *"); 6541 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6542 Builder.AddTextChunk("array"); 6543 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6544 CXCursor_ObjCInstanceMethodDecl)); 6545 } 6546 } 6547 6548 // Unordered getters 6549 // - (NSEnumerator *)enumeratorOfKey 6550 if (IsInstanceMethod && 6551 (ReturnType.isNull() || 6552 (ReturnType->isObjCObjectPointerType() && 6553 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6554 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6555 ->getName() == "NSEnumerator"))) { 6556 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 6557 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6558 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6559 if (ReturnType.isNull()) { 6560 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6561 Builder.AddTextChunk("NSEnumerator *"); 6562 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6563 } 6564 6565 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6566 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6567 CXCursor_ObjCInstanceMethodDecl)); 6568 } 6569 } 6570 6571 // - (type *)memberOfKey:(type *)object 6572 if (IsInstanceMethod && 6573 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6574 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 6575 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6576 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6577 if (ReturnType.isNull()) { 6578 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6579 Builder.AddPlaceholderChunk("object-type"); 6580 Builder.AddTextChunk(" *"); 6581 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6582 } 6583 6584 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6585 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6586 if (ReturnType.isNull()) { 6587 Builder.AddPlaceholderChunk("object-type"); 6588 Builder.AddTextChunk(" *"); 6589 } else { 6590 Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 6591 Policy, 6592 Builder.getAllocator())); 6593 } 6594 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6595 Builder.AddTextChunk("object"); 6596 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6597 CXCursor_ObjCInstanceMethodDecl)); 6598 } 6599 } 6600 6601 // Mutable unordered accessors 6602 // - (void)addKeyObject:(type *)object 6603 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6604 std::string SelectorName 6605 = (Twine("add") + UpperKey + Twine("Object")).str(); 6606 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6607 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6608 if (ReturnType.isNull()) { 6609 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6610 Builder.AddTextChunk("void"); 6611 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6612 } 6613 6614 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6615 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6616 Builder.AddPlaceholderChunk("object-type"); 6617 Builder.AddTextChunk(" *"); 6618 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6619 Builder.AddTextChunk("object"); 6620 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6621 CXCursor_ObjCInstanceMethodDecl)); 6622 } 6623 } 6624 6625 // - (void)addKey:(NSSet *)objects 6626 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6627 std::string SelectorName = (Twine("add") + UpperKey).str(); 6628 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6629 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6630 if (ReturnType.isNull()) { 6631 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6632 Builder.AddTextChunk("void"); 6633 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6634 } 6635 6636 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6637 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6638 Builder.AddTextChunk("NSSet *"); 6639 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6640 Builder.AddTextChunk("objects"); 6641 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6642 CXCursor_ObjCInstanceMethodDecl)); 6643 } 6644 } 6645 6646 // - (void)removeKeyObject:(type *)object 6647 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6648 std::string SelectorName 6649 = (Twine("remove") + UpperKey + Twine("Object")).str(); 6650 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6651 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6652 if (ReturnType.isNull()) { 6653 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6654 Builder.AddTextChunk("void"); 6655 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6656 } 6657 6658 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6659 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6660 Builder.AddPlaceholderChunk("object-type"); 6661 Builder.AddTextChunk(" *"); 6662 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6663 Builder.AddTextChunk("object"); 6664 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6665 CXCursor_ObjCInstanceMethodDecl)); 6666 } 6667 } 6668 6669 // - (void)removeKey:(NSSet *)objects 6670 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6671 std::string SelectorName = (Twine("remove") + UpperKey).str(); 6672 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6673 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6674 if (ReturnType.isNull()) { 6675 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6676 Builder.AddTextChunk("void"); 6677 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6678 } 6679 6680 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6681 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6682 Builder.AddTextChunk("NSSet *"); 6683 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6684 Builder.AddTextChunk("objects"); 6685 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6686 CXCursor_ObjCInstanceMethodDecl)); 6687 } 6688 } 6689 6690 // - (void)intersectKey:(NSSet *)objects 6691 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6692 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 6693 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6694 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6695 if (ReturnType.isNull()) { 6696 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6697 Builder.AddTextChunk("void"); 6698 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6699 } 6700 6701 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6702 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6703 Builder.AddTextChunk("NSSet *"); 6704 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6705 Builder.AddTextChunk("objects"); 6706 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6707 CXCursor_ObjCInstanceMethodDecl)); 6708 } 6709 } 6710 6711 // Key-Value Observing 6712 // + (NSSet *)keyPathsForValuesAffectingKey 6713 if (!IsInstanceMethod && 6714 (ReturnType.isNull() || 6715 (ReturnType->isObjCObjectPointerType() && 6716 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6717 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6718 ->getName() == "NSSet"))) { 6719 std::string SelectorName 6720 = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 6721 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6722 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6723 if (ReturnType.isNull()) { 6724 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6725 Builder.AddTextChunk("NSSet *"); 6726 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6727 } 6728 6729 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6730 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6731 CXCursor_ObjCClassMethodDecl)); 6732 } 6733 } 6734 6735 // + (BOOL)automaticallyNotifiesObserversForKey 6736 if (!IsInstanceMethod && 6737 (ReturnType.isNull() || 6738 ReturnType->isIntegerType() || 6739 ReturnType->isBooleanType())) { 6740 std::string SelectorName 6741 = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 6742 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6743 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6744 if (ReturnType.isNull()) { 6745 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6746 Builder.AddTextChunk("BOOL"); 6747 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6748 } 6749 6750 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6751 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6752 CXCursor_ObjCClassMethodDecl)); 6753 } 6754 } 6755 } 6756 6757 void Sema::CodeCompleteObjCMethodDecl(Scope *S, 6758 bool IsInstanceMethod, 6759 ParsedType ReturnTy) { 6760 // Determine the return type of the method we're declaring, if 6761 // provided. 6762 QualType ReturnType = GetTypeFromParser(ReturnTy); 6763 Decl *IDecl = 0; 6764 if (CurContext->isObjCContainer()) { 6765 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6766 IDecl = cast<Decl>(OCD); 6767 } 6768 // Determine where we should start searching for methods. 6769 ObjCContainerDecl *SearchDecl = 0; 6770 bool IsInImplementation = false; 6771 if (Decl *D = IDecl) { 6772 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6773 SearchDecl = Impl->getClassInterface(); 6774 IsInImplementation = true; 6775 } else if (ObjCCategoryImplDecl *CatImpl 6776 = dyn_cast<ObjCCategoryImplDecl>(D)) { 6777 SearchDecl = CatImpl->getCategoryDecl(); 6778 IsInImplementation = true; 6779 } else 6780 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6781 } 6782 6783 if (!SearchDecl && S) { 6784 if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) 6785 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6786 } 6787 6788 if (!SearchDecl) { 6789 HandleCodeCompleteResults(this, CodeCompleter, 6790 CodeCompletionContext::CCC_Other, 6791 0, 0); 6792 return; 6793 } 6794 6795 // Find all of the methods that we could declare/implement here. 6796 KnownMethodsMap KnownMethods; 6797 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6798 ReturnType, KnownMethods); 6799 6800 // Add declarations or definitions for each of the known methods. 6801 typedef CodeCompletionResult Result; 6802 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6803 CodeCompleter->getCodeCompletionTUInfo(), 6804 CodeCompletionContext::CCC_Other); 6805 Results.EnterNewScope(); 6806 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6807 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6808 MEnd = KnownMethods.end(); 6809 M != MEnd; ++M) { 6810 ObjCMethodDecl *Method = M->second.first; 6811 CodeCompletionBuilder Builder(Results.getAllocator(), 6812 Results.getCodeCompletionTUInfo()); 6813 6814 // If the result type was not already provided, add it to the 6815 // pattern as (type). 6816 if (ReturnType.isNull()) 6817 AddObjCPassingTypeChunk(Method->getResultType(), 6818 Method->getObjCDeclQualifier(), 6819 Context, Policy, 6820 Builder); 6821 6822 Selector Sel = Method->getSelector(); 6823 6824 // Add the first part of the selector to the pattern. 6825 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6826 Sel.getNameForSlot(0))); 6827 6828 // Add parameters to the pattern. 6829 unsigned I = 0; 6830 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6831 PEnd = Method->param_end(); 6832 P != PEnd; (void)++P, ++I) { 6833 // Add the part of the selector name. 6834 if (I == 0) 6835 Builder.AddTypedTextChunk(":"); 6836 else if (I < Sel.getNumArgs()) { 6837 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6838 Builder.AddTypedTextChunk( 6839 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6840 } else 6841 break; 6842 6843 // Add the parameter type. 6844 AddObjCPassingTypeChunk((*P)->getOriginalType(), 6845 (*P)->getObjCDeclQualifier(), 6846 Context, Policy, 6847 Builder); 6848 6849 if (IdentifierInfo *Id = (*P)->getIdentifier()) 6850 Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6851 } 6852 6853 if (Method->isVariadic()) { 6854 if (Method->param_size() > 0) 6855 Builder.AddChunk(CodeCompletionString::CK_Comma); 6856 Builder.AddTextChunk("..."); 6857 } 6858 6859 if (IsInImplementation && Results.includeCodePatterns()) { 6860 // We will be defining the method here, so add a compound statement. 6861 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6862 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6863 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6864 if (!Method->getResultType()->isVoidType()) { 6865 // If the result type is not void, add a return clause. 6866 Builder.AddTextChunk("return"); 6867 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6868 Builder.AddPlaceholderChunk("expression"); 6869 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6870 } else 6871 Builder.AddPlaceholderChunk("statements"); 6872 6873 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6874 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6875 } 6876 6877 unsigned Priority = CCP_CodePattern; 6878 if (!M->second.second) 6879 Priority += CCD_InBaseClass; 6880 6881 Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6882 } 6883 6884 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6885 // the properties in this class and its categories. 6886 if (Context.getLangOpts().ObjC2) { 6887 SmallVector<ObjCContainerDecl *, 4> Containers; 6888 Containers.push_back(SearchDecl); 6889 6890 VisitedSelectorSet KnownSelectors; 6891 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6892 MEnd = KnownMethods.end(); 6893 M != MEnd; ++M) 6894 KnownSelectors.insert(M->first); 6895 6896 6897 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6898 if (!IFace) 6899 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6900 IFace = Category->getClassInterface(); 6901 6902 if (IFace) { 6903 for (ObjCCategoryDecl *Category = IFace->getCategoryList(); Category; 6904 Category = Category->getNextClassCategory()) 6905 Containers.push_back(Category); 6906 } 6907 6908 for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6909 for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6910 PEnd = Containers[I]->prop_end(); 6911 P != PEnd; ++P) { 6912 AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6913 KnownSelectors, Results); 6914 } 6915 } 6916 } 6917 6918 Results.ExitScope(); 6919 6920 HandleCodeCompleteResults(this, CodeCompleter, 6921 CodeCompletionContext::CCC_Other, 6922 Results.data(),Results.size()); 6923 } 6924 6925 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 6926 bool IsInstanceMethod, 6927 bool AtParameterName, 6928 ParsedType ReturnTy, 6929 IdentifierInfo **SelIdents, 6930 unsigned NumSelIdents) { 6931 // If we have an external source, load the entire class method 6932 // pool from the AST file. 6933 if (ExternalSource) { 6934 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 6935 I != N; ++I) { 6936 Selector Sel = ExternalSource->GetExternalSelector(I); 6937 if (Sel.isNull() || MethodPool.count(Sel)) 6938 continue; 6939 6940 ReadMethodPool(Sel); 6941 } 6942 } 6943 6944 // Build the set of methods we can see. 6945 typedef CodeCompletionResult Result; 6946 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6947 CodeCompleter->getCodeCompletionTUInfo(), 6948 CodeCompletionContext::CCC_Other); 6949 6950 if (ReturnTy) 6951 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6952 6953 Results.EnterNewScope(); 6954 for (GlobalMethodPool::iterator M = MethodPool.begin(), 6955 MEnd = MethodPool.end(); 6956 M != MEnd; ++M) { 6957 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6958 &M->second.second; 6959 MethList && MethList->Method; 6960 MethList = MethList->Next) { 6961 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents, 6962 NumSelIdents)) 6963 continue; 6964 6965 if (AtParameterName) { 6966 // Suggest parameter names we've seen before. 6967 if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 6968 ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 6969 if (Param->getIdentifier()) { 6970 CodeCompletionBuilder Builder(Results.getAllocator(), 6971 Results.getCodeCompletionTUInfo()); 6972 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6973 Param->getIdentifier()->getName())); 6974 Results.AddResult(Builder.TakeString()); 6975 } 6976 } 6977 6978 continue; 6979 } 6980 6981 Result R(MethList->Method, 0); 6982 R.StartParameter = NumSelIdents; 6983 R.AllParametersAreInformative = false; 6984 R.DeclaringEntity = true; 6985 Results.MaybeAddResult(R, CurContext); 6986 } 6987 } 6988 6989 Results.ExitScope(); 6990 HandleCodeCompleteResults(this, CodeCompleter, 6991 CodeCompletionContext::CCC_Other, 6992 Results.data(),Results.size()); 6993 } 6994 6995 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 6996 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6997 CodeCompleter->getCodeCompletionTUInfo(), 6998 CodeCompletionContext::CCC_PreprocessorDirective); 6999 Results.EnterNewScope(); 7000 7001 // #if <condition> 7002 CodeCompletionBuilder Builder(Results.getAllocator(), 7003 Results.getCodeCompletionTUInfo()); 7004 Builder.AddTypedTextChunk("if"); 7005 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7006 Builder.AddPlaceholderChunk("condition"); 7007 Results.AddResult(Builder.TakeString()); 7008 7009 // #ifdef <macro> 7010 Builder.AddTypedTextChunk("ifdef"); 7011 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7012 Builder.AddPlaceholderChunk("macro"); 7013 Results.AddResult(Builder.TakeString()); 7014 7015 // #ifndef <macro> 7016 Builder.AddTypedTextChunk("ifndef"); 7017 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7018 Builder.AddPlaceholderChunk("macro"); 7019 Results.AddResult(Builder.TakeString()); 7020 7021 if (InConditional) { 7022 // #elif <condition> 7023 Builder.AddTypedTextChunk("elif"); 7024 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7025 Builder.AddPlaceholderChunk("condition"); 7026 Results.AddResult(Builder.TakeString()); 7027 7028 // #else 7029 Builder.AddTypedTextChunk("else"); 7030 Results.AddResult(Builder.TakeString()); 7031 7032 // #endif 7033 Builder.AddTypedTextChunk("endif"); 7034 Results.AddResult(Builder.TakeString()); 7035 } 7036 7037 // #include "header" 7038 Builder.AddTypedTextChunk("include"); 7039 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7040 Builder.AddTextChunk("\""); 7041 Builder.AddPlaceholderChunk("header"); 7042 Builder.AddTextChunk("\""); 7043 Results.AddResult(Builder.TakeString()); 7044 7045 // #include <header> 7046 Builder.AddTypedTextChunk("include"); 7047 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7048 Builder.AddTextChunk("<"); 7049 Builder.AddPlaceholderChunk("header"); 7050 Builder.AddTextChunk(">"); 7051 Results.AddResult(Builder.TakeString()); 7052 7053 // #define <macro> 7054 Builder.AddTypedTextChunk("define"); 7055 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7056 Builder.AddPlaceholderChunk("macro"); 7057 Results.AddResult(Builder.TakeString()); 7058 7059 // #define <macro>(<args>) 7060 Builder.AddTypedTextChunk("define"); 7061 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7062 Builder.AddPlaceholderChunk("macro"); 7063 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7064 Builder.AddPlaceholderChunk("args"); 7065 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7066 Results.AddResult(Builder.TakeString()); 7067 7068 // #undef <macro> 7069 Builder.AddTypedTextChunk("undef"); 7070 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7071 Builder.AddPlaceholderChunk("macro"); 7072 Results.AddResult(Builder.TakeString()); 7073 7074 // #line <number> 7075 Builder.AddTypedTextChunk("line"); 7076 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7077 Builder.AddPlaceholderChunk("number"); 7078 Results.AddResult(Builder.TakeString()); 7079 7080 // #line <number> "filename" 7081 Builder.AddTypedTextChunk("line"); 7082 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7083 Builder.AddPlaceholderChunk("number"); 7084 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7085 Builder.AddTextChunk("\""); 7086 Builder.AddPlaceholderChunk("filename"); 7087 Builder.AddTextChunk("\""); 7088 Results.AddResult(Builder.TakeString()); 7089 7090 // #error <message> 7091 Builder.AddTypedTextChunk("error"); 7092 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7093 Builder.AddPlaceholderChunk("message"); 7094 Results.AddResult(Builder.TakeString()); 7095 7096 // #pragma <arguments> 7097 Builder.AddTypedTextChunk("pragma"); 7098 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7099 Builder.AddPlaceholderChunk("arguments"); 7100 Results.AddResult(Builder.TakeString()); 7101 7102 if (getLangOpts().ObjC1) { 7103 // #import "header" 7104 Builder.AddTypedTextChunk("import"); 7105 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7106 Builder.AddTextChunk("\""); 7107 Builder.AddPlaceholderChunk("header"); 7108 Builder.AddTextChunk("\""); 7109 Results.AddResult(Builder.TakeString()); 7110 7111 // #import <header> 7112 Builder.AddTypedTextChunk("import"); 7113 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7114 Builder.AddTextChunk("<"); 7115 Builder.AddPlaceholderChunk("header"); 7116 Builder.AddTextChunk(">"); 7117 Results.AddResult(Builder.TakeString()); 7118 } 7119 7120 // #include_next "header" 7121 Builder.AddTypedTextChunk("include_next"); 7122 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7123 Builder.AddTextChunk("\""); 7124 Builder.AddPlaceholderChunk("header"); 7125 Builder.AddTextChunk("\""); 7126 Results.AddResult(Builder.TakeString()); 7127 7128 // #include_next <header> 7129 Builder.AddTypedTextChunk("include_next"); 7130 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7131 Builder.AddTextChunk("<"); 7132 Builder.AddPlaceholderChunk("header"); 7133 Builder.AddTextChunk(">"); 7134 Results.AddResult(Builder.TakeString()); 7135 7136 // #warning <message> 7137 Builder.AddTypedTextChunk("warning"); 7138 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7139 Builder.AddPlaceholderChunk("message"); 7140 Results.AddResult(Builder.TakeString()); 7141 7142 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7143 // completions for them. And __include_macros is a Clang-internal extension 7144 // that we don't want to encourage anyone to use. 7145 7146 // FIXME: we don't support #assert or #unassert, so don't suggest them. 7147 Results.ExitScope(); 7148 7149 HandleCodeCompleteResults(this, CodeCompleter, 7150 CodeCompletionContext::CCC_PreprocessorDirective, 7151 Results.data(), Results.size()); 7152 } 7153 7154 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7155 CodeCompleteOrdinaryName(S, 7156 S->getFnParent()? Sema::PCC_RecoveryInFunction 7157 : Sema::PCC_Namespace); 7158 } 7159 7160 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7161 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7162 CodeCompleter->getCodeCompletionTUInfo(), 7163 IsDefinition? CodeCompletionContext::CCC_MacroName 7164 : CodeCompletionContext::CCC_MacroNameUse); 7165 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 7166 // Add just the names of macros, not their arguments. 7167 CodeCompletionBuilder Builder(Results.getAllocator(), 7168 Results.getCodeCompletionTUInfo()); 7169 Results.EnterNewScope(); 7170 for (Preprocessor::macro_iterator M = PP.macro_begin(), 7171 MEnd = PP.macro_end(); 7172 M != MEnd; ++M) { 7173 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7174 M->first->getName())); 7175 Results.AddResult(Builder.TakeString()); 7176 } 7177 Results.ExitScope(); 7178 } else if (IsDefinition) { 7179 // FIXME: Can we detect when the user just wrote an include guard above? 7180 } 7181 7182 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7183 Results.data(), Results.size()); 7184 } 7185 7186 void Sema::CodeCompletePreprocessorExpression() { 7187 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7188 CodeCompleter->getCodeCompletionTUInfo(), 7189 CodeCompletionContext::CCC_PreprocessorExpression); 7190 7191 if (!CodeCompleter || CodeCompleter->includeMacros()) 7192 AddMacroResults(PP, Results); 7193 7194 // defined (<macro>) 7195 Results.EnterNewScope(); 7196 CodeCompletionBuilder Builder(Results.getAllocator(), 7197 Results.getCodeCompletionTUInfo()); 7198 Builder.AddTypedTextChunk("defined"); 7199 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7200 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7201 Builder.AddPlaceholderChunk("macro"); 7202 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7203 Results.AddResult(Builder.TakeString()); 7204 Results.ExitScope(); 7205 7206 HandleCodeCompleteResults(this, CodeCompleter, 7207 CodeCompletionContext::CCC_PreprocessorExpression, 7208 Results.data(), Results.size()); 7209 } 7210 7211 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7212 IdentifierInfo *Macro, 7213 MacroInfo *MacroInfo, 7214 unsigned Argument) { 7215 // FIXME: In the future, we could provide "overload" results, much like we 7216 // do for function calls. 7217 7218 // Now just ignore this. There will be another code-completion callback 7219 // for the expanded tokens. 7220 } 7221 7222 void Sema::CodeCompleteNaturalLanguage() { 7223 HandleCodeCompleteResults(this, CodeCompleter, 7224 CodeCompletionContext::CCC_NaturalLanguage, 7225 0, 0); 7226 } 7227 7228 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 7229 CodeCompletionTUInfo &CCTUInfo, 7230 SmallVectorImpl<CodeCompletionResult> &Results) { 7231 ResultBuilder Builder(*this, Allocator, CCTUInfo, 7232 CodeCompletionContext::CCC_Recovery); 7233 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 7234 CodeCompletionDeclConsumer Consumer(Builder, 7235 Context.getTranslationUnitDecl()); 7236 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 7237 Consumer); 7238 } 7239 7240 if (!CodeCompleter || CodeCompleter->includeMacros()) 7241 AddMacroResults(PP, Builder); 7242 7243 Results.clear(); 7244 Results.insert(Results.end(), 7245 Builder.data(), Builder.data() + Builder.size()); 7246 } 7247