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