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