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