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 virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1258 bool InBaseClass) { 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 (specific_attr_iterator<AnnotateAttr> 2642 i = ND->specific_attr_begin<AnnotateAttr>(), 2643 e = ND->specific_attr_end<AnnotateAttr>(); 2644 i != e; ++i) 2645 Result.AddAnnotation( 2646 Result.getAllocator().CopyString((*i)->getAnnotation())); 2647 2648 AddResultTypeChunk(Ctx, Policy, ND, Result); 2649 2650 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 2651 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2652 Ctx, Policy); 2653 AddTypedNameChunk(Ctx, Policy, ND, Result); 2654 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2655 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2656 Result.AddChunk(CodeCompletionString::CK_RightParen); 2657 AddFunctionTypeQualsToCompletionString(Result, Function); 2658 return Result.TakeString(); 2659 } 2660 2661 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 2662 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2663 Ctx, Policy); 2664 FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2665 AddTypedNameChunk(Ctx, Policy, Function, Result); 2666 2667 // Figure out which template parameters are deduced (or have default 2668 // arguments). 2669 llvm::SmallBitVector Deduced; 2670 Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 2671 unsigned LastDeducibleArgument; 2672 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 2673 --LastDeducibleArgument) { 2674 if (!Deduced[LastDeducibleArgument - 1]) { 2675 // C++0x: Figure out if the template argument has a default. If so, 2676 // the user doesn't need to type this argument. 2677 // FIXME: We need to abstract template parameters better! 2678 bool HasDefaultArg = false; 2679 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2680 LastDeducibleArgument - 1); 2681 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 2682 HasDefaultArg = TTP->hasDefaultArgument(); 2683 else if (NonTypeTemplateParmDecl *NTTP 2684 = dyn_cast<NonTypeTemplateParmDecl>(Param)) 2685 HasDefaultArg = NTTP->hasDefaultArgument(); 2686 else { 2687 assert(isa<TemplateTemplateParmDecl>(Param)); 2688 HasDefaultArg 2689 = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 2690 } 2691 2692 if (!HasDefaultArg) 2693 break; 2694 } 2695 } 2696 2697 if (LastDeducibleArgument) { 2698 // Some of the function template arguments cannot be deduced from a 2699 // function call, so we introduce an explicit template argument list 2700 // containing all of the arguments up to the first deducible argument. 2701 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2702 AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 2703 LastDeducibleArgument); 2704 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2705 } 2706 2707 // Add the function parameters 2708 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2709 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2710 Result.AddChunk(CodeCompletionString::CK_RightParen); 2711 AddFunctionTypeQualsToCompletionString(Result, Function); 2712 return Result.TakeString(); 2713 } 2714 2715 if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 2716 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2717 Ctx, Policy); 2718 Result.AddTypedTextChunk( 2719 Result.getAllocator().CopyString(Template->getNameAsString())); 2720 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2721 AddTemplateParameterChunks(Ctx, Policy, Template, Result); 2722 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2723 return Result.TakeString(); 2724 } 2725 2726 if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 2727 Selector Sel = Method->getSelector(); 2728 if (Sel.isUnarySelector()) { 2729 Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2730 Sel.getNameForSlot(0))); 2731 return Result.TakeString(); 2732 } 2733 2734 std::string SelName = Sel.getNameForSlot(0).str(); 2735 SelName += ':'; 2736 if (StartParameter == 0) 2737 Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2738 else { 2739 Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2740 2741 // If there is only one parameter, and we're past it, add an empty 2742 // typed-text chunk since there is nothing to type. 2743 if (Method->param_size() == 1) 2744 Result.AddTypedTextChunk(""); 2745 } 2746 unsigned Idx = 0; 2747 for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(), 2748 PEnd = Method->param_end(); 2749 P != PEnd; (void)++P, ++Idx) { 2750 if (Idx > 0) { 2751 std::string Keyword; 2752 if (Idx > StartParameter) 2753 Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2754 if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2755 Keyword += II->getName(); 2756 Keyword += ":"; 2757 if (Idx < StartParameter || AllParametersAreInformative) 2758 Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2759 else 2760 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 2761 } 2762 2763 // If we're before the starting parameter, skip the placeholder. 2764 if (Idx < StartParameter) 2765 continue; 2766 2767 std::string Arg; 2768 2769 if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2770 Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 2771 else { 2772 (*P)->getType().getAsStringInternal(Arg, Policy); 2773 Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 2774 + Arg + ")"; 2775 if (IdentifierInfo *II = (*P)->getIdentifier()) 2776 if (DeclaringEntity || AllParametersAreInformative) 2777 Arg += II->getName(); 2778 } 2779 2780 if (Method->isVariadic() && (P + 1) == PEnd) 2781 Arg += ", ..."; 2782 2783 if (DeclaringEntity) 2784 Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 2785 else if (AllParametersAreInformative) 2786 Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 2787 else 2788 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2789 } 2790 2791 if (Method->isVariadic()) { 2792 if (Method->param_size() == 0) { 2793 if (DeclaringEntity) 2794 Result.AddTextChunk(", ..."); 2795 else if (AllParametersAreInformative) 2796 Result.AddInformativeChunk(", ..."); 2797 else 2798 Result.AddPlaceholderChunk(", ..."); 2799 } 2800 2801 MaybeAddSentinel(Ctx, Method, Result); 2802 } 2803 2804 return Result.TakeString(); 2805 } 2806 2807 if (Qualifier) 2808 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2809 Ctx, Policy); 2810 2811 Result.AddTypedTextChunk( 2812 Result.getAllocator().CopyString(ND->getNameAsString())); 2813 return Result.TakeString(); 2814 } 2815 2816 CodeCompletionString * 2817 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 2818 unsigned CurrentArg, 2819 Sema &S, 2820 CodeCompletionAllocator &Allocator, 2821 CodeCompletionTUInfo &CCTUInfo) const { 2822 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2823 2824 // FIXME: Set priority, availability appropriately. 2825 CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 2826 FunctionDecl *FDecl = getFunction(); 2827 AddResultTypeChunk(S.Context, Policy, FDecl, Result); 2828 const FunctionProtoType *Proto 2829 = dyn_cast<FunctionProtoType>(getFunctionType()); 2830 if (!FDecl && !Proto) { 2831 // Function without a prototype. Just give the return type and a 2832 // highlighted ellipsis. 2833 const FunctionType *FT = getFunctionType(); 2834 Result.AddTextChunk(GetCompletionTypeString(FT->getReturnType(), S.Context, 2835 Policy, Result.getAllocator())); 2836 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2837 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2838 Result.AddChunk(CodeCompletionString::CK_RightParen); 2839 return Result.TakeString(); 2840 } 2841 2842 if (FDecl) 2843 Result.AddTextChunk( 2844 Result.getAllocator().CopyString(FDecl->getNameAsString())); 2845 else 2846 Result.AddTextChunk(Result.getAllocator().CopyString( 2847 Proto->getReturnType().getAsString(Policy))); 2848 2849 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2850 unsigned NumParams = FDecl ? FDecl->getNumParams() : Proto->getNumParams(); 2851 for (unsigned I = 0; I != NumParams; ++I) { 2852 if (I) 2853 Result.AddChunk(CodeCompletionString::CK_Comma); 2854 2855 std::string ArgString; 2856 QualType ArgType; 2857 2858 if (FDecl) { 2859 ArgString = FDecl->getParamDecl(I)->getNameAsString(); 2860 ArgType = FDecl->getParamDecl(I)->getOriginalType(); 2861 } else { 2862 ArgType = Proto->getParamType(I); 2863 } 2864 2865 ArgType.getAsStringInternal(ArgString, Policy); 2866 2867 if (I == CurrentArg) 2868 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 2869 Result.getAllocator().CopyString(ArgString)); 2870 else 2871 Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 2872 } 2873 2874 if (Proto && Proto->isVariadic()) { 2875 Result.AddChunk(CodeCompletionString::CK_Comma); 2876 if (CurrentArg < NumParams) 2877 Result.AddTextChunk("..."); 2878 else 2879 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2880 } 2881 Result.AddChunk(CodeCompletionString::CK_RightParen); 2882 2883 return Result.TakeString(); 2884 } 2885 2886 unsigned clang::getMacroUsagePriority(StringRef MacroName, 2887 const LangOptions &LangOpts, 2888 bool PreferredTypeIsPointer) { 2889 unsigned Priority = CCP_Macro; 2890 2891 // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2892 if (MacroName.equals("nil") || MacroName.equals("NULL") || 2893 MacroName.equals("Nil")) { 2894 Priority = CCP_Constant; 2895 if (PreferredTypeIsPointer) 2896 Priority = Priority / CCF_SimilarTypeMatch; 2897 } 2898 // Treat "YES", "NO", "true", and "false" as constants. 2899 else if (MacroName.equals("YES") || MacroName.equals("NO") || 2900 MacroName.equals("true") || MacroName.equals("false")) 2901 Priority = CCP_Constant; 2902 // Treat "bool" as a type. 2903 else if (MacroName.equals("bool")) 2904 Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2905 2906 2907 return Priority; 2908 } 2909 2910 CXCursorKind clang::getCursorKindForDecl(const Decl *D) { 2911 if (!D) 2912 return CXCursor_UnexposedDecl; 2913 2914 switch (D->getKind()) { 2915 case Decl::Enum: return CXCursor_EnumDecl; 2916 case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2917 case Decl::Field: return CXCursor_FieldDecl; 2918 case Decl::Function: 2919 return CXCursor_FunctionDecl; 2920 case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2921 case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2922 case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2923 2924 case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2925 case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2926 case Decl::ObjCMethod: 2927 return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2928 ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2929 case Decl::CXXMethod: return CXCursor_CXXMethod; 2930 case Decl::CXXConstructor: return CXCursor_Constructor; 2931 case Decl::CXXDestructor: return CXCursor_Destructor; 2932 case Decl::CXXConversion: return CXCursor_ConversionFunction; 2933 case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2934 case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2935 case Decl::ParmVar: return CXCursor_ParmDecl; 2936 case Decl::Typedef: return CXCursor_TypedefDecl; 2937 case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2938 case Decl::Var: return CXCursor_VarDecl; 2939 case Decl::Namespace: return CXCursor_Namespace; 2940 case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2941 case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2942 case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2943 case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2944 case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2945 case Decl::ClassTemplate: return CXCursor_ClassTemplate; 2946 case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2947 case Decl::ClassTemplatePartialSpecialization: 2948 return CXCursor_ClassTemplatePartialSpecialization; 2949 case Decl::UsingDirective: return CXCursor_UsingDirective; 2950 case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2951 2952 case Decl::Using: 2953 case Decl::UnresolvedUsingValue: 2954 case Decl::UnresolvedUsingTypename: 2955 return CXCursor_UsingDeclaration; 2956 2957 case Decl::ObjCPropertyImpl: 2958 switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2959 case ObjCPropertyImplDecl::Dynamic: 2960 return CXCursor_ObjCDynamicDecl; 2961 2962 case ObjCPropertyImplDecl::Synthesize: 2963 return CXCursor_ObjCSynthesizeDecl; 2964 } 2965 2966 case Decl::Import: 2967 return CXCursor_ModuleImportDecl; 2968 2969 default: 2970 if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 2971 switch (TD->getTagKind()) { 2972 case TTK_Interface: // fall through 2973 case TTK_Struct: return CXCursor_StructDecl; 2974 case TTK_Class: return CXCursor_ClassDecl; 2975 case TTK_Union: return CXCursor_UnionDecl; 2976 case TTK_Enum: return CXCursor_EnumDecl; 2977 } 2978 } 2979 } 2980 2981 return CXCursor_UnexposedDecl; 2982 } 2983 2984 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2985 bool IncludeUndefined, 2986 bool TargetTypeIsPointer = false) { 2987 typedef CodeCompletionResult Result; 2988 2989 Results.EnterNewScope(); 2990 2991 for (Preprocessor::macro_iterator M = PP.macro_begin(), 2992 MEnd = PP.macro_end(); 2993 M != MEnd; ++M) { 2994 if (IncludeUndefined || M->first->hasMacroDefinition()) 2995 Results.AddResult(Result(M->first, 2996 getMacroUsagePriority(M->first->getName(), 2997 PP.getLangOpts(), 2998 TargetTypeIsPointer))); 2999 } 3000 3001 Results.ExitScope(); 3002 3003 } 3004 3005 static void AddPrettyFunctionResults(const LangOptions &LangOpts, 3006 ResultBuilder &Results) { 3007 typedef CodeCompletionResult Result; 3008 3009 Results.EnterNewScope(); 3010 3011 Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 3012 Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 3013 if (LangOpts.C99 || LangOpts.CPlusPlus11) 3014 Results.AddResult(Result("__func__", CCP_Constant)); 3015 Results.ExitScope(); 3016 } 3017 3018 static void HandleCodeCompleteResults(Sema *S, 3019 CodeCompleteConsumer *CodeCompleter, 3020 CodeCompletionContext Context, 3021 CodeCompletionResult *Results, 3022 unsigned NumResults) { 3023 if (CodeCompleter) 3024 CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 3025 } 3026 3027 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 3028 Sema::ParserCompletionContext PCC) { 3029 switch (PCC) { 3030 case Sema::PCC_Namespace: 3031 return CodeCompletionContext::CCC_TopLevel; 3032 3033 case Sema::PCC_Class: 3034 return CodeCompletionContext::CCC_ClassStructUnion; 3035 3036 case Sema::PCC_ObjCInterface: 3037 return CodeCompletionContext::CCC_ObjCInterface; 3038 3039 case Sema::PCC_ObjCImplementation: 3040 return CodeCompletionContext::CCC_ObjCImplementation; 3041 3042 case Sema::PCC_ObjCInstanceVariableList: 3043 return CodeCompletionContext::CCC_ObjCIvarList; 3044 3045 case Sema::PCC_Template: 3046 case Sema::PCC_MemberTemplate: 3047 if (S.CurContext->isFileContext()) 3048 return CodeCompletionContext::CCC_TopLevel; 3049 if (S.CurContext->isRecord()) 3050 return CodeCompletionContext::CCC_ClassStructUnion; 3051 return CodeCompletionContext::CCC_Other; 3052 3053 case Sema::PCC_RecoveryInFunction: 3054 return CodeCompletionContext::CCC_Recovery; 3055 3056 case Sema::PCC_ForInit: 3057 if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 3058 S.getLangOpts().ObjC1) 3059 return CodeCompletionContext::CCC_ParenthesizedExpression; 3060 else 3061 return CodeCompletionContext::CCC_Expression; 3062 3063 case Sema::PCC_Expression: 3064 case Sema::PCC_Condition: 3065 return CodeCompletionContext::CCC_Expression; 3066 3067 case Sema::PCC_Statement: 3068 return CodeCompletionContext::CCC_Statement; 3069 3070 case Sema::PCC_Type: 3071 return CodeCompletionContext::CCC_Type; 3072 3073 case Sema::PCC_ParenthesizedExpression: 3074 return CodeCompletionContext::CCC_ParenthesizedExpression; 3075 3076 case Sema::PCC_LocalDeclarationSpecifiers: 3077 return CodeCompletionContext::CCC_Type; 3078 } 3079 3080 llvm_unreachable("Invalid ParserCompletionContext!"); 3081 } 3082 3083 /// \brief If we're in a C++ virtual member function, add completion results 3084 /// that invoke the functions we override, since it's common to invoke the 3085 /// overridden function as well as adding new functionality. 3086 /// 3087 /// \param S The semantic analysis object for which we are generating results. 3088 /// 3089 /// \param InContext This context in which the nested-name-specifier preceding 3090 /// the code-completion point 3091 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 3092 ResultBuilder &Results) { 3093 // Look through blocks. 3094 DeclContext *CurContext = S.CurContext; 3095 while (isa<BlockDecl>(CurContext)) 3096 CurContext = CurContext->getParent(); 3097 3098 3099 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 3100 if (!Method || !Method->isVirtual()) 3101 return; 3102 3103 // We need to have names for all of the parameters, if we're going to 3104 // generate a forwarding call. 3105 for (auto P : Method->params()) 3106 if (!P->getDeclName()) 3107 return; 3108 3109 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3110 for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3111 MEnd = Method->end_overridden_methods(); 3112 M != MEnd; ++M) { 3113 CodeCompletionBuilder Builder(Results.getAllocator(), 3114 Results.getCodeCompletionTUInfo()); 3115 const CXXMethodDecl *Overridden = *M; 3116 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3117 continue; 3118 3119 // If we need a nested-name-specifier, add one now. 3120 if (!InContext) { 3121 NestedNameSpecifier *NNS 3122 = getRequiredQualification(S.Context, CurContext, 3123 Overridden->getDeclContext()); 3124 if (NNS) { 3125 std::string Str; 3126 llvm::raw_string_ostream OS(Str); 3127 NNS->print(OS, Policy); 3128 Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3129 } 3130 } else if (!InContext->Equals(Overridden->getDeclContext())) 3131 continue; 3132 3133 Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3134 Overridden->getNameAsString())); 3135 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3136 bool FirstParam = true; 3137 for (auto P : Method->params()) { 3138 if (FirstParam) 3139 FirstParam = false; 3140 else 3141 Builder.AddChunk(CodeCompletionString::CK_Comma); 3142 3143 Builder.AddPlaceholderChunk( 3144 Results.getAllocator().CopyString(P->getIdentifier()->getName())); 3145 } 3146 Builder.AddChunk(CodeCompletionString::CK_RightParen); 3147 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3148 CCP_SuperCompletion, 3149 CXCursor_CXXMethod, 3150 CXAvailability_Available, 3151 Overridden)); 3152 Results.Ignore(Overridden); 3153 } 3154 } 3155 3156 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3157 ModuleIdPath Path) { 3158 typedef CodeCompletionResult Result; 3159 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3160 CodeCompleter->getCodeCompletionTUInfo(), 3161 CodeCompletionContext::CCC_Other); 3162 Results.EnterNewScope(); 3163 3164 CodeCompletionAllocator &Allocator = Results.getAllocator(); 3165 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3166 typedef CodeCompletionResult Result; 3167 if (Path.empty()) { 3168 // Enumerate all top-level modules. 3169 SmallVector<Module *, 8> Modules; 3170 PP.getHeaderSearchInfo().collectAllModules(Modules); 3171 for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3172 Builder.AddTypedTextChunk( 3173 Builder.getAllocator().CopyString(Modules[I]->Name)); 3174 Results.AddResult(Result(Builder.TakeString(), 3175 CCP_Declaration, 3176 CXCursor_ModuleImportDecl, 3177 Modules[I]->isAvailable() 3178 ? CXAvailability_Available 3179 : CXAvailability_NotAvailable)); 3180 } 3181 } else if (getLangOpts().Modules) { 3182 // Load the named module. 3183 Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3184 Module::AllVisible, 3185 /*IsInclusionDirective=*/false); 3186 // Enumerate submodules. 3187 if (Mod) { 3188 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3189 SubEnd = Mod->submodule_end(); 3190 Sub != SubEnd; ++Sub) { 3191 3192 Builder.AddTypedTextChunk( 3193 Builder.getAllocator().CopyString((*Sub)->Name)); 3194 Results.AddResult(Result(Builder.TakeString(), 3195 CCP_Declaration, 3196 CXCursor_ModuleImportDecl, 3197 (*Sub)->isAvailable() 3198 ? CXAvailability_Available 3199 : CXAvailability_NotAvailable)); 3200 } 3201 } 3202 } 3203 Results.ExitScope(); 3204 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3205 Results.data(),Results.size()); 3206 } 3207 3208 void Sema::CodeCompleteOrdinaryName(Scope *S, 3209 ParserCompletionContext CompletionContext) { 3210 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3211 CodeCompleter->getCodeCompletionTUInfo(), 3212 mapCodeCompletionContext(*this, CompletionContext)); 3213 Results.EnterNewScope(); 3214 3215 // Determine how to filter results, e.g., so that the names of 3216 // values (functions, enumerators, function templates, etc.) are 3217 // only allowed where we can have an expression. 3218 switch (CompletionContext) { 3219 case PCC_Namespace: 3220 case PCC_Class: 3221 case PCC_ObjCInterface: 3222 case PCC_ObjCImplementation: 3223 case PCC_ObjCInstanceVariableList: 3224 case PCC_Template: 3225 case PCC_MemberTemplate: 3226 case PCC_Type: 3227 case PCC_LocalDeclarationSpecifiers: 3228 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 3229 break; 3230 3231 case PCC_Statement: 3232 case PCC_ParenthesizedExpression: 3233 case PCC_Expression: 3234 case PCC_ForInit: 3235 case PCC_Condition: 3236 if (WantTypesInContext(CompletionContext, getLangOpts())) 3237 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3238 else 3239 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3240 3241 if (getLangOpts().CPlusPlus) 3242 MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 3243 break; 3244 3245 case PCC_RecoveryInFunction: 3246 // Unfiltered 3247 break; 3248 } 3249 3250 // If we are in a C++ non-static member function, check the qualifiers on 3251 // the member function to filter/prioritize the results list. 3252 if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 3253 if (CurMethod->isInstance()) 3254 Results.setObjectTypeQualifiers( 3255 Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 3256 3257 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3258 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3259 CodeCompleter->includeGlobals()); 3260 3261 AddOrdinaryNameResults(CompletionContext, S, *this, Results); 3262 Results.ExitScope(); 3263 3264 switch (CompletionContext) { 3265 case PCC_ParenthesizedExpression: 3266 case PCC_Expression: 3267 case PCC_Statement: 3268 case PCC_RecoveryInFunction: 3269 if (S->getFnParent()) 3270 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3271 break; 3272 3273 case PCC_Namespace: 3274 case PCC_Class: 3275 case PCC_ObjCInterface: 3276 case PCC_ObjCImplementation: 3277 case PCC_ObjCInstanceVariableList: 3278 case PCC_Template: 3279 case PCC_MemberTemplate: 3280 case PCC_ForInit: 3281 case PCC_Condition: 3282 case PCC_Type: 3283 case PCC_LocalDeclarationSpecifiers: 3284 break; 3285 } 3286 3287 if (CodeCompleter->includeMacros()) 3288 AddMacroResults(PP, Results, false); 3289 3290 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3291 Results.data(),Results.size()); 3292 } 3293 3294 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3295 ParsedType Receiver, 3296 ArrayRef<IdentifierInfo *> SelIdents, 3297 bool AtArgumentExpression, 3298 bool IsSuper, 3299 ResultBuilder &Results); 3300 3301 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3302 bool AllowNonIdentifiers, 3303 bool AllowNestedNameSpecifiers) { 3304 typedef CodeCompletionResult Result; 3305 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3306 CodeCompleter->getCodeCompletionTUInfo(), 3307 AllowNestedNameSpecifiers 3308 ? CodeCompletionContext::CCC_PotentiallyQualifiedName 3309 : CodeCompletionContext::CCC_Name); 3310 Results.EnterNewScope(); 3311 3312 // Type qualifiers can come after names. 3313 Results.AddResult(Result("const")); 3314 Results.AddResult(Result("volatile")); 3315 if (getLangOpts().C99) 3316 Results.AddResult(Result("restrict")); 3317 3318 if (getLangOpts().CPlusPlus) { 3319 if (AllowNonIdentifiers) { 3320 Results.AddResult(Result("operator")); 3321 } 3322 3323 // Add nested-name-specifiers. 3324 if (AllowNestedNameSpecifiers) { 3325 Results.allowNestedNameSpecifiers(); 3326 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 3327 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3328 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 3329 CodeCompleter->includeGlobals()); 3330 Results.setFilter(0); 3331 } 3332 } 3333 Results.ExitScope(); 3334 3335 // If we're in a context where we might have an expression (rather than a 3336 // declaration), and what we've seen so far is an Objective-C type that could 3337 // be a receiver of a class message, this may be a class message send with 3338 // the initial opening bracket '[' missing. Add appropriate completions. 3339 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3340 DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier && 3341 DS.getTypeSpecType() == DeclSpec::TST_typename && 3342 DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3343 DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3344 !DS.isTypeAltiVecVector() && 3345 S && 3346 (S->getFlags() & Scope::DeclScope) != 0 && 3347 (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3348 Scope::FunctionPrototypeScope | 3349 Scope::AtCatchScope)) == 0) { 3350 ParsedType T = DS.getRepAsType(); 3351 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 3352 AddClassMessageCompletions(*this, S, T, None, false, false, Results); 3353 } 3354 3355 // Note that we intentionally suppress macro results here, since we do not 3356 // encourage using macros to produce the names of entities. 3357 3358 HandleCodeCompleteResults(this, CodeCompleter, 3359 Results.getCompletionContext(), 3360 Results.data(), Results.size()); 3361 } 3362 3363 struct Sema::CodeCompleteExpressionData { 3364 CodeCompleteExpressionData(QualType PreferredType = QualType()) 3365 : PreferredType(PreferredType), IntegralConstantExpression(false), 3366 ObjCCollection(false) { } 3367 3368 QualType PreferredType; 3369 bool IntegralConstantExpression; 3370 bool ObjCCollection; 3371 SmallVector<Decl *, 4> IgnoreDecls; 3372 }; 3373 3374 /// \brief Perform code-completion in an expression context when we know what 3375 /// type we're looking for. 3376 void Sema::CodeCompleteExpression(Scope *S, 3377 const CodeCompleteExpressionData &Data) { 3378 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3379 CodeCompleter->getCodeCompletionTUInfo(), 3380 CodeCompletionContext::CCC_Expression); 3381 if (Data.ObjCCollection) 3382 Results.setFilter(&ResultBuilder::IsObjCCollection); 3383 else if (Data.IntegralConstantExpression) 3384 Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3385 else if (WantTypesInContext(PCC_Expression, getLangOpts())) 3386 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3387 else 3388 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3389 3390 if (!Data.PreferredType.isNull()) 3391 Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3392 3393 // Ignore any declarations that we were told that we don't care about. 3394 for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3395 Results.Ignore(Data.IgnoreDecls[I]); 3396 3397 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3398 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3399 CodeCompleter->includeGlobals()); 3400 3401 Results.EnterNewScope(); 3402 AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 3403 Results.ExitScope(); 3404 3405 bool PreferredTypeIsPointer = false; 3406 if (!Data.PreferredType.isNull()) 3407 PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3408 || Data.PreferredType->isMemberPointerType() 3409 || Data.PreferredType->isBlockPointerType(); 3410 3411 if (S->getFnParent() && 3412 !Data.ObjCCollection && 3413 !Data.IntegralConstantExpression) 3414 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3415 3416 if (CodeCompleter->includeMacros()) 3417 AddMacroResults(PP, Results, false, PreferredTypeIsPointer); 3418 HandleCodeCompleteResults(this, CodeCompleter, 3419 CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3420 Data.PreferredType), 3421 Results.data(),Results.size()); 3422 } 3423 3424 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3425 if (E.isInvalid()) 3426 CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3427 else if (getLangOpts().ObjC1) 3428 CodeCompleteObjCInstanceMessage(S, E.take(), None, false); 3429 } 3430 3431 /// \brief The set of properties that have already been added, referenced by 3432 /// property name. 3433 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 3434 3435 /// \brief Retrieve the container definition, if any? 3436 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3437 if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3438 if (Interface->hasDefinition()) 3439 return Interface->getDefinition(); 3440 3441 return Interface; 3442 } 3443 3444 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3445 if (Protocol->hasDefinition()) 3446 return Protocol->getDefinition(); 3447 3448 return Protocol; 3449 } 3450 return Container; 3451 } 3452 3453 static void AddObjCProperties(ObjCContainerDecl *Container, 3454 bool AllowCategories, 3455 bool AllowNullaryMethods, 3456 DeclContext *CurContext, 3457 AddedPropertiesSet &AddedProperties, 3458 ResultBuilder &Results) { 3459 typedef CodeCompletionResult Result; 3460 3461 // Retrieve the definition. 3462 Container = getContainerDef(Container); 3463 3464 // Add properties in this container. 3465 for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 3466 PEnd = Container->prop_end(); 3467 P != PEnd; 3468 ++P) { 3469 if (AddedProperties.insert(P->getIdentifier())) 3470 Results.MaybeAddResult(Result(*P, Results.getBasePriority(*P), 0), 3471 CurContext); 3472 } 3473 3474 // Add nullary methods 3475 if (AllowNullaryMethods) { 3476 ASTContext &Context = Container->getASTContext(); 3477 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 3478 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 3479 MEnd = Container->meth_end(); 3480 M != MEnd; ++M) { 3481 if (M->getSelector().isUnarySelector()) 3482 if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 3483 if (AddedProperties.insert(Name)) { 3484 CodeCompletionBuilder Builder(Results.getAllocator(), 3485 Results.getCodeCompletionTUInfo()); 3486 AddResultTypeChunk(Context, Policy, *M, Builder); 3487 Builder.AddTypedTextChunk( 3488 Results.getAllocator().CopyString(Name->getName())); 3489 3490 Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3491 CCP_MemberDeclaration + CCD_MethodAsProperty), 3492 CurContext); 3493 } 3494 } 3495 } 3496 3497 3498 // Add properties in referenced protocols. 3499 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3500 for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 3501 PEnd = Protocol->protocol_end(); 3502 P != PEnd; ++P) 3503 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3504 AddedProperties, Results); 3505 } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3506 if (AllowCategories) { 3507 // Look through categories. 3508 for (ObjCInterfaceDecl::known_categories_iterator 3509 Cat = IFace->known_categories_begin(), 3510 CatEnd = IFace->known_categories_end(); 3511 Cat != CatEnd; ++Cat) 3512 AddObjCProperties(*Cat, AllowCategories, AllowNullaryMethods, 3513 CurContext, AddedProperties, Results); 3514 } 3515 3516 // Look through protocols. 3517 for (ObjCInterfaceDecl::all_protocol_iterator 3518 I = IFace->all_referenced_protocol_begin(), 3519 E = IFace->all_referenced_protocol_end(); I != E; ++I) 3520 AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 3521 AddedProperties, Results); 3522 3523 // Look in the superclass. 3524 if (IFace->getSuperClass()) 3525 AddObjCProperties(IFace->getSuperClass(), AllowCategories, 3526 AllowNullaryMethods, CurContext, 3527 AddedProperties, Results); 3528 } else if (const ObjCCategoryDecl *Category 3529 = dyn_cast<ObjCCategoryDecl>(Container)) { 3530 // Look through protocols. 3531 for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 3532 PEnd = Category->protocol_end(); 3533 P != PEnd; ++P) 3534 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3535 AddedProperties, Results); 3536 } 3537 } 3538 3539 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 3540 SourceLocation OpLoc, 3541 bool IsArrow) { 3542 if (!Base || !CodeCompleter) 3543 return; 3544 3545 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3546 if (ConvertedBase.isInvalid()) 3547 return; 3548 Base = ConvertedBase.get(); 3549 3550 typedef CodeCompletionResult Result; 3551 3552 QualType BaseType = Base->getType(); 3553 3554 if (IsArrow) { 3555 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 3556 BaseType = Ptr->getPointeeType(); 3557 else if (BaseType->isObjCObjectPointerType()) 3558 /*Do nothing*/ ; 3559 else 3560 return; 3561 } 3562 3563 enum CodeCompletionContext::Kind contextKind; 3564 3565 if (IsArrow) { 3566 contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 3567 } 3568 else { 3569 if (BaseType->isObjCObjectPointerType() || 3570 BaseType->isObjCObjectOrInterfaceType()) { 3571 contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 3572 } 3573 else { 3574 contextKind = CodeCompletionContext::CCC_DotMemberAccess; 3575 } 3576 } 3577 3578 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3579 CodeCompleter->getCodeCompletionTUInfo(), 3580 CodeCompletionContext(contextKind, 3581 BaseType), 3582 &ResultBuilder::IsMember); 3583 Results.EnterNewScope(); 3584 if (const RecordType *Record = BaseType->getAs<RecordType>()) { 3585 // Indicate that we are performing a member access, and the cv-qualifiers 3586 // for the base object type. 3587 Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 3588 3589 // Access to a C/C++ class, struct, or union. 3590 Results.allowNestedNameSpecifiers(); 3591 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3592 LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 3593 CodeCompleter->includeGlobals()); 3594 3595 if (getLangOpts().CPlusPlus) { 3596 if (!Results.empty()) { 3597 // The "template" keyword can follow "->" or "." in the grammar. 3598 // However, we only want to suggest the template keyword if something 3599 // is dependent. 3600 bool IsDependent = BaseType->isDependentType(); 3601 if (!IsDependent) { 3602 for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 3603 if (DeclContext *Ctx = DepScope->getEntity()) { 3604 IsDependent = Ctx->isDependentContext(); 3605 break; 3606 } 3607 } 3608 3609 if (IsDependent) 3610 Results.AddResult(Result("template")); 3611 } 3612 } 3613 } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 3614 // Objective-C property reference. 3615 AddedPropertiesSet AddedProperties; 3616 3617 // Add property results based on our interface. 3618 const ObjCObjectPointerType *ObjCPtr 3619 = BaseType->getAsObjCInterfacePointerType(); 3620 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 3621 AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 3622 /*AllowNullaryMethods=*/true, CurContext, 3623 AddedProperties, Results); 3624 3625 // Add properties from the protocols in a qualified interface. 3626 for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 3627 E = ObjCPtr->qual_end(); 3628 I != E; ++I) 3629 AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 3630 AddedProperties, Results); 3631 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3632 (!IsArrow && BaseType->isObjCObjectType())) { 3633 // Objective-C instance variable access. 3634 ObjCInterfaceDecl *Class = 0; 3635 if (const ObjCObjectPointerType *ObjCPtr 3636 = BaseType->getAs<ObjCObjectPointerType>()) 3637 Class = ObjCPtr->getInterfaceDecl(); 3638 else 3639 Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 3640 3641 // Add all ivars from this class and its superclasses. 3642 if (Class) { 3643 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3644 Results.setFilter(&ResultBuilder::IsObjCIvar); 3645 LookupVisibleDecls(Class, LookupMemberName, Consumer, 3646 CodeCompleter->includeGlobals()); 3647 } 3648 } 3649 3650 // FIXME: How do we cope with isa? 3651 3652 Results.ExitScope(); 3653 3654 // Hand off the results found for code completion. 3655 HandleCodeCompleteResults(this, CodeCompleter, 3656 Results.getCompletionContext(), 3657 Results.data(),Results.size()); 3658 } 3659 3660 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3661 if (!CodeCompleter) 3662 return; 3663 3664 ResultBuilder::LookupFilter Filter = 0; 3665 enum CodeCompletionContext::Kind ContextKind 3666 = CodeCompletionContext::CCC_Other; 3667 switch ((DeclSpec::TST)TagSpec) { 3668 case DeclSpec::TST_enum: 3669 Filter = &ResultBuilder::IsEnum; 3670 ContextKind = CodeCompletionContext::CCC_EnumTag; 3671 break; 3672 3673 case DeclSpec::TST_union: 3674 Filter = &ResultBuilder::IsUnion; 3675 ContextKind = CodeCompletionContext::CCC_UnionTag; 3676 break; 3677 3678 case DeclSpec::TST_struct: 3679 case DeclSpec::TST_class: 3680 case DeclSpec::TST_interface: 3681 Filter = &ResultBuilder::IsClassOrStruct; 3682 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3683 break; 3684 3685 default: 3686 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3687 } 3688 3689 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3690 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 3691 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3692 3693 // First pass: look for tags. 3694 Results.setFilter(Filter); 3695 LookupVisibleDecls(S, LookupTagName, Consumer, 3696 CodeCompleter->includeGlobals()); 3697 3698 if (CodeCompleter->includeGlobals()) { 3699 // Second pass: look for nested name specifiers. 3700 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 3701 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 3702 } 3703 3704 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3705 Results.data(),Results.size()); 3706 } 3707 3708 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3709 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3710 CodeCompleter->getCodeCompletionTUInfo(), 3711 CodeCompletionContext::CCC_TypeQualifiers); 3712 Results.EnterNewScope(); 3713 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 3714 Results.AddResult("const"); 3715 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 3716 Results.AddResult("volatile"); 3717 if (getLangOpts().C99 && 3718 !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 3719 Results.AddResult("restrict"); 3720 if (getLangOpts().C11 && 3721 !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic)) 3722 Results.AddResult("_Atomic"); 3723 Results.ExitScope(); 3724 HandleCodeCompleteResults(this, CodeCompleter, 3725 Results.getCompletionContext(), 3726 Results.data(), Results.size()); 3727 } 3728 3729 void Sema::CodeCompleteCase(Scope *S) { 3730 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 3731 return; 3732 3733 SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3734 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3735 if (!type->isEnumeralType()) { 3736 CodeCompleteExpressionData Data(type); 3737 Data.IntegralConstantExpression = true; 3738 CodeCompleteExpression(S, Data); 3739 return; 3740 } 3741 3742 // Code-complete the cases of a switch statement over an enumeration type 3743 // by providing the list of 3744 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3745 if (EnumDecl *Def = Enum->getDefinition()) 3746 Enum = Def; 3747 3748 // Determine which enumerators we have already seen in the switch statement. 3749 // FIXME: Ideally, we would also be able to look *past* the code-completion 3750 // token, in case we are code-completing in the middle of the switch and not 3751 // at the end. However, we aren't able to do so at the moment. 3752 llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3753 NestedNameSpecifier *Qualifier = 0; 3754 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 3755 SC = SC->getNextSwitchCase()) { 3756 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 3757 if (!Case) 3758 continue; 3759 3760 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 3761 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 3762 if (EnumConstantDecl *Enumerator 3763 = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 3764 // We look into the AST of the case statement to determine which 3765 // enumerator was named. Alternatively, we could compute the value of 3766 // the integral constant expression, then compare it against the 3767 // values of each enumerator. However, value-based approach would not 3768 // work as well with C++ templates where enumerators declared within a 3769 // template are type- and value-dependent. 3770 EnumeratorsSeen.insert(Enumerator); 3771 3772 // If this is a qualified-id, keep track of the nested-name-specifier 3773 // so that we can reproduce it as part of code completion, e.g., 3774 // 3775 // switch (TagD.getKind()) { 3776 // case TagDecl::TK_enum: 3777 // break; 3778 // case XXX 3779 // 3780 // At the XXX, our completions are TagDecl::TK_union, 3781 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 3782 // TK_struct, and TK_class. 3783 Qualifier = DRE->getQualifier(); 3784 } 3785 } 3786 3787 if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3788 // If there are no prior enumerators in C++, check whether we have to 3789 // qualify the names of the enumerators that we suggest, because they 3790 // may not be visible in this scope. 3791 Qualifier = getRequiredQualification(Context, CurContext, Enum); 3792 } 3793 3794 // Add any enumerators that have not yet been mentioned. 3795 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3796 CodeCompleter->getCodeCompletionTUInfo(), 3797 CodeCompletionContext::CCC_Expression); 3798 Results.EnterNewScope(); 3799 for (auto *E : Enum->enumerators()) { 3800 if (EnumeratorsSeen.count(E)) 3801 continue; 3802 3803 CodeCompletionResult R(E, CCP_EnumInCase, Qualifier); 3804 Results.AddResult(R, CurContext, 0, false); 3805 } 3806 Results.ExitScope(); 3807 3808 //We need to make sure we're setting the right context, 3809 //so only say we include macros if the code completer says we do 3810 enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 3811 if (CodeCompleter->includeMacros()) { 3812 AddMacroResults(PP, Results, false); 3813 kind = CodeCompletionContext::CCC_OtherWithMacros; 3814 } 3815 3816 HandleCodeCompleteResults(this, CodeCompleter, 3817 kind, 3818 Results.data(),Results.size()); 3819 } 3820 3821 static bool anyNullArguments(ArrayRef<Expr *> Args) { 3822 if (Args.size() && !Args.data()) 3823 return true; 3824 3825 for (unsigned I = 0; I != Args.size(); ++I) 3826 if (!Args[I]) 3827 return true; 3828 3829 return false; 3830 } 3831 3832 void Sema::CodeCompleteCall(Scope *S, Expr *FnIn, ArrayRef<Expr *> Args) { 3833 if (!CodeCompleter) 3834 return; 3835 3836 // When we're code-completing for a call, we fall back to ordinary 3837 // name code-completion whenever we can't produce specific 3838 // results. We may want to revisit this strategy in the future, 3839 // e.g., by merging the two kinds of results. 3840 3841 Expr *Fn = (Expr *)FnIn; 3842 3843 // Ignore type-dependent call expressions entirely. 3844 if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 3845 Expr::hasAnyTypeDependentArguments(Args)) { 3846 CodeCompleteOrdinaryName(S, PCC_Expression); 3847 return; 3848 } 3849 3850 // Build an overload candidate set based on the functions we find. 3851 SourceLocation Loc = Fn->getExprLoc(); 3852 OverloadCandidateSet CandidateSet(Loc); 3853 3854 // FIXME: What if we're calling something that isn't a function declaration? 3855 // FIXME: What if we're calling a pseudo-destructor? 3856 // FIXME: What if we're calling a member function? 3857 3858 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 3859 SmallVector<ResultCandidate, 8> Results; 3860 3861 Expr *NakedFn = Fn->IgnoreParenCasts(); 3862 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 3863 AddOverloadedCallCandidates(ULE, Args, CandidateSet, 3864 /*PartialOverloading=*/ true); 3865 else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) { 3866 FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 3867 if (FDecl) { 3868 if (!getLangOpts().CPlusPlus || 3869 !FDecl->getType()->getAs<FunctionProtoType>()) 3870 Results.push_back(ResultCandidate(FDecl)); 3871 else 3872 // FIXME: access? 3873 AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none), Args, 3874 CandidateSet, false, /*PartialOverloading*/true); 3875 } 3876 } 3877 3878 QualType ParamType; 3879 3880 if (!CandidateSet.empty()) { 3881 // Sort the overload candidate set by placing the best overloads first. 3882 std::stable_sort( 3883 CandidateSet.begin(), CandidateSet.end(), 3884 [&](const OverloadCandidate &X, const OverloadCandidate &Y) { 3885 return isBetterOverloadCandidate(*this, X, Y, Loc); 3886 }); 3887 3888 // Add the remaining viable overload candidates as code-completion reslults. 3889 for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(), 3890 CandEnd = CandidateSet.end(); 3891 Cand != CandEnd; ++Cand) { 3892 if (Cand->Viable) 3893 Results.push_back(ResultCandidate(Cand->Function)); 3894 } 3895 3896 // From the viable candidates, try to determine the type of this parameter. 3897 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 3898 if (const FunctionType *FType = Results[I].getFunctionType()) 3899 if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FType)) 3900 if (Args.size() < Proto->getNumParams()) { 3901 if (ParamType.isNull()) 3902 ParamType = Proto->getParamType(Args.size()); 3903 else if (!Context.hasSameUnqualifiedType( 3904 ParamType.getNonReferenceType(), 3905 Proto->getParamType(Args.size()) 3906 .getNonReferenceType())) { 3907 ParamType = QualType(); 3908 break; 3909 } 3910 } 3911 } 3912 } else { 3913 // Try to determine the parameter type from the type of the expression 3914 // being called. 3915 QualType FunctionType = Fn->getType(); 3916 if (const PointerType *Ptr = FunctionType->getAs<PointerType>()) 3917 FunctionType = Ptr->getPointeeType(); 3918 else if (const BlockPointerType *BlockPtr 3919 = FunctionType->getAs<BlockPointerType>()) 3920 FunctionType = BlockPtr->getPointeeType(); 3921 else if (const MemberPointerType *MemPtr 3922 = FunctionType->getAs<MemberPointerType>()) 3923 FunctionType = MemPtr->getPointeeType(); 3924 3925 if (const FunctionProtoType *Proto 3926 = FunctionType->getAs<FunctionProtoType>()) { 3927 if (Args.size() < Proto->getNumParams()) 3928 ParamType = Proto->getParamType(Args.size()); 3929 } 3930 } 3931 3932 if (ParamType.isNull()) 3933 CodeCompleteOrdinaryName(S, PCC_Expression); 3934 else 3935 CodeCompleteExpression(S, ParamType); 3936 3937 if (!Results.empty()) 3938 CodeCompleter->ProcessOverloadCandidates(*this, Args.size(), Results.data(), 3939 Results.size()); 3940 } 3941 3942 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 3943 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 3944 if (!VD) { 3945 CodeCompleteOrdinaryName(S, PCC_Expression); 3946 return; 3947 } 3948 3949 CodeCompleteExpression(S, VD->getType()); 3950 } 3951 3952 void Sema::CodeCompleteReturn(Scope *S) { 3953 QualType ResultType; 3954 if (isa<BlockDecl>(CurContext)) { 3955 if (BlockScopeInfo *BSI = getCurBlock()) 3956 ResultType = BSI->ReturnType; 3957 } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(CurContext)) 3958 ResultType = Function->getReturnType(); 3959 else if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(CurContext)) 3960 ResultType = Method->getReturnType(); 3961 3962 if (ResultType.isNull()) 3963 CodeCompleteOrdinaryName(S, PCC_Expression); 3964 else 3965 CodeCompleteExpression(S, ResultType); 3966 } 3967 3968 void Sema::CodeCompleteAfterIf(Scope *S) { 3969 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3970 CodeCompleter->getCodeCompletionTUInfo(), 3971 mapCodeCompletionContext(*this, PCC_Statement)); 3972 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3973 Results.EnterNewScope(); 3974 3975 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3976 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3977 CodeCompleter->includeGlobals()); 3978 3979 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 3980 3981 // "else" block 3982 CodeCompletionBuilder Builder(Results.getAllocator(), 3983 Results.getCodeCompletionTUInfo()); 3984 Builder.AddTypedTextChunk("else"); 3985 if (Results.includeCodePatterns()) { 3986 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3987 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 3988 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3989 Builder.AddPlaceholderChunk("statements"); 3990 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 3991 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 3992 } 3993 Results.AddResult(Builder.TakeString()); 3994 3995 // "else if" block 3996 Builder.AddTypedTextChunk("else"); 3997 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3998 Builder.AddTextChunk("if"); 3999 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4000 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4001 if (getLangOpts().CPlusPlus) 4002 Builder.AddPlaceholderChunk("condition"); 4003 else 4004 Builder.AddPlaceholderChunk("expression"); 4005 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4006 if (Results.includeCodePatterns()) { 4007 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4008 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4009 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 4010 Builder.AddPlaceholderChunk("statements"); 4011 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 4012 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4013 } 4014 Results.AddResult(Builder.TakeString()); 4015 4016 Results.ExitScope(); 4017 4018 if (S->getFnParent()) 4019 AddPrettyFunctionResults(PP.getLangOpts(), Results); 4020 4021 if (CodeCompleter->includeMacros()) 4022 AddMacroResults(PP, Results, false); 4023 4024 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4025 Results.data(),Results.size()); 4026 } 4027 4028 void Sema::CodeCompleteAssignmentRHS(Scope *S, Expr *LHS) { 4029 if (LHS) 4030 CodeCompleteExpression(S, static_cast<Expr *>(LHS)->getType()); 4031 else 4032 CodeCompleteOrdinaryName(S, PCC_Expression); 4033 } 4034 4035 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 4036 bool EnteringContext) { 4037 if (!SS.getScopeRep() || !CodeCompleter) 4038 return; 4039 4040 DeclContext *Ctx = computeDeclContext(SS, EnteringContext); 4041 if (!Ctx) 4042 return; 4043 4044 // Try to instantiate any non-dependent declaration contexts before 4045 // we look in them. 4046 if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS, Ctx)) 4047 return; 4048 4049 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4050 CodeCompleter->getCodeCompletionTUInfo(), 4051 CodeCompletionContext::CCC_Name); 4052 Results.EnterNewScope(); 4053 4054 // The "template" keyword can follow "::" in the grammar, but only 4055 // put it into the grammar if the nested-name-specifier is dependent. 4056 NestedNameSpecifier *NNS = SS.getScopeRep(); 4057 if (!Results.empty() && NNS->isDependent()) 4058 Results.AddResult("template"); 4059 4060 // Add calls to overridden virtual functions, if there are any. 4061 // 4062 // FIXME: This isn't wonderful, because we don't know whether we're actually 4063 // in a context that permits expressions. This is a general issue with 4064 // qualified-id completions. 4065 if (!EnteringContext) 4066 MaybeAddOverrideCalls(*this, Ctx, Results); 4067 Results.ExitScope(); 4068 4069 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4070 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer); 4071 4072 HandleCodeCompleteResults(this, CodeCompleter, 4073 Results.getCompletionContext(), 4074 Results.data(),Results.size()); 4075 } 4076 4077 void Sema::CodeCompleteUsing(Scope *S) { 4078 if (!CodeCompleter) 4079 return; 4080 4081 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4082 CodeCompleter->getCodeCompletionTUInfo(), 4083 CodeCompletionContext::CCC_PotentiallyQualifiedName, 4084 &ResultBuilder::IsNestedNameSpecifier); 4085 Results.EnterNewScope(); 4086 4087 // If we aren't in class scope, we could see the "namespace" keyword. 4088 if (!S->isClassScope()) 4089 Results.AddResult(CodeCompletionResult("namespace")); 4090 4091 // After "using", we can see anything that would start a 4092 // nested-name-specifier. 4093 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4094 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4095 CodeCompleter->includeGlobals()); 4096 Results.ExitScope(); 4097 4098 HandleCodeCompleteResults(this, CodeCompleter, 4099 CodeCompletionContext::CCC_PotentiallyQualifiedName, 4100 Results.data(),Results.size()); 4101 } 4102 4103 void Sema::CodeCompleteUsingDirective(Scope *S) { 4104 if (!CodeCompleter) 4105 return; 4106 4107 // After "using namespace", we expect to see a namespace name or namespace 4108 // alias. 4109 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4110 CodeCompleter->getCodeCompletionTUInfo(), 4111 CodeCompletionContext::CCC_Namespace, 4112 &ResultBuilder::IsNamespaceOrAlias); 4113 Results.EnterNewScope(); 4114 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4115 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4116 CodeCompleter->includeGlobals()); 4117 Results.ExitScope(); 4118 HandleCodeCompleteResults(this, CodeCompleter, 4119 CodeCompletionContext::CCC_Namespace, 4120 Results.data(),Results.size()); 4121 } 4122 4123 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 4124 if (!CodeCompleter) 4125 return; 4126 4127 DeclContext *Ctx = S->getEntity(); 4128 if (!S->getParent()) 4129 Ctx = Context.getTranslationUnitDecl(); 4130 4131 bool SuppressedGlobalResults 4132 = Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 4133 4134 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4135 CodeCompleter->getCodeCompletionTUInfo(), 4136 SuppressedGlobalResults 4137 ? CodeCompletionContext::CCC_Namespace 4138 : CodeCompletionContext::CCC_Other, 4139 &ResultBuilder::IsNamespace); 4140 4141 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 4142 // We only want to see those namespaces that have already been defined 4143 // within this scope, because its likely that the user is creating an 4144 // extended namespace declaration. Keep track of the most recent 4145 // definition of each namespace. 4146 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 4147 for (DeclContext::specific_decl_iterator<NamespaceDecl> 4148 NS(Ctx->decls_begin()), NSEnd(Ctx->decls_end()); 4149 NS != NSEnd; ++NS) 4150 OrigToLatest[NS->getOriginalNamespace()] = *NS; 4151 4152 // Add the most recent definition (or extended definition) of each 4153 // namespace to the list of results. 4154 Results.EnterNewScope(); 4155 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 4156 NS = OrigToLatest.begin(), 4157 NSEnd = OrigToLatest.end(); 4158 NS != NSEnd; ++NS) 4159 Results.AddResult(CodeCompletionResult( 4160 NS->second, Results.getBasePriority(NS->second), 0), 4161 CurContext, 0, false); 4162 Results.ExitScope(); 4163 } 4164 4165 HandleCodeCompleteResults(this, CodeCompleter, 4166 Results.getCompletionContext(), 4167 Results.data(),Results.size()); 4168 } 4169 4170 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 4171 if (!CodeCompleter) 4172 return; 4173 4174 // After "namespace", we expect to see a namespace or alias. 4175 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4176 CodeCompleter->getCodeCompletionTUInfo(), 4177 CodeCompletionContext::CCC_Namespace, 4178 &ResultBuilder::IsNamespaceOrAlias); 4179 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4180 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4181 CodeCompleter->includeGlobals()); 4182 HandleCodeCompleteResults(this, CodeCompleter, 4183 Results.getCompletionContext(), 4184 Results.data(),Results.size()); 4185 } 4186 4187 void Sema::CodeCompleteOperatorName(Scope *S) { 4188 if (!CodeCompleter) 4189 return; 4190 4191 typedef CodeCompletionResult Result; 4192 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4193 CodeCompleter->getCodeCompletionTUInfo(), 4194 CodeCompletionContext::CCC_Type, 4195 &ResultBuilder::IsType); 4196 Results.EnterNewScope(); 4197 4198 // Add the names of overloadable operators. 4199 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4200 if (std::strcmp(Spelling, "?")) \ 4201 Results.AddResult(Result(Spelling)); 4202 #include "clang/Basic/OperatorKinds.def" 4203 4204 // Add any type names visible from the current scope 4205 Results.allowNestedNameSpecifiers(); 4206 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4207 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4208 CodeCompleter->includeGlobals()); 4209 4210 // Add any type specifiers 4211 AddTypeSpecifierResults(getLangOpts(), Results); 4212 Results.ExitScope(); 4213 4214 HandleCodeCompleteResults(this, CodeCompleter, 4215 CodeCompletionContext::CCC_Type, 4216 Results.data(),Results.size()); 4217 } 4218 4219 void Sema::CodeCompleteConstructorInitializer( 4220 Decl *ConstructorD, 4221 ArrayRef <CXXCtorInitializer *> Initializers) { 4222 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 4223 CXXConstructorDecl *Constructor 4224 = static_cast<CXXConstructorDecl *>(ConstructorD); 4225 if (!Constructor) 4226 return; 4227 4228 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4229 CodeCompleter->getCodeCompletionTUInfo(), 4230 CodeCompletionContext::CCC_PotentiallyQualifiedName); 4231 Results.EnterNewScope(); 4232 4233 // Fill in any already-initialized fields or base classes. 4234 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 4235 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 4236 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) { 4237 if (Initializers[I]->isBaseInitializer()) 4238 InitializedBases.insert( 4239 Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); 4240 else 4241 InitializedFields.insert(cast<FieldDecl>( 4242 Initializers[I]->getAnyMember())); 4243 } 4244 4245 // Add completions for base classes. 4246 CodeCompletionBuilder Builder(Results.getAllocator(), 4247 Results.getCodeCompletionTUInfo()); 4248 bool SawLastInitializer = Initializers.empty(); 4249 CXXRecordDecl *ClassDecl = Constructor->getParent(); 4250 for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), 4251 BaseEnd = ClassDecl->bases_end(); 4252 Base != BaseEnd; ++Base) { 4253 if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 4254 SawLastInitializer 4255 = !Initializers.empty() && 4256 Initializers.back()->isBaseInitializer() && 4257 Context.hasSameUnqualifiedType(Base->getType(), 4258 QualType(Initializers.back()->getBaseClass(), 0)); 4259 continue; 4260 } 4261 4262 Builder.AddTypedTextChunk( 4263 Results.getAllocator().CopyString( 4264 Base->getType().getAsString(Policy))); 4265 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4266 Builder.AddPlaceholderChunk("args"); 4267 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4268 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4269 SawLastInitializer? CCP_NextInitializer 4270 : CCP_MemberDeclaration)); 4271 SawLastInitializer = false; 4272 } 4273 4274 // Add completions for virtual base classes. 4275 for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), 4276 BaseEnd = ClassDecl->vbases_end(); 4277 Base != BaseEnd; ++Base) { 4278 if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { 4279 SawLastInitializer 4280 = !Initializers.empty() && 4281 Initializers.back()->isBaseInitializer() && 4282 Context.hasSameUnqualifiedType(Base->getType(), 4283 QualType(Initializers.back()->getBaseClass(), 0)); 4284 continue; 4285 } 4286 4287 Builder.AddTypedTextChunk( 4288 Builder.getAllocator().CopyString( 4289 Base->getType().getAsString(Policy))); 4290 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4291 Builder.AddPlaceholderChunk("args"); 4292 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4293 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4294 SawLastInitializer? CCP_NextInitializer 4295 : CCP_MemberDeclaration)); 4296 SawLastInitializer = false; 4297 } 4298 4299 // Add completions for members. 4300 for (auto *Field : ClassDecl->fields()) { 4301 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) { 4302 SawLastInitializer 4303 = !Initializers.empty() && 4304 Initializers.back()->isAnyMemberInitializer() && 4305 Initializers.back()->getAnyMember() == Field; 4306 continue; 4307 } 4308 4309 if (!Field->getDeclName()) 4310 continue; 4311 4312 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 4313 Field->getIdentifier()->getName())); 4314 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4315 Builder.AddPlaceholderChunk("args"); 4316 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4317 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 4318 SawLastInitializer? CCP_NextInitializer 4319 : CCP_MemberDeclaration, 4320 CXCursor_MemberRef, 4321 CXAvailability_Available, 4322 Field)); 4323 SawLastInitializer = false; 4324 } 4325 Results.ExitScope(); 4326 4327 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4328 Results.data(), Results.size()); 4329 } 4330 4331 /// \brief Determine whether this scope denotes a namespace. 4332 static bool isNamespaceScope(Scope *S) { 4333 DeclContext *DC = S->getEntity(); 4334 if (!DC) 4335 return false; 4336 4337 return DC->isFileContext(); 4338 } 4339 4340 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 4341 bool AfterAmpersand) { 4342 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4343 CodeCompleter->getCodeCompletionTUInfo(), 4344 CodeCompletionContext::CCC_Other); 4345 Results.EnterNewScope(); 4346 4347 // Note what has already been captured. 4348 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 4349 bool IncludedThis = false; 4350 for (SmallVectorImpl<LambdaCapture>::iterator C = Intro.Captures.begin(), 4351 CEnd = Intro.Captures.end(); 4352 C != CEnd; ++C) { 4353 if (C->Kind == LCK_This) { 4354 IncludedThis = true; 4355 continue; 4356 } 4357 4358 Known.insert(C->Id); 4359 } 4360 4361 // Look for other capturable variables. 4362 for (; S && !isNamespaceScope(S); S = S->getParent()) { 4363 for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 4364 D != DEnd; ++D) { 4365 VarDecl *Var = dyn_cast<VarDecl>(*D); 4366 if (!Var || 4367 !Var->hasLocalStorage() || 4368 Var->hasAttr<BlocksAttr>()) 4369 continue; 4370 4371 if (Known.insert(Var->getIdentifier())) 4372 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 4373 CurContext, 0, false); 4374 } 4375 } 4376 4377 // Add 'this', if it would be valid. 4378 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 4379 addThisCompletion(*this, Results); 4380 4381 Results.ExitScope(); 4382 4383 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4384 Results.data(), Results.size()); 4385 } 4386 4387 /// Macro that optionally prepends an "@" to the string literal passed in via 4388 /// Keyword, depending on whether NeedAt is true or false. 4389 #define OBJC_AT_KEYWORD_NAME(NeedAt,Keyword) ((NeedAt)? "@" Keyword : Keyword) 4390 4391 static void AddObjCImplementationResults(const LangOptions &LangOpts, 4392 ResultBuilder &Results, 4393 bool NeedAt) { 4394 typedef CodeCompletionResult Result; 4395 // Since we have an implementation, we can end it. 4396 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4397 4398 CodeCompletionBuilder Builder(Results.getAllocator(), 4399 Results.getCodeCompletionTUInfo()); 4400 if (LangOpts.ObjC2) { 4401 // @dynamic 4402 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"dynamic")); 4403 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4404 Builder.AddPlaceholderChunk("property"); 4405 Results.AddResult(Result(Builder.TakeString())); 4406 4407 // @synthesize 4408 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synthesize")); 4409 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4410 Builder.AddPlaceholderChunk("property"); 4411 Results.AddResult(Result(Builder.TakeString())); 4412 } 4413 } 4414 4415 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 4416 ResultBuilder &Results, 4417 bool NeedAt) { 4418 typedef CodeCompletionResult Result; 4419 4420 // Since we have an interface or protocol, we can end it. 4421 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"end"))); 4422 4423 if (LangOpts.ObjC2) { 4424 // @property 4425 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"property"))); 4426 4427 // @required 4428 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"required"))); 4429 4430 // @optional 4431 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"optional"))); 4432 } 4433 } 4434 4435 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 4436 typedef CodeCompletionResult Result; 4437 CodeCompletionBuilder Builder(Results.getAllocator(), 4438 Results.getCodeCompletionTUInfo()); 4439 4440 // @class name ; 4441 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"class")); 4442 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4443 Builder.AddPlaceholderChunk("name"); 4444 Results.AddResult(Result(Builder.TakeString())); 4445 4446 if (Results.includeCodePatterns()) { 4447 // @interface name 4448 // FIXME: Could introduce the whole pattern, including superclasses and 4449 // such. 4450 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"interface")); 4451 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4452 Builder.AddPlaceholderChunk("class"); 4453 Results.AddResult(Result(Builder.TakeString())); 4454 4455 // @protocol name 4456 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4457 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4458 Builder.AddPlaceholderChunk("protocol"); 4459 Results.AddResult(Result(Builder.TakeString())); 4460 4461 // @implementation name 4462 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"implementation")); 4463 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4464 Builder.AddPlaceholderChunk("class"); 4465 Results.AddResult(Result(Builder.TakeString())); 4466 } 4467 4468 // @compatibility_alias name 4469 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"compatibility_alias")); 4470 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4471 Builder.AddPlaceholderChunk("alias"); 4472 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4473 Builder.AddPlaceholderChunk("class"); 4474 Results.AddResult(Result(Builder.TakeString())); 4475 4476 if (Results.getSema().getLangOpts().Modules) { 4477 // @import name 4478 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 4479 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4480 Builder.AddPlaceholderChunk("module"); 4481 Results.AddResult(Result(Builder.TakeString())); 4482 } 4483 } 4484 4485 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 4486 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4487 CodeCompleter->getCodeCompletionTUInfo(), 4488 CodeCompletionContext::CCC_Other); 4489 Results.EnterNewScope(); 4490 if (isa<ObjCImplDecl>(CurContext)) 4491 AddObjCImplementationResults(getLangOpts(), Results, false); 4492 else if (CurContext->isObjCContainer()) 4493 AddObjCInterfaceResults(getLangOpts(), Results, false); 4494 else 4495 AddObjCTopLevelResults(Results, false); 4496 Results.ExitScope(); 4497 HandleCodeCompleteResults(this, CodeCompleter, 4498 CodeCompletionContext::CCC_Other, 4499 Results.data(),Results.size()); 4500 } 4501 4502 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 4503 typedef CodeCompletionResult Result; 4504 CodeCompletionBuilder Builder(Results.getAllocator(), 4505 Results.getCodeCompletionTUInfo()); 4506 4507 // @encode ( type-name ) 4508 const char *EncodeType = "char[]"; 4509 if (Results.getSema().getLangOpts().CPlusPlus || 4510 Results.getSema().getLangOpts().ConstStrings) 4511 EncodeType = "const char[]"; 4512 Builder.AddResultTypeChunk(EncodeType); 4513 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"encode")); 4514 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4515 Builder.AddPlaceholderChunk("type-name"); 4516 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4517 Results.AddResult(Result(Builder.TakeString())); 4518 4519 // @protocol ( protocol-name ) 4520 Builder.AddResultTypeChunk("Protocol *"); 4521 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"protocol")); 4522 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4523 Builder.AddPlaceholderChunk("protocol-name"); 4524 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4525 Results.AddResult(Result(Builder.TakeString())); 4526 4527 // @selector ( selector ) 4528 Builder.AddResultTypeChunk("SEL"); 4529 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"selector")); 4530 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4531 Builder.AddPlaceholderChunk("selector"); 4532 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4533 Results.AddResult(Result(Builder.TakeString())); 4534 4535 // @"string" 4536 Builder.AddResultTypeChunk("NSString *"); 4537 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"\"")); 4538 Builder.AddPlaceholderChunk("string"); 4539 Builder.AddTextChunk("\""); 4540 Results.AddResult(Result(Builder.TakeString())); 4541 4542 // @[objects, ...] 4543 Builder.AddResultTypeChunk("NSArray *"); 4544 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"[")); 4545 Builder.AddPlaceholderChunk("objects, ..."); 4546 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 4547 Results.AddResult(Result(Builder.TakeString())); 4548 4549 // @{key : object, ...} 4550 Builder.AddResultTypeChunk("NSDictionary *"); 4551 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"{")); 4552 Builder.AddPlaceholderChunk("key"); 4553 Builder.AddChunk(CodeCompletionString::CK_Colon); 4554 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4555 Builder.AddPlaceholderChunk("object, ..."); 4556 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4557 Results.AddResult(Result(Builder.TakeString())); 4558 4559 // @(expression) 4560 Builder.AddResultTypeChunk("id"); 4561 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 4562 Builder.AddPlaceholderChunk("expression"); 4563 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4564 Results.AddResult(Result(Builder.TakeString())); 4565 } 4566 4567 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 4568 typedef CodeCompletionResult Result; 4569 CodeCompletionBuilder Builder(Results.getAllocator(), 4570 Results.getCodeCompletionTUInfo()); 4571 4572 if (Results.includeCodePatterns()) { 4573 // @try { statements } @catch ( declaration ) { statements } @finally 4574 // { statements } 4575 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"try")); 4576 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4577 Builder.AddPlaceholderChunk("statements"); 4578 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4579 Builder.AddTextChunk("@catch"); 4580 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4581 Builder.AddPlaceholderChunk("parameter"); 4582 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4583 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4584 Builder.AddPlaceholderChunk("statements"); 4585 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4586 Builder.AddTextChunk("@finally"); 4587 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4588 Builder.AddPlaceholderChunk("statements"); 4589 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4590 Results.AddResult(Result(Builder.TakeString())); 4591 } 4592 4593 // @throw 4594 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"throw")); 4595 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4596 Builder.AddPlaceholderChunk("expression"); 4597 Results.AddResult(Result(Builder.TakeString())); 4598 4599 if (Results.includeCodePatterns()) { 4600 // @synchronized ( expression ) { statements } 4601 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt,"synchronized")); 4602 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4603 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4604 Builder.AddPlaceholderChunk("expression"); 4605 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4606 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 4607 Builder.AddPlaceholderChunk("statements"); 4608 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 4609 Results.AddResult(Result(Builder.TakeString())); 4610 } 4611 } 4612 4613 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 4614 ResultBuilder &Results, 4615 bool NeedAt) { 4616 typedef CodeCompletionResult Result; 4617 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"private"))); 4618 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"protected"))); 4619 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"public"))); 4620 if (LangOpts.ObjC2) 4621 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt,"package"))); 4622 } 4623 4624 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 4625 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4626 CodeCompleter->getCodeCompletionTUInfo(), 4627 CodeCompletionContext::CCC_Other); 4628 Results.EnterNewScope(); 4629 AddObjCVisibilityResults(getLangOpts(), Results, false); 4630 Results.ExitScope(); 4631 HandleCodeCompleteResults(this, CodeCompleter, 4632 CodeCompletionContext::CCC_Other, 4633 Results.data(),Results.size()); 4634 } 4635 4636 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 4637 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4638 CodeCompleter->getCodeCompletionTUInfo(), 4639 CodeCompletionContext::CCC_Other); 4640 Results.EnterNewScope(); 4641 AddObjCStatementResults(Results, false); 4642 AddObjCExpressionResults(Results, false); 4643 Results.ExitScope(); 4644 HandleCodeCompleteResults(this, CodeCompleter, 4645 CodeCompletionContext::CCC_Other, 4646 Results.data(),Results.size()); 4647 } 4648 4649 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 4650 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4651 CodeCompleter->getCodeCompletionTUInfo(), 4652 CodeCompletionContext::CCC_Other); 4653 Results.EnterNewScope(); 4654 AddObjCExpressionResults(Results, false); 4655 Results.ExitScope(); 4656 HandleCodeCompleteResults(this, CodeCompleter, 4657 CodeCompletionContext::CCC_Other, 4658 Results.data(),Results.size()); 4659 } 4660 4661 /// \brief Determine whether the addition of the given flag to an Objective-C 4662 /// property's attributes will cause a conflict. 4663 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 4664 // Check if we've already added this flag. 4665 if (Attributes & NewFlag) 4666 return true; 4667 4668 Attributes |= NewFlag; 4669 4670 // Check for collisions with "readonly". 4671 if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) && 4672 (Attributes & ObjCDeclSpec::DQ_PR_readwrite)) 4673 return true; 4674 4675 // Check for more than one of { assign, copy, retain, strong, weak }. 4676 unsigned AssignCopyRetMask = Attributes & (ObjCDeclSpec::DQ_PR_assign | 4677 ObjCDeclSpec::DQ_PR_unsafe_unretained | 4678 ObjCDeclSpec::DQ_PR_copy | 4679 ObjCDeclSpec::DQ_PR_retain | 4680 ObjCDeclSpec::DQ_PR_strong | 4681 ObjCDeclSpec::DQ_PR_weak); 4682 if (AssignCopyRetMask && 4683 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign && 4684 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained && 4685 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy && 4686 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain && 4687 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong && 4688 AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak) 4689 return true; 4690 4691 return false; 4692 } 4693 4694 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 4695 if (!CodeCompleter) 4696 return; 4697 4698 unsigned Attributes = ODS.getPropertyAttributes(); 4699 4700 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4701 CodeCompleter->getCodeCompletionTUInfo(), 4702 CodeCompletionContext::CCC_Other); 4703 Results.EnterNewScope(); 4704 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly)) 4705 Results.AddResult(CodeCompletionResult("readonly")); 4706 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign)) 4707 Results.AddResult(CodeCompletionResult("assign")); 4708 if (!ObjCPropertyFlagConflicts(Attributes, 4709 ObjCDeclSpec::DQ_PR_unsafe_unretained)) 4710 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 4711 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite)) 4712 Results.AddResult(CodeCompletionResult("readwrite")); 4713 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain)) 4714 Results.AddResult(CodeCompletionResult("retain")); 4715 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong)) 4716 Results.AddResult(CodeCompletionResult("strong")); 4717 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy)) 4718 Results.AddResult(CodeCompletionResult("copy")); 4719 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic)) 4720 Results.AddResult(CodeCompletionResult("nonatomic")); 4721 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic)) 4722 Results.AddResult(CodeCompletionResult("atomic")); 4723 4724 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 4725 if (getLangOpts().ObjCARCWeak || getLangOpts().getGC() != LangOptions::NonGC) 4726 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak)) 4727 Results.AddResult(CodeCompletionResult("weak")); 4728 4729 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) { 4730 CodeCompletionBuilder Setter(Results.getAllocator(), 4731 Results.getCodeCompletionTUInfo()); 4732 Setter.AddTypedTextChunk("setter"); 4733 Setter.AddTextChunk("="); 4734 Setter.AddPlaceholderChunk("method"); 4735 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 4736 } 4737 if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) { 4738 CodeCompletionBuilder Getter(Results.getAllocator(), 4739 Results.getCodeCompletionTUInfo()); 4740 Getter.AddTypedTextChunk("getter"); 4741 Getter.AddTextChunk("="); 4742 Getter.AddPlaceholderChunk("method"); 4743 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 4744 } 4745 Results.ExitScope(); 4746 HandleCodeCompleteResults(this, CodeCompleter, 4747 CodeCompletionContext::CCC_Other, 4748 Results.data(),Results.size()); 4749 } 4750 4751 /// \brief Describes the kind of Objective-C method that we want to find 4752 /// via code completion. 4753 enum ObjCMethodKind { 4754 MK_Any, ///< Any kind of method, provided it means other specified criteria. 4755 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 4756 MK_OneArgSelector ///< One-argument selector. 4757 }; 4758 4759 static bool isAcceptableObjCSelector(Selector Sel, 4760 ObjCMethodKind WantKind, 4761 ArrayRef<IdentifierInfo *> SelIdents, 4762 bool AllowSameLength = true) { 4763 unsigned NumSelIdents = SelIdents.size(); 4764 if (NumSelIdents > Sel.getNumArgs()) 4765 return false; 4766 4767 switch (WantKind) { 4768 case MK_Any: break; 4769 case MK_ZeroArgSelector: return Sel.isUnarySelector(); 4770 case MK_OneArgSelector: return Sel.getNumArgs() == 1; 4771 } 4772 4773 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 4774 return false; 4775 4776 for (unsigned I = 0; I != NumSelIdents; ++I) 4777 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 4778 return false; 4779 4780 return true; 4781 } 4782 4783 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 4784 ObjCMethodKind WantKind, 4785 ArrayRef<IdentifierInfo *> SelIdents, 4786 bool AllowSameLength = true) { 4787 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 4788 AllowSameLength); 4789 } 4790 4791 namespace { 4792 /// \brief A set of selectors, which is used to avoid introducing multiple 4793 /// completions with the same selector into the result set. 4794 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 4795 } 4796 4797 /// \brief Add all of the Objective-C methods in the given Objective-C 4798 /// container to the set of results. 4799 /// 4800 /// The container will be a class, protocol, category, or implementation of 4801 /// any of the above. This mether will recurse to include methods from 4802 /// the superclasses of classes along with their categories, protocols, and 4803 /// implementations. 4804 /// 4805 /// \param Container the container in which we'll look to find methods. 4806 /// 4807 /// \param WantInstanceMethods Whether to add instance methods (only); if 4808 /// false, this routine will add factory methods (only). 4809 /// 4810 /// \param CurContext the context in which we're performing the lookup that 4811 /// finds methods. 4812 /// 4813 /// \param AllowSameLength Whether we allow a method to be added to the list 4814 /// when it has the same number of parameters as we have selector identifiers. 4815 /// 4816 /// \param Results the structure into which we'll add results. 4817 static void AddObjCMethods(ObjCContainerDecl *Container, 4818 bool WantInstanceMethods, 4819 ObjCMethodKind WantKind, 4820 ArrayRef<IdentifierInfo *> SelIdents, 4821 DeclContext *CurContext, 4822 VisitedSelectorSet &Selectors, 4823 bool AllowSameLength, 4824 ResultBuilder &Results, 4825 bool InOriginalClass = true) { 4826 typedef CodeCompletionResult Result; 4827 Container = getContainerDef(Container); 4828 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 4829 bool isRootClass = IFace && !IFace->getSuperClass(); 4830 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 4831 MEnd = Container->meth_end(); 4832 M != MEnd; ++M) { 4833 // The instance methods on the root class can be messaged via the 4834 // metaclass. 4835 if (M->isInstanceMethod() == WantInstanceMethods || 4836 (isRootClass && !WantInstanceMethods)) { 4837 // Check whether the selector identifiers we've been given are a 4838 // subset of the identifiers for this particular method. 4839 if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, AllowSameLength)) 4840 continue; 4841 4842 if (!Selectors.insert(M->getSelector())) 4843 continue; 4844 4845 Result R = Result(*M, Results.getBasePriority(*M), 0); 4846 R.StartParameter = SelIdents.size(); 4847 R.AllParametersAreInformative = (WantKind != MK_Any); 4848 if (!InOriginalClass) 4849 R.Priority += CCD_InBaseClass; 4850 Results.MaybeAddResult(R, CurContext); 4851 } 4852 } 4853 4854 // Visit the protocols of protocols. 4855 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4856 if (Protocol->hasDefinition()) { 4857 const ObjCList<ObjCProtocolDecl> &Protocols 4858 = Protocol->getReferencedProtocols(); 4859 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4860 E = Protocols.end(); 4861 I != E; ++I) 4862 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4863 CurContext, Selectors, AllowSameLength, Results, false); 4864 } 4865 } 4866 4867 if (!IFace || !IFace->hasDefinition()) 4868 return; 4869 4870 // Add methods in protocols. 4871 for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(), 4872 E = IFace->protocol_end(); 4873 I != E; ++I) 4874 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4875 CurContext, Selectors, AllowSameLength, Results, false); 4876 4877 // Add methods in categories. 4878 for (ObjCInterfaceDecl::known_categories_iterator 4879 Cat = IFace->known_categories_begin(), 4880 CatEnd = IFace->known_categories_end(); 4881 Cat != CatEnd; ++Cat) { 4882 ObjCCategoryDecl *CatDecl = *Cat; 4883 4884 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 4885 CurContext, Selectors, AllowSameLength, 4886 Results, InOriginalClass); 4887 4888 // Add a categories protocol methods. 4889 const ObjCList<ObjCProtocolDecl> &Protocols 4890 = CatDecl->getReferencedProtocols(); 4891 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 4892 E = Protocols.end(); 4893 I != E; ++I) 4894 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, 4895 CurContext, Selectors, AllowSameLength, 4896 Results, false); 4897 4898 // Add methods in category implementations. 4899 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 4900 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4901 CurContext, Selectors, AllowSameLength, 4902 Results, InOriginalClass); 4903 } 4904 4905 // Add methods in superclass. 4906 if (IFace->getSuperClass()) 4907 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 4908 SelIdents, CurContext, Selectors, 4909 AllowSameLength, Results, false); 4910 4911 // Add methods in our implementation, if any. 4912 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 4913 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, 4914 CurContext, Selectors, AllowSameLength, 4915 Results, InOriginalClass); 4916 } 4917 4918 4919 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 4920 // Try to find the interface where getters might live. 4921 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4922 if (!Class) { 4923 if (ObjCCategoryDecl *Category 4924 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4925 Class = Category->getClassInterface(); 4926 4927 if (!Class) 4928 return; 4929 } 4930 4931 // Find all of the potential getters. 4932 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4933 CodeCompleter->getCodeCompletionTUInfo(), 4934 CodeCompletionContext::CCC_Other); 4935 Results.EnterNewScope(); 4936 4937 VisitedSelectorSet Selectors; 4938 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 4939 /*AllowSameLength=*/true, Results); 4940 Results.ExitScope(); 4941 HandleCodeCompleteResults(this, CodeCompleter, 4942 CodeCompletionContext::CCC_Other, 4943 Results.data(),Results.size()); 4944 } 4945 4946 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 4947 // Try to find the interface where setters might live. 4948 ObjCInterfaceDecl *Class 4949 = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 4950 if (!Class) { 4951 if (ObjCCategoryDecl *Category 4952 = dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 4953 Class = Category->getClassInterface(); 4954 4955 if (!Class) 4956 return; 4957 } 4958 4959 // Find all of the potential getters. 4960 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4961 CodeCompleter->getCodeCompletionTUInfo(), 4962 CodeCompletionContext::CCC_Other); 4963 Results.EnterNewScope(); 4964 4965 VisitedSelectorSet Selectors; 4966 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, 4967 Selectors, /*AllowSameLength=*/true, Results); 4968 4969 Results.ExitScope(); 4970 HandleCodeCompleteResults(this, CodeCompleter, 4971 CodeCompletionContext::CCC_Other, 4972 Results.data(),Results.size()); 4973 } 4974 4975 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 4976 bool IsParameter) { 4977 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4978 CodeCompleter->getCodeCompletionTUInfo(), 4979 CodeCompletionContext::CCC_Type); 4980 Results.EnterNewScope(); 4981 4982 // Add context-sensitive, Objective-C parameter-passing keywords. 4983 bool AddedInOut = false; 4984 if ((DS.getObjCDeclQualifier() & 4985 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 4986 Results.AddResult("in"); 4987 Results.AddResult("inout"); 4988 AddedInOut = true; 4989 } 4990 if ((DS.getObjCDeclQualifier() & 4991 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 4992 Results.AddResult("out"); 4993 if (!AddedInOut) 4994 Results.AddResult("inout"); 4995 } 4996 if ((DS.getObjCDeclQualifier() & 4997 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 4998 ObjCDeclSpec::DQ_Oneway)) == 0) { 4999 Results.AddResult("bycopy"); 5000 Results.AddResult("byref"); 5001 Results.AddResult("oneway"); 5002 } 5003 5004 // If we're completing the return type of an Objective-C method and the 5005 // identifier IBAction refers to a macro, provide a completion item for 5006 // an action, e.g., 5007 // IBAction)<#selector#>:(id)sender 5008 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 5009 Context.Idents.get("IBAction").hasMacroDefinition()) { 5010 CodeCompletionBuilder Builder(Results.getAllocator(), 5011 Results.getCodeCompletionTUInfo(), 5012 CCP_CodePattern, CXAvailability_Available); 5013 Builder.AddTypedTextChunk("IBAction"); 5014 Builder.AddChunk(CodeCompletionString::CK_RightParen); 5015 Builder.AddPlaceholderChunk("selector"); 5016 Builder.AddChunk(CodeCompletionString::CK_Colon); 5017 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5018 Builder.AddTextChunk("id"); 5019 Builder.AddChunk(CodeCompletionString::CK_RightParen); 5020 Builder.AddTextChunk("sender"); 5021 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 5022 } 5023 5024 // If we're completing the return type, provide 'instancetype'. 5025 if (!IsParameter) { 5026 Results.AddResult(CodeCompletionResult("instancetype")); 5027 } 5028 5029 // Add various builtin type names and specifiers. 5030 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 5031 Results.ExitScope(); 5032 5033 // Add the various type names 5034 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 5035 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5036 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5037 CodeCompleter->includeGlobals()); 5038 5039 if (CodeCompleter->includeMacros()) 5040 AddMacroResults(PP, Results, false); 5041 5042 HandleCodeCompleteResults(this, CodeCompleter, 5043 CodeCompletionContext::CCC_Type, 5044 Results.data(), Results.size()); 5045 } 5046 5047 /// \brief When we have an expression with type "id", we may assume 5048 /// that it has some more-specific class type based on knowledge of 5049 /// common uses of Objective-C. This routine returns that class type, 5050 /// or NULL if no better result could be determined. 5051 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 5052 ObjCMessageExpr *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 5053 if (!Msg) 5054 return 0; 5055 5056 Selector Sel = Msg->getSelector(); 5057 if (Sel.isNull()) 5058 return 0; 5059 5060 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 5061 if (!Id) 5062 return 0; 5063 5064 ObjCMethodDecl *Method = Msg->getMethodDecl(); 5065 if (!Method) 5066 return 0; 5067 5068 // Determine the class that we're sending the message to. 5069 ObjCInterfaceDecl *IFace = 0; 5070 switch (Msg->getReceiverKind()) { 5071 case ObjCMessageExpr::Class: 5072 if (const ObjCObjectType *ObjType 5073 = Msg->getClassReceiver()->getAs<ObjCObjectType>()) 5074 IFace = ObjType->getInterface(); 5075 break; 5076 5077 case ObjCMessageExpr::Instance: { 5078 QualType T = Msg->getInstanceReceiver()->getType(); 5079 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 5080 IFace = Ptr->getInterfaceDecl(); 5081 break; 5082 } 5083 5084 case ObjCMessageExpr::SuperInstance: 5085 case ObjCMessageExpr::SuperClass: 5086 break; 5087 } 5088 5089 if (!IFace) 5090 return 0; 5091 5092 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 5093 if (Method->isInstanceMethod()) 5094 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5095 .Case("retain", IFace) 5096 .Case("strong", IFace) 5097 .Case("autorelease", IFace) 5098 .Case("copy", IFace) 5099 .Case("copyWithZone", IFace) 5100 .Case("mutableCopy", IFace) 5101 .Case("mutableCopyWithZone", IFace) 5102 .Case("awakeFromCoder", IFace) 5103 .Case("replacementObjectFromCoder", IFace) 5104 .Case("class", IFace) 5105 .Case("classForCoder", IFace) 5106 .Case("superclass", Super) 5107 .Default(0); 5108 5109 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 5110 .Case("new", IFace) 5111 .Case("alloc", IFace) 5112 .Case("allocWithZone", IFace) 5113 .Case("class", IFace) 5114 .Case("superclass", Super) 5115 .Default(0); 5116 } 5117 5118 // Add a special completion for a message send to "super", which fills in the 5119 // most likely case of forwarding all of our arguments to the superclass 5120 // function. 5121 /// 5122 /// \param S The semantic analysis object. 5123 /// 5124 /// \param NeedSuperKeyword Whether we need to prefix this completion with 5125 /// the "super" keyword. Otherwise, we just need to provide the arguments. 5126 /// 5127 /// \param SelIdents The identifiers in the selector that have already been 5128 /// provided as arguments for a send to "super". 5129 /// 5130 /// \param Results The set of results to augment. 5131 /// 5132 /// \returns the Objective-C method declaration that would be invoked by 5133 /// this "super" completion. If NULL, no completion was added. 5134 static ObjCMethodDecl *AddSuperSendCompletion( 5135 Sema &S, bool NeedSuperKeyword, 5136 ArrayRef<IdentifierInfo *> SelIdents, 5137 ResultBuilder &Results) { 5138 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 5139 if (!CurMethod) 5140 return 0; 5141 5142 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 5143 if (!Class) 5144 return 0; 5145 5146 // Try to find a superclass method with the same selector. 5147 ObjCMethodDecl *SuperMethod = 0; 5148 while ((Class = Class->getSuperClass()) && !SuperMethod) { 5149 // Check in the class 5150 SuperMethod = Class->getMethod(CurMethod->getSelector(), 5151 CurMethod->isInstanceMethod()); 5152 5153 // Check in categories or class extensions. 5154 if (!SuperMethod) { 5155 for (ObjCInterfaceDecl::known_categories_iterator 5156 Cat = Class->known_categories_begin(), 5157 CatEnd = Class->known_categories_end(); 5158 Cat != CatEnd; ++Cat) { 5159 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 5160 CurMethod->isInstanceMethod()))) 5161 break; 5162 } 5163 } 5164 } 5165 5166 if (!SuperMethod) 5167 return 0; 5168 5169 // Check whether the superclass method has the same signature. 5170 if (CurMethod->param_size() != SuperMethod->param_size() || 5171 CurMethod->isVariadic() != SuperMethod->isVariadic()) 5172 return 0; 5173 5174 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 5175 CurPEnd = CurMethod->param_end(), 5176 SuperP = SuperMethod->param_begin(); 5177 CurP != CurPEnd; ++CurP, ++SuperP) { 5178 // Make sure the parameter types are compatible. 5179 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 5180 (*SuperP)->getType())) 5181 return 0; 5182 5183 // Make sure we have a parameter name to forward! 5184 if (!(*CurP)->getIdentifier()) 5185 return 0; 5186 } 5187 5188 // We have a superclass method. Now, form the send-to-super completion. 5189 CodeCompletionBuilder Builder(Results.getAllocator(), 5190 Results.getCodeCompletionTUInfo()); 5191 5192 // Give this completion a return type. 5193 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 5194 Builder); 5195 5196 // If we need the "super" keyword, add it (plus some spacing). 5197 if (NeedSuperKeyword) { 5198 Builder.AddTypedTextChunk("super"); 5199 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5200 } 5201 5202 Selector Sel = CurMethod->getSelector(); 5203 if (Sel.isUnarySelector()) { 5204 if (NeedSuperKeyword) 5205 Builder.AddTextChunk(Builder.getAllocator().CopyString( 5206 Sel.getNameForSlot(0))); 5207 else 5208 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5209 Sel.getNameForSlot(0))); 5210 } else { 5211 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 5212 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 5213 if (I > SelIdents.size()) 5214 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5215 5216 if (I < SelIdents.size()) 5217 Builder.AddInformativeChunk( 5218 Builder.getAllocator().CopyString( 5219 Sel.getNameForSlot(I) + ":")); 5220 else if (NeedSuperKeyword || I > SelIdents.size()) { 5221 Builder.AddTextChunk( 5222 Builder.getAllocator().CopyString( 5223 Sel.getNameForSlot(I) + ":")); 5224 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5225 (*CurP)->getIdentifier()->getName())); 5226 } else { 5227 Builder.AddTypedTextChunk( 5228 Builder.getAllocator().CopyString( 5229 Sel.getNameForSlot(I) + ":")); 5230 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 5231 (*CurP)->getIdentifier()->getName())); 5232 } 5233 } 5234 } 5235 5236 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 5237 CCP_SuperCompletion)); 5238 return SuperMethod; 5239 } 5240 5241 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 5242 typedef CodeCompletionResult Result; 5243 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5244 CodeCompleter->getCodeCompletionTUInfo(), 5245 CodeCompletionContext::CCC_ObjCMessageReceiver, 5246 getLangOpts().CPlusPlus11 5247 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 5248 : &ResultBuilder::IsObjCMessageReceiver); 5249 5250 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5251 Results.EnterNewScope(); 5252 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5253 CodeCompleter->includeGlobals()); 5254 5255 // If we are in an Objective-C method inside a class that has a superclass, 5256 // add "super" as an option. 5257 if (ObjCMethodDecl *Method = getCurMethodDecl()) 5258 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 5259 if (Iface->getSuperClass()) { 5260 Results.AddResult(Result("super")); 5261 5262 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 5263 } 5264 5265 if (getLangOpts().CPlusPlus11) 5266 addThisCompletion(*this, Results); 5267 5268 Results.ExitScope(); 5269 5270 if (CodeCompleter->includeMacros()) 5271 AddMacroResults(PP, Results, false); 5272 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5273 Results.data(), Results.size()); 5274 5275 } 5276 5277 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 5278 ArrayRef<IdentifierInfo *> SelIdents, 5279 bool AtArgumentExpression) { 5280 ObjCInterfaceDecl *CDecl = 0; 5281 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5282 // Figure out which interface we're in. 5283 CDecl = CurMethod->getClassInterface(); 5284 if (!CDecl) 5285 return; 5286 5287 // Find the superclass of this class. 5288 CDecl = CDecl->getSuperClass(); 5289 if (!CDecl) 5290 return; 5291 5292 if (CurMethod->isInstanceMethod()) { 5293 // We are inside an instance method, which means that the message 5294 // send [super ...] is actually calling an instance method on the 5295 // current object. 5296 return CodeCompleteObjCInstanceMessage(S, 0, SelIdents, 5297 AtArgumentExpression, 5298 CDecl); 5299 } 5300 5301 // Fall through to send to the superclass in CDecl. 5302 } else { 5303 // "super" may be the name of a type or variable. Figure out which 5304 // it is. 5305 IdentifierInfo *Super = getSuperIdentifier(); 5306 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, 5307 LookupOrdinaryName); 5308 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 5309 // "super" names an interface. Use it. 5310 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 5311 if (const ObjCObjectType *Iface 5312 = Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 5313 CDecl = Iface->getInterface(); 5314 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 5315 // "super" names an unresolved type; we can't be more specific. 5316 } else { 5317 // Assume that "super" names some kind of value and parse that way. 5318 CXXScopeSpec SS; 5319 SourceLocation TemplateKWLoc; 5320 UnqualifiedId id; 5321 id.setIdentifier(Super, SuperLoc); 5322 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 5323 false, false); 5324 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 5325 SelIdents, 5326 AtArgumentExpression); 5327 } 5328 5329 // Fall through 5330 } 5331 5332 ParsedType Receiver; 5333 if (CDecl) 5334 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 5335 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 5336 AtArgumentExpression, 5337 /*IsSuper=*/true); 5338 } 5339 5340 /// \brief Given a set of code-completion results for the argument of a message 5341 /// send, determine the preferred type (if any) for that argument expression. 5342 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 5343 unsigned NumSelIdents) { 5344 typedef CodeCompletionResult Result; 5345 ASTContext &Context = Results.getSema().Context; 5346 5347 QualType PreferredType; 5348 unsigned BestPriority = CCP_Unlikely * 2; 5349 Result *ResultsData = Results.data(); 5350 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 5351 Result &R = ResultsData[I]; 5352 if (R.Kind == Result::RK_Declaration && 5353 isa<ObjCMethodDecl>(R.Declaration)) { 5354 if (R.Priority <= BestPriority) { 5355 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 5356 if (NumSelIdents <= Method->param_size()) { 5357 QualType MyPreferredType = Method->param_begin()[NumSelIdents - 1] 5358 ->getType(); 5359 if (R.Priority < BestPriority || PreferredType.isNull()) { 5360 BestPriority = R.Priority; 5361 PreferredType = MyPreferredType; 5362 } else if (!Context.hasSameUnqualifiedType(PreferredType, 5363 MyPreferredType)) { 5364 PreferredType = QualType(); 5365 } 5366 } 5367 } 5368 } 5369 } 5370 5371 return PreferredType; 5372 } 5373 5374 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 5375 ParsedType Receiver, 5376 ArrayRef<IdentifierInfo *> SelIdents, 5377 bool AtArgumentExpression, 5378 bool IsSuper, 5379 ResultBuilder &Results) { 5380 typedef CodeCompletionResult Result; 5381 ObjCInterfaceDecl *CDecl = 0; 5382 5383 // If the given name refers to an interface type, retrieve the 5384 // corresponding declaration. 5385 if (Receiver) { 5386 QualType T = SemaRef.GetTypeFromParser(Receiver, 0); 5387 if (!T.isNull()) 5388 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 5389 CDecl = Interface->getInterface(); 5390 } 5391 5392 // Add all of the factory methods in this Objective-C class, its protocols, 5393 // superclasses, categories, implementation, etc. 5394 Results.EnterNewScope(); 5395 5396 // If this is a send-to-super, try to add the special "super" send 5397 // completion. 5398 if (IsSuper) { 5399 if (ObjCMethodDecl *SuperMethod 5400 = AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 5401 Results.Ignore(SuperMethod); 5402 } 5403 5404 // If we're inside an Objective-C method definition, prefer its selector to 5405 // others. 5406 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 5407 Results.setPreferredSelector(CurMethod->getSelector()); 5408 5409 VisitedSelectorSet Selectors; 5410 if (CDecl) 5411 AddObjCMethods(CDecl, false, MK_Any, SelIdents, 5412 SemaRef.CurContext, Selectors, AtArgumentExpression, 5413 Results); 5414 else { 5415 // We're messaging "id" as a type; provide all class/factory methods. 5416 5417 // If we have an external source, load the entire class method 5418 // pool from the AST file. 5419 if (SemaRef.getExternalSource()) { 5420 for (uint32_t I = 0, 5421 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 5422 I != N; ++I) { 5423 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 5424 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 5425 continue; 5426 5427 SemaRef.ReadMethodPool(Sel); 5428 } 5429 } 5430 5431 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 5432 MEnd = SemaRef.MethodPool.end(); 5433 M != MEnd; ++M) { 5434 for (ObjCMethodList *MethList = &M->second.second; 5435 MethList && MethList->Method; 5436 MethList = MethList->getNext()) { 5437 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 5438 continue; 5439 5440 Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); 5441 R.StartParameter = SelIdents.size(); 5442 R.AllParametersAreInformative = false; 5443 Results.MaybeAddResult(R, SemaRef.CurContext); 5444 } 5445 } 5446 } 5447 5448 Results.ExitScope(); 5449 } 5450 5451 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 5452 ArrayRef<IdentifierInfo *> SelIdents, 5453 bool AtArgumentExpression, 5454 bool IsSuper) { 5455 5456 QualType T = this->GetTypeFromParser(Receiver); 5457 5458 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5459 CodeCompleter->getCodeCompletionTUInfo(), 5460 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, 5461 T, SelIdents)); 5462 5463 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 5464 AtArgumentExpression, IsSuper, Results); 5465 5466 // If we're actually at the argument expression (rather than prior to the 5467 // selector), we're actually performing code completion for an expression. 5468 // Determine whether we have a single, best method. If so, we can 5469 // code-complete the expression using the corresponding parameter type as 5470 // our preferred type, improving completion results. 5471 if (AtArgumentExpression) { 5472 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5473 SelIdents.size()); 5474 if (PreferredType.isNull()) 5475 CodeCompleteOrdinaryName(S, PCC_Expression); 5476 else 5477 CodeCompleteExpression(S, PreferredType); 5478 return; 5479 } 5480 5481 HandleCodeCompleteResults(this, CodeCompleter, 5482 Results.getCompletionContext(), 5483 Results.data(), Results.size()); 5484 } 5485 5486 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 5487 ArrayRef<IdentifierInfo *> SelIdents, 5488 bool AtArgumentExpression, 5489 ObjCInterfaceDecl *Super) { 5490 typedef CodeCompletionResult Result; 5491 5492 Expr *RecExpr = static_cast<Expr *>(Receiver); 5493 5494 // If necessary, apply function/array conversion to the receiver. 5495 // C99 6.7.5.3p[7,8]. 5496 if (RecExpr) { 5497 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 5498 if (Conv.isInvalid()) // conversion failed. bail. 5499 return; 5500 RecExpr = Conv.take(); 5501 } 5502 QualType ReceiverType = RecExpr? RecExpr->getType() 5503 : Super? Context.getObjCObjectPointerType( 5504 Context.getObjCInterfaceType(Super)) 5505 : Context.getObjCIdType(); 5506 5507 // If we're messaging an expression with type "id" or "Class", check 5508 // whether we know something special about the receiver that allows 5509 // us to assume a more-specific receiver type. 5510 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 5511 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 5512 if (ReceiverType->isObjCClassType()) 5513 return CodeCompleteObjCClassMessage(S, 5514 ParsedType::make(Context.getObjCInterfaceType(IFace)), 5515 SelIdents, 5516 AtArgumentExpression, Super); 5517 5518 ReceiverType = Context.getObjCObjectPointerType( 5519 Context.getObjCInterfaceType(IFace)); 5520 } 5521 } else if (RecExpr && getLangOpts().CPlusPlus) { 5522 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 5523 if (Conv.isUsable()) { 5524 RecExpr = Conv.take(); 5525 ReceiverType = RecExpr->getType(); 5526 } 5527 } 5528 5529 // Build the set of methods we can see. 5530 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5531 CodeCompleter->getCodeCompletionTUInfo(), 5532 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 5533 ReceiverType, SelIdents)); 5534 5535 Results.EnterNewScope(); 5536 5537 // If this is a send-to-super, try to add the special "super" send 5538 // completion. 5539 if (Super) { 5540 if (ObjCMethodDecl *SuperMethod 5541 = AddSuperSendCompletion(*this, false, SelIdents, Results)) 5542 Results.Ignore(SuperMethod); 5543 } 5544 5545 // If we're inside an Objective-C method definition, prefer its selector to 5546 // others. 5547 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 5548 Results.setPreferredSelector(CurMethod->getSelector()); 5549 5550 // Keep track of the selectors we've already added. 5551 VisitedSelectorSet Selectors; 5552 5553 // Handle messages to Class. This really isn't a message to an instance 5554 // method, so we treat it the same way we would treat a message send to a 5555 // class method. 5556 if (ReceiverType->isObjCClassType() || 5557 ReceiverType->isObjCQualifiedClassType()) { 5558 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 5559 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 5560 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, 5561 CurContext, Selectors, AtArgumentExpression, Results); 5562 } 5563 } 5564 // Handle messages to a qualified ID ("id<foo>"). 5565 else if (const ObjCObjectPointerType *QualID 5566 = ReceiverType->getAsObjCQualifiedIdType()) { 5567 // Search protocols for instance methods. 5568 for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(), 5569 E = QualID->qual_end(); 5570 I != E; ++I) 5571 AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext, 5572 Selectors, AtArgumentExpression, Results); 5573 } 5574 // Handle messages to a pointer to interface type. 5575 else if (const ObjCObjectPointerType *IFacePtr 5576 = ReceiverType->getAsObjCInterfacePointerType()) { 5577 // Search the class, its superclasses, etc., for instance methods. 5578 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 5579 CurContext, Selectors, AtArgumentExpression, 5580 Results); 5581 5582 // Search protocols for instance methods. 5583 for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(), 5584 E = IFacePtr->qual_end(); 5585 I != E; ++I) 5586 AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext, 5587 Selectors, AtArgumentExpression, Results); 5588 } 5589 // Handle messages to "id". 5590 else if (ReceiverType->isObjCIdType()) { 5591 // We're messaging "id", so provide all instance methods we know 5592 // about as code-completion results. 5593 5594 // If we have an external source, load the entire class method 5595 // pool from the AST file. 5596 if (ExternalSource) { 5597 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5598 I != N; ++I) { 5599 Selector Sel = ExternalSource->GetExternalSelector(I); 5600 if (Sel.isNull() || MethodPool.count(Sel)) 5601 continue; 5602 5603 ReadMethodPool(Sel); 5604 } 5605 } 5606 5607 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5608 MEnd = MethodPool.end(); 5609 M != MEnd; ++M) { 5610 for (ObjCMethodList *MethList = &M->second.first; 5611 MethList && MethList->Method; 5612 MethList = MethList->getNext()) { 5613 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 5614 continue; 5615 5616 if (!Selectors.insert(MethList->Method->getSelector())) 5617 continue; 5618 5619 Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); 5620 R.StartParameter = SelIdents.size(); 5621 R.AllParametersAreInformative = false; 5622 Results.MaybeAddResult(R, CurContext); 5623 } 5624 } 5625 } 5626 Results.ExitScope(); 5627 5628 5629 // If we're actually at the argument expression (rather than prior to the 5630 // selector), we're actually performing code completion for an expression. 5631 // Determine whether we have a single, best method. If so, we can 5632 // code-complete the expression using the corresponding parameter type as 5633 // our preferred type, improving completion results. 5634 if (AtArgumentExpression) { 5635 QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results, 5636 SelIdents.size()); 5637 if (PreferredType.isNull()) 5638 CodeCompleteOrdinaryName(S, PCC_Expression); 5639 else 5640 CodeCompleteExpression(S, PreferredType); 5641 return; 5642 } 5643 5644 HandleCodeCompleteResults(this, CodeCompleter, 5645 Results.getCompletionContext(), 5646 Results.data(),Results.size()); 5647 } 5648 5649 void Sema::CodeCompleteObjCForCollection(Scope *S, 5650 DeclGroupPtrTy IterationVar) { 5651 CodeCompleteExpressionData Data; 5652 Data.ObjCCollection = true; 5653 5654 if (IterationVar.getAsOpaquePtr()) { 5655 DeclGroupRef DG = IterationVar.get(); 5656 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 5657 if (*I) 5658 Data.IgnoreDecls.push_back(*I); 5659 } 5660 } 5661 5662 CodeCompleteExpression(S, Data); 5663 } 5664 5665 void Sema::CodeCompleteObjCSelector(Scope *S, 5666 ArrayRef<IdentifierInfo *> SelIdents) { 5667 // If we have an external source, load the entire class method 5668 // pool from the AST file. 5669 if (ExternalSource) { 5670 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 5671 I != N; ++I) { 5672 Selector Sel = ExternalSource->GetExternalSelector(I); 5673 if (Sel.isNull() || MethodPool.count(Sel)) 5674 continue; 5675 5676 ReadMethodPool(Sel); 5677 } 5678 } 5679 5680 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5681 CodeCompleter->getCodeCompletionTUInfo(), 5682 CodeCompletionContext::CCC_SelectorName); 5683 Results.EnterNewScope(); 5684 for (GlobalMethodPool::iterator M = MethodPool.begin(), 5685 MEnd = MethodPool.end(); 5686 M != MEnd; ++M) { 5687 5688 Selector Sel = M->first; 5689 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 5690 continue; 5691 5692 CodeCompletionBuilder Builder(Results.getAllocator(), 5693 Results.getCodeCompletionTUInfo()); 5694 if (Sel.isUnarySelector()) { 5695 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 5696 Sel.getNameForSlot(0))); 5697 Results.AddResult(Builder.TakeString()); 5698 continue; 5699 } 5700 5701 std::string Accumulator; 5702 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 5703 if (I == SelIdents.size()) { 5704 if (!Accumulator.empty()) { 5705 Builder.AddInformativeChunk(Builder.getAllocator().CopyString( 5706 Accumulator)); 5707 Accumulator.clear(); 5708 } 5709 } 5710 5711 Accumulator += Sel.getNameForSlot(I); 5712 Accumulator += ':'; 5713 } 5714 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( Accumulator)); 5715 Results.AddResult(Builder.TakeString()); 5716 } 5717 Results.ExitScope(); 5718 5719 HandleCodeCompleteResults(this, CodeCompleter, 5720 CodeCompletionContext::CCC_SelectorName, 5721 Results.data(), Results.size()); 5722 } 5723 5724 /// \brief Add all of the protocol declarations that we find in the given 5725 /// (translation unit) context. 5726 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 5727 bool OnlyForwardDeclarations, 5728 ResultBuilder &Results) { 5729 typedef CodeCompletionResult Result; 5730 5731 for (const auto *D : Ctx->decls()) { 5732 // Record any protocols we find. 5733 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 5734 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 5735 Results.AddResult(Result(Proto, Results.getBasePriority(Proto), 0), 5736 CurContext, 0, false); 5737 } 5738 } 5739 5740 void Sema::CodeCompleteObjCProtocolReferences(IdentifierLocPair *Protocols, 5741 unsigned NumProtocols) { 5742 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5743 CodeCompleter->getCodeCompletionTUInfo(), 5744 CodeCompletionContext::CCC_ObjCProtocolName); 5745 5746 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5747 Results.EnterNewScope(); 5748 5749 // Tell the result set to ignore all of the protocols we have 5750 // already seen. 5751 // FIXME: This doesn't work when caching code-completion results. 5752 for (unsigned I = 0; I != NumProtocols; ++I) 5753 if (ObjCProtocolDecl *Protocol = LookupProtocol(Protocols[I].first, 5754 Protocols[I].second)) 5755 Results.Ignore(Protocol); 5756 5757 // Add all protocols. 5758 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 5759 Results); 5760 5761 Results.ExitScope(); 5762 } 5763 5764 HandleCodeCompleteResults(this, CodeCompleter, 5765 CodeCompletionContext::CCC_ObjCProtocolName, 5766 Results.data(),Results.size()); 5767 } 5768 5769 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 5770 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5771 CodeCompleter->getCodeCompletionTUInfo(), 5772 CodeCompletionContext::CCC_ObjCProtocolName); 5773 5774 if (CodeCompleter && CodeCompleter->includeGlobals()) { 5775 Results.EnterNewScope(); 5776 5777 // Add all protocols. 5778 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 5779 Results); 5780 5781 Results.ExitScope(); 5782 } 5783 5784 HandleCodeCompleteResults(this, CodeCompleter, 5785 CodeCompletionContext::CCC_ObjCProtocolName, 5786 Results.data(),Results.size()); 5787 } 5788 5789 /// \brief Add all of the Objective-C interface declarations that we find in 5790 /// the given (translation unit) context. 5791 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 5792 bool OnlyForwardDeclarations, 5793 bool OnlyUnimplemented, 5794 ResultBuilder &Results) { 5795 typedef CodeCompletionResult Result; 5796 5797 for (const auto *D : Ctx->decls()) { 5798 // Record any interfaces we find. 5799 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 5800 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 5801 (!OnlyUnimplemented || !Class->getImplementation())) 5802 Results.AddResult(Result(Class, Results.getBasePriority(Class), 0), 5803 CurContext, 0, false); 5804 } 5805 } 5806 5807 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 5808 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5809 CodeCompleter->getCodeCompletionTUInfo(), 5810 CodeCompletionContext::CCC_Other); 5811 Results.EnterNewScope(); 5812 5813 if (CodeCompleter->includeGlobals()) { 5814 // Add all classes. 5815 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5816 false, Results); 5817 } 5818 5819 Results.ExitScope(); 5820 5821 HandleCodeCompleteResults(this, CodeCompleter, 5822 CodeCompletionContext::CCC_ObjCInterfaceName, 5823 Results.data(),Results.size()); 5824 } 5825 5826 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 5827 SourceLocation ClassNameLoc) { 5828 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5829 CodeCompleter->getCodeCompletionTUInfo(), 5830 CodeCompletionContext::CCC_ObjCInterfaceName); 5831 Results.EnterNewScope(); 5832 5833 // Make sure that we ignore the class we're currently defining. 5834 NamedDecl *CurClass 5835 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5836 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 5837 Results.Ignore(CurClass); 5838 5839 if (CodeCompleter->includeGlobals()) { 5840 // Add all classes. 5841 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5842 false, Results); 5843 } 5844 5845 Results.ExitScope(); 5846 5847 HandleCodeCompleteResults(this, CodeCompleter, 5848 CodeCompletionContext::CCC_ObjCInterfaceName, 5849 Results.data(),Results.size()); 5850 } 5851 5852 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 5853 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5854 CodeCompleter->getCodeCompletionTUInfo(), 5855 CodeCompletionContext::CCC_Other); 5856 Results.EnterNewScope(); 5857 5858 if (CodeCompleter->includeGlobals()) { 5859 // Add all unimplemented classes. 5860 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 5861 true, Results); 5862 } 5863 5864 Results.ExitScope(); 5865 5866 HandleCodeCompleteResults(this, CodeCompleter, 5867 CodeCompletionContext::CCC_ObjCInterfaceName, 5868 Results.data(),Results.size()); 5869 } 5870 5871 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 5872 IdentifierInfo *ClassName, 5873 SourceLocation ClassNameLoc) { 5874 typedef CodeCompletionResult Result; 5875 5876 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5877 CodeCompleter->getCodeCompletionTUInfo(), 5878 CodeCompletionContext::CCC_ObjCCategoryName); 5879 5880 // Ignore any categories we find that have already been implemented by this 5881 // interface. 5882 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5883 NamedDecl *CurClass 5884 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5885 if (ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)){ 5886 for (ObjCInterfaceDecl::visible_categories_iterator 5887 Cat = Class->visible_categories_begin(), 5888 CatEnd = Class->visible_categories_end(); 5889 Cat != CatEnd; ++Cat) { 5890 CategoryNames.insert(Cat->getIdentifier()); 5891 } 5892 } 5893 5894 // Add all of the categories we know about. 5895 Results.EnterNewScope(); 5896 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 5897 for (const auto *D : TU->decls()) 5898 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 5899 if (CategoryNames.insert(Category->getIdentifier())) 5900 Results.AddResult(Result(Category, Results.getBasePriority(Category),0), 5901 CurContext, 0, false); 5902 Results.ExitScope(); 5903 5904 HandleCodeCompleteResults(this, CodeCompleter, 5905 CodeCompletionContext::CCC_ObjCCategoryName, 5906 Results.data(),Results.size()); 5907 } 5908 5909 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 5910 IdentifierInfo *ClassName, 5911 SourceLocation ClassNameLoc) { 5912 typedef CodeCompletionResult Result; 5913 5914 // Find the corresponding interface. If we couldn't find the interface, the 5915 // program itself is ill-formed. However, we'll try to be helpful still by 5916 // providing the list of all of the categories we know about. 5917 NamedDecl *CurClass 5918 = LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 5919 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 5920 if (!Class) 5921 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 5922 5923 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5924 CodeCompleter->getCodeCompletionTUInfo(), 5925 CodeCompletionContext::CCC_ObjCCategoryName); 5926 5927 // Add all of the categories that have have corresponding interface 5928 // declarations in this class and any of its superclasses, except for 5929 // already-implemented categories in the class itself. 5930 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 5931 Results.EnterNewScope(); 5932 bool IgnoreImplemented = true; 5933 while (Class) { 5934 for (ObjCInterfaceDecl::visible_categories_iterator 5935 Cat = Class->visible_categories_begin(), 5936 CatEnd = Class->visible_categories_end(); 5937 Cat != CatEnd; ++Cat) { 5938 if ((!IgnoreImplemented || !Cat->getImplementation()) && 5939 CategoryNames.insert(Cat->getIdentifier())) 5940 Results.AddResult(Result(*Cat, Results.getBasePriority(*Cat), 0), 5941 CurContext, 0, false); 5942 } 5943 5944 Class = Class->getSuperClass(); 5945 IgnoreImplemented = false; 5946 } 5947 Results.ExitScope(); 5948 5949 HandleCodeCompleteResults(this, CodeCompleter, 5950 CodeCompletionContext::CCC_ObjCCategoryName, 5951 Results.data(),Results.size()); 5952 } 5953 5954 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 5955 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5956 CodeCompleter->getCodeCompletionTUInfo(), 5957 CodeCompletionContext::CCC_Other); 5958 5959 // Figure out where this @synthesize lives. 5960 ObjCContainerDecl *Container 5961 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 5962 if (!Container || 5963 (!isa<ObjCImplementationDecl>(Container) && 5964 !isa<ObjCCategoryImplDecl>(Container))) 5965 return; 5966 5967 // Ignore any properties that have already been implemented. 5968 Container = getContainerDef(Container); 5969 for (const auto *D : Container->decls()) 5970 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 5971 Results.Ignore(PropertyImpl->getPropertyDecl()); 5972 5973 // Add any properties that we find. 5974 AddedPropertiesSet AddedProperties; 5975 Results.EnterNewScope(); 5976 if (ObjCImplementationDecl *ClassImpl 5977 = dyn_cast<ObjCImplementationDecl>(Container)) 5978 AddObjCProperties(ClassImpl->getClassInterface(), false, 5979 /*AllowNullaryMethods=*/false, CurContext, 5980 AddedProperties, Results); 5981 else 5982 AddObjCProperties(cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 5983 false, /*AllowNullaryMethods=*/false, CurContext, 5984 AddedProperties, Results); 5985 Results.ExitScope(); 5986 5987 HandleCodeCompleteResults(this, CodeCompleter, 5988 CodeCompletionContext::CCC_Other, 5989 Results.data(),Results.size()); 5990 } 5991 5992 void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S, 5993 IdentifierInfo *PropertyName) { 5994 typedef CodeCompletionResult Result; 5995 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5996 CodeCompleter->getCodeCompletionTUInfo(), 5997 CodeCompletionContext::CCC_Other); 5998 5999 // Figure out where this @synthesize lives. 6000 ObjCContainerDecl *Container 6001 = dyn_cast_or_null<ObjCContainerDecl>(CurContext); 6002 if (!Container || 6003 (!isa<ObjCImplementationDecl>(Container) && 6004 !isa<ObjCCategoryImplDecl>(Container))) 6005 return; 6006 6007 // Figure out which interface we're looking into. 6008 ObjCInterfaceDecl *Class = 0; 6009 if (ObjCImplementationDecl *ClassImpl 6010 = dyn_cast<ObjCImplementationDecl>(Container)) 6011 Class = ClassImpl->getClassInterface(); 6012 else 6013 Class = cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl() 6014 ->getClassInterface(); 6015 6016 // Determine the type of the property we're synthesizing. 6017 QualType PropertyType = Context.getObjCIdType(); 6018 if (Class) { 6019 if (ObjCPropertyDecl *Property 6020 = Class->FindPropertyDeclaration(PropertyName)) { 6021 PropertyType 6022 = Property->getType().getNonReferenceType().getUnqualifiedType(); 6023 6024 // Give preference to ivars 6025 Results.setPreferredType(PropertyType); 6026 } 6027 } 6028 6029 // Add all of the instance variables in this class and its superclasses. 6030 Results.EnterNewScope(); 6031 bool SawSimilarlyNamedIvar = false; 6032 std::string NameWithPrefix; 6033 NameWithPrefix += '_'; 6034 NameWithPrefix += PropertyName->getName(); 6035 std::string NameWithSuffix = PropertyName->getName().str(); 6036 NameWithSuffix += '_'; 6037 for(; Class; Class = Class->getSuperClass()) { 6038 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 6039 Ivar = Ivar->getNextIvar()) { 6040 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), 0), 6041 CurContext, 0, false); 6042 6043 // Determine whether we've seen an ivar with a name similar to the 6044 // property. 6045 if ((PropertyName == Ivar->getIdentifier() || 6046 NameWithPrefix == Ivar->getName() || 6047 NameWithSuffix == Ivar->getName())) { 6048 SawSimilarlyNamedIvar = true; 6049 6050 // Reduce the priority of this result by one, to give it a slight 6051 // advantage over other results whose names don't match so closely. 6052 if (Results.size() && 6053 Results.data()[Results.size() - 1].Kind 6054 == CodeCompletionResult::RK_Declaration && 6055 Results.data()[Results.size() - 1].Declaration == Ivar) 6056 Results.data()[Results.size() - 1].Priority--; 6057 } 6058 } 6059 } 6060 6061 if (!SawSimilarlyNamedIvar) { 6062 // Create ivar result _propName, that the user can use to synthesize 6063 // an ivar of the appropriate type. 6064 unsigned Priority = CCP_MemberDeclaration + 1; 6065 typedef CodeCompletionResult Result; 6066 CodeCompletionAllocator &Allocator = Results.getAllocator(); 6067 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 6068 Priority,CXAvailability_Available); 6069 6070 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6071 Builder.AddResultTypeChunk(GetCompletionTypeString(PropertyType, Context, 6072 Policy, Allocator)); 6073 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 6074 Results.AddResult(Result(Builder.TakeString(), Priority, 6075 CXCursor_ObjCIvarDecl)); 6076 } 6077 6078 Results.ExitScope(); 6079 6080 HandleCodeCompleteResults(this, CodeCompleter, 6081 CodeCompletionContext::CCC_Other, 6082 Results.data(),Results.size()); 6083 } 6084 6085 // Mapping from selectors to the methods that implement that selector, along 6086 // with the "in original class" flag. 6087 typedef llvm::DenseMap< 6088 Selector, llvm::PointerIntPair<ObjCMethodDecl *, 1, bool> > KnownMethodsMap; 6089 6090 /// \brief Find all of the methods that reside in the given container 6091 /// (and its superclasses, protocols, etc.) that meet the given 6092 /// criteria. Insert those methods into the map of known methods, 6093 /// indexed by selector so they can be easily found. 6094 static void FindImplementableMethods(ASTContext &Context, 6095 ObjCContainerDecl *Container, 6096 bool WantInstanceMethods, 6097 QualType ReturnType, 6098 KnownMethodsMap &KnownMethods, 6099 bool InOriginalClass = true) { 6100 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 6101 // Make sure we have a definition; that's what we'll walk. 6102 if (!IFace->hasDefinition()) 6103 return; 6104 6105 IFace = IFace->getDefinition(); 6106 Container = IFace; 6107 6108 const ObjCList<ObjCProtocolDecl> &Protocols 6109 = IFace->getReferencedProtocols(); 6110 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6111 E = Protocols.end(); 6112 I != E; ++I) 6113 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6114 KnownMethods, InOriginalClass); 6115 6116 // Add methods from any class extensions and categories. 6117 for (ObjCInterfaceDecl::visible_categories_iterator 6118 Cat = IFace->visible_categories_begin(), 6119 CatEnd = IFace->visible_categories_end(); 6120 Cat != CatEnd; ++Cat) { 6121 FindImplementableMethods(Context, *Cat, WantInstanceMethods, ReturnType, 6122 KnownMethods, false); 6123 } 6124 6125 // Visit the superclass. 6126 if (IFace->getSuperClass()) 6127 FindImplementableMethods(Context, IFace->getSuperClass(), 6128 WantInstanceMethods, ReturnType, 6129 KnownMethods, false); 6130 } 6131 6132 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 6133 // Recurse into protocols. 6134 const ObjCList<ObjCProtocolDecl> &Protocols 6135 = Category->getReferencedProtocols(); 6136 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6137 E = Protocols.end(); 6138 I != E; ++I) 6139 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6140 KnownMethods, InOriginalClass); 6141 6142 // If this category is the original class, jump to the interface. 6143 if (InOriginalClass && Category->getClassInterface()) 6144 FindImplementableMethods(Context, Category->getClassInterface(), 6145 WantInstanceMethods, ReturnType, KnownMethods, 6146 false); 6147 } 6148 6149 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6150 // Make sure we have a definition; that's what we'll walk. 6151 if (!Protocol->hasDefinition()) 6152 return; 6153 Protocol = Protocol->getDefinition(); 6154 Container = Protocol; 6155 6156 // Recurse into protocols. 6157 const ObjCList<ObjCProtocolDecl> &Protocols 6158 = Protocol->getReferencedProtocols(); 6159 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6160 E = Protocols.end(); 6161 I != E; ++I) 6162 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 6163 KnownMethods, false); 6164 } 6165 6166 // Add methods in this container. This operation occurs last because 6167 // we want the methods from this container to override any methods 6168 // we've previously seen with the same selector. 6169 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 6170 MEnd = Container->meth_end(); 6171 M != MEnd; ++M) { 6172 if (M->isInstanceMethod() == WantInstanceMethods) { 6173 if (!ReturnType.isNull() && 6174 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 6175 continue; 6176 6177 KnownMethods[M->getSelector()] = 6178 KnownMethodsMap::mapped_type(*M, InOriginalClass); 6179 } 6180 } 6181 } 6182 6183 /// \brief Add the parenthesized return or parameter type chunk to a code 6184 /// completion string. 6185 static void AddObjCPassingTypeChunk(QualType Type, 6186 unsigned ObjCDeclQuals, 6187 ASTContext &Context, 6188 const PrintingPolicy &Policy, 6189 CodeCompletionBuilder &Builder) { 6190 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6191 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals); 6192 if (!Quals.empty()) 6193 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 6194 Builder.AddTextChunk(GetCompletionTypeString(Type, Context, Policy, 6195 Builder.getAllocator())); 6196 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6197 } 6198 6199 /// \brief Determine whether the given class is or inherits from a class by 6200 /// the given name. 6201 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, 6202 StringRef Name) { 6203 if (!Class) 6204 return false; 6205 6206 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 6207 return true; 6208 6209 return InheritsFromClassNamed(Class->getSuperClass(), Name); 6210 } 6211 6212 /// \brief Add code completions for Objective-C Key-Value Coding (KVC) and 6213 /// Key-Value Observing (KVO). 6214 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 6215 bool IsInstanceMethod, 6216 QualType ReturnType, 6217 ASTContext &Context, 6218 VisitedSelectorSet &KnownSelectors, 6219 ResultBuilder &Results) { 6220 IdentifierInfo *PropName = Property->getIdentifier(); 6221 if (!PropName || PropName->getLength() == 0) 6222 return; 6223 6224 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 6225 6226 // Builder that will create each code completion. 6227 typedef CodeCompletionResult Result; 6228 CodeCompletionAllocator &Allocator = Results.getAllocator(); 6229 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 6230 6231 // The selector table. 6232 SelectorTable &Selectors = Context.Selectors; 6233 6234 // The property name, copied into the code completion allocation region 6235 // on demand. 6236 struct KeyHolder { 6237 CodeCompletionAllocator &Allocator; 6238 StringRef Key; 6239 const char *CopiedKey; 6240 6241 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 6242 : Allocator(Allocator), Key(Key), CopiedKey(0) { } 6243 6244 operator const char *() { 6245 if (CopiedKey) 6246 return CopiedKey; 6247 6248 return CopiedKey = Allocator.CopyString(Key); 6249 } 6250 } Key(Allocator, PropName->getName()); 6251 6252 // The uppercased name of the property name. 6253 std::string UpperKey = PropName->getName(); 6254 if (!UpperKey.empty()) 6255 UpperKey[0] = toUppercase(UpperKey[0]); 6256 6257 bool ReturnTypeMatchesProperty = ReturnType.isNull() || 6258 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 6259 Property->getType()); 6260 bool ReturnTypeMatchesVoid 6261 = ReturnType.isNull() || ReturnType->isVoidType(); 6262 6263 // Add the normal accessor -(type)key. 6264 if (IsInstanceMethod && 6265 KnownSelectors.insert(Selectors.getNullarySelector(PropName)) && 6266 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 6267 if (ReturnType.isNull()) 6268 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6269 Context, Policy, Builder); 6270 6271 Builder.AddTypedTextChunk(Key); 6272 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6273 CXCursor_ObjCInstanceMethodDecl)); 6274 } 6275 6276 // If we have an integral or boolean property (or the user has provided 6277 // an integral or boolean return type), add the accessor -(type)isKey. 6278 if (IsInstanceMethod && 6279 ((!ReturnType.isNull() && 6280 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 6281 (ReturnType.isNull() && 6282 (Property->getType()->isIntegerType() || 6283 Property->getType()->isBooleanType())))) { 6284 std::string SelectorName = (Twine("is") + UpperKey).str(); 6285 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6286 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6287 if (ReturnType.isNull()) { 6288 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6289 Builder.AddTextChunk("BOOL"); 6290 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6291 } 6292 6293 Builder.AddTypedTextChunk( 6294 Allocator.CopyString(SelectorId->getName())); 6295 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6296 CXCursor_ObjCInstanceMethodDecl)); 6297 } 6298 } 6299 6300 // Add the normal mutator. 6301 if (IsInstanceMethod && ReturnTypeMatchesVoid && 6302 !Property->getSetterMethodDecl()) { 6303 std::string SelectorName = (Twine("set") + UpperKey).str(); 6304 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6305 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6306 if (ReturnType.isNull()) { 6307 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6308 Builder.AddTextChunk("void"); 6309 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6310 } 6311 6312 Builder.AddTypedTextChunk( 6313 Allocator.CopyString(SelectorId->getName())); 6314 Builder.AddTypedTextChunk(":"); 6315 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, 6316 Context, Policy, Builder); 6317 Builder.AddTextChunk(Key); 6318 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6319 CXCursor_ObjCInstanceMethodDecl)); 6320 } 6321 } 6322 6323 // Indexed and unordered accessors 6324 unsigned IndexedGetterPriority = CCP_CodePattern; 6325 unsigned IndexedSetterPriority = CCP_CodePattern; 6326 unsigned UnorderedGetterPriority = CCP_CodePattern; 6327 unsigned UnorderedSetterPriority = CCP_CodePattern; 6328 if (const ObjCObjectPointerType *ObjCPointer 6329 = Property->getType()->getAs<ObjCObjectPointerType>()) { 6330 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 6331 // If this interface type is not provably derived from a known 6332 // collection, penalize the corresponding completions. 6333 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 6334 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6335 if (!InheritsFromClassNamed(IFace, "NSArray")) 6336 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6337 } 6338 6339 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 6340 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6341 if (!InheritsFromClassNamed(IFace, "NSSet")) 6342 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6343 } 6344 } 6345 } else { 6346 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 6347 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 6348 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 6349 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 6350 } 6351 6352 // Add -(NSUInteger)countOf<key> 6353 if (IsInstanceMethod && 6354 (ReturnType.isNull() || ReturnType->isIntegerType())) { 6355 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 6356 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6357 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6358 if (ReturnType.isNull()) { 6359 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6360 Builder.AddTextChunk("NSUInteger"); 6361 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6362 } 6363 6364 Builder.AddTypedTextChunk( 6365 Allocator.CopyString(SelectorId->getName())); 6366 Results.AddResult(Result(Builder.TakeString(), 6367 std::min(IndexedGetterPriority, 6368 UnorderedGetterPriority), 6369 CXCursor_ObjCInstanceMethodDecl)); 6370 } 6371 } 6372 6373 // Indexed getters 6374 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 6375 if (IsInstanceMethod && 6376 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6377 std::string SelectorName 6378 = (Twine("objectIn") + UpperKey + "AtIndex").str(); 6379 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6380 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6381 if (ReturnType.isNull()) { 6382 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6383 Builder.AddTextChunk("id"); 6384 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6385 } 6386 6387 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6388 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6389 Builder.AddTextChunk("NSUInteger"); 6390 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6391 Builder.AddTextChunk("index"); 6392 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6393 CXCursor_ObjCInstanceMethodDecl)); 6394 } 6395 } 6396 6397 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 6398 if (IsInstanceMethod && 6399 (ReturnType.isNull() || 6400 (ReturnType->isObjCObjectPointerType() && 6401 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6402 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6403 ->getName() == "NSArray"))) { 6404 std::string SelectorName 6405 = (Twine(Property->getName()) + "AtIndexes").str(); 6406 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6407 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6408 if (ReturnType.isNull()) { 6409 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6410 Builder.AddTextChunk("NSArray *"); 6411 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6412 } 6413 6414 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6415 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6416 Builder.AddTextChunk("NSIndexSet *"); 6417 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6418 Builder.AddTextChunk("indexes"); 6419 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6420 CXCursor_ObjCInstanceMethodDecl)); 6421 } 6422 } 6423 6424 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 6425 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6426 std::string SelectorName = (Twine("get") + UpperKey).str(); 6427 IdentifierInfo *SelectorIds[2] = { 6428 &Context.Idents.get(SelectorName), 6429 &Context.Idents.get("range") 6430 }; 6431 6432 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6433 if (ReturnType.isNull()) { 6434 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6435 Builder.AddTextChunk("void"); 6436 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6437 } 6438 6439 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6440 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6441 Builder.AddPlaceholderChunk("object-type"); 6442 Builder.AddTextChunk(" **"); 6443 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6444 Builder.AddTextChunk("buffer"); 6445 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6446 Builder.AddTypedTextChunk("range:"); 6447 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6448 Builder.AddTextChunk("NSRange"); 6449 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6450 Builder.AddTextChunk("inRange"); 6451 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 6452 CXCursor_ObjCInstanceMethodDecl)); 6453 } 6454 } 6455 6456 // Mutable indexed accessors 6457 6458 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 6459 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6460 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 6461 IdentifierInfo *SelectorIds[2] = { 6462 &Context.Idents.get("insertObject"), 6463 &Context.Idents.get(SelectorName) 6464 }; 6465 6466 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6467 if (ReturnType.isNull()) { 6468 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6469 Builder.AddTextChunk("void"); 6470 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6471 } 6472 6473 Builder.AddTypedTextChunk("insertObject:"); 6474 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6475 Builder.AddPlaceholderChunk("object-type"); 6476 Builder.AddTextChunk(" *"); 6477 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6478 Builder.AddTextChunk("object"); 6479 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6480 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6481 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6482 Builder.AddPlaceholderChunk("NSUInteger"); 6483 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6484 Builder.AddTextChunk("index"); 6485 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6486 CXCursor_ObjCInstanceMethodDecl)); 6487 } 6488 } 6489 6490 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 6491 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6492 std::string SelectorName = (Twine("insert") + UpperKey).str(); 6493 IdentifierInfo *SelectorIds[2] = { 6494 &Context.Idents.get(SelectorName), 6495 &Context.Idents.get("atIndexes") 6496 }; 6497 6498 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6499 if (ReturnType.isNull()) { 6500 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6501 Builder.AddTextChunk("void"); 6502 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6503 } 6504 6505 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6506 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6507 Builder.AddTextChunk("NSArray *"); 6508 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6509 Builder.AddTextChunk("array"); 6510 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6511 Builder.AddTypedTextChunk("atIndexes:"); 6512 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6513 Builder.AddPlaceholderChunk("NSIndexSet *"); 6514 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6515 Builder.AddTextChunk("indexes"); 6516 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6517 CXCursor_ObjCInstanceMethodDecl)); 6518 } 6519 } 6520 6521 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 6522 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6523 std::string SelectorName 6524 = (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 6525 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6526 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6527 if (ReturnType.isNull()) { 6528 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6529 Builder.AddTextChunk("void"); 6530 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6531 } 6532 6533 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6534 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6535 Builder.AddTextChunk("NSUInteger"); 6536 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6537 Builder.AddTextChunk("index"); 6538 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6539 CXCursor_ObjCInstanceMethodDecl)); 6540 } 6541 } 6542 6543 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 6544 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6545 std::string SelectorName 6546 = (Twine("remove") + UpperKey + "AtIndexes").str(); 6547 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6548 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6549 if (ReturnType.isNull()) { 6550 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6551 Builder.AddTextChunk("void"); 6552 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6553 } 6554 6555 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6556 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6557 Builder.AddTextChunk("NSIndexSet *"); 6558 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6559 Builder.AddTextChunk("indexes"); 6560 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6561 CXCursor_ObjCInstanceMethodDecl)); 6562 } 6563 } 6564 6565 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 6566 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6567 std::string SelectorName 6568 = (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 6569 IdentifierInfo *SelectorIds[2] = { 6570 &Context.Idents.get(SelectorName), 6571 &Context.Idents.get("withObject") 6572 }; 6573 6574 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6575 if (ReturnType.isNull()) { 6576 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6577 Builder.AddTextChunk("void"); 6578 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6579 } 6580 6581 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6582 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6583 Builder.AddPlaceholderChunk("NSUInteger"); 6584 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6585 Builder.AddTextChunk("index"); 6586 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6587 Builder.AddTypedTextChunk("withObject:"); 6588 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6589 Builder.AddTextChunk("id"); 6590 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6591 Builder.AddTextChunk("object"); 6592 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6593 CXCursor_ObjCInstanceMethodDecl)); 6594 } 6595 } 6596 6597 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 6598 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6599 std::string SelectorName1 6600 = (Twine("replace") + UpperKey + "AtIndexes").str(); 6601 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 6602 IdentifierInfo *SelectorIds[2] = { 6603 &Context.Idents.get(SelectorName1), 6604 &Context.Idents.get(SelectorName2) 6605 }; 6606 6607 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds))) { 6608 if (ReturnType.isNull()) { 6609 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6610 Builder.AddTextChunk("void"); 6611 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6612 } 6613 6614 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 6615 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6616 Builder.AddPlaceholderChunk("NSIndexSet *"); 6617 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6618 Builder.AddTextChunk("indexes"); 6619 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6620 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 6621 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6622 Builder.AddTextChunk("NSArray *"); 6623 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6624 Builder.AddTextChunk("array"); 6625 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 6626 CXCursor_ObjCInstanceMethodDecl)); 6627 } 6628 } 6629 6630 // Unordered getters 6631 // - (NSEnumerator *)enumeratorOfKey 6632 if (IsInstanceMethod && 6633 (ReturnType.isNull() || 6634 (ReturnType->isObjCObjectPointerType() && 6635 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6636 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6637 ->getName() == "NSEnumerator"))) { 6638 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 6639 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6640 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6641 if (ReturnType.isNull()) { 6642 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6643 Builder.AddTextChunk("NSEnumerator *"); 6644 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6645 } 6646 6647 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6648 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6649 CXCursor_ObjCInstanceMethodDecl)); 6650 } 6651 } 6652 6653 // - (type *)memberOfKey:(type *)object 6654 if (IsInstanceMethod && 6655 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 6656 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 6657 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6658 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6659 if (ReturnType.isNull()) { 6660 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6661 Builder.AddPlaceholderChunk("object-type"); 6662 Builder.AddTextChunk(" *"); 6663 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6664 } 6665 6666 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6667 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6668 if (ReturnType.isNull()) { 6669 Builder.AddPlaceholderChunk("object-type"); 6670 Builder.AddTextChunk(" *"); 6671 } else { 6672 Builder.AddTextChunk(GetCompletionTypeString(ReturnType, Context, 6673 Policy, 6674 Builder.getAllocator())); 6675 } 6676 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6677 Builder.AddTextChunk("object"); 6678 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 6679 CXCursor_ObjCInstanceMethodDecl)); 6680 } 6681 } 6682 6683 // Mutable unordered accessors 6684 // - (void)addKeyObject:(type *)object 6685 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6686 std::string SelectorName 6687 = (Twine("add") + UpperKey + Twine("Object")).str(); 6688 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6689 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6690 if (ReturnType.isNull()) { 6691 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6692 Builder.AddTextChunk("void"); 6693 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6694 } 6695 6696 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6697 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6698 Builder.AddPlaceholderChunk("object-type"); 6699 Builder.AddTextChunk(" *"); 6700 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6701 Builder.AddTextChunk("object"); 6702 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6703 CXCursor_ObjCInstanceMethodDecl)); 6704 } 6705 } 6706 6707 // - (void)addKey:(NSSet *)objects 6708 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6709 std::string SelectorName = (Twine("add") + UpperKey).str(); 6710 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6711 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6712 if (ReturnType.isNull()) { 6713 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6714 Builder.AddTextChunk("void"); 6715 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6716 } 6717 6718 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6719 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6720 Builder.AddTextChunk("NSSet *"); 6721 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6722 Builder.AddTextChunk("objects"); 6723 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6724 CXCursor_ObjCInstanceMethodDecl)); 6725 } 6726 } 6727 6728 // - (void)removeKeyObject:(type *)object 6729 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6730 std::string SelectorName 6731 = (Twine("remove") + UpperKey + Twine("Object")).str(); 6732 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6733 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6734 if (ReturnType.isNull()) { 6735 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6736 Builder.AddTextChunk("void"); 6737 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6738 } 6739 6740 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6741 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6742 Builder.AddPlaceholderChunk("object-type"); 6743 Builder.AddTextChunk(" *"); 6744 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6745 Builder.AddTextChunk("object"); 6746 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6747 CXCursor_ObjCInstanceMethodDecl)); 6748 } 6749 } 6750 6751 // - (void)removeKey:(NSSet *)objects 6752 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6753 std::string SelectorName = (Twine("remove") + UpperKey).str(); 6754 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6755 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6756 if (ReturnType.isNull()) { 6757 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6758 Builder.AddTextChunk("void"); 6759 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6760 } 6761 6762 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6763 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6764 Builder.AddTextChunk("NSSet *"); 6765 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6766 Builder.AddTextChunk("objects"); 6767 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6768 CXCursor_ObjCInstanceMethodDecl)); 6769 } 6770 } 6771 6772 // - (void)intersectKey:(NSSet *)objects 6773 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 6774 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 6775 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6776 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId))) { 6777 if (ReturnType.isNull()) { 6778 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6779 Builder.AddTextChunk("void"); 6780 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6781 } 6782 6783 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 6784 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6785 Builder.AddTextChunk("NSSet *"); 6786 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6787 Builder.AddTextChunk("objects"); 6788 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 6789 CXCursor_ObjCInstanceMethodDecl)); 6790 } 6791 } 6792 6793 // Key-Value Observing 6794 // + (NSSet *)keyPathsForValuesAffectingKey 6795 if (!IsInstanceMethod && 6796 (ReturnType.isNull() || 6797 (ReturnType->isObjCObjectPointerType() && 6798 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 6799 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() 6800 ->getName() == "NSSet"))) { 6801 std::string SelectorName 6802 = (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 6803 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6804 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6805 if (ReturnType.isNull()) { 6806 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6807 Builder.AddTextChunk("NSSet *"); 6808 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6809 } 6810 6811 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6812 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6813 CXCursor_ObjCClassMethodDecl)); 6814 } 6815 } 6816 6817 // + (BOOL)automaticallyNotifiesObserversForKey 6818 if (!IsInstanceMethod && 6819 (ReturnType.isNull() || 6820 ReturnType->isIntegerType() || 6821 ReturnType->isBooleanType())) { 6822 std::string SelectorName 6823 = (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 6824 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 6825 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId))) { 6826 if (ReturnType.isNull()) { 6827 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6828 Builder.AddTextChunk("BOOL"); 6829 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6830 } 6831 6832 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 6833 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 6834 CXCursor_ObjCClassMethodDecl)); 6835 } 6836 } 6837 } 6838 6839 void Sema::CodeCompleteObjCMethodDecl(Scope *S, 6840 bool IsInstanceMethod, 6841 ParsedType ReturnTy) { 6842 // Determine the return type of the method we're declaring, if 6843 // provided. 6844 QualType ReturnType = GetTypeFromParser(ReturnTy); 6845 Decl *IDecl = 0; 6846 if (CurContext->isObjCContainer()) { 6847 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 6848 IDecl = cast<Decl>(OCD); 6849 } 6850 // Determine where we should start searching for methods. 6851 ObjCContainerDecl *SearchDecl = 0; 6852 bool IsInImplementation = false; 6853 if (Decl *D = IDecl) { 6854 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 6855 SearchDecl = Impl->getClassInterface(); 6856 IsInImplementation = true; 6857 } else if (ObjCCategoryImplDecl *CatImpl 6858 = dyn_cast<ObjCCategoryImplDecl>(D)) { 6859 SearchDecl = CatImpl->getCategoryDecl(); 6860 IsInImplementation = true; 6861 } else 6862 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 6863 } 6864 6865 if (!SearchDecl && S) { 6866 if (DeclContext *DC = S->getEntity()) 6867 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 6868 } 6869 6870 if (!SearchDecl) { 6871 HandleCodeCompleteResults(this, CodeCompleter, 6872 CodeCompletionContext::CCC_Other, 6873 0, 0); 6874 return; 6875 } 6876 6877 // Find all of the methods that we could declare/implement here. 6878 KnownMethodsMap KnownMethods; 6879 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, 6880 ReturnType, KnownMethods); 6881 6882 // Add declarations or definitions for each of the known methods. 6883 typedef CodeCompletionResult Result; 6884 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6885 CodeCompleter->getCodeCompletionTUInfo(), 6886 CodeCompletionContext::CCC_Other); 6887 Results.EnterNewScope(); 6888 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6889 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6890 MEnd = KnownMethods.end(); 6891 M != MEnd; ++M) { 6892 ObjCMethodDecl *Method = M->second.getPointer(); 6893 CodeCompletionBuilder Builder(Results.getAllocator(), 6894 Results.getCodeCompletionTUInfo()); 6895 6896 // If the result type was not already provided, add it to the 6897 // pattern as (type). 6898 if (ReturnType.isNull()) 6899 AddObjCPassingTypeChunk(Method->getReturnType(), 6900 Method->getObjCDeclQualifier(), Context, Policy, 6901 Builder); 6902 6903 Selector Sel = Method->getSelector(); 6904 6905 // Add the first part of the selector to the pattern. 6906 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 6907 Sel.getNameForSlot(0))); 6908 6909 // Add parameters to the pattern. 6910 unsigned I = 0; 6911 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 6912 PEnd = Method->param_end(); 6913 P != PEnd; (void)++P, ++I) { 6914 // Add the part of the selector name. 6915 if (I == 0) 6916 Builder.AddTypedTextChunk(":"); 6917 else if (I < Sel.getNumArgs()) { 6918 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6919 Builder.AddTypedTextChunk( 6920 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 6921 } else 6922 break; 6923 6924 // Add the parameter type. 6925 AddObjCPassingTypeChunk((*P)->getOriginalType(), 6926 (*P)->getObjCDeclQualifier(), 6927 Context, Policy, 6928 Builder); 6929 6930 if (IdentifierInfo *Id = (*P)->getIdentifier()) 6931 Builder.AddTextChunk(Builder.getAllocator().CopyString( Id->getName())); 6932 } 6933 6934 if (Method->isVariadic()) { 6935 if (Method->param_size() > 0) 6936 Builder.AddChunk(CodeCompletionString::CK_Comma); 6937 Builder.AddTextChunk("..."); 6938 } 6939 6940 if (IsInImplementation && Results.includeCodePatterns()) { 6941 // We will be defining the method here, so add a compound statement. 6942 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6943 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6944 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6945 if (!Method->getReturnType()->isVoidType()) { 6946 // If the result type is not void, add a return clause. 6947 Builder.AddTextChunk("return"); 6948 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6949 Builder.AddPlaceholderChunk("expression"); 6950 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6951 } else 6952 Builder.AddPlaceholderChunk("statements"); 6953 6954 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6955 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6956 } 6957 6958 unsigned Priority = CCP_CodePattern; 6959 if (!M->second.getInt()) 6960 Priority += CCD_InBaseClass; 6961 6962 Results.AddResult(Result(Builder.TakeString(), Method, Priority)); 6963 } 6964 6965 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 6966 // the properties in this class and its categories. 6967 if (Context.getLangOpts().ObjC2) { 6968 SmallVector<ObjCContainerDecl *, 4> Containers; 6969 Containers.push_back(SearchDecl); 6970 6971 VisitedSelectorSet KnownSelectors; 6972 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 6973 MEnd = KnownMethods.end(); 6974 M != MEnd; ++M) 6975 KnownSelectors.insert(M->first); 6976 6977 6978 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 6979 if (!IFace) 6980 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 6981 IFace = Category->getClassInterface(); 6982 6983 if (IFace) { 6984 for (ObjCInterfaceDecl::visible_categories_iterator 6985 Cat = IFace->visible_categories_begin(), 6986 CatEnd = IFace->visible_categories_end(); 6987 Cat != CatEnd; ++Cat) { 6988 Containers.push_back(*Cat); 6989 } 6990 } 6991 6992 for (unsigned I = 0, N = Containers.size(); I != N; ++I) { 6993 for (ObjCContainerDecl::prop_iterator P = Containers[I]->prop_begin(), 6994 PEnd = Containers[I]->prop_end(); 6995 P != PEnd; ++P) { 6996 AddObjCKeyValueCompletions(*P, IsInstanceMethod, ReturnType, Context, 6997 KnownSelectors, Results); 6998 } 6999 } 7000 } 7001 7002 Results.ExitScope(); 7003 7004 HandleCodeCompleteResults(this, CodeCompleter, 7005 CodeCompletionContext::CCC_Other, 7006 Results.data(),Results.size()); 7007 } 7008 7009 void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S, 7010 bool IsInstanceMethod, 7011 bool AtParameterName, 7012 ParsedType ReturnTy, 7013 ArrayRef<IdentifierInfo *> SelIdents) { 7014 // If we have an external source, load the entire class method 7015 // pool from the AST file. 7016 if (ExternalSource) { 7017 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 7018 I != N; ++I) { 7019 Selector Sel = ExternalSource->GetExternalSelector(I); 7020 if (Sel.isNull() || MethodPool.count(Sel)) 7021 continue; 7022 7023 ReadMethodPool(Sel); 7024 } 7025 } 7026 7027 // Build the set of methods we can see. 7028 typedef CodeCompletionResult Result; 7029 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7030 CodeCompleter->getCodeCompletionTUInfo(), 7031 CodeCompletionContext::CCC_Other); 7032 7033 if (ReturnTy) 7034 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 7035 7036 Results.EnterNewScope(); 7037 for (GlobalMethodPool::iterator M = MethodPool.begin(), 7038 MEnd = MethodPool.end(); 7039 M != MEnd; ++M) { 7040 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first : 7041 &M->second.second; 7042 MethList && MethList->Method; 7043 MethList = MethList->getNext()) { 7044 if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents)) 7045 continue; 7046 7047 if (AtParameterName) { 7048 // Suggest parameter names we've seen before. 7049 unsigned NumSelIdents = SelIdents.size(); 7050 if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) { 7051 ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1]; 7052 if (Param->getIdentifier()) { 7053 CodeCompletionBuilder Builder(Results.getAllocator(), 7054 Results.getCodeCompletionTUInfo()); 7055 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7056 Param->getIdentifier()->getName())); 7057 Results.AddResult(Builder.TakeString()); 7058 } 7059 } 7060 7061 continue; 7062 } 7063 7064 Result R(MethList->Method, Results.getBasePriority(MethList->Method), 0); 7065 R.StartParameter = SelIdents.size(); 7066 R.AllParametersAreInformative = false; 7067 R.DeclaringEntity = true; 7068 Results.MaybeAddResult(R, CurContext); 7069 } 7070 } 7071 7072 Results.ExitScope(); 7073 HandleCodeCompleteResults(this, CodeCompleter, 7074 CodeCompletionContext::CCC_Other, 7075 Results.data(),Results.size()); 7076 } 7077 7078 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 7079 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7080 CodeCompleter->getCodeCompletionTUInfo(), 7081 CodeCompletionContext::CCC_PreprocessorDirective); 7082 Results.EnterNewScope(); 7083 7084 // #if <condition> 7085 CodeCompletionBuilder Builder(Results.getAllocator(), 7086 Results.getCodeCompletionTUInfo()); 7087 Builder.AddTypedTextChunk("if"); 7088 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7089 Builder.AddPlaceholderChunk("condition"); 7090 Results.AddResult(Builder.TakeString()); 7091 7092 // #ifdef <macro> 7093 Builder.AddTypedTextChunk("ifdef"); 7094 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7095 Builder.AddPlaceholderChunk("macro"); 7096 Results.AddResult(Builder.TakeString()); 7097 7098 // #ifndef <macro> 7099 Builder.AddTypedTextChunk("ifndef"); 7100 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7101 Builder.AddPlaceholderChunk("macro"); 7102 Results.AddResult(Builder.TakeString()); 7103 7104 if (InConditional) { 7105 // #elif <condition> 7106 Builder.AddTypedTextChunk("elif"); 7107 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7108 Builder.AddPlaceholderChunk("condition"); 7109 Results.AddResult(Builder.TakeString()); 7110 7111 // #else 7112 Builder.AddTypedTextChunk("else"); 7113 Results.AddResult(Builder.TakeString()); 7114 7115 // #endif 7116 Builder.AddTypedTextChunk("endif"); 7117 Results.AddResult(Builder.TakeString()); 7118 } 7119 7120 // #include "header" 7121 Builder.AddTypedTextChunk("include"); 7122 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7123 Builder.AddTextChunk("\""); 7124 Builder.AddPlaceholderChunk("header"); 7125 Builder.AddTextChunk("\""); 7126 Results.AddResult(Builder.TakeString()); 7127 7128 // #include <header> 7129 Builder.AddTypedTextChunk("include"); 7130 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7131 Builder.AddTextChunk("<"); 7132 Builder.AddPlaceholderChunk("header"); 7133 Builder.AddTextChunk(">"); 7134 Results.AddResult(Builder.TakeString()); 7135 7136 // #define <macro> 7137 Builder.AddTypedTextChunk("define"); 7138 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7139 Builder.AddPlaceholderChunk("macro"); 7140 Results.AddResult(Builder.TakeString()); 7141 7142 // #define <macro>(<args>) 7143 Builder.AddTypedTextChunk("define"); 7144 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7145 Builder.AddPlaceholderChunk("macro"); 7146 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7147 Builder.AddPlaceholderChunk("args"); 7148 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7149 Results.AddResult(Builder.TakeString()); 7150 7151 // #undef <macro> 7152 Builder.AddTypedTextChunk("undef"); 7153 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7154 Builder.AddPlaceholderChunk("macro"); 7155 Results.AddResult(Builder.TakeString()); 7156 7157 // #line <number> 7158 Builder.AddTypedTextChunk("line"); 7159 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7160 Builder.AddPlaceholderChunk("number"); 7161 Results.AddResult(Builder.TakeString()); 7162 7163 // #line <number> "filename" 7164 Builder.AddTypedTextChunk("line"); 7165 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7166 Builder.AddPlaceholderChunk("number"); 7167 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7168 Builder.AddTextChunk("\""); 7169 Builder.AddPlaceholderChunk("filename"); 7170 Builder.AddTextChunk("\""); 7171 Results.AddResult(Builder.TakeString()); 7172 7173 // #error <message> 7174 Builder.AddTypedTextChunk("error"); 7175 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7176 Builder.AddPlaceholderChunk("message"); 7177 Results.AddResult(Builder.TakeString()); 7178 7179 // #pragma <arguments> 7180 Builder.AddTypedTextChunk("pragma"); 7181 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7182 Builder.AddPlaceholderChunk("arguments"); 7183 Results.AddResult(Builder.TakeString()); 7184 7185 if (getLangOpts().ObjC1) { 7186 // #import "header" 7187 Builder.AddTypedTextChunk("import"); 7188 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7189 Builder.AddTextChunk("\""); 7190 Builder.AddPlaceholderChunk("header"); 7191 Builder.AddTextChunk("\""); 7192 Results.AddResult(Builder.TakeString()); 7193 7194 // #import <header> 7195 Builder.AddTypedTextChunk("import"); 7196 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7197 Builder.AddTextChunk("<"); 7198 Builder.AddPlaceholderChunk("header"); 7199 Builder.AddTextChunk(">"); 7200 Results.AddResult(Builder.TakeString()); 7201 } 7202 7203 // #include_next "header" 7204 Builder.AddTypedTextChunk("include_next"); 7205 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7206 Builder.AddTextChunk("\""); 7207 Builder.AddPlaceholderChunk("header"); 7208 Builder.AddTextChunk("\""); 7209 Results.AddResult(Builder.TakeString()); 7210 7211 // #include_next <header> 7212 Builder.AddTypedTextChunk("include_next"); 7213 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7214 Builder.AddTextChunk("<"); 7215 Builder.AddPlaceholderChunk("header"); 7216 Builder.AddTextChunk(">"); 7217 Results.AddResult(Builder.TakeString()); 7218 7219 // #warning <message> 7220 Builder.AddTypedTextChunk("warning"); 7221 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7222 Builder.AddPlaceholderChunk("message"); 7223 Results.AddResult(Builder.TakeString()); 7224 7225 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 7226 // completions for them. And __include_macros is a Clang-internal extension 7227 // that we don't want to encourage anyone to use. 7228 7229 // FIXME: we don't support #assert or #unassert, so don't suggest them. 7230 Results.ExitScope(); 7231 7232 HandleCodeCompleteResults(this, CodeCompleter, 7233 CodeCompletionContext::CCC_PreprocessorDirective, 7234 Results.data(), Results.size()); 7235 } 7236 7237 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 7238 CodeCompleteOrdinaryName(S, 7239 S->getFnParent()? Sema::PCC_RecoveryInFunction 7240 : Sema::PCC_Namespace); 7241 } 7242 7243 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 7244 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7245 CodeCompleter->getCodeCompletionTUInfo(), 7246 IsDefinition? CodeCompletionContext::CCC_MacroName 7247 : CodeCompletionContext::CCC_MacroNameUse); 7248 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 7249 // Add just the names of macros, not their arguments. 7250 CodeCompletionBuilder Builder(Results.getAllocator(), 7251 Results.getCodeCompletionTUInfo()); 7252 Results.EnterNewScope(); 7253 for (Preprocessor::macro_iterator M = PP.macro_begin(), 7254 MEnd = PP.macro_end(); 7255 M != MEnd; ++M) { 7256 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 7257 M->first->getName())); 7258 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 7259 CCP_CodePattern, 7260 CXCursor_MacroDefinition)); 7261 } 7262 Results.ExitScope(); 7263 } else if (IsDefinition) { 7264 // FIXME: Can we detect when the user just wrote an include guard above? 7265 } 7266 7267 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7268 Results.data(), Results.size()); 7269 } 7270 7271 void Sema::CodeCompletePreprocessorExpression() { 7272 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7273 CodeCompleter->getCodeCompletionTUInfo(), 7274 CodeCompletionContext::CCC_PreprocessorExpression); 7275 7276 if (!CodeCompleter || CodeCompleter->includeMacros()) 7277 AddMacroResults(PP, Results, true); 7278 7279 // defined (<macro>) 7280 Results.EnterNewScope(); 7281 CodeCompletionBuilder Builder(Results.getAllocator(), 7282 Results.getCodeCompletionTUInfo()); 7283 Builder.AddTypedTextChunk("defined"); 7284 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7285 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7286 Builder.AddPlaceholderChunk("macro"); 7287 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7288 Results.AddResult(Builder.TakeString()); 7289 Results.ExitScope(); 7290 7291 HandleCodeCompleteResults(this, CodeCompleter, 7292 CodeCompletionContext::CCC_PreprocessorExpression, 7293 Results.data(), Results.size()); 7294 } 7295 7296 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 7297 IdentifierInfo *Macro, 7298 MacroInfo *MacroInfo, 7299 unsigned Argument) { 7300 // FIXME: In the future, we could provide "overload" results, much like we 7301 // do for function calls. 7302 7303 // Now just ignore this. There will be another code-completion callback 7304 // for the expanded tokens. 7305 } 7306 7307 void Sema::CodeCompleteNaturalLanguage() { 7308 HandleCodeCompleteResults(this, CodeCompleter, 7309 CodeCompletionContext::CCC_NaturalLanguage, 7310 0, 0); 7311 } 7312 7313 void Sema::GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator, 7314 CodeCompletionTUInfo &CCTUInfo, 7315 SmallVectorImpl<CodeCompletionResult> &Results) { 7316 ResultBuilder Builder(*this, Allocator, CCTUInfo, 7317 CodeCompletionContext::CCC_Recovery); 7318 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 7319 CodeCompletionDeclConsumer Consumer(Builder, 7320 Context.getTranslationUnitDecl()); 7321 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 7322 Consumer); 7323 } 7324 7325 if (!CodeCompleter || CodeCompleter->includeMacros()) 7326 AddMacroResults(PP, Builder, true); 7327 7328 Results.clear(); 7329 Results.insert(Results.end(), 7330 Builder.data(), Builder.data() + Builder.size()); 7331 } 7332