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