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