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