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