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