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