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