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