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