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