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 (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 4331 CEnd = Intro.Captures.end(); 4332 C != CEnd; ++C) { 4333 if (C->Kind == LCK_This) { 4334 IncludedThis = true; 4335 continue; 4336 } 4337 4338 Known.insert(C->Id); 4339 } 4340 4341 // Look for other capturable variables. 4342 for (; S && !isNamespaceScope(S); S = S->getParent()) { 4343 for (const auto *D : S->decls()) { 4344 const auto *Var = dyn_cast<VarDecl>(D); 4345 if (!Var || 4346 !Var->hasLocalStorage() || 4347 Var->hasAttr<BlocksAttr>()) 4348 continue; 4349 4350 if (Known.insert(Var->getIdentifier())) 4351 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 4352 CurContext, 0, false); 4353 } 4354 } 4355 4356 // Add 'this', if it would be valid. 4357 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 4358 addThisCompletion(*this, Results); 4359 4360 Results.ExitScope(); 4361 4362 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4363 Results.data(), Results.size()); 4364 } 4365 4366 /// Macro that optionally prepends an "@" to the string literal passed in via 4367 /// Keyword, depending on whether NeedAt is true or false. 4368 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4369 4370 static void AddObjCImplementationResults(const LangOptions &LangOpts, 4371 ResultBuilder &Results, 4372 bool NeedAt) { 4373 typedef CodeCompletionResult Result; 4374 // Since we have an implementation, we can end it. 4375 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4376 4377 CodeCompletionBuilder Builder(Results.getAllocator(), 4378 Results.getCodeCompletionTUInfo()); 4379 if (LangOpts.ObjC2) { 4380 // @dynamic 4381 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4382 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4383 Builder.AddPlaceholderChunk("property"); 4384 Results.AddResult(Result(Builder.TakeString())); 4385 4386 // @synthesize 4387 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4388 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4389 Builder.AddPlaceholderChunk("property"); 4390 Results.AddResult(Result(Builder.TakeString())); 4391 } 4392 } 4393 4394 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 4395 ResultBuilder &Results, 4396 bool NeedAt) { 4397 typedef CodeCompletionResult Result; 4398 4399 // Since we have an interface or protocol, we can end it. 4400 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4401 4402 if (LangOpts.ObjC2) { 4403 // @property 4404 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4405 4406 // @required 4407 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4408 4409 // @optional 4410 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4411 } 4412 } 4413 4414 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 4415 typedef CodeCompletionResult Result; 4416 CodeCompletionBuilder Builder(Results.getAllocator(), 4417 Results.getCodeCompletionTUInfo()); 4418 4419 // @class name ; 4420 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4421 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4422 Builder.AddPlaceholderChunk("name"); 4423 Results.AddResult(Result(Builder.TakeString())); 4424 4425 if (Results.includeCodePatterns()) { 4426 // @interface name 4427 // FIXME: Could introduce the whole pattern, including superclasses and 4428 // such. 4429 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4430 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4431 Builder.AddPlaceholderChunk("class"); 4432 Results.AddResult(Result(Builder.TakeString())); 4433 4434 // @protocol name 4435 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4436 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4437 Builder.AddPlaceholderChunk("protocol"); 4438 Results.AddResult(Result(Builder.TakeString())); 4439 4440 // @implementation name 4441 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4442 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4443 Builder.AddPlaceholderChunk("class"); 4444 Results.AddResult(Result(Builder.TakeString())); 4445 } 4446 4447 // @compatibility_alias name 4448 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4449 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4450 Builder.AddPlaceholderChunk("alias"); 4451 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4452 Builder.AddPlaceholderChunk("class"); 4453 Results.AddResult(Result(Builder.TakeString())); 4454 4455 if (Results.getSema().getLangOpts().Modules) { 4456 // @import name 4457 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 4458 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4459 Builder.AddPlaceholderChunk("module"); 4460 Results.AddResult(Result(Builder.TakeString())); 4461 } 4462 } 4463 4464 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 4465 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4466 CodeCompleter->getCodeCompletionTUInfo(), 4467 CodeCompletionContext::CCC_Other); 4468 Results.EnterNewScope(); 4469 if (isa<ObjCImplDecl>(CurContext)) 4470 AddObjCImplementationResults(getLangOpts(), Results, false); 4471 else if (CurContext->isObjCContainer()) 4472 AddObjCInterfaceResults(getLangOpts(), Results, false); 4473 else 4474 AddObjCTopLevelResults(Results, false); 4475 Results.ExitScope(); 4476 HandleCodeCompleteResults(this, CodeCompleter, 4477 CodeCompletionContext::CCC_Other, 4478 Results.data(),Results.size()); 4479 } 4480 4481 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 4482 typedef CodeCompletionResult Result; 4483 CodeCompletionBuilder Builder(Results.getAllocator(), 4484 Results.getCodeCompletionTUInfo()); 4485 4486 // @encode ( type-name ) 4487 const char *EncodeType = "char[]"; 4488 if (Results.getSema().getLangOpts().CPlusPlus || 4489 Results.getSema().getLangOpts().ConstStrings) 4490 EncodeType = "const char[]"; 4491 Builder.AddResultTypeChunk(EncodeType); 4492 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4493 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4494 Builder.AddPlaceholderChunk("type-name"); 4495 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4496 Results.AddResult(Result(Builder.TakeString())); 4497 4498 // @protocol ( protocol-name ) 4499 Builder.AddResultTypeChunk("Protocol *"); 4500 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4501 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4502 Builder.AddPlaceholderChunk("protocol-name"); 4503 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4504 Results.AddResult(Result(Builder.TakeString())); 4505 4506 // @selector ( selector ) 4507 Builder.AddResultTypeChunk("SEL"); 4508 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4509 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4510 Builder.AddPlaceholderChunk("selector"); 4511 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4512 Results.AddResult(Result(Builder.TakeString())); 4513 4514 // @"string" 4515 Builder.AddResultTypeChunk("NSString *"); 4516 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\"")); 4517 Builder.AddPlaceholderChunk("string"); 4518 Builder.AddTextChunk("\""); 4519 Results.AddResult(Result(Builder.TakeString())); 4520 4521 // @[objects, ...] 4522 Builder.AddResultTypeChunk("NSArray *"); 4523 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4524 Builder.AddPlaceholderChunk("objects, ..."); 4525 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4526 Results.AddResult(Result(Builder.TakeString())); 4527 4528 // @{key : object, ...} 4529 Builder.AddResultTypeChunk("NSDictionary *"); 4530 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4531 Builder.AddPlaceholderChunk("key"); 4532 Builder.AddChunk(CodeCompletionString::CK_Colon); 4533 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4534 Builder.AddPlaceholderChunk("object, ..."); 4535 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4536 Results.AddResult(Result(Builder.TakeString())); 4537 4538 // @(expression) 4539 Builder.AddResultTypeChunk("id"); 4540 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 4541 Builder.AddPlaceholderChunk("expression"); 4542 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4543 Results.AddResult(Result(Builder.TakeString())); 4544 } 4545 4546 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 4547 typedef CodeCompletionResult Result; 4548 CodeCompletionBuilder Builder(Results.getAllocator(), 4549 Results.getCodeCompletionTUInfo()); 4550 4551 if (Results.includeCodePatterns()) { 4552 // @try { statements } @catch ( declaration ) { statements } @finally 4553 // { statements } 4554 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4555 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4556 Builder.AddPlaceholderChunk("statements"); 4557 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4558 Builder.AddTextChunk("@catch"); 4559 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4560 Builder.AddPlaceholderChunk("parameter"); 4561 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4562 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4563 Builder.AddPlaceholderChunk("statements"); 4564 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4565 Builder.AddTextChunk("@finally"); 4566 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4567 Builder.AddPlaceholderChunk("statements"); 4568 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4569 Results.AddResult(Result(Builder.TakeString())); 4570 } 4571 4572 // @throw 4573 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4574 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4575 Builder.AddPlaceholderChunk("expression"); 4576 Results.AddResult(Result(Builder.TakeString())); 4577 4578 if (Results.includeCodePatterns()) { 4579 // @synchronized ( expression ) { statements } 4580 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4581 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4582 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4583 Builder.AddPlaceholderChunk("expression"); 4584 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4585 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4586 Builder.AddPlaceholderChunk("statements"); 4587 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4588 Results.AddResult(Result(Builder.TakeString())); 4589 } 4590 } 4591 4592 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 4593 ResultBuilder &Results, 4594 bool NeedAt) { 4595 typedef CodeCompletionResult Result; 4596 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4597 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4598 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4599 if (LangOpts.ObjC2) 4600 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4601 } 4602 4603 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4604 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4605 CodeCompleter->getCodeCompletionTUInfo(), 4606 CodeCompletionContext::CCC_Other); 4607 Results.EnterNewScope(); 4608 AddObjCVisibilityResults(getLangOpts(), Results, false); 4609 Results.ExitScope(); 4610 HandleCodeCompleteResults(this, CodeCompleter, 4611 CodeCompletionContext::CCC_Other, 4612 Results.data(),Results.size()); 4613 } 4614 4615 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 4616 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4617 CodeCompleter->getCodeCompletionTUInfo(), 4618 CodeCompletionContext::CCC_Other); 4619 Results.EnterNewScope(); 4620 AddObjCStatementResults(Results, false); 4621 AddObjCExpressionResults(Results, false); 4622 Results.ExitScope(); 4623 HandleCodeCompleteResults(this, CodeCompleter, 4624 CodeCompletionContext::CCC_Other, 4625 Results.data(),Results.size()); 4626 } 4627 4628 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 4629 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4630 CodeCompleter->getCodeCompletionTUInfo(), 4631 CodeCompletionContext::CCC_Other); 4632 Results.EnterNewScope(); 4633 AddObjCExpressionResults(Results, false); 4634 Results.ExitScope(); 4635 HandleCodeCompleteResults(this, CodeCompleter, 4636 CodeCompletionContext::CCC_Other, 4637 Results.data(),Results.size()); 4638 } 4639 4640 /// \brief Determine whether the addition of the given flag to an Objective-C 4641 /// property's attributes will cause a conflict. 4642 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4643 // Check if we've already added this flag. 4644 if (Attributes & NewFlag) 4645 return true; 4646 4647 Attributes |= NewFlag; 4648 4649 // Check for collisions with "readonly". 4650 if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4651 (Attributes & ObjCDeclSpec::DQ_PR_readwrite)) 4652 return true; 4653 4654 // Check for more than one of { assign, copy, retain, strong, weak }. 4655 unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4656 ObjCDeclSpec::DQ_PR_unsafe_unretained | 4657 ObjCDeclSpec::DQ_PR_copy | 4658 ObjCDeclSpec::DQ_PR_retain | 4659 ObjCDeclSpec::DQ_PR_strong | 4660 ObjCDeclSpec::DQ_PR_weak); 4661 if (AssignCopyRetMask && 4662 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4663 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4664 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4665 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4666 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong && 4667 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak) 4668 return true; 4669 4670 return false; 4671 } 4672 4673 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4674 if (!CodeCompleter) 4675 return; 4676 4677 unsigned Attributes = ODS.getPropertyAttributes(); 4678 4679 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4680 CodeCompleter->getCodeCompletionTUInfo(), 4681 CodeCompletionContext::CCC_Other); 4682 Results.EnterNewScope(); 4683 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 4684 Results.AddResult(CodeCompletionResult("readonly")); 4685 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 4686 Results.AddResult(CodeCompletionResult("assign")); 4687 if (!ObjCPropertyFlagConflicts(Attributes, 4688 ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4689 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4690 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 4691 Results.AddResult(CodeCompletionResult("readwrite")); 4692 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 4693 Results.AddResult(CodeCompletionResult("retain")); 4694 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4695 Results.AddResult(CodeCompletionResult("strong")); 4696 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 4697 Results.AddResult(CodeCompletionResult("copy")); 4698 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 4699 Results.AddResult(CodeCompletionResult("nonatomic")); 4700 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 4701 Results.AddResult(CodeCompletionResult("atomic")); 4702 4703 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 4704 if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC) 4705 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak)) 4706 Results.AddResult(CodeCompletionResult("weak")); 4707 4708 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4709 CodeCompletionBuilder Setter(Results.getAllocator(), 4710 Results.getCodeCompletionTUInfo()); 4711 Setter.AddTypedTextChunk("setter"); 4712 Setter.AddTextChunk("="); 4713 Setter.AddPlaceholderChunk("method"); 4714 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 4715 } 4716 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4717 CodeCompletionBuilder Getter(Results.getAllocator(), 4718 Results.getCodeCompletionTUInfo()); 4719 Getter.AddTypedTextChunk("getter"); 4720 Getter.AddTextChunk("="); 4721 Getter.AddPlaceholderChunk("method"); 4722 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 4723 } 4724 Results.ExitScope(); 4725 HandleCodeCompleteResults(this, CodeCompleter, 4726 CodeCompletionContext::CCC_Other, 4727 Results.data(),Results.size()); 4728 } 4729 4730 /// \brief Describes the kind of Objective-C method that we want to find 4731 /// via code completion. 4732 enum ObjCMethodKind { 4733 MK_Any, ///< Any kind of method, provided it means other specified criteria. 4734 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 4735 MK_OneArgSelector ///< One-argument selector. 4736 }; 4737 4738 static bool isAcceptableObjCSelector(Selector Sel, 4739 ObjCMethodKind WantKind, 4740 ArrayRef<IdentifierInfo *> SelIdents, 4741 bool AllowSameLength = true) { 4742 unsigned NumSelIdents = SelIdents.size(); 4743 if (NumSelIdents > Sel.getNumArgs()) 4744 return false; 4745 4746 switch (WantKind) { 4747 case MK_Any: break; 4748 case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4749 case MK_OneArgSelector: return Sel.getNumArgs() == 1; 4750 } 4751 4752 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4753 return false; 4754 4755 for (unsigned I = 0; I != NumSelIdents; ++I) 4756 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 4757 return false; 4758 4759 return true; 4760 } 4761 4762 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4763 ObjCMethodKind WantKind, 4764 ArrayRef<IdentifierInfo *> SelIdents, 4765 bool AllowSameLength = true) { 4766 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4767 AllowSameLength); 4768 } 4769 4770 namespace { 4771 /// \brief A set of selectors, which is used to avoid introducing multiple 4772 /// completions with the same selector into the result set. 4773 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4774 } 4775 4776 /// \brief Add all of the Objective-C methods in the given Objective-C 4777 /// container to the set of results. 4778 /// 4779 /// The container will be a class, protocol, category, or implementation of 4780 /// any of the above. This mether will recurse to include methods from 4781 /// the superclasses of classes along with their categories, protocols, and 4782 /// implementations. 4783 /// 4784 /// \param Container the container in which we'll look to find methods. 4785 /// 4786 /// \param WantInstanceMethods Whether to add instance methods (only); if 4787 /// false, this routine will add factory methods (only). 4788 /// 4789 /// \param CurContext the context in which we're performing the lookup that 4790 /// finds methods. 4791 /// 4792 /// \param AllowSameLength Whether we allow a method to be added to the list 4793 /// when it has the same number of parameters as we have selector identifiers. 4794 /// 4795 /// \param Results the structure into which we'll add results. 4796 static void AddObjCMethods(ObjCContainerDecl *Container, 4797 bool WantInstanceMethods, 4798 ObjCMethodKind WantKind, 4799 ArrayRef<IdentifierInfo *> SelIdents, 4800 DeclContext *CurContext, 4801 VisitedSelectorSet &Selectors, 4802 bool AllowSameLength, 4803 ResultBuilder &Results, 4804 bool InOriginalClass = true) { 4805 typedef CodeCompletionResult Result; 4806 Container = getContainerDef(Container); 4807 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 4808 bool isRootClass = IFace && !IFace->getSuperClass(); 4809 for (auto *M : Container->methods()) { 4810 // The instance methods on the root class can be messaged via the 4811 // metaclass. 4812 if (M->isInstanceMethod() == WantInstanceMethods || 4813 (isRootClass && !WantInstanceMethods)) { 4814 // Check whether the selector identifiers we've been given are a 4815 // subset of the identifiers for this particular method. 4816 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength)) 4817 continue; 4818 4819 if (!Selectors.insert(M->getSelector())) 4820 continue; 4821 4822 Result R = Result(M, Results.getBasePriority(M), 0); 4823 R.StartParameter = SelIdents.size(); 4824 R.AllParametersAreInformative = (WantKind != MK_Any); 4825 if (!InOriginalClass) 4826 R.Priority += CCD_InBaseClass; 4827 Results.MaybeAddResult(R, CurContext); 4828 } 4829 } 4830 4831 // Visit the protocols of protocols. 4832 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4833 if (Protocol->hasDefinition()) { 4834 const ObjCList<ObjCProtocolDecl> &Protocols 4835 = Protocol->getReferencedProtocols(); 4836 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4837 E = Protocols.end(); 4838 I != E; ++I) 4839 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4840 CurContext, Selectors, AllowSameLength, Results, false); 4841 } 4842 } 4843 4844 if (!IFace || !IFace->hasDefinition()) 4845 return; 4846 4847 // Add methods in protocols. 4848 for (auto *I : IFace->protocols()) 4849 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, 4850 CurContext, Selectors, AllowSameLength, Results, false); 4851 4852 // Add methods in categories. 4853 for (auto *CatDecl : IFace->known_categories()) { 4854 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4855 CurContext, Selectors, AllowSameLength, 4856 Results, InOriginalClass); 4857 4858 // Add a categories protocol methods. 4859 const ObjCList<ObjCProtocolDecl> &Protocols 4860 = CatDecl->getReferencedProtocols(); 4861 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4862 E = Protocols.end(); 4863 I != E; ++I) 4864 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4865 CurContext, Selectors, AllowSameLength, 4866 Results, false); 4867 4868 // Add methods in category implementations. 4869 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 4870 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4871 CurContext, Selectors, AllowSameLength, 4872 Results, InOriginalClass); 4873 } 4874 4875 // Add methods in superclass. 4876 if (IFace->getSuperClass()) 4877 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4878 SelIdents, CurContext, Selectors, 4879 AllowSameLength, Results, false); 4880 4881 // Add methods in our implementation, if any. 4882 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 4883 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4884 CurContext, Selectors, AllowSameLength, 4885 Results, InOriginalClass); 4886 } 4887 4888 4889 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 4890 // Try to find the interface where getters might live. 4891 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4892 if (!Class) { 4893 if (ObjCCategoryDecl *Category 4894 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4895 Class = Category->getClassInterface(); 4896 4897 if (!Class) 4898 return; 4899 } 4900 4901 // Find all of the potential getters. 4902 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4903 CodeCompleter->getCodeCompletionTUInfo(), 4904 CodeCompletionContext::CCC_Other); 4905 Results.EnterNewScope(); 4906 4907 VisitedSelectorSet Selectors; 4908 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 4909 /*AllowSameLength=*/true, Results); 4910 Results.ExitScope(); 4911 HandleCodeCompleteResults(this, CodeCompleter, 4912 CodeCompletionContext::CCC_Other, 4913 Results.data(),Results.size()); 4914 } 4915 4916 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 4917 // Try to find the interface where setters might live. 4918 ObjCInterfaceDecl *Class 4919 = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4920 if (!Class) { 4921 if (ObjCCategoryDecl *Category 4922 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4923 Class = Category->getClassInterface(); 4924 4925 if (!Class) 4926 return; 4927 } 4928 4929 // Find all of the potential getters. 4930 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4931 CodeCompleter->getCodeCompletionTUInfo(), 4932 CodeCompletionContext::CCC_Other); 4933 Results.EnterNewScope(); 4934 4935 VisitedSelectorSet Selectors; 4936 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, 4937 Selectors, /*AllowSameLength=*/true, Results); 4938 4939 Results.ExitScope(); 4940 HandleCodeCompleteResults(this, CodeCompleter, 4941 CodeCompletionContext::CCC_Other, 4942 Results.data(),Results.size()); 4943 } 4944 4945 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4946 bool IsParameter) { 4947 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4948 CodeCompleter->getCodeCompletionTUInfo(), 4949 CodeCompletionContext::CCC_Type); 4950 Results.EnterNewScope(); 4951 4952 // Add context-sensitive, Objective-C parameter-passing keywords. 4953 bool AddedInOut = false; 4954 if ((DS.getObjCDeclQualifier() & 4955 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4956 Results.AddResult("in"); 4957 Results.AddResult("inout"); 4958 AddedInOut = true; 4959 } 4960 if ((DS.getObjCDeclQualifier() & 4961 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4962 Results.AddResult("out"); 4963 if (!AddedInOut) 4964 Results.AddResult("inout"); 4965 } 4966 if ((DS.getObjCDeclQualifier() & 4967 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4968 ObjCDeclSpec::DQ_Oneway)) == 0) { 4969 Results.AddResult("bycopy"); 4970 Results.AddResult("byref"); 4971 Results.AddResult("oneway"); 4972 } 4973 4974 // If we're completing the return type of an Objective-C method and the 4975 // identifier IBAction refers to a macro, provide a completion item for 4976 // an action, e.g., 4977 // IBAction)<#selector#>:(id)sender 4978 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 4979 Context.Idents.get("IBAction").hasMacroDefinition()) { 4980 CodeCompletionBuilder Builder(Results.getAllocator(), 4981 Results.getCodeCompletionTUInfo(), 4982 CCP_CodePattern, CXAvailability_Available); 4983 Builder.AddTypedTextChunk("IBAction"); 4984 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4985 Builder.AddPlaceholderChunk("selector"); 4986 Builder.AddChunk(CodeCompletionString::CK_Colon); 4987 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4988 Builder.AddTextChunk("id"); 4989 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4990 Builder.AddTextChunk("sender"); 4991 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 4992 } 4993 4994 // If we're completing the return type, provide 'instancetype'. 4995 if (!IsParameter) { 4996 Results.AddResult(CodeCompletionResult("instancetype")); 4997 } 4998 4999 // Add various builtin type names and specifiers. 5000 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 5001 Results.ExitScope(); 5002 5003 // Add the various type names 5004 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 5005 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5006 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5007 CodeCompleter->includeGlobals()); 5008 5009 if (CodeCompleter->includeMacros()) 5010 AddMacroResults(PP, Results, false); 5011 5012 HandleCodeCompleteResults(this, CodeCompleter, 5013 CodeCompletionContext::CCC_Type, 5014 Results.data(), Results.size()); 5015 } 5016 5017 /// \brief When we have an expression with type "id", we may assume 5018 /// that it has some more-specific class type based on knowledge of 5019 /// common uses of Objective-C. This routine returns that class type, 5020 /// or NULL if no better result could be determined. 5021 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 5022 ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 5023 if (!Msg) 5024 return 0; 5025 5026 Selector Sel = Msg->getSelector(); 5027 if (Sel.isNull()) 5028 return 0; 5029 5030 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 5031 if (!Id) 5032 return 0; 5033 5034 ObjCMethodDecl *Method = Msg->getMethodDecl(); 5035 if (!Method) 5036 return 0; 5037 5038 // Determine the class that we're sending the message to. 5039 ObjCInterfaceDecl *IFace = 0; 5040 switch (Msg->getReceiverKind()) { 5041 case ObjCMessageExpr::Class: 5042 if (const ObjCObjectType *ObjType 5043 = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 5044 IFace = ObjType->getInterface(); 5045 break; 5046 5047 case ObjCMessageExpr::Instance: { 5048 QualType T = Msg->getInstanceReceiver()->getType(); 5049 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 5050 IFace = Ptr->getInterfaceDecl(); 5051 break; 5052 } 5053 5054 case ObjCMessageExpr::SuperInstance: 5055 case ObjCMessageExpr::SuperClass: 5056 break; 5057 } 5058 5059 if (!IFace) 5060 return 0; 5061 5062 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 5063 if (Method->isInstanceMethod()) 5064 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5065 .Case("retain", IFace) 5066 .Case("strong", IFace) 5067 .Case("autorelease", IFace) 5068 .Case("copy", IFace) 5069 .Case("copyWithZone", IFace) 5070 .Case("mutableCopy", IFace) 5071 .Case("mutableCopyWithZone", IFace) 5072 .Case("awakeFromCoder", IFace) 5073 .Case("replacementObjectFromCoder", IFace) 5074 .Case("class", IFace) 5075 .Case("classForCoder", IFace) 5076 .Case("superclass", Super) 5077 .Default(0); 5078 5079 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5080 .Case("new", IFace) 5081 .Case("alloc", IFace) 5082 .Case("allocWithZone", IFace) 5083 .Case("class", IFace) 5084 .Case("superclass", Super) 5085 .Default(0); 5086 } 5087 5088 // Add a special completion for a message send to "super", which fills in the 5089 // most likely case of forwarding all of our arguments to the superclass 5090 // function. 5091 /// 5092 /// \param S The semantic analysis object. 5093 /// 5094 /// \param NeedSuperKeyword Whether we need to prefix this completion with 5095 /// the "super" keyword. Otherwise, we just need to provide the arguments. 5096 /// 5097 /// \param SelIdents The identifiers in the selector that have already been 5098 /// provided as arguments for a send to "super". 5099 /// 5100 /// \param Results The set of results to augment. 5101 /// 5102 /// \returns the Objective-C method declaration that would be invoked by 5103 /// this "super" completion. If NULL, no completion was added. 5104 static ObjCMethodDecl *AddSuperSendCompletion( 5105 Sema &S, bool NeedSuperKeyword, 5106 ArrayRef<IdentifierInfo *> SelIdents, 5107 ResultBuilder &Results) { 5108 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 5109 if (!CurMethod) 5110 return 0; 5111 5112 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 5113 if (!Class) 5114 return 0; 5115 5116 // Try to find a superclass method with the same selector. 5117 ObjCMethodDecl *SuperMethod = 0; 5118 while ((Class = Class->getSuperClass()) && !SuperMethod) { 5119 // Check in the class 5120 SuperMethod = Class->getMethod(CurMethod->getSelector(), 5121 CurMethod->isInstanceMethod()); 5122 5123 // Check in categories or class extensions. 5124 if (!SuperMethod) { 5125 for (const auto *Cat : Class->known_categories()) { 5126 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 5127 CurMethod->isInstanceMethod()))) 5128 break; 5129 } 5130 } 5131 } 5132 5133 if (!SuperMethod) 5134 return 0; 5135 5136 // Check whether the superclass method has the same signature. 5137 if (CurMethod->param_size() != SuperMethod->param_size() || 5138 CurMethod->isVariadic() != SuperMethod->isVariadic()) 5139 return 0; 5140 5141 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 5142 CurPEnd = CurMethod->param_end(), 5143 SuperP = SuperMethod->param_begin(); 5144 CurP != CurPEnd; ++CurP, ++SuperP) { 5145 // Make sure the parameter types are compatible. 5146 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 5147 (*SuperP)->getType())) 5148 return 0; 5149 5150 // Make sure we have a parameter name to forward! 5151 if (!(*CurP)->getIdentifier()) 5152 return 0; 5153 } 5154 5155 // We have a superclass method. Now, form the send-to-super completion. 5156 CodeCompletionBuilder Builder(Results.getAllocator(), 5157 Results.getCodeCompletionTUInfo()); 5158 5159 // Give this completion a return type. 5160 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 5161 Builder); 5162 5163 // If we need the "super" keyword, add it (plus some spacing). 5164 if (NeedSuperKeyword) { 5165 Builder.AddTypedTextChunk("super"); 5166 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5167 } 5168 5169 Selector Sel = CurMethod->getSelector(); 5170 if (Sel.isUnarySelector()) { 5171 if (NeedSuperKeyword) 5172 Builder.AddTextChunk(Builder.getAllocator().CopyString( 5173 Sel.getNameForSlot(0))); 5174 else 5175 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5176 Sel.getNameForSlot(0))); 5177 } else { 5178 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 5179 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 5180 if (I > SelIdents.size()) 5181 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5182 5183 if (I < SelIdents.size()) 5184 Builder.AddInformativeChunk( 5185 Builder.getAllocator().CopyString( 5186 Sel.getNameForSlot(I) + ":")); 5187 else if (NeedSuperKeyword || I > SelIdents.size()) { 5188 Builder.AddTextChunk( 5189 Builder.getAllocator().CopyString( 5190 Sel.getNameForSlot(I) + ":")); 5191 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5192 (*CurP)->getIdentifier()->getName())); 5193 } else { 5194 Builder.AddTypedTextChunk( 5195 Builder.getAllocator().CopyString( 5196 Sel.getNameForSlot(I) + ":")); 5197 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5198 (*CurP)->getIdentifier()->getName())); 5199 } 5200 } 5201 } 5202 5203 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 5204 CCP_SuperCompletion)); 5205 return SuperMethod; 5206 } 5207 5208 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 5209 typedef CodeCompletionResult Result; 5210 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5211 CodeCompleter->getCodeCompletionTUInfo(), 5212 CodeCompletionContext::CCC_ObjCMessageReceiver, 5213 getLangOpts().CPlusPlus11 5214 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 5215 : &ResultBuilder::IsObjCMessageReceiver); 5216 5217 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5218 Results.EnterNewScope(); 5219 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5220 CodeCompleter->includeGlobals()); 5221 5222 // If we are in an Objective-C method inside a class that has a superclass, 5223 // add "super" as an option. 5224 if (ObjCMethodDecl *Method = getCurMethodDecl()) 5225 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 5226 if (Iface->getSuperClass()) { 5227 Results.AddResult(Result("super")); 5228 5229 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 5230 } 5231 5232 if (getLangOpts().CPlusPlus11) 5233 addThisCompletion(*this, Results); 5234 5235 Results.ExitScope(); 5236 5237 if (CodeCompleter->includeMacros()) 5238 AddMacroResults(PP, Results, false); 5239 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5240 Results.data(), Results.size()); 5241 5242 } 5243 5244 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5245 ArrayRef<IdentifierInfo *> SelIdents, 5246 bool AtArgumentExpression) { 5247 ObjCInterfaceDecl *CDecl = 0; 5248 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5249 // Figure out which interface we're in. 5250 CDecl = CurMethod->getClassInterface(); 5251 if (!CDecl) 5252 return; 5253 5254 // Find the superclass of this class. 5255 CDecl = CDecl->getSuperClass(); 5256 if (!CDecl) 5257 return; 5258 5259 if (CurMethod->isInstanceMethod()) { 5260 // We are inside an instance method, which means that the message 5261 // send [super ...] is actually calling an instance method on the 5262 // current object. 5263 return CodeCompleteObjCInstanceMessage(S, 0, SelIdents, 5264 AtArgumentExpression, 5265 CDecl); 5266 } 5267 5268 // Fall through to send to the superclass in CDecl. 5269 } else { 5270 // "super" may be the name of a type or variable. Figure out which 5271 // it is. 5272 IdentifierInfo *Super = getSuperIdentifier(); 5273 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 5274 LookupOrdinaryName); 5275 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 5276 // "super" names an interface. Use it. 5277 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5278 if (const ObjCObjectType *Iface 5279 = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5280 CDecl = Iface->getInterface(); 5281 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 5282 // "super" names an unresolved type; we can't be more specific. 5283 } else { 5284 // Assume that "super" names some kind of value and parse that way. 5285 CXXScopeSpec SS; 5286 SourceLocation TemplateKWLoc; 5287 UnqualifiedId id; 5288 id.setIdentifier(Super, SuperLoc); 5289 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5290 false, false); 5291 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 5292 SelIdents, 5293 AtArgumentExpression); 5294 } 5295 5296 // Fall through 5297 } 5298 5299 ParsedType Receiver; 5300 if (CDecl) 5301 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 5302 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 5303 AtArgumentExpression, 5304 /*IsSuper=*/true); 5305 } 5306 5307 /// \brief Given a set of code-completion results for the argument of a message 5308 /// send, determine the preferred type (if any) for that argument expression. 5309 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5310 unsigned NumSelIdents) { 5311 typedef CodeCompletionResult Result; 5312 ASTContext &Context = Results.getSema().Context; 5313 5314 QualType PreferredType; 5315 unsigned BestPriority = CCP_Unlikely * 2; 5316 Result *ResultsData = Results.data(); 5317 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5318 Result &R = ResultsData[I]; 5319 if (R.Kind == Result::RK_Declaration && 5320 isa<ObjCMethodDecl>(R.Declaration)) { 5321 if (R.Priority <= BestPriority) { 5322 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5323 if (NumSelIdents <= Method->param_size()) { 5324 QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5325 ->getType(); 5326 if (R.Priority < BestPriority || PreferredType.isNull()) { 5327 BestPriority = R.Priority; 5328 PreferredType = MyPreferredType; 5329 } else if (!Context.hasSameUnqualifiedType(PreferredType, 5330 MyPreferredType)) { 5331 PreferredType = QualType(); 5332 } 5333 } 5334 } 5335 } 5336 } 5337 5338 return PreferredType; 5339 } 5340 5341 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5342 ParsedType Receiver, 5343 ArrayRef<IdentifierInfo *> SelIdents, 5344 bool AtArgumentExpression, 5345 bool IsSuper, 5346 ResultBuilder &Results) { 5347 typedef CodeCompletionResult Result; 5348 ObjCInterfaceDecl *CDecl = 0; 5349 5350 // If the given name refers to an interface type, retrieve the 5351 // corresponding declaration. 5352 if (Receiver) { 5353 QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 5354 if (!T.isNull()) 5355 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5356 CDecl = Interface->getInterface(); 5357 } 5358 5359 // Add all of the factory methods in this Objective-C class, its protocols, 5360 // superclasses, categories, implementation, etc. 5361 Results.EnterNewScope(); 5362 5363 // If this is a send-to-super, try to add the special "super" send 5364 // completion. 5365 if (IsSuper) { 5366 if (ObjCMethodDecl *SuperMethod 5367 = AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 5368 Results.Ignore(SuperMethod); 5369 } 5370 5371 // If we're inside an Objective-C method definition, prefer its selector to 5372 // others. 5373 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5374 Results.setPreferredSelector(CurMethod->getSelector()); 5375 5376 VisitedSelectorSet Selectors; 5377 if (CDecl) 5378 AddObjCMethods(CDecl, false, MK_Any, SelIdents, 5379 SemaRef.CurContext, Selectors, AtArgumentExpression, 5380 Results); 5381 else { 5382 // We're messaging "id" as a type; provide all class/factory methods. 5383 5384 // If we have an external source, load the entire class method 5385 // pool from the AST file. 5386 if (SemaRef.getExternalSource()) { 5387 for (uint32_t I = 0, 5388 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 5389 I != N; ++I) { 5390 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 5391 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5392 continue; 5393 5394 SemaRef.ReadMethodPool(Sel); 5395 } 5396 } 5397 5398 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5399 MEnd = SemaRef.MethodPool.end(); 5400 M != MEnd; ++M) { 5401 for (ObjCMethodList *MethList = &M->second.second; 5402 MethList && MethList->Method; 5403 MethList = MethList->getNext()) { 5404 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 5405 continue; 5406 5407 Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); 5408 R.StartParameter = SelIdents.size(); 5409 R.AllParametersAreInformative = false; 5410 Results.MaybeAddResult(R, SemaRef.CurContext); 5411 } 5412 } 5413 } 5414 5415 Results.ExitScope(); 5416 } 5417 5418 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5419 ArrayRef<IdentifierInfo *> SelIdents, 5420 bool AtArgumentExpression, 5421 bool IsSuper) { 5422 5423 QualType T = this->GetTypeFromParser(Receiver); 5424 5425 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5426 CodeCompleter->getCodeCompletionTUInfo(), 5427 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 5428 T, SelIdents)); 5429 5430 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 5431 AtArgumentExpression, IsSuper, Results); 5432 5433 // If we're actually at the argument expression (rather than prior to the 5434 // selector), we're actually performing code completion for an expression. 5435 // Determine whether we have a single, best method. If so, we can 5436 // code-complete the expression using the corresponding parameter type as 5437 // our preferred type, improving completion results. 5438 if (AtArgumentExpression) { 5439 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5440 SelIdents.size()); 5441 if (PreferredType.isNull()) 5442 CodeCompleteOrdinaryName(S, PCC_Expression); 5443 else 5444 CodeCompleteExpression(S, PreferredType); 5445 return; 5446 } 5447 5448 HandleCodeCompleteResults(this, CodeCompleter, 5449 Results.getCompletionContext(), 5450 Results.data(), Results.size()); 5451 } 5452 5453 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5454 ArrayRef<IdentifierInfo *> SelIdents, 5455 bool AtArgumentExpression, 5456 ObjCInterfaceDecl *Super) { 5457 typedef CodeCompletionResult Result; 5458 5459 Expr *RecExpr = static_cast<Expr *>(Receiver); 5460 5461 // If necessary, apply function/array conversion to the receiver. 5462 // C99 6.7.5.3p[7,8]. 5463 if (RecExpr) { 5464 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5465 if (Conv.isInvalid()) // conversion failed. bail. 5466 return; 5467 RecExpr = Conv.take(); 5468 } 5469 QualType ReceiverType = RecExpr? RecExpr->getType() 5470 : Super? Context.getObjCObjectPointerType( 5471 Context.getObjCInterfaceType(Super)) 5472 : Context.getObjCIdType(); 5473 5474 // If we're messaging an expression with type "id" or "Class", check 5475 // whether we know something special about the receiver that allows 5476 // us to assume a more-specific receiver type. 5477 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 5478 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5479 if (ReceiverType->isObjCClassType()) 5480 return CodeCompleteObjCClassMessage(S, 5481 ParsedType::make(Context.getObjCInterfaceType(IFace)), 5482 SelIdents, 5483 AtArgumentExpression, Super); 5484 5485 ReceiverType = Context.getObjCObjectPointerType( 5486 Context.getObjCInterfaceType(IFace)); 5487 } 5488 } else if (RecExpr && getLangOpts().CPlusPlus) { 5489 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 5490 if (Conv.isUsable()) { 5491 RecExpr = Conv.take(); 5492 ReceiverType = RecExpr->getType(); 5493 } 5494 } 5495 5496 // Build the set of methods we can see. 5497 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5498 CodeCompleter->getCodeCompletionTUInfo(), 5499 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 5500 ReceiverType, SelIdents)); 5501 5502 Results.EnterNewScope(); 5503 5504 // If this is a send-to-super, try to add the special "super" send 5505 // completion. 5506 if (Super) { 5507 if (ObjCMethodDecl *SuperMethod 5508 = AddSuperSendCompletion(*this, false, SelIdents, Results)) 5509 Results.Ignore(SuperMethod); 5510 } 5511 5512 // If we're inside an Objective-C method definition, prefer its selector to 5513 // others. 5514 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5515 Results.setPreferredSelector(CurMethod->getSelector()); 5516 5517 // Keep track of the selectors we've already added. 5518 VisitedSelectorSet Selectors; 5519 5520 // Handle messages to Class. This really isn't a message to an instance 5521 // method, so we treat it the same way we would treat a message send to a 5522 // class method. 5523 if (ReceiverType->isObjCClassType() || 5524 ReceiverType->isObjCQualifiedClassType()) { 5525 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5526 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 5527 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, 5528 CurContext, Selectors, AtArgumentExpression, Results); 5529 } 5530 } 5531 // Handle messages to a qualified ID ("id<foo>"). 5532 else if (const ObjCObjectPointerType *QualID 5533 = ReceiverType->getAsObjCQualifiedIdType()) { 5534 // Search protocols for instance methods. 5535 for (auto *I : QualID->quals()) 5536 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, 5537 Selectors, AtArgumentExpression, Results); 5538 } 5539 // Handle messages to a pointer to interface type. 5540 else if (const ObjCObjectPointerType *IFacePtr 5541 = ReceiverType->getAsObjCInterfacePointerType()) { 5542 // Search the class, its superclasses, etc., for instance methods. 5543 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5544 CurContext, Selectors, AtArgumentExpression, 5545 Results); 5546 5547 // Search protocols for instance methods. 5548 for (auto *I : IFacePtr->quals()) 5549 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, 5550 Selectors, AtArgumentExpression, Results); 5551 } 5552 // Handle messages to "id". 5553 else if (ReceiverType->isObjCIdType()) { 5554 // We're messaging "id", so provide all instance methods we know 5555 // about as code-completion results. 5556 5557 // If we have an external source, load the entire class method 5558 // pool from the AST file. 5559 if (ExternalSource) { 5560 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5561 I != N; ++I) { 5562 Selector Sel = ExternalSource->GetExternalSelector(I); 5563 if (Sel.isNull() || MethodPool.count(Sel)) 5564 continue; 5565 5566 ReadMethodPool(Sel); 5567 } 5568 } 5569 5570 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5571 MEnd = MethodPool.end(); 5572 M != MEnd; ++M) { 5573 for (ObjCMethodList *MethList = &M->second.first; 5574 MethList && MethList->Method; 5575 MethList = MethList->getNext()) { 5576 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 5577 continue; 5578 5579 if (!Selectors.insert(MethList->Method->getSelector())) 5580 continue; 5581 5582 Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); 5583 R.StartParameter = SelIdents.size(); 5584 R.AllParametersAreInformative = false; 5585 Results.MaybeAddResult(R, CurContext); 5586 } 5587 } 5588 } 5589 Results.ExitScope(); 5590 5591 5592 // If we're actually at the argument expression (rather than prior to the 5593 // selector), we're actually performing code completion for an expression. 5594 // Determine whether we have a single, best method. If so, we can 5595 // code-complete the expression using the corresponding parameter type as 5596 // our preferred type, improving completion results. 5597 if (AtArgumentExpression) { 5598 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5599 SelIdents.size()); 5600 if (PreferredType.isNull()) 5601 CodeCompleteOrdinaryName(S, PCC_Expression); 5602 else 5603 CodeCompleteExpression(S, PreferredType); 5604 return; 5605 } 5606 5607 HandleCodeCompleteResults(this, CodeCompleter, 5608 Results.getCompletionContext(), 5609 Results.data(),Results.size()); 5610 } 5611 5612 void Sema::CodeCompleteObjCForCollection(Scope *S, 5613 DeclGroupPtrTy IterationVar) { 5614 CodeCompleteExpressionData Data; 5615 Data.ObjCCollection = true; 5616 5617 if (IterationVar.getAsOpaquePtr()) { 5618 DeclGroupRef DG = IterationVar.get(); 5619 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5620 if (*I) 5621 Data.IgnoreDecls.push_back(*I); 5622 } 5623 } 5624 5625 CodeCompleteExpression(S, Data); 5626 } 5627 5628 void Sema::CodeCompleteObjCSelector(Scope *S, 5629 ArrayRef<IdentifierInfo *> SelIdents) { 5630 // If we have an external source, load the entire class method 5631 // pool from the AST file. 5632 if (ExternalSource) { 5633 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5634 I != N; ++I) { 5635 Selector Sel = ExternalSource->GetExternalSelector(I); 5636 if (Sel.isNull() || MethodPool.count(Sel)) 5637 continue; 5638 5639 ReadMethodPool(Sel); 5640 } 5641 } 5642 5643 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5644 CodeCompleter->getCodeCompletionTUInfo(), 5645 CodeCompletionContext::CCC_SelectorName); 5646 Results.EnterNewScope(); 5647 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5648 MEnd = MethodPool.end(); 5649 M != MEnd; ++M) { 5650 5651 Selector Sel = M->first; 5652 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 5653 continue; 5654 5655 CodeCompletionBuilder Builder(Results.getAllocator(), 5656 Results.getCodeCompletionTUInfo()); 5657 if (Sel.isUnarySelector()) { 5658 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5659 Sel.getNameForSlot(0))); 5660 Results.AddResult(Builder.TakeString()); 5661 continue; 5662 } 5663 5664 std::string Accumulator; 5665 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 5666 if (I == SelIdents.size()) { 5667 if (!Accumulator.empty()) { 5668 Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5669 Accumulator)); 5670 Accumulator.clear(); 5671 } 5672 } 5673 5674 Accumulator += Sel.getNameForSlot(I); 5675 Accumulator += ':'; 5676 } 5677 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5678 Results.AddResult(Builder.TakeString()); 5679 } 5680 Results.ExitScope(); 5681 5682 HandleCodeCompleteResults(this, CodeCompleter, 5683 CodeCompletionContext::CCC_SelectorName, 5684 Results.data(), Results.size()); 5685 } 5686 5687 /// \brief Add all of the protocol declarations that we find in the given 5688 /// (translation unit) context. 5689 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5690 bool OnlyForwardDeclarations, 5691 ResultBuilder &Results) { 5692 typedef CodeCompletionResult Result; 5693 5694 for (const auto *D : Ctx->decls()) { 5695 // Record any protocols we find. 5696 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 5697 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5698 Results.AddResult(Result(Proto, Results.getBasePriority(Proto), 0), 5699 CurContext, 0, false); 5700 } 5701 } 5702 5703 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 5704 unsigned NumProtocols) { 5705 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5706 CodeCompleter->getCodeCompletionTUInfo(), 5707 CodeCompletionContext::CCC_ObjCProtocolName); 5708 5709 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5710 Results.EnterNewScope(); 5711 5712 // Tell the result set to ignore all of the protocols we have 5713 // already seen. 5714 // FIXME: This doesn't work when caching code-completion results. 5715 for (unsigned I = 0; I != NumProtocols; ++I) 5716 if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 5717 Protocols[I].second)) 5718 Results.Ignore(Protocol); 5719 5720 // Add all protocols. 5721 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 5722 Results); 5723 5724 Results.ExitScope(); 5725 } 5726 5727 HandleCodeCompleteResults(this, CodeCompleter, 5728 CodeCompletionContext::CCC_ObjCProtocolName, 5729 Results.data(),Results.size()); 5730 } 5731 5732 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5733 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5734 CodeCompleter->getCodeCompletionTUInfo(), 5735 CodeCompletionContext::CCC_ObjCProtocolName); 5736 5737 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5738 Results.EnterNewScope(); 5739 5740 // Add all protocols. 5741 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 5742 Results); 5743 5744 Results.ExitScope(); 5745 } 5746 5747 HandleCodeCompleteResults(this, CodeCompleter, 5748 CodeCompletionContext::CCC_ObjCProtocolName, 5749 Results.data(),Results.size()); 5750 } 5751 5752 /// \brief Add all of the Objective-C interface declarations that we find in 5753 /// the given (translation unit) context. 5754 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 5755 bool OnlyForwardDeclarations, 5756 bool OnlyUnimplemented, 5757 ResultBuilder &Results) { 5758 typedef CodeCompletionResult Result; 5759 5760 for (const auto *D : Ctx->decls()) { 5761 // Record any interfaces we find. 5762 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 5763 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5764 (!OnlyUnimplemented || !Class->getImplementation())) 5765 Results.AddResult(Result(Class, Results.getBasePriority(Class), 0), 5766 CurContext, 0, false); 5767 } 5768 } 5769 5770 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5771 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5772 CodeCompleter->getCodeCompletionTUInfo(), 5773 CodeCompletionContext::CCC_Other); 5774 Results.EnterNewScope(); 5775 5776 if (CodeCompleter->includeGlobals()) { 5777 // Add all classes. 5778 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5779 false, Results); 5780 } 5781 5782 Results.ExitScope(); 5783 5784 HandleCodeCompleteResults(this, CodeCompleter, 5785 CodeCompletionContext::CCC_ObjCInterfaceName, 5786 Results.data(),Results.size()); 5787 } 5788 5789 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5790 SourceLocation ClassNameLoc) { 5791 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5792 CodeCompleter->getCodeCompletionTUInfo(), 5793 CodeCompletionContext::CCC_ObjCInterfaceName); 5794 Results.EnterNewScope(); 5795 5796 // Make sure that we ignore the class we're currently defining. 5797 NamedDecl *CurClass 5798 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5799 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 5800 Results.Ignore(CurClass); 5801 5802 if (CodeCompleter->includeGlobals()) { 5803 // Add all classes. 5804 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5805 false, Results); 5806 } 5807 5808 Results.ExitScope(); 5809 5810 HandleCodeCompleteResults(this, CodeCompleter, 5811 CodeCompletionContext::CCC_ObjCInterfaceName, 5812 Results.data(),Results.size()); 5813 } 5814 5815 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5816 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5817 CodeCompleter->getCodeCompletionTUInfo(), 5818 CodeCompletionContext::CCC_Other); 5819 Results.EnterNewScope(); 5820 5821 if (CodeCompleter->includeGlobals()) { 5822 // Add all unimplemented classes. 5823 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5824 true, Results); 5825 } 5826 5827 Results.ExitScope(); 5828 5829 HandleCodeCompleteResults(this, CodeCompleter, 5830 CodeCompletionContext::CCC_ObjCInterfaceName, 5831 Results.data(),Results.size()); 5832 } 5833 5834 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5835 IdentifierInfo *ClassName, 5836 SourceLocation ClassNameLoc) { 5837 typedef CodeCompletionResult Result; 5838 5839 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5840 CodeCompleter->getCodeCompletionTUInfo(), 5841 CodeCompletionContext::CCC_ObjCCategoryName); 5842 5843 // Ignore any categories we find that have already been implemented by this 5844 // interface. 5845 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5846 NamedDecl *CurClass 5847 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5848 if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)){ 5849 for (const auto *Cat : Class->visible_categories()) 5850 CategoryNames.insert(Cat->getIdentifier()); 5851 } 5852 5853 // Add all of the categories we know about. 5854 Results.EnterNewScope(); 5855 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 5856 for (const auto *D : TU->decls()) 5857 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 5858 if (CategoryNames.insert(Category->getIdentifier())) 5859 Results.AddResult(Result(Category, Results.getBasePriority(Category),0), 5860 CurContext, 0, false); 5861 Results.ExitScope(); 5862 5863 HandleCodeCompleteResults(this, CodeCompleter, 5864 CodeCompletionContext::CCC_ObjCCategoryName, 5865 Results.data(),Results.size()); 5866 } 5867 5868 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5869 IdentifierInfo *ClassName, 5870 SourceLocation ClassNameLoc) { 5871 typedef CodeCompletionResult Result; 5872 5873 // Find the corresponding interface. If we couldn't find the interface, the 5874 // program itself is ill-formed. However, we'll try to be helpful still by 5875 // providing the list of all of the categories we know about. 5876 NamedDecl *CurClass 5877 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5878 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 5879 if (!Class) 5880 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 5881 5882 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5883 CodeCompleter->getCodeCompletionTUInfo(), 5884 CodeCompletionContext::CCC_ObjCCategoryName); 5885 5886 // Add all of the categories that have have corresponding interface 5887 // declarations in this class and any of its superclasses, except for 5888 // already-implemented categories in the class itself. 5889 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5890 Results.EnterNewScope(); 5891 bool IgnoreImplemented = true; 5892 while (Class) { 5893 for (const auto *Cat : Class->visible_categories()) { 5894 if ((!IgnoreImplemented || !Cat->getImplementation()) && 5895 CategoryNames.insert(Cat->getIdentifier())) 5896 Results.AddResult(Result(Cat, Results.getBasePriority(Cat), 0), 5897 CurContext, 0, false); 5898 } 5899 5900 Class = Class->getSuperClass(); 5901 IgnoreImplemented = false; 5902 } 5903 Results.ExitScope(); 5904 5905 HandleCodeCompleteResults(this, CodeCompleter, 5906 CodeCompletionContext::CCC_ObjCCategoryName, 5907 Results.data(),Results.size()); 5908 } 5909 5910 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 5911 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5912 CodeCompleter->getCodeCompletionTUInfo(), 5913 CodeCompletionContext::CCC_Other); 5914 5915 // Figure out where this @synthesize lives. 5916 ObjCContainerDecl *Container 5917 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5918 if (!Container || 5919 (!isa<ObjCImplementationDecl>(Container) && 5920 !isa<ObjCCategoryImplDecl>(Container))) 5921 return; 5922 5923 // Ignore any properties that have already been implemented. 5924 Container = getContainerDef(Container); 5925 for (const auto *D : Container->decls()) 5926 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 5927 Results.Ignore(PropertyImpl->getPropertyDecl()); 5928 5929 // Add any properties that we find. 5930 AddedPropertiesSet AddedProperties; 5931 Results.EnterNewScope(); 5932 if (ObjCImplementationDecl *ClassImpl 5933 = dyn_cast<ObjCImplementationDecl>(Container)) 5934 AddObjCProperties(ClassImpl->getClassInterface(), false, 5935 /*AllowNullaryMethods=*/false, CurContext, 5936 AddedProperties, Results); 5937 else 5938 AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 5939 false, /*AllowNullaryMethods=*/false, CurContext, 5940 AddedProperties, Results); 5941 Results.ExitScope(); 5942 5943 HandleCodeCompleteResults(this, CodeCompleter, 5944 CodeCompletionContext::CCC_Other, 5945 Results.data(),Results.size()); 5946 } 5947 5948 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5949 IdentifierInfo *PropertyName) { 5950 typedef CodeCompletionResult Result; 5951 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5952 CodeCompleter->getCodeCompletionTUInfo(), 5953 CodeCompletionContext::CCC_Other); 5954 5955 // Figure out where this @synthesize lives. 5956 ObjCContainerDecl *Container 5957 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5958 if (!Container || 5959 (!isa<ObjCImplementationDecl>(Container) && 5960 !isa<ObjCCategoryImplDecl>(Container))) 5961 return; 5962 5963 // Figure out which interface we're looking into. 5964 ObjCInterfaceDecl *Class = 0; 5965 if (ObjCImplementationDecl *ClassImpl 5966 = dyn_cast<ObjCImplementationDecl>(Container)) 5967 Class = ClassImpl->getClassInterface(); 5968 else 5969 Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 5970 ->getClassInterface(); 5971 5972 // Determine the type of the property we're synthesizing. 5973 QualType PropertyType = Context.getObjCIdType(); 5974 if (Class) { 5975 if (ObjCPropertyDecl *Property 5976 = Class->FindPropertyDeclaration(PropertyName)) { 5977 PropertyType 5978 = Property->getType().getNonReferenceType().getUnqualifiedType(); 5979 5980 // Give preference to ivars 5981 Results.setPreferredType(PropertyType); 5982 } 5983 } 5984 5985 // Add all of the instance variables in this class and its superclasses. 5986 Results.EnterNewScope(); 5987 bool SawSimilarlyNamedIvar = false; 5988 std::string NameWithPrefix; 5989 NameWithPrefix += '_'; 5990 NameWithPrefix += PropertyName->getName(); 5991 std::string NameWithSuffix = PropertyName->getName().str(); 5992 NameWithSuffix += '_'; 5993 for(; Class; Class = Class->getSuperClass()) { 5994 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 5995 Ivar = Ivar->getNextIvar()) { 5996 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), 0), 5997 CurContext, 0, false); 5998 5999 // Determine whether we've seen an ivar with a name similar to the 6000 // property. 6001 if ((PropertyName == Ivar->getIdentifier() || 6002 NameWithPrefix == Ivar->getName() || 6003 NameWithSuffix == Ivar->getName())) { 6004 SawSimilarlyNamedIvar = true; 6005 6006 // Reduce the priority of this result by one, to give it a slight 6007 // advantage over other results whose names don't match so closely. 6008 if (Results.size() && 6009 Results.data()[Results.size() - 1].Kind 6010 == CodeCompletionResult::RK_Declaration && 6011 Results.data()[Results.size() - 1].Declaration == Ivar) 6012 Results.data()[Results.size() - 1].Priority--; 6013 } 6014 } 6015 } 6016 6017 if (!SawSimilarlyNamedIvar) { 6018 // Create ivar result _propName, that the user can use to synthesize 6019 // an ivar of the appropriate type. 6020 unsigned Priority = CCP_MemberDeclaration + 1; 6021 typedef CodeCompletionResult Result; 6022 CodeCompletionAllocator &Allocator = Results.getAllocator(); 6023 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 6024 Priority,CXAvailability_Available); 6025 6026 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6027 Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 6028 Policy, Allocator)); 6029 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 6030 Results.AddResult(Result(Builder.TakeString(), Priority, 6031 CXCursor_ObjCIvarDecl)); 6032 } 6033 6034 Results.ExitScope(); 6035 6036 HandleCodeCompleteResults(this, CodeCompleter, 6037 CodeCompletionContext::CCC_Other, 6038 Results.data(),Results.size()); 6039 } 6040 6041 // Mapping from selectors to the methods that implement that selector, along 6042 // with the "in original class" flag. 6043 typedef llvm::DenseMap< 6044 Selector, llvm::PointerIntPair<ObjCMethodDecl *, 1, bool> > KnownMethodsMap; 6045 6046 /// \brief Find all of the methods that reside in the given container 6047 /// (and its superclasses, protocols, etc.) that meet the given 6048 /// criteria. Insert those methods into the map of known methods, 6049 /// indexed by selector so they can be easily found. 6050 static void FindImplementableMethods(ASTContext &Context, 6051 ObjCContainerDecl *Container, 6052 bool WantInstanceMethods, 6053 QualType ReturnType, 6054 KnownMethodsMap &KnownMethods, 6055 bool InOriginalClass = true) { 6056 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 6057 // Make sure we have a definition; that's what we'll walk. 6058 if (!IFace->hasDefinition()) 6059 return; 6060 6061 IFace = IFace->getDefinition(); 6062 Container = IFace; 6063 6064 const ObjCList<ObjCProtocolDecl> &Protocols 6065 = IFace->getReferencedProtocols(); 6066 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6067 E = Protocols.end(); 6068 I != E; ++I) 6069 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6070 KnownMethods, InOriginalClass); 6071 6072 // Add methods from any class extensions and categories. 6073 for (auto *Cat : IFace->visible_categories()) { 6074 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType, 6075 KnownMethods, false); 6076 } 6077 6078 // Visit the superclass. 6079 if (IFace->getSuperClass()) 6080 FindImplementableMethods(Context, IFace->getSuperClass(), 6081 WantInstanceMethods, ReturnType, 6082 KnownMethods, false); 6083 } 6084 6085 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6086 // Recurse into protocols. 6087 const ObjCList<ObjCProtocolDecl> &Protocols 6088 = Category->getReferencedProtocols(); 6089 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6090 E = Protocols.end(); 6091 I != E; ++I) 6092 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6093 KnownMethods, InOriginalClass); 6094 6095 // If this category is the original class, jump to the interface. 6096 if (InOriginalClass && Category->getClassInterface()) 6097 FindImplementableMethods(Context, Category->getClassInterface(), 6098 WantInstanceMethods, ReturnType, KnownMethods, 6099 false); 6100 } 6101 6102 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6103 // Make sure we have a definition; that's what we'll walk. 6104 if (!Protocol->hasDefinition()) 6105 return; 6106 Protocol = Protocol->getDefinition(); 6107 Container = Protocol; 6108 6109 // Recurse into protocols. 6110 const ObjCList<ObjCProtocolDecl> &Protocols 6111 = Protocol->getReferencedProtocols(); 6112 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6113 E = Protocols.end(); 6114 I != E; ++I) 6115 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6116 KnownMethods, false); 6117 } 6118 6119 // Add methods in this container. This operation occurs last because 6120 // we want the methods from this container to override any methods 6121 // we've previously seen with the same selector. 6122 for (auto *M : Container->methods()) { 6123 if (M->isInstanceMethod() == WantInstanceMethods) { 6124 if (!ReturnType.isNull() && 6125 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 6126 continue; 6127 6128 KnownMethods[M->getSelector()] = 6129 KnownMethodsMap::mapped_type(M, InOriginalClass); 6130 } 6131 } 6132 } 6133 6134 /// \brief Add the parenthesized return or parameter type chunk to a code 6135 /// completion string. 6136 static void AddObjCPassingTypeChunk(QualType Type, 6137 unsigned ObjCDeclQuals, 6138 ASTContext &Context, 6139 const PrintingPolicy &Policy, 6140 CodeCompletionBuilder &Builder) { 6141 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6142 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 6143 if (!Quals.empty()) 6144 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 6145 Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6146 Builder.getAllocator())); 6147 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6148 } 6149 6150 /// \brief Determine whether the given class is or inherits from a class by 6151 /// the given name. 6152 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 6153 StringRef Name) { 6154 if (!Class) 6155 return false; 6156 6157 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6158 return true; 6159 6160 return InheritsFromClassNamed(Class->getSuperClass(), Name); 6161 } 6162 6163 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6164 /// Key-Value Observing (KVO). 6165 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6166 bool IsInstanceMethod, 6167 QualType ReturnType, 6168 ASTContext &Context, 6169 VisitedSelectorSet &KnownSelectors, 6170 ResultBuilder &Results) { 6171 IdentifierInfo *PropName = Property->getIdentifier(); 6172 if (!PropName || PropName->getLength() == 0) 6173 return; 6174 6175 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 6176 6177 // Builder that will create each code completion. 6178 typedef CodeCompletionResult Result; 6179 CodeCompletionAllocator &Allocator = Results.getAllocator(); 6180 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6181 6182 // The selector table. 6183 SelectorTable &Selectors = Context.Selectors; 6184 6185 // The property name, copied into the code completion allocation region 6186 // on demand. 6187 struct KeyHolder { 6188 CodeCompletionAllocator &Allocator; 6189 StringRef Key; 6190 const char *CopiedKey; 6191 6192 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6193 : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6194 6195 operator const char *() { 6196 if (CopiedKey) 6197 return CopiedKey; 6198 6199 return CopiedKey = Allocator.CopyString(Key); 6200 } 6201 } Key(Allocator, PropName->getName()); 6202 6203 // The uppercased name of the property name. 6204 std::string UpperKey = PropName->getName(); 6205 if (!UpperKey.empty()) 6206 UpperKey[0] = toUppercase(UpperKey[0]); 6207 6208 bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6209 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6210 Property->getType()); 6211 bool ReturnTypeMatchesVoid 6212 = ReturnType.isNull() || ReturnType->isVoidType(); 6213 6214 // Add the normal accessor -(type)key. 6215 if (IsInstanceMethod && 6216 KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6217 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6218 if (ReturnType.isNull()) 6219 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6220 Context, Policy, Builder); 6221 6222 Builder.AddTypedTextChunk(Key); 6223 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6224 CXCursor_ObjCInstanceMethodDecl)); 6225 } 6226 6227 // If we have an integral or boolean property (or the user has provided 6228 // an integral or boolean return type), add the accessor -(type)isKey. 6229 if (IsInstanceMethod && 6230 ((!ReturnType.isNull() && 6231 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6232 (ReturnType.isNull() && 6233 (Property->getType()->isIntegerType() || 6234 Property->getType()->isBooleanType())))) { 6235 std::string SelectorName = (Twine("is") + UpperKey).str(); 6236 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6237 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6238 if (ReturnType.isNull()) { 6239 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6240 Builder.AddTextChunk("BOOL"); 6241 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6242 } 6243 6244 Builder.AddTypedTextChunk( 6245 Allocator.CopyString(SelectorId->getName())); 6246 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6247 CXCursor_ObjCInstanceMethodDecl)); 6248 } 6249 } 6250 6251 // Add the normal mutator. 6252 if (IsInstanceMethod && ReturnTypeMatchesVoid && 6253 !Property->getSetterMethodDecl()) { 6254 std::string SelectorName = (Twine("set") + UpperKey).str(); 6255 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6256 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6257 if (ReturnType.isNull()) { 6258 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6259 Builder.AddTextChunk("void"); 6260 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6261 } 6262 6263 Builder.AddTypedTextChunk( 6264 Allocator.CopyString(SelectorId->getName())); 6265 Builder.AddTypedTextChunk(":"); 6266 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6267 Context, Policy, Builder); 6268 Builder.AddTextChunk(Key); 6269 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6270 CXCursor_ObjCInstanceMethodDecl)); 6271 } 6272 } 6273 6274 // Indexed and unordered accessors 6275 unsigned IndexedGetterPriority = CCP_CodePattern; 6276 unsigned IndexedSetterPriority = CCP_CodePattern; 6277 unsigned UnorderedGetterPriority = CCP_CodePattern; 6278 unsigned UnorderedSetterPriority = CCP_CodePattern; 6279 if (const ObjCObjectPointerType *ObjCPointer 6280 = Property->getType()->getAs<ObjCObjectPointerType>()) { 6281 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6282 // If this interface type is not provably derived from a known 6283 // collection, penalize the corresponding completions. 6284 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6285 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6286 if (!InheritsFromClassNamed(IFace, "NSArray")) 6287 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6288 } 6289 6290 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6291 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6292 if (!InheritsFromClassNamed(IFace, "NSSet")) 6293 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6294 } 6295 } 6296 } else { 6297 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6298 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6299 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6300 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6301 } 6302 6303 // Add -(NSUInteger)countOf<key> 6304 if (IsInstanceMethod && 6305 (ReturnType.isNull() || ReturnType->isIntegerType())) { 6306 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 6307 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6308 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6309 if (ReturnType.isNull()) { 6310 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6311 Builder.AddTextChunk("NSUInteger"); 6312 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6313 } 6314 6315 Builder.AddTypedTextChunk( 6316 Allocator.CopyString(SelectorId->getName())); 6317 Results.AddResult(Result(Builder.TakeString(), 6318 std::min(IndexedGetterPriority, 6319 UnorderedGetterPriority), 6320 CXCursor_ObjCInstanceMethodDecl)); 6321 } 6322 } 6323 6324 // Indexed getters 6325 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6326 if (IsInstanceMethod && 6327 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6328 std::string SelectorName 6329 = (Twine("objectIn") + UpperKey + "AtIndex").str(); 6330 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6331 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6332 if (ReturnType.isNull()) { 6333 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6334 Builder.AddTextChunk("id"); 6335 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6336 } 6337 6338 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6339 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6340 Builder.AddTextChunk("NSUInteger"); 6341 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6342 Builder.AddTextChunk("index"); 6343 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6344 CXCursor_ObjCInstanceMethodDecl)); 6345 } 6346 } 6347 6348 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6349 if (IsInstanceMethod && 6350 (ReturnType.isNull() || 6351 (ReturnType->isObjCObjectPointerType() && 6352 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6353 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6354 ->getName() == "NSArray"))) { 6355 std::string SelectorName 6356 = (Twine(Property->getName()) + "AtIndexes").str(); 6357 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6358 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6359 if (ReturnType.isNull()) { 6360 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6361 Builder.AddTextChunk("NSArray *"); 6362 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6363 } 6364 6365 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6366 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6367 Builder.AddTextChunk("NSIndexSet *"); 6368 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6369 Builder.AddTextChunk("indexes"); 6370 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6371 CXCursor_ObjCInstanceMethodDecl)); 6372 } 6373 } 6374 6375 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6376 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6377 std::string SelectorName = (Twine("get") + UpperKey).str(); 6378 IdentifierInfo *SelectorIds[2] = { 6379 &Context.Idents.get(SelectorName), 6380 &Context.Idents.get("range") 6381 }; 6382 6383 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6384 if (ReturnType.isNull()) { 6385 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6386 Builder.AddTextChunk("void"); 6387 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6388 } 6389 6390 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6391 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6392 Builder.AddPlaceholderChunk("object-type"); 6393 Builder.AddTextChunk(" **"); 6394 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6395 Builder.AddTextChunk("buffer"); 6396 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6397 Builder.AddTypedTextChunk("range:"); 6398 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6399 Builder.AddTextChunk("NSRange"); 6400 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6401 Builder.AddTextChunk("inRange"); 6402 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6403 CXCursor_ObjCInstanceMethodDecl)); 6404 } 6405 } 6406 6407 // Mutable indexed accessors 6408 6409 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6410 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6411 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6412 IdentifierInfo *SelectorIds[2] = { 6413 &Context.Idents.get("insertObject"), 6414 &Context.Idents.get(SelectorName) 6415 }; 6416 6417 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6418 if (ReturnType.isNull()) { 6419 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6420 Builder.AddTextChunk("void"); 6421 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6422 } 6423 6424 Builder.AddTypedTextChunk("insertObject:"); 6425 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6426 Builder.AddPlaceholderChunk("object-type"); 6427 Builder.AddTextChunk(" *"); 6428 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6429 Builder.AddTextChunk("object"); 6430 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6431 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6432 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6433 Builder.AddPlaceholderChunk("NSUInteger"); 6434 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6435 Builder.AddTextChunk("index"); 6436 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6437 CXCursor_ObjCInstanceMethodDecl)); 6438 } 6439 } 6440 6441 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6442 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6443 std::string SelectorName = (Twine("insert") + UpperKey).str(); 6444 IdentifierInfo *SelectorIds[2] = { 6445 &Context.Idents.get(SelectorName), 6446 &Context.Idents.get("atIndexes") 6447 }; 6448 6449 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6450 if (ReturnType.isNull()) { 6451 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6452 Builder.AddTextChunk("void"); 6453 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6454 } 6455 6456 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6457 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6458 Builder.AddTextChunk("NSArray *"); 6459 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6460 Builder.AddTextChunk("array"); 6461 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6462 Builder.AddTypedTextChunk("atIndexes:"); 6463 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6464 Builder.AddPlaceholderChunk("NSIndexSet *"); 6465 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6466 Builder.AddTextChunk("indexes"); 6467 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6468 CXCursor_ObjCInstanceMethodDecl)); 6469 } 6470 } 6471 6472 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6473 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6474 std::string SelectorName 6475 = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 6476 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6477 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6478 if (ReturnType.isNull()) { 6479 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6480 Builder.AddTextChunk("void"); 6481 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6482 } 6483 6484 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6485 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6486 Builder.AddTextChunk("NSUInteger"); 6487 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6488 Builder.AddTextChunk("index"); 6489 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6490 CXCursor_ObjCInstanceMethodDecl)); 6491 } 6492 } 6493 6494 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6495 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6496 std::string SelectorName 6497 = (Twine("remove") + UpperKey + "AtIndexes").str(); 6498 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6499 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6500 if (ReturnType.isNull()) { 6501 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6502 Builder.AddTextChunk("void"); 6503 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6504 } 6505 6506 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6507 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6508 Builder.AddTextChunk("NSIndexSet *"); 6509 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6510 Builder.AddTextChunk("indexes"); 6511 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6512 CXCursor_ObjCInstanceMethodDecl)); 6513 } 6514 } 6515 6516 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6517 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6518 std::string SelectorName 6519 = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6520 IdentifierInfo *SelectorIds[2] = { 6521 &Context.Idents.get(SelectorName), 6522 &Context.Idents.get("withObject") 6523 }; 6524 6525 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6526 if (ReturnType.isNull()) { 6527 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6528 Builder.AddTextChunk("void"); 6529 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6530 } 6531 6532 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6533 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6534 Builder.AddPlaceholderChunk("NSUInteger"); 6535 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6536 Builder.AddTextChunk("index"); 6537 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6538 Builder.AddTypedTextChunk("withObject:"); 6539 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6540 Builder.AddTextChunk("id"); 6541 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6542 Builder.AddTextChunk("object"); 6543 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6544 CXCursor_ObjCInstanceMethodDecl)); 6545 } 6546 } 6547 6548 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6549 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6550 std::string SelectorName1 6551 = (Twine("replace") + UpperKey + "AtIndexes").str(); 6552 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6553 IdentifierInfo *SelectorIds[2] = { 6554 &Context.Idents.get(SelectorName1), 6555 &Context.Idents.get(SelectorName2) 6556 }; 6557 6558 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6559 if (ReturnType.isNull()) { 6560 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6561 Builder.AddTextChunk("void"); 6562 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6563 } 6564 6565 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6566 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6567 Builder.AddPlaceholderChunk("NSIndexSet *"); 6568 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6569 Builder.AddTextChunk("indexes"); 6570 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6571 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6572 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6573 Builder.AddTextChunk("NSArray *"); 6574 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6575 Builder.AddTextChunk("array"); 6576 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6577 CXCursor_ObjCInstanceMethodDecl)); 6578 } 6579 } 6580 6581 // Unordered getters 6582 // - (NSEnumerator *)enumeratorOfKey 6583 if (IsInstanceMethod && 6584 (ReturnType.isNull() || 6585 (ReturnType->isObjCObjectPointerType() && 6586 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6587 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6588 ->getName() == "NSEnumerator"))) { 6589 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 6590 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6591 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6592 if (ReturnType.isNull()) { 6593 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6594 Builder.AddTextChunk("NSEnumerator *"); 6595 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6596 } 6597 6598 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6599 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6600 CXCursor_ObjCInstanceMethodDecl)); 6601 } 6602 } 6603 6604 // - (type *)memberOfKey:(type *)object 6605 if (IsInstanceMethod && 6606 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6607 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 6608 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6609 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6610 if (ReturnType.isNull()) { 6611 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6612 Builder.AddPlaceholderChunk("object-type"); 6613 Builder.AddTextChunk(" *"); 6614 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6615 } 6616 6617 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6618 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6619 if (ReturnType.isNull()) { 6620 Builder.AddPlaceholderChunk("object-type"); 6621 Builder.AddTextChunk(" *"); 6622 } else { 6623 Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 6624 Policy, 6625 Builder.getAllocator())); 6626 } 6627 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6628 Builder.AddTextChunk("object"); 6629 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6630 CXCursor_ObjCInstanceMethodDecl)); 6631 } 6632 } 6633 6634 // Mutable unordered accessors 6635 // - (void)addKeyObject:(type *)object 6636 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6637 std::string SelectorName 6638 = (Twine("add") + UpperKey + Twine("Object")).str(); 6639 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6640 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6641 if (ReturnType.isNull()) { 6642 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6643 Builder.AddTextChunk("void"); 6644 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6645 } 6646 6647 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6648 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6649 Builder.AddPlaceholderChunk("object-type"); 6650 Builder.AddTextChunk(" *"); 6651 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6652 Builder.AddTextChunk("object"); 6653 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6654 CXCursor_ObjCInstanceMethodDecl)); 6655 } 6656 } 6657 6658 // - (void)addKey:(NSSet *)objects 6659 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6660 std::string SelectorName = (Twine("add") + UpperKey).str(); 6661 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6662 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6663 if (ReturnType.isNull()) { 6664 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6665 Builder.AddTextChunk("void"); 6666 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6667 } 6668 6669 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6670 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6671 Builder.AddTextChunk("NSSet *"); 6672 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6673 Builder.AddTextChunk("objects"); 6674 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6675 CXCursor_ObjCInstanceMethodDecl)); 6676 } 6677 } 6678 6679 // - (void)removeKeyObject:(type *)object 6680 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6681 std::string SelectorName 6682 = (Twine("remove") + UpperKey + Twine("Object")).str(); 6683 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6684 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6685 if (ReturnType.isNull()) { 6686 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6687 Builder.AddTextChunk("void"); 6688 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6689 } 6690 6691 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6692 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6693 Builder.AddPlaceholderChunk("object-type"); 6694 Builder.AddTextChunk(" *"); 6695 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6696 Builder.AddTextChunk("object"); 6697 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6698 CXCursor_ObjCInstanceMethodDecl)); 6699 } 6700 } 6701 6702 // - (void)removeKey:(NSSet *)objects 6703 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6704 std::string SelectorName = (Twine("remove") + UpperKey).str(); 6705 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6706 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6707 if (ReturnType.isNull()) { 6708 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6709 Builder.AddTextChunk("void"); 6710 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6711 } 6712 6713 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6714 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6715 Builder.AddTextChunk("NSSet *"); 6716 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6717 Builder.AddTextChunk("objects"); 6718 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6719 CXCursor_ObjCInstanceMethodDecl)); 6720 } 6721 } 6722 6723 // - (void)intersectKey:(NSSet *)objects 6724 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6725 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 6726 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6727 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6728 if (ReturnType.isNull()) { 6729 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6730 Builder.AddTextChunk("void"); 6731 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6732 } 6733 6734 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6735 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6736 Builder.AddTextChunk("NSSet *"); 6737 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6738 Builder.AddTextChunk("objects"); 6739 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6740 CXCursor_ObjCInstanceMethodDecl)); 6741 } 6742 } 6743 6744 // Key-Value Observing 6745 // + (NSSet *)keyPathsForValuesAffectingKey 6746 if (!IsInstanceMethod && 6747 (ReturnType.isNull() || 6748 (ReturnType->isObjCObjectPointerType() && 6749 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6750 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6751 ->getName() == "NSSet"))) { 6752 std::string SelectorName 6753 = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 6754 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6755 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6756 if (ReturnType.isNull()) { 6757 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6758 Builder.AddTextChunk("NSSet *"); 6759 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6760 } 6761 6762 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6763 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6764 CXCursor_ObjCClassMethodDecl)); 6765 } 6766 } 6767 6768 // + (BOOL)automaticallyNotifiesObserversForKey 6769 if (!IsInstanceMethod && 6770 (ReturnType.isNull() || 6771 ReturnType->isIntegerType() || 6772 ReturnType->isBooleanType())) { 6773 std::string SelectorName 6774 = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 6775 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6776 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6777 if (ReturnType.isNull()) { 6778 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6779 Builder.AddTextChunk("BOOL"); 6780 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6781 } 6782 6783 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6784 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6785 CXCursor_ObjCClassMethodDecl)); 6786 } 6787 } 6788 } 6789 6790 void Sema::CodeCompleteObjCMethodDecl(Scope *S, 6791 bool IsInstanceMethod, 6792 ParsedType ReturnTy) { 6793 // Determine the return type of the method we're declaring, if 6794 // provided. 6795 QualType ReturnType = GetTypeFromParser(ReturnTy); 6796 Decl *IDecl = 0; 6797 if (CurContext->isObjCContainer()) { 6798 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6799 IDecl = cast<Decl>(OCD); 6800 } 6801 // Determine where we should start searching for methods. 6802 ObjCContainerDecl *SearchDecl = 0; 6803 bool IsInImplementation = false; 6804 if (Decl *D = IDecl) { 6805 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6806 SearchDecl = Impl->getClassInterface(); 6807 IsInImplementation = true; 6808 } else if (ObjCCategoryImplDecl *CatImpl 6809 = dyn_cast<ObjCCategoryImplDecl>(D)) { 6810 SearchDecl = CatImpl->getCategoryDecl(); 6811 IsInImplementation = true; 6812 } else 6813 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6814 } 6815 6816 if (!SearchDecl && S) { 6817 if (DeclContext *DC = S->getEntity()) 6818 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6819 } 6820 6821 if (!SearchDecl) { 6822 HandleCodeCompleteResults(this, CodeCompleter, 6823 CodeCompletionContext::CCC_Other, 6824 0, 0); 6825 return; 6826 } 6827 6828 // Find all of the methods that we could declare/implement here. 6829 KnownMethodsMap KnownMethods; 6830 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6831 ReturnType, KnownMethods); 6832 6833 // Add declarations or definitions for each of the known methods. 6834 typedef CodeCompletionResult Result; 6835 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6836 CodeCompleter->getCodeCompletionTUInfo(), 6837 CodeCompletionContext::CCC_Other); 6838 Results.EnterNewScope(); 6839 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6840 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6841 MEnd = KnownMethods.end(); 6842 M != MEnd; ++M) { 6843 ObjCMethodDecl *Method = M->second.getPointer(); 6844 CodeCompletionBuilder Builder(Results.getAllocator(), 6845 Results.getCodeCompletionTUInfo()); 6846 6847 // If the result type was not already provided, add it to the 6848 // pattern as (type). 6849 if (ReturnType.isNull()) 6850 AddObjCPassingTypeChunk(Method->getReturnType(), 6851 Method->getObjCDeclQualifier(), Context, Policy, 6852 Builder); 6853 6854 Selector Sel = Method->getSelector(); 6855 6856 // Add the first part of the selector to the pattern. 6857 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6858 Sel.getNameForSlot(0))); 6859 6860 // Add parameters to the pattern. 6861 unsigned I = 0; 6862 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6863 PEnd = Method->param_end(); 6864 P != PEnd; (void)++P, ++I) { 6865 // Add the part of the selector name. 6866 if (I == 0) 6867 Builder.AddTypedTextChunk(":"); 6868 else if (I < Sel.getNumArgs()) { 6869 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6870 Builder.AddTypedTextChunk( 6871 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6872 } else 6873 break; 6874 6875 // Add the parameter type. 6876 AddObjCPassingTypeChunk((*P)->getOriginalType(), 6877 (*P)->getObjCDeclQualifier(), 6878 Context, Policy, 6879 Builder); 6880 6881 if (IdentifierInfo *Id = (*P)->getIdentifier()) 6882 Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6883 } 6884 6885 if (Method->isVariadic()) { 6886 if (Method->param_size() > 0) 6887 Builder.AddChunk(CodeCompletionString::CK_Comma); 6888 Builder.AddTextChunk("..."); 6889 } 6890 6891 if (IsInImplementation && Results.includeCodePatterns()) { 6892 // We will be defining the method here, so add a compound statement. 6893 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6894 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6895 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6896 if (!Method->getReturnType()->isVoidType()) { 6897 // If the result type is not void, add a return clause. 6898 Builder.AddTextChunk("return"); 6899 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6900 Builder.AddPlaceholderChunk("expression"); 6901 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6902 } else 6903 Builder.AddPlaceholderChunk("statements"); 6904 6905 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6906 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6907 } 6908 6909 unsigned Priority = CCP_CodePattern; 6910 if (!M->second.getInt()) 6911 Priority += CCD_InBaseClass; 6912 6913 Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6914 } 6915 6916 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6917 // the properties in this class and its categories. 6918 if (Context.getLangOpts().ObjC2) { 6919 SmallVector<ObjCContainerDecl *, 4> Containers; 6920 Containers.push_back(SearchDecl); 6921 6922 VisitedSelectorSet KnownSelectors; 6923 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6924 MEnd = KnownMethods.end(); 6925 M != MEnd; ++M) 6926 KnownSelectors.insert(M->first); 6927 6928 6929 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6930 if (!IFace) 6931 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6932 IFace = Category->getClassInterface(); 6933 6934 if (IFace) 6935 for (auto *Cat : IFace->visible_categories()) 6936 Containers.push_back(Cat); 6937 6938 for (unsigned I = 0, N = Containers.size(); I != N; ++I) 6939 for (auto *P : Containers[I]->properties()) 6940 AddObjCKeyValueCompletions(P, IsInstanceMethod, ReturnType, Context, 6941 KnownSelectors, Results); 6942 } 6943 6944 Results.ExitScope(); 6945 6946 HandleCodeCompleteResults(this, CodeCompleter, 6947 CodeCompletionContext::CCC_Other, 6948 Results.data(),Results.size()); 6949 } 6950 6951 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 6952 bool IsInstanceMethod, 6953 bool AtParameterName, 6954 ParsedType ReturnTy, 6955 ArrayRef<IdentifierInfo *> SelIdents) { 6956 // If we have an external source, load the entire class method 6957 // pool from the AST file. 6958 if (ExternalSource) { 6959 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 6960 I != N; ++I) { 6961 Selector Sel = ExternalSource->GetExternalSelector(I); 6962 if (Sel.isNull() || MethodPool.count(Sel)) 6963 continue; 6964 6965 ReadMethodPool(Sel); 6966 } 6967 } 6968 6969 // Build the set of methods we can see. 6970 typedef CodeCompletionResult Result; 6971 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6972 CodeCompleter->getCodeCompletionTUInfo(), 6973 CodeCompletionContext::CCC_Other); 6974 6975 if (ReturnTy) 6976 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 6977 6978 Results.EnterNewScope(); 6979 for (GlobalMethodPool::iterator M = MethodPool.begin(), 6980 MEnd = MethodPool.end(); 6981 M != MEnd; ++M) { 6982 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 6983 &M->second.second; 6984 MethList && MethList->Method; 6985 MethList = MethList->getNext()) { 6986 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 6987 continue; 6988 6989 if (AtParameterName) { 6990 // Suggest parameter names we've seen before. 6991 unsigned NumSelIdents = SelIdents.size(); 6992 if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 6993 ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 6994 if (Param->getIdentifier()) { 6995 CodeCompletionBuilder Builder(Results.getAllocator(), 6996 Results.getCodeCompletionTUInfo()); 6997 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6998 Param->getIdentifier()->getName())); 6999 Results.AddResult(Builder.TakeString()); 7000 } 7001 } 7002 7003 continue; 7004 } 7005 7006 Result R(MethList->Method, Results.getBasePriority(MethList->Method), 0); 7007 R.StartParameter = SelIdents.size(); 7008 R.AllParametersAreInformative = false; 7009 R.DeclaringEntity = true; 7010 Results.MaybeAddResult(R, CurContext); 7011 } 7012 } 7013 7014 Results.ExitScope(); 7015 HandleCodeCompleteResults(this, CodeCompleter, 7016 CodeCompletionContext::CCC_Other, 7017 Results.data(),Results.size()); 7018 } 7019 7020 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 7021 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7022 CodeCompleter->getCodeCompletionTUInfo(), 7023 CodeCompletionContext::CCC_PreprocessorDirective); 7024 Results.EnterNewScope(); 7025 7026 // #if <condition> 7027 CodeCompletionBuilder Builder(Results.getAllocator(), 7028 Results.getCodeCompletionTUInfo()); 7029 Builder.AddTypedTextChunk("if"); 7030 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7031 Builder.AddPlaceholderChunk("condition"); 7032 Results.AddResult(Builder.TakeString()); 7033 7034 // #ifdef <macro> 7035 Builder.AddTypedTextChunk("ifdef"); 7036 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7037 Builder.AddPlaceholderChunk("macro"); 7038 Results.AddResult(Builder.TakeString()); 7039 7040 // #ifndef <macro> 7041 Builder.AddTypedTextChunk("ifndef"); 7042 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7043 Builder.AddPlaceholderChunk("macro"); 7044 Results.AddResult(Builder.TakeString()); 7045 7046 if (InConditional) { 7047 // #elif <condition> 7048 Builder.AddTypedTextChunk("elif"); 7049 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7050 Builder.AddPlaceholderChunk("condition"); 7051 Results.AddResult(Builder.TakeString()); 7052 7053 // #else 7054 Builder.AddTypedTextChunk("else"); 7055 Results.AddResult(Builder.TakeString()); 7056 7057 // #endif 7058 Builder.AddTypedTextChunk("endif"); 7059 Results.AddResult(Builder.TakeString()); 7060 } 7061 7062 // #include "header" 7063 Builder.AddTypedTextChunk("include"); 7064 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7065 Builder.AddTextChunk("\""); 7066 Builder.AddPlaceholderChunk("header"); 7067 Builder.AddTextChunk("\""); 7068 Results.AddResult(Builder.TakeString()); 7069 7070 // #include <header> 7071 Builder.AddTypedTextChunk("include"); 7072 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7073 Builder.AddTextChunk("<"); 7074 Builder.AddPlaceholderChunk("header"); 7075 Builder.AddTextChunk(">"); 7076 Results.AddResult(Builder.TakeString()); 7077 7078 // #define <macro> 7079 Builder.AddTypedTextChunk("define"); 7080 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7081 Builder.AddPlaceholderChunk("macro"); 7082 Results.AddResult(Builder.TakeString()); 7083 7084 // #define <macro>(<args>) 7085 Builder.AddTypedTextChunk("define"); 7086 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7087 Builder.AddPlaceholderChunk("macro"); 7088 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7089 Builder.AddPlaceholderChunk("args"); 7090 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7091 Results.AddResult(Builder.TakeString()); 7092 7093 // #undef <macro> 7094 Builder.AddTypedTextChunk("undef"); 7095 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7096 Builder.AddPlaceholderChunk("macro"); 7097 Results.AddResult(Builder.TakeString()); 7098 7099 // #line <number> 7100 Builder.AddTypedTextChunk("line"); 7101 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7102 Builder.AddPlaceholderChunk("number"); 7103 Results.AddResult(Builder.TakeString()); 7104 7105 // #line <number> "filename" 7106 Builder.AddTypedTextChunk("line"); 7107 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7108 Builder.AddPlaceholderChunk("number"); 7109 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7110 Builder.AddTextChunk("\""); 7111 Builder.AddPlaceholderChunk("filename"); 7112 Builder.AddTextChunk("\""); 7113 Results.AddResult(Builder.TakeString()); 7114 7115 // #error <message> 7116 Builder.AddTypedTextChunk("error"); 7117 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7118 Builder.AddPlaceholderChunk("message"); 7119 Results.AddResult(Builder.TakeString()); 7120 7121 // #pragma <arguments> 7122 Builder.AddTypedTextChunk("pragma"); 7123 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7124 Builder.AddPlaceholderChunk("arguments"); 7125 Results.AddResult(Builder.TakeString()); 7126 7127 if (getLangOpts().ObjC1) { 7128 // #import "header" 7129 Builder.AddTypedTextChunk("import"); 7130 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7131 Builder.AddTextChunk("\""); 7132 Builder.AddPlaceholderChunk("header"); 7133 Builder.AddTextChunk("\""); 7134 Results.AddResult(Builder.TakeString()); 7135 7136 // #import <header> 7137 Builder.AddTypedTextChunk("import"); 7138 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7139 Builder.AddTextChunk("<"); 7140 Builder.AddPlaceholderChunk("header"); 7141 Builder.AddTextChunk(">"); 7142 Results.AddResult(Builder.TakeString()); 7143 } 7144 7145 // #include_next "header" 7146 Builder.AddTypedTextChunk("include_next"); 7147 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7148 Builder.AddTextChunk("\""); 7149 Builder.AddPlaceholderChunk("header"); 7150 Builder.AddTextChunk("\""); 7151 Results.AddResult(Builder.TakeString()); 7152 7153 // #include_next <header> 7154 Builder.AddTypedTextChunk("include_next"); 7155 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7156 Builder.AddTextChunk("<"); 7157 Builder.AddPlaceholderChunk("header"); 7158 Builder.AddTextChunk(">"); 7159 Results.AddResult(Builder.TakeString()); 7160 7161 // #warning <message> 7162 Builder.AddTypedTextChunk("warning"); 7163 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7164 Builder.AddPlaceholderChunk("message"); 7165 Results.AddResult(Builder.TakeString()); 7166 7167 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7168 // completions for them. And __include_macros is a Clang-internal extension 7169 // that we don't want to encourage anyone to use. 7170 7171 // FIXME: we don't support #assert or #unassert, so don't suggest them. 7172 Results.ExitScope(); 7173 7174 HandleCodeCompleteResults(this, CodeCompleter, 7175 CodeCompletionContext::CCC_PreprocessorDirective, 7176 Results.data(), Results.size()); 7177 } 7178 7179 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7180 CodeCompleteOrdinaryName(S, 7181 S->getFnParent()? Sema::PCC_RecoveryInFunction 7182 : Sema::PCC_Namespace); 7183 } 7184 7185 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7186 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7187 CodeCompleter->getCodeCompletionTUInfo(), 7188 IsDefinition? CodeCompletionContext::CCC_MacroName 7189 : CodeCompletionContext::CCC_MacroNameUse); 7190 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 7191 // Add just the names of macros, not their arguments. 7192 CodeCompletionBuilder Builder(Results.getAllocator(), 7193 Results.getCodeCompletionTUInfo()); 7194 Results.EnterNewScope(); 7195 for (Preprocessor::macro_iterator M = PP.macro_begin(), 7196 MEnd = PP.macro_end(); 7197 M != MEnd; ++M) { 7198 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7199 M->first->getName())); 7200 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 7201 CCP_CodePattern, 7202 CXCursor_MacroDefinition)); 7203 } 7204 Results.ExitScope(); 7205 } else if (IsDefinition) { 7206 // FIXME: Can we detect when the user just wrote an include guard above? 7207 } 7208 7209 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7210 Results.data(), Results.size()); 7211 } 7212 7213 void Sema::CodeCompletePreprocessorExpression() { 7214 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7215 CodeCompleter->getCodeCompletionTUInfo(), 7216 CodeCompletionContext::CCC_PreprocessorExpression); 7217 7218 if (!CodeCompleter || CodeCompleter->includeMacros()) 7219 AddMacroResults(PP, Results, true); 7220 7221 // defined (<macro>) 7222 Results.EnterNewScope(); 7223 CodeCompletionBuilder Builder(Results.getAllocator(), 7224 Results.getCodeCompletionTUInfo()); 7225 Builder.AddTypedTextChunk("defined"); 7226 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7227 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7228 Builder.AddPlaceholderChunk("macro"); 7229 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7230 Results.AddResult(Builder.TakeString()); 7231 Results.ExitScope(); 7232 7233 HandleCodeCompleteResults(this, CodeCompleter, 7234 CodeCompletionContext::CCC_PreprocessorExpression, 7235 Results.data(), Results.size()); 7236 } 7237 7238 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7239 IdentifierInfo *Macro, 7240 MacroInfo *MacroInfo, 7241 unsigned Argument) { 7242 // FIXME: In the future, we could provide "overload" results, much like we 7243 // do for function calls. 7244 7245 // Now just ignore this. There will be another code-completion callback 7246 // for the expanded tokens. 7247 } 7248 7249 void Sema::CodeCompleteNaturalLanguage() { 7250 HandleCodeCompleteResults(this, CodeCompleter, 7251 CodeCompletionContext::CCC_NaturalLanguage, 7252 0, 0); 7253 } 7254 7255 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 7256 CodeCompletionTUInfo &CCTUInfo, 7257 SmallVectorImpl<CodeCompletionResult> &Results) { 7258 ResultBuilder Builder(*this, Allocator, CCTUInfo, 7259 CodeCompletionContext::CCC_Recovery); 7260 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 7261 CodeCompletionDeclConsumer Consumer(Builder, 7262 Context.getTranslationUnitDecl()); 7263 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 7264 Consumer); 7265 } 7266 7267 if (!CodeCompleter || CodeCompleter->includeMacros()) 7268 AddMacroResults(PP, Builder, true); 7269 7270 Results.clear(); 7271 Results.insert(Results.end(), 7272 Builder.data(), Builder.data() + Builder.size()); 7273 } 7274