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