1 //===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the code-completion semantic actions. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "clang/Sema/SemaInternal.h" 14 #include "clang/AST/DeclObjC.h" 15 #include "clang/AST/ExprCXX.h" 16 #include "clang/AST/ExprObjC.h" 17 #include "clang/Basic/CharInfo.h" 18 #include "clang/Lex/HeaderSearch.h" 19 #include "clang/Lex/MacroInfo.h" 20 #include "clang/Lex/Preprocessor.h" 21 #include "clang/Sema/CodeCompleteConsumer.h" 22 #include "clang/Sema/ExternalSemaSource.h" 23 #include "clang/Sema/Lookup.h" 24 #include "clang/Sema/Overload.h" 25 #include "clang/Sema/Scope.h" 26 #include "clang/Sema/ScopeInfo.h" 27 #include "llvm/ADT/DenseSet.h" 28 #include "llvm/ADT/SmallBitVector.h" 29 #include "llvm/ADT/SmallPtrSet.h" 30 #include "llvm/ADT/SmallString.h" 31 #include "llvm/ADT/StringExtras.h" 32 #include "llvm/ADT/StringSwitch.h" 33 #include "llvm/ADT/Twine.h" 34 #include <list> 35 #include <map> 36 #include <vector> 37 38 using namespace clang; 39 using namespace sema; 40 41 namespace { 42 /// \brief A container of code-completion results. 43 class ResultBuilder { 44 public: 45 /// \brief The type of a name-lookup filter, which can be provided to the 46 /// name-lookup routines to specify which declarations should be included in 47 /// the result set (when it returns true) and which declarations should be 48 /// filtered out (returns false). 49 typedef bool (ResultBuilder::*LookupFilter)(const NamedDecl *) const; 50 51 typedef CodeCompletionResult Result; 52 53 private: 54 /// \brief The actual results we have found. 55 std::vector<Result> Results; 56 57 /// \brief A record of all of the declarations we have found and placed 58 /// into the result set, used to ensure that no declaration ever gets into 59 /// the result set twice. 60 llvm::SmallPtrSet<const Decl*, 16> AllDeclsFound; 61 62 typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair; 63 64 /// \brief An entry in the shadow map, which is optimized to store 65 /// a single (declaration, index) mapping (the common case) but 66 /// can also store a list of (declaration, index) mappings. 67 class ShadowMapEntry { 68 typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector; 69 70 /// \brief Contains either the solitary NamedDecl * or a vector 71 /// of (declaration, index) pairs. 72 llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector*> DeclOrVector; 73 74 /// \brief When the entry contains a single declaration, this is 75 /// the index associated with that entry. 76 unsigned SingleDeclIndex; 77 78 public: 79 ShadowMapEntry() : DeclOrVector(), SingleDeclIndex(0) { } 80 81 void Add(const NamedDecl *ND, unsigned Index) { 82 if (DeclOrVector.isNull()) { 83 // 0 - > 1 elements: just set the single element information. 84 DeclOrVector = ND; 85 SingleDeclIndex = Index; 86 return; 87 } 88 89 if (const NamedDecl *PrevND = 90 DeclOrVector.dyn_cast<const NamedDecl *>()) { 91 // 1 -> 2 elements: create the vector of results and push in the 92 // existing declaration. 93 DeclIndexPairVector *Vec = new DeclIndexPairVector; 94 Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex)); 95 DeclOrVector = Vec; 96 } 97 98 // Add the new element to the end of the vector. 99 DeclOrVector.get<DeclIndexPairVector*>()->push_back( 100 DeclIndexPair(ND, Index)); 101 } 102 103 void Destroy() { 104 if (DeclIndexPairVector *Vec 105 = DeclOrVector.dyn_cast<DeclIndexPairVector *>()) { 106 delete Vec; 107 DeclOrVector = ((NamedDecl *)0); 108 } 109 } 110 111 // Iteration. 112 class iterator; 113 iterator begin() const; 114 iterator end() const; 115 }; 116 117 /// \brief A mapping from declaration names to the declarations that have 118 /// this name within a particular scope and their index within the list of 119 /// results. 120 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap; 121 122 /// \brief The semantic analysis object for which results are being 123 /// produced. 124 Sema &SemaRef; 125 126 /// \brief The allocator used to allocate new code-completion strings. 127 CodeCompletionAllocator &Allocator; 128 129 CodeCompletionTUInfo &CCTUInfo; 130 131 /// \brief If non-NULL, a filter function used to remove any code-completion 132 /// results that are not desirable. 133 LookupFilter Filter; 134 135 /// \brief Whether we should allow declarations as 136 /// nested-name-specifiers that would otherwise be filtered out. 137 bool AllowNestedNameSpecifiers; 138 139 /// \brief If set, the type that we would prefer our resulting value 140 /// declarations to have. 141 /// 142 /// Closely matching the preferred type gives a boost to a result's 143 /// priority. 144 CanQualType PreferredType; 145 146 /// \brief A list of shadow maps, which is used to model name hiding at 147 /// different levels of, e.g., the inheritance hierarchy. 148 std::list<ShadowMap> ShadowMaps; 149 150 /// \brief If we're potentially referring to a C++ member function, the set 151 /// of qualifiers applied to the object type. 152 Qualifiers ObjectTypeQualifiers; 153 154 /// \brief Whether the \p ObjectTypeQualifiers field is active. 155 bool HasObjectTypeQualifiers; 156 157 /// \brief The selector that we prefer. 158 Selector PreferredSelector; 159 160 /// \brief The completion context in which we are gathering results. 161 CodeCompletionContext CompletionContext; 162 163 /// \brief If we are in an instance method definition, the \@implementation 164 /// object. 165 ObjCImplementationDecl *ObjCImplementation; 166 167 void AdjustResultPriorityForDecl(Result &R); 168 169 void MaybeAddConstructorResults(Result R); 170 171 public: 172 explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator, 173 CodeCompletionTUInfo &CCTUInfo, 174 const CodeCompletionContext &CompletionContext, 175 LookupFilter Filter = 0) 176 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo), 177 Filter(Filter), 178 AllowNestedNameSpecifiers(false), HasObjectTypeQualifiers(false), 179 CompletionContext(CompletionContext), 180 ObjCImplementation(0) 181 { 182 // If this is an Objective-C instance method definition, dig out the 183 // corresponding implementation. 184 switch (CompletionContext.getKind()) { 185 case CodeCompletionContext::CCC_Expression: 186 case CodeCompletionContext::CCC_ObjCMessageReceiver: 187 case CodeCompletionContext::CCC_ParenthesizedExpression: 188 case CodeCompletionContext::CCC_Statement: 189 case CodeCompletionContext::CCC_Recovery: 190 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) 191 if (Method->isInstanceMethod()) 192 if (ObjCInterfaceDecl *Interface = Method->getClassInterface()) 193 ObjCImplementation = Interface->getImplementation(); 194 break; 195 196 default: 197 break; 198 } 199 } 200 201 /// \brief Determine the priority for a reference to the given declaration. 202 unsigned getBasePriority(const NamedDecl *D); 203 204 /// \brief Whether we should include code patterns in the completion 205 /// results. 206 bool includeCodePatterns() const { 207 return SemaRef.CodeCompleter && 208 SemaRef.CodeCompleter->includeCodePatterns(); 209 } 210 211 /// \brief Set the filter used for code-completion results. 212 void setFilter(LookupFilter Filter) { 213 this->Filter = Filter; 214 } 215 216 Result *data() { return Results.empty()? 0 : &Results.front(); } 217 unsigned size() const { return Results.size(); } 218 bool empty() const { return Results.empty(); } 219 220 /// \brief Specify the preferred type. 221 void setPreferredType(QualType T) { 222 PreferredType = SemaRef.Context.getCanonicalType(T); 223 } 224 225 /// \brief Set the cv-qualifiers on the object type, for us in filtering 226 /// calls to member functions. 227 /// 228 /// When there are qualifiers in this set, they will be used to filter 229 /// out member functions that aren't available (because there will be a 230 /// cv-qualifier mismatch) or prefer functions with an exact qualifier 231 /// match. 232 void setObjectTypeQualifiers(Qualifiers Quals) { 233 ObjectTypeQualifiers = Quals; 234 HasObjectTypeQualifiers = true; 235 } 236 237 /// \brief Set the preferred selector. 238 /// 239 /// When an Objective-C method declaration result is added, and that 240 /// method's selector matches this preferred selector, we give that method 241 /// a slight priority boost. 242 void setPreferredSelector(Selector Sel) { 243 PreferredSelector = Sel; 244 } 245 246 /// \brief Retrieve the code-completion context for which results are 247 /// being collected. 248 const CodeCompletionContext &getCompletionContext() const { 249 return CompletionContext; 250 } 251 252 /// \brief Specify whether nested-name-specifiers are allowed. 253 void allowNestedNameSpecifiers(bool Allow = true) { 254 AllowNestedNameSpecifiers = Allow; 255 } 256 257 /// \brief Return the semantic analysis object for which we are collecting 258 /// code completion results. 259 Sema &getSema() const { return SemaRef; } 260 261 /// \brief Retrieve the allocator used to allocate code completion strings. 262 CodeCompletionAllocator &getAllocator() const { return Allocator; } 263 264 CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; } 265 266 /// \brief Determine whether the given declaration is at all interesting 267 /// as a code-completion result. 268 /// 269 /// \param ND the declaration that we are inspecting. 270 /// 271 /// \param AsNestedNameSpecifier will be set true if this declaration is 272 /// only interesting when it is a nested-name-specifier. 273 bool isInterestingDecl(const NamedDecl *ND, 274 bool &AsNestedNameSpecifier) const; 275 276 /// \brief Check whether the result is hidden by the Hiding declaration. 277 /// 278 /// \returns true if the result is hidden and cannot be found, false if 279 /// the hidden result could still be found. When false, \p R may be 280 /// modified to describe how the result can be found (e.g., via extra 281 /// qualification). 282 bool CheckHiddenResult(Result &R, DeclContext *CurContext, 283 const NamedDecl *Hiding); 284 285 /// \brief Add a new result to this result set (if it isn't already in one 286 /// of the shadow maps), or replace an existing result (for, e.g., a 287 /// redeclaration). 288 /// 289 /// \param R the result to add (if it is unique). 290 /// 291 /// \param CurContext the context in which this result will be named. 292 void MaybeAddResult(Result R, DeclContext *CurContext = 0); 293 294 /// \brief Add a new result to this result set, where we already know 295 /// the hiding declation (if any). 296 /// 297 /// \param R the result to add (if it is unique). 298 /// 299 /// \param CurContext the context in which this result will be named. 300 /// 301 /// \param Hiding the declaration that hides the result. 302 /// 303 /// \param InBaseClass whether the result was found in a base 304 /// class of the searched context. 305 void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding, 306 bool InBaseClass); 307 308 /// \brief Add a new non-declaration result to this result set. 309 void AddResult(Result R); 310 311 /// \brief Enter into a new scope. 312 void EnterNewScope(); 313 314 /// \brief Exit from the current scope. 315 void ExitScope(); 316 317 /// \brief Ignore this declaration, if it is seen again. 318 void Ignore(const Decl *D) { AllDeclsFound.insert(D->getCanonicalDecl()); } 319 320 /// \name Name lookup predicates 321 /// 322 /// These predicates can be passed to the name lookup functions to filter the 323 /// results of name lookup. All of the predicates have the same type, so that 324 /// 325 //@{ 326 bool IsOrdinaryName(const NamedDecl *ND) const; 327 bool IsOrdinaryNonTypeName(const NamedDecl *ND) const; 328 bool IsIntegralConstantValue(const NamedDecl *ND) const; 329 bool IsOrdinaryNonValueName(const NamedDecl *ND) const; 330 bool IsNestedNameSpecifier(const NamedDecl *ND) const; 331 bool IsEnum(const NamedDecl *ND) const; 332 bool IsClassOrStruct(const NamedDecl *ND) const; 333 bool IsUnion(const NamedDecl *ND) const; 334 bool IsNamespace(const NamedDecl *ND) const; 335 bool IsNamespaceOrAlias(const NamedDecl *ND) const; 336 bool IsType(const NamedDecl *ND) const; 337 bool IsMember(const NamedDecl *ND) const; 338 bool IsObjCIvar(const NamedDecl *ND) const; 339 bool IsObjCMessageReceiver(const NamedDecl *ND) const; 340 bool IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const; 341 bool IsObjCCollection(const NamedDecl *ND) const; 342 bool IsImpossibleToSatisfy(const NamedDecl *ND) const; 343 //@} 344 }; 345 } 346 347 class ResultBuilder::ShadowMapEntry::iterator { 348 llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator; 349 unsigned SingleDeclIndex; 350 351 public: 352 typedef DeclIndexPair value_type; 353 typedef value_type reference; 354 typedef std::ptrdiff_t difference_type; 355 typedef std::input_iterator_tag iterator_category; 356 357 class pointer { 358 DeclIndexPair Value; 359 360 public: 361 pointer(const DeclIndexPair &Value) : Value(Value) { } 362 363 const DeclIndexPair *operator->() const { 364 return &Value; 365 } 366 }; 367 368 iterator() : DeclOrIterator((NamedDecl *)0), SingleDeclIndex(0) { } 369 370 iterator(const NamedDecl *SingleDecl, unsigned Index) 371 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) { } 372 373 iterator(const DeclIndexPair *Iterator) 374 : DeclOrIterator(Iterator), SingleDeclIndex(0) { } 375 376 iterator &operator++() { 377 if (DeclOrIterator.is<const NamedDecl *>()) { 378 DeclOrIterator = (NamedDecl *)0; 379 SingleDeclIndex = 0; 380 return *this; 381 } 382 383 const DeclIndexPair *I = DeclOrIterator.get<const DeclIndexPair*>(); 384 ++I; 385 DeclOrIterator = I; 386 return *this; 387 } 388 389 /*iterator operator++(int) { 390 iterator tmp(*this); 391 ++(*this); 392 return tmp; 393 }*/ 394 395 reference operator*() const { 396 if (const NamedDecl *ND = DeclOrIterator.dyn_cast<const NamedDecl *>()) 397 return reference(ND, SingleDeclIndex); 398 399 return *DeclOrIterator.get<const DeclIndexPair*>(); 400 } 401 402 pointer operator->() const { 403 return pointer(**this); 404 } 405 406 friend bool operator==(const iterator &X, const iterator &Y) { 407 return X.DeclOrIterator.getOpaqueValue() 408 == Y.DeclOrIterator.getOpaqueValue() && 409 X.SingleDeclIndex == Y.SingleDeclIndex; 410 } 411 412 friend bool operator!=(const iterator &X, const iterator &Y) { 413 return !(X == Y); 414 } 415 }; 416 417 ResultBuilder::ShadowMapEntry::iterator 418 ResultBuilder::ShadowMapEntry::begin() const { 419 if (DeclOrVector.isNull()) 420 return iterator(); 421 422 if (const NamedDecl *ND = DeclOrVector.dyn_cast<const NamedDecl *>()) 423 return iterator(ND, SingleDeclIndex); 424 425 return iterator(DeclOrVector.get<DeclIndexPairVector *>()->begin()); 426 } 427 428 ResultBuilder::ShadowMapEntry::iterator 429 ResultBuilder::ShadowMapEntry::end() const { 430 if (DeclOrVector.is<const NamedDecl *>() || DeclOrVector.isNull()) 431 return iterator(); 432 433 return iterator(DeclOrVector.get<DeclIndexPairVector *>()->end()); 434 } 435 436 /// \brief Compute the qualification required to get from the current context 437 /// (\p CurContext) to the target context (\p TargetContext). 438 /// 439 /// \param Context the AST context in which the qualification will be used. 440 /// 441 /// \param CurContext the context where an entity is being named, which is 442 /// typically based on the current scope. 443 /// 444 /// \param TargetContext the context in which the named entity actually 445 /// resides. 446 /// 447 /// \returns a nested name specifier that refers into the target context, or 448 /// NULL if no qualification is needed. 449 static NestedNameSpecifier * 450 getRequiredQualification(ASTContext &Context, 451 const DeclContext *CurContext, 452 const DeclContext *TargetContext) { 453 SmallVector<const DeclContext *, 4> TargetParents; 454 455 for (const DeclContext *CommonAncestor = TargetContext; 456 CommonAncestor && !CommonAncestor->Encloses(CurContext); 457 CommonAncestor = CommonAncestor->getLookupParent()) { 458 if (CommonAncestor->isTransparentContext() || 459 CommonAncestor->isFunctionOrMethod()) 460 continue; 461 462 TargetParents.push_back(CommonAncestor); 463 } 464 465 NestedNameSpecifier *Result = 0; 466 while (!TargetParents.empty()) { 467 const DeclContext *Parent = TargetParents.back(); 468 TargetParents.pop_back(); 469 470 if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) { 471 if (!Namespace->getIdentifier()) 472 continue; 473 474 Result = NestedNameSpecifier::Create(Context, Result, Namespace); 475 } 476 else if (const TagDecl *TD = dyn_cast<TagDecl>(Parent)) 477 Result = NestedNameSpecifier::Create(Context, Result, 478 false, 479 Context.getTypeDeclType(TD).getTypePtr()); 480 } 481 return Result; 482 } 483 484 bool ResultBuilder::isInterestingDecl(const NamedDecl *ND, 485 bool &AsNestedNameSpecifier) const { 486 AsNestedNameSpecifier = false; 487 488 ND = ND->getUnderlyingDecl(); 489 unsigned IDNS = ND->getIdentifierNamespace(); 490 491 // Skip unnamed entities. 492 if (!ND->getDeclName()) 493 return false; 494 495 // Friend declarations and declarations introduced due to friends are never 496 // added as results. 497 if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend)) 498 return false; 499 500 // Class template (partial) specializations are never added as results. 501 if (isa<ClassTemplateSpecializationDecl>(ND) || 502 isa<ClassTemplatePartialSpecializationDecl>(ND)) 503 return false; 504 505 // Using declarations themselves are never added as results. 506 if (isa<UsingDecl>(ND)) 507 return false; 508 509 // Some declarations have reserved names that we don't want to ever show. 510 if (const IdentifierInfo *Id = ND->getIdentifier()) { 511 // __va_list_tag is a freak of nature. Find it and skip it. 512 if (Id->isStr("__va_list_tag") || Id->isStr("__builtin_va_list")) 513 return false; 514 515 // Filter out names reserved for the implementation (C99 7.1.3, 516 // C++ [lib.global.names]) if they come from a system header. 517 // 518 // FIXME: Add predicate for this. 519 if (Id->getLength() >= 2) { 520 const char *Name = Id->getNameStart(); 521 if (Name[0] == '_' && 522 (Name[1] == '_' || (Name[1] >= 'A' && Name[1] <= 'Z')) && 523 (ND->getLocation().isInvalid() || 524 SemaRef.SourceMgr.isInSystemHeader( 525 SemaRef.SourceMgr.getSpellingLoc(ND->getLocation())))) 526 return false; 527 } 528 } 529 530 if (Filter == &ResultBuilder::IsNestedNameSpecifier || 531 ((isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) && 532 Filter != &ResultBuilder::IsNamespace && 533 Filter != &ResultBuilder::IsNamespaceOrAlias && 534 Filter != 0)) 535 AsNestedNameSpecifier = true; 536 537 // Filter out any unwanted results. 538 if (Filter && !(this->*Filter)(ND)) { 539 // Check whether it is interesting as a nested-name-specifier. 540 if (AllowNestedNameSpecifiers && SemaRef.getLangOpts().CPlusPlus && 541 IsNestedNameSpecifier(ND) && 542 (Filter != &ResultBuilder::IsMember || 543 (isa<CXXRecordDecl>(ND) && 544 cast<CXXRecordDecl>(ND)->isInjectedClassName()))) { 545 AsNestedNameSpecifier = true; 546 return true; 547 } 548 549 return false; 550 } 551 // ... then it must be interesting! 552 return true; 553 } 554 555 bool ResultBuilder::CheckHiddenResult(Result &R, DeclContext *CurContext, 556 const NamedDecl *Hiding) { 557 // In C, there is no way to refer to a hidden name. 558 // FIXME: This isn't true; we can find a tag name hidden by an ordinary 559 // name if we introduce the tag type. 560 if (!SemaRef.getLangOpts().CPlusPlus) 561 return true; 562 563 const DeclContext *HiddenCtx = 564 R.Declaration->getDeclContext()->getRedeclContext(); 565 566 // There is no way to qualify a name declared in a function or method. 567 if (HiddenCtx->isFunctionOrMethod()) 568 return true; 569 570 if (HiddenCtx == Hiding->getDeclContext()->getRedeclContext()) 571 return true; 572 573 // We can refer to the result with the appropriate qualification. Do it. 574 R.Hidden = true; 575 R.QualifierIsInformative = false; 576 577 if (!R.Qualifier) 578 R.Qualifier = getRequiredQualification(SemaRef.Context, 579 CurContext, 580 R.Declaration->getDeclContext()); 581 return false; 582 } 583 584 /// \brief A simplified classification of types used to determine whether two 585 /// types are "similar enough" when adjusting priorities. 586 SimplifiedTypeClass clang::getSimplifiedTypeClass(CanQualType T) { 587 switch (T->getTypeClass()) { 588 case Type::Builtin: 589 switch (cast<BuiltinType>(T)->getKind()) { 590 case BuiltinType::Void: 591 return STC_Void; 592 593 case BuiltinType::NullPtr: 594 return STC_Pointer; 595 596 case BuiltinType::Overload: 597 case BuiltinType::Dependent: 598 return STC_Other; 599 600 case BuiltinType::ObjCId: 601 case BuiltinType::ObjCClass: 602 case BuiltinType::ObjCSel: 603 return STC_ObjectiveC; 604 605 default: 606 return STC_Arithmetic; 607 } 608 609 case Type::Complex: 610 return STC_Arithmetic; 611 612 case Type::Pointer: 613 return STC_Pointer; 614 615 case Type::BlockPointer: 616 return STC_Block; 617 618 case Type::LValueReference: 619 case Type::RValueReference: 620 return getSimplifiedTypeClass(T->getAs<ReferenceType>()->getPointeeType()); 621 622 case Type::ConstantArray: 623 case Type::IncompleteArray: 624 case Type::VariableArray: 625 case Type::DependentSizedArray: 626 return STC_Array; 627 628 case Type::DependentSizedExtVector: 629 case Type::Vector: 630 case Type::ExtVector: 631 return STC_Arithmetic; 632 633 case Type::FunctionProto: 634 case Type::FunctionNoProto: 635 return STC_Function; 636 637 case Type::Record: 638 return STC_Record; 639 640 case Type::Enum: 641 return STC_Arithmetic; 642 643 case Type::ObjCObject: 644 case Type::ObjCInterface: 645 case Type::ObjCObjectPointer: 646 return STC_ObjectiveC; 647 648 default: 649 return STC_Other; 650 } 651 } 652 653 /// \brief Get the type that a given expression will have if this declaration 654 /// is used as an expression in its "typical" code-completion form. 655 QualType clang::getDeclUsageType(ASTContext &C, const NamedDecl *ND) { 656 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 657 658 if (const TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 659 return C.getTypeDeclType(Type); 660 if (const ObjCInterfaceDecl *Iface = dyn_cast<ObjCInterfaceDecl>(ND)) 661 return C.getObjCInterfaceType(Iface); 662 663 QualType T; 664 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 665 T = Function->getCallResultType(); 666 else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 667 T = Method->getSendResultType(); 668 else if (const FunctionTemplateDecl *FunTmpl = 669 dyn_cast<FunctionTemplateDecl>(ND)) 670 T = FunTmpl->getTemplatedDecl()->getCallResultType(); 671 else if (const EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 672 T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); 673 else if (const ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 674 T = Property->getType(); 675 else if (const ValueDecl *Value = dyn_cast<ValueDecl>(ND)) 676 T = Value->getType(); 677 else 678 return QualType(); 679 680 // Dig through references, function pointers, and block pointers to 681 // get down to the likely type of an expression when the entity is 682 // used. 683 do { 684 if (const ReferenceType *Ref = T->getAs<ReferenceType>()) { 685 T = Ref->getPointeeType(); 686 continue; 687 } 688 689 if (const PointerType *Pointer = T->getAs<PointerType>()) { 690 if (Pointer->getPointeeType()->isFunctionType()) { 691 T = Pointer->getPointeeType(); 692 continue; 693 } 694 695 break; 696 } 697 698 if (const BlockPointerType *Block = T->getAs<BlockPointerType>()) { 699 T = Block->getPointeeType(); 700 continue; 701 } 702 703 if (const FunctionType *Function = T->getAs<FunctionType>()) { 704 T = Function->getResultType(); 705 continue; 706 } 707 708 break; 709 } while (true); 710 711 return T; 712 } 713 714 unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) { 715 if (!ND) 716 return CCP_Unlikely; 717 718 // Context-based decisions. 719 const DeclContext *DC = ND->getDeclContext()->getRedeclContext(); 720 if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) { 721 // _cmd is relatively rare 722 if (const ImplicitParamDecl *ImplicitParam = 723 dyn_cast<ImplicitParamDecl>(ND)) 724 if (ImplicitParam->getIdentifier() && 725 ImplicitParam->getIdentifier()->isStr("_cmd")) 726 return CCP_ObjC_cmd; 727 728 return CCP_LocalDeclaration; 729 } 730 if (DC->isRecord() || isa<ObjCContainerDecl>(DC)) 731 return CCP_MemberDeclaration; 732 733 // Content-based decisions. 734 if (isa<EnumConstantDecl>(ND)) 735 return CCP_Constant; 736 737 // Use CCP_Type for type declarations unless we're in a statement, Objective-C 738 // message receiver, or parenthesized expression context. There, it's as 739 // likely that the user will want to write a type as other declarations. 740 if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) && 741 !(CompletionContext.getKind() == CodeCompletionContext::CCC_Statement || 742 CompletionContext.getKind() 743 == CodeCompletionContext::CCC_ObjCMessageReceiver || 744 CompletionContext.getKind() 745 == CodeCompletionContext::CCC_ParenthesizedExpression)) 746 return CCP_Type; 747 748 return CCP_Declaration; 749 } 750 751 void ResultBuilder::AdjustResultPriorityForDecl(Result &R) { 752 // If this is an Objective-C method declaration whose selector matches our 753 // preferred selector, give it a priority boost. 754 if (!PreferredSelector.isNull()) 755 if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(R.Declaration)) 756 if (PreferredSelector == Method->getSelector()) 757 R.Priority += CCD_SelectorMatch; 758 759 // If we have a preferred type, adjust the priority for results with exactly- 760 // matching or nearly-matching types. 761 if (!PreferredType.isNull()) { 762 QualType T = getDeclUsageType(SemaRef.Context, R.Declaration); 763 if (!T.isNull()) { 764 CanQualType TC = SemaRef.Context.getCanonicalType(T); 765 // Check for exactly-matching types (modulo qualifiers). 766 if (SemaRef.Context.hasSameUnqualifiedType(PreferredType, TC)) 767 R.Priority /= CCF_ExactTypeMatch; 768 // Check for nearly-matching types, based on classification of each. 769 else if ((getSimplifiedTypeClass(PreferredType) 770 == getSimplifiedTypeClass(TC)) && 771 !(PreferredType->isEnumeralType() && TC->isEnumeralType())) 772 R.Priority /= CCF_SimilarTypeMatch; 773 } 774 } 775 } 776 777 void ResultBuilder::MaybeAddConstructorResults(Result R) { 778 if (!SemaRef.getLangOpts().CPlusPlus || !R.Declaration || 779 !CompletionContext.wantConstructorResults()) 780 return; 781 782 ASTContext &Context = SemaRef.Context; 783 const NamedDecl *D = R.Declaration; 784 const CXXRecordDecl *Record = 0; 785 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) 786 Record = ClassTemplate->getTemplatedDecl(); 787 else if ((Record = dyn_cast<CXXRecordDecl>(D))) { 788 // Skip specializations and partial specializations. 789 if (isa<ClassTemplateSpecializationDecl>(Record)) 790 return; 791 } else { 792 // There are no constructors here. 793 return; 794 } 795 796 Record = Record->getDefinition(); 797 if (!Record) 798 return; 799 800 801 QualType RecordTy = Context.getTypeDeclType(Record); 802 DeclarationName ConstructorName 803 = Context.DeclarationNames.getCXXConstructorName( 804 Context.getCanonicalType(RecordTy)); 805 DeclContext::lookup_const_result Ctors = Record->lookup(ConstructorName); 806 for (DeclContext::lookup_const_iterator I = Ctors.begin(), 807 E = Ctors.end(); 808 I != E; ++I) { 809 R.Declaration = *I; 810 R.CursorKind = getCursorKindForDecl(R.Declaration); 811 Results.push_back(R); 812 } 813 } 814 815 void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { 816 assert(!ShadowMaps.empty() && "Must enter into a results scope"); 817 818 if (R.Kind != Result::RK_Declaration) { 819 // For non-declaration results, just add the result. 820 Results.push_back(R); 821 return; 822 } 823 824 // Look through using declarations. 825 if (const UsingShadowDecl *Using = 826 dyn_cast<UsingShadowDecl>(R.Declaration)) { 827 MaybeAddResult(Result(Using->getTargetDecl(), 828 getBasePriority(Using->getTargetDecl()), 829 R.Qualifier), 830 CurContext); 831 return; 832 } 833 834 const Decl *CanonDecl = R.Declaration->getCanonicalDecl(); 835 unsigned IDNS = CanonDecl->getIdentifierNamespace(); 836 837 bool AsNestedNameSpecifier = false; 838 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 839 return; 840 841 // C++ constructors are never found by name lookup. 842 if (isa<CXXConstructorDecl>(R.Declaration)) 843 return; 844 845 ShadowMap &SMap = ShadowMaps.back(); 846 ShadowMapEntry::iterator I, IEnd; 847 ShadowMap::iterator NamePos = SMap.find(R.Declaration->getDeclName()); 848 if (NamePos != SMap.end()) { 849 I = NamePos->second.begin(); 850 IEnd = NamePos->second.end(); 851 } 852 853 for (; I != IEnd; ++I) { 854 const NamedDecl *ND = I->first; 855 unsigned Index = I->second; 856 if (ND->getCanonicalDecl() == CanonDecl) { 857 // This is a redeclaration. Always pick the newer declaration. 858 Results[Index].Declaration = R.Declaration; 859 860 // We're done. 861 return; 862 } 863 } 864 865 // This is a new declaration in this scope. However, check whether this 866 // declaration name is hidden by a similarly-named declaration in an outer 867 // scope. 868 std::list<ShadowMap>::iterator SM, SMEnd = ShadowMaps.end(); 869 --SMEnd; 870 for (SM = ShadowMaps.begin(); SM != SMEnd; ++SM) { 871 ShadowMapEntry::iterator I, IEnd; 872 ShadowMap::iterator NamePos = SM->find(R.Declaration->getDeclName()); 873 if (NamePos != SM->end()) { 874 I = NamePos->second.begin(); 875 IEnd = NamePos->second.end(); 876 } 877 for (; I != IEnd; ++I) { 878 // A tag declaration does not hide a non-tag declaration. 879 if (I->first->hasTagIdentifierNamespace() && 880 (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | 881 Decl::IDNS_ObjCProtocol))) 882 continue; 883 884 // Protocols are in distinct namespaces from everything else. 885 if (((I->first->getIdentifierNamespace() & Decl::IDNS_ObjCProtocol) 886 || (IDNS & Decl::IDNS_ObjCProtocol)) && 887 I->first->getIdentifierNamespace() != IDNS) 888 continue; 889 890 // The newly-added result is hidden by an entry in the shadow map. 891 if (CheckHiddenResult(R, CurContext, I->first)) 892 return; 893 894 break; 895 } 896 } 897 898 // Make sure that any given declaration only shows up in the result set once. 899 if (!AllDeclsFound.insert(CanonDecl)) 900 return; 901 902 // If the filter is for nested-name-specifiers, then this result starts a 903 // nested-name-specifier. 904 if (AsNestedNameSpecifier) { 905 R.StartsNestedNameSpecifier = true; 906 R.Priority = CCP_NestedNameSpecifier; 907 } else 908 AdjustResultPriorityForDecl(R); 909 910 // If this result is supposed to have an informative qualifier, add one. 911 if (R.QualifierIsInformative && !R.Qualifier && 912 !R.StartsNestedNameSpecifier) { 913 const DeclContext *Ctx = R.Declaration->getDeclContext(); 914 if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 915 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 916 else if (const TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 917 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 918 SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 919 else 920 R.QualifierIsInformative = false; 921 } 922 923 // Insert this result into the set of results and into the current shadow 924 // map. 925 SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size()); 926 Results.push_back(R); 927 928 if (!AsNestedNameSpecifier) 929 MaybeAddConstructorResults(R); 930 } 931 932 void ResultBuilder::AddResult(Result R, DeclContext *CurContext, 933 NamedDecl *Hiding, bool InBaseClass = false) { 934 if (R.Kind != Result::RK_Declaration) { 935 // For non-declaration results, just add the result. 936 Results.push_back(R); 937 return; 938 } 939 940 // Look through using declarations. 941 if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) { 942 AddResult(Result(Using->getTargetDecl(), 943 getBasePriority(Using->getTargetDecl()), 944 R.Qualifier), 945 CurContext, Hiding); 946 return; 947 } 948 949 bool AsNestedNameSpecifier = false; 950 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier)) 951 return; 952 953 // C++ constructors are never found by name lookup. 954 if (isa<CXXConstructorDecl>(R.Declaration)) 955 return; 956 957 if (Hiding && CheckHiddenResult(R, CurContext, Hiding)) 958 return; 959 960 // Make sure that any given declaration only shows up in the result set once. 961 if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl())) 962 return; 963 964 // If the filter is for nested-name-specifiers, then this result starts a 965 // nested-name-specifier. 966 if (AsNestedNameSpecifier) { 967 R.StartsNestedNameSpecifier = true; 968 R.Priority = CCP_NestedNameSpecifier; 969 } 970 else if (Filter == &ResultBuilder::IsMember && !R.Qualifier && InBaseClass && 971 isa<CXXRecordDecl>(R.Declaration->getDeclContext() 972 ->getRedeclContext())) 973 R.QualifierIsInformative = true; 974 975 // If this result is supposed to have an informative qualifier, add one. 976 if (R.QualifierIsInformative && !R.Qualifier && 977 !R.StartsNestedNameSpecifier) { 978 const DeclContext *Ctx = R.Declaration->getDeclContext(); 979 if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx)) 980 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, Namespace); 981 else if (const TagDecl *Tag = dyn_cast<TagDecl>(Ctx)) 982 R.Qualifier = NestedNameSpecifier::Create(SemaRef.Context, 0, false, 983 SemaRef.Context.getTypeDeclType(Tag).getTypePtr()); 984 else 985 R.QualifierIsInformative = false; 986 } 987 988 // Adjust the priority if this result comes from a base class. 989 if (InBaseClass) 990 R.Priority += CCD_InBaseClass; 991 992 AdjustResultPriorityForDecl(R); 993 994 if (HasObjectTypeQualifiers) 995 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) 996 if (Method->isInstance()) { 997 Qualifiers MethodQuals 998 = Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 999 if (ObjectTypeQualifiers == MethodQuals) 1000 R.Priority += CCD_ObjectQualifierMatch; 1001 else if (ObjectTypeQualifiers - MethodQuals) { 1002 // The method cannot be invoked, because doing so would drop 1003 // qualifiers. 1004 return; 1005 } 1006 } 1007 1008 // Insert this result into the set of results. 1009 Results.push_back(R); 1010 1011 if (!AsNestedNameSpecifier) 1012 MaybeAddConstructorResults(R); 1013 } 1014 1015 void ResultBuilder::AddResult(Result R) { 1016 assert(R.Kind != Result::RK_Declaration && 1017 "Declaration results need more context"); 1018 Results.push_back(R); 1019 } 1020 1021 /// \brief Enter into a new scope. 1022 void ResultBuilder::EnterNewScope() { 1023 ShadowMaps.push_back(ShadowMap()); 1024 } 1025 1026 /// \brief Exit from the current scope. 1027 void ResultBuilder::ExitScope() { 1028 for (ShadowMap::iterator E = ShadowMaps.back().begin(), 1029 EEnd = ShadowMaps.back().end(); 1030 E != EEnd; 1031 ++E) 1032 E->second.Destroy(); 1033 1034 ShadowMaps.pop_back(); 1035 } 1036 1037 /// \brief Determines whether this given declaration will be found by 1038 /// ordinary name lookup. 1039 bool ResultBuilder::IsOrdinaryName(const NamedDecl *ND) const { 1040 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 1041 1042 unsigned IDNS = Decl::IDNS_Ordinary; 1043 if (SemaRef.getLangOpts().CPlusPlus) 1044 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1045 else if (SemaRef.getLangOpts().ObjC1) { 1046 if (isa<ObjCIvarDecl>(ND)) 1047 return true; 1048 } 1049 1050 return ND->getIdentifierNamespace() & IDNS; 1051 } 1052 1053 /// \brief Determines whether this given declaration will be found by 1054 /// ordinary name lookup but is not a type name. 1055 bool ResultBuilder::IsOrdinaryNonTypeName(const NamedDecl *ND) const { 1056 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 1057 if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) 1058 return false; 1059 1060 unsigned IDNS = Decl::IDNS_Ordinary; 1061 if (SemaRef.getLangOpts().CPlusPlus) 1062 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member; 1063 else if (SemaRef.getLangOpts().ObjC1) { 1064 if (isa<ObjCIvarDecl>(ND)) 1065 return true; 1066 } 1067 1068 return ND->getIdentifierNamespace() & IDNS; 1069 } 1070 1071 bool ResultBuilder::IsIntegralConstantValue(const NamedDecl *ND) const { 1072 if (!IsOrdinaryNonTypeName(ND)) 1073 return 0; 1074 1075 if (const ValueDecl *VD = dyn_cast<ValueDecl>(ND->getUnderlyingDecl())) 1076 if (VD->getType()->isIntegralOrEnumerationType()) 1077 return true; 1078 1079 return false; 1080 } 1081 1082 /// \brief Determines whether this given declaration will be found by 1083 /// ordinary name lookup. 1084 bool ResultBuilder::IsOrdinaryNonValueName(const NamedDecl *ND) const { 1085 ND = cast<NamedDecl>(ND->getUnderlyingDecl()); 1086 1087 unsigned IDNS = Decl::IDNS_Ordinary; 1088 if (SemaRef.getLangOpts().CPlusPlus) 1089 IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; 1090 1091 return (ND->getIdentifierNamespace() & IDNS) && 1092 !isa<ValueDecl>(ND) && !isa<FunctionTemplateDecl>(ND) && 1093 !isa<ObjCPropertyDecl>(ND); 1094 } 1095 1096 /// \brief Determines whether the given declaration is suitable as the 1097 /// start of a C++ nested-name-specifier, e.g., a class or namespace. 1098 bool ResultBuilder::IsNestedNameSpecifier(const NamedDecl *ND) const { 1099 // Allow us to find class templates, too. 1100 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1101 ND = ClassTemplate->getTemplatedDecl(); 1102 1103 return SemaRef.isAcceptableNestedNameSpecifier(ND); 1104 } 1105 1106 /// \brief Determines whether the given declaration is an enumeration. 1107 bool ResultBuilder::IsEnum(const NamedDecl *ND) const { 1108 return isa<EnumDecl>(ND); 1109 } 1110 1111 /// \brief Determines whether the given declaration is a class or struct. 1112 bool ResultBuilder::IsClassOrStruct(const NamedDecl *ND) const { 1113 // Allow us to find class templates, too. 1114 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1115 ND = ClassTemplate->getTemplatedDecl(); 1116 1117 // For purposes of this check, interfaces match too. 1118 if (const RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1119 return RD->getTagKind() == TTK_Class || 1120 RD->getTagKind() == TTK_Struct || 1121 RD->getTagKind() == TTK_Interface; 1122 1123 return false; 1124 } 1125 1126 /// \brief Determines whether the given declaration is a union. 1127 bool ResultBuilder::IsUnion(const NamedDecl *ND) const { 1128 // Allow us to find class templates, too. 1129 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND)) 1130 ND = ClassTemplate->getTemplatedDecl(); 1131 1132 if (const RecordDecl *RD = dyn_cast<RecordDecl>(ND)) 1133 return RD->getTagKind() == TTK_Union; 1134 1135 return false; 1136 } 1137 1138 /// \brief Determines whether the given declaration is a namespace. 1139 bool ResultBuilder::IsNamespace(const NamedDecl *ND) const { 1140 return isa<NamespaceDecl>(ND); 1141 } 1142 1143 /// \brief Determines whether the given declaration is a namespace or 1144 /// namespace alias. 1145 bool ResultBuilder::IsNamespaceOrAlias(const NamedDecl *ND) const { 1146 return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND); 1147 } 1148 1149 /// \brief Determines whether the given declaration is a type. 1150 bool ResultBuilder::IsType(const NamedDecl *ND) const { 1151 if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1152 ND = Using->getTargetDecl(); 1153 1154 return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); 1155 } 1156 1157 /// \brief Determines which members of a class should be visible via 1158 /// "." or "->". Only value declarations, nested name specifiers, and 1159 /// using declarations thereof should show up. 1160 bool ResultBuilder::IsMember(const NamedDecl *ND) const { 1161 if (const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(ND)) 1162 ND = Using->getTargetDecl(); 1163 1164 return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) || 1165 isa<ObjCPropertyDecl>(ND); 1166 } 1167 1168 static bool isObjCReceiverType(ASTContext &C, QualType T) { 1169 T = C.getCanonicalType(T); 1170 switch (T->getTypeClass()) { 1171 case Type::ObjCObject: 1172 case Type::ObjCInterface: 1173 case Type::ObjCObjectPointer: 1174 return true; 1175 1176 case Type::Builtin: 1177 switch (cast<BuiltinType>(T)->getKind()) { 1178 case BuiltinType::ObjCId: 1179 case BuiltinType::ObjCClass: 1180 case BuiltinType::ObjCSel: 1181 return true; 1182 1183 default: 1184 break; 1185 } 1186 return false; 1187 1188 default: 1189 break; 1190 } 1191 1192 if (!C.getLangOpts().CPlusPlus) 1193 return false; 1194 1195 // FIXME: We could perform more analysis here to determine whether a 1196 // particular class type has any conversions to Objective-C types. For now, 1197 // just accept all class types. 1198 return T->isDependentType() || T->isRecordType(); 1199 } 1200 1201 bool ResultBuilder::IsObjCMessageReceiver(const NamedDecl *ND) const { 1202 QualType T = getDeclUsageType(SemaRef.Context, ND); 1203 if (T.isNull()) 1204 return false; 1205 1206 T = SemaRef.Context.getBaseElementType(T); 1207 return isObjCReceiverType(SemaRef.Context, T); 1208 } 1209 1210 bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(const NamedDecl *ND) const { 1211 if (IsObjCMessageReceiver(ND)) 1212 return true; 1213 1214 const VarDecl *Var = dyn_cast<VarDecl>(ND); 1215 if (!Var) 1216 return false; 1217 1218 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>(); 1219 } 1220 1221 bool ResultBuilder::IsObjCCollection(const NamedDecl *ND) const { 1222 if ((SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) || 1223 (!SemaRef.getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND))) 1224 return false; 1225 1226 QualType T = getDeclUsageType(SemaRef.Context, ND); 1227 if (T.isNull()) 1228 return false; 1229 1230 T = SemaRef.Context.getBaseElementType(T); 1231 return T->isObjCObjectType() || T->isObjCObjectPointerType() || 1232 T->isObjCIdType() || 1233 (SemaRef.getLangOpts().CPlusPlus && T->isRecordType()); 1234 } 1235 1236 bool ResultBuilder::IsImpossibleToSatisfy(const NamedDecl *ND) const { 1237 return false; 1238 } 1239 1240 /// \brief Determines whether the given declaration is an Objective-C 1241 /// instance variable. 1242 bool ResultBuilder::IsObjCIvar(const NamedDecl *ND) const { 1243 return isa<ObjCIvarDecl>(ND); 1244 } 1245 1246 namespace { 1247 /// \brief Visible declaration consumer that adds a code-completion result 1248 /// for each visible declaration. 1249 class CodeCompletionDeclConsumer : public VisibleDeclConsumer { 1250 ResultBuilder &Results; 1251 DeclContext *CurContext; 1252 1253 public: 1254 CodeCompletionDeclConsumer(ResultBuilder &Results, DeclContext *CurContext) 1255 : Results(Results), CurContext(CurContext) { } 1256 1257 virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, 1258 bool InBaseClass) { 1259 bool Accessible = true; 1260 if (Ctx) 1261 Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); 1262 1263 ResultBuilder::Result Result(ND, Results.getBasePriority(ND), 0, false, 1264 Accessible); 1265 Results.AddResult(Result, CurContext, Hiding, InBaseClass); 1266 } 1267 }; 1268 } 1269 1270 /// \brief Add type specifiers for the current language as keyword results. 1271 static void AddTypeSpecifierResults(const LangOptions &LangOpts, 1272 ResultBuilder &Results) { 1273 typedef CodeCompletionResult Result; 1274 Results.AddResult(Result("short", CCP_Type)); 1275 Results.AddResult(Result("long", CCP_Type)); 1276 Results.AddResult(Result("signed", CCP_Type)); 1277 Results.AddResult(Result("unsigned", CCP_Type)); 1278 Results.AddResult(Result("void", CCP_Type)); 1279 Results.AddResult(Result("char", CCP_Type)); 1280 Results.AddResult(Result("int", CCP_Type)); 1281 Results.AddResult(Result("float", CCP_Type)); 1282 Results.AddResult(Result("double", CCP_Type)); 1283 Results.AddResult(Result("enum", CCP_Type)); 1284 Results.AddResult(Result("struct", CCP_Type)); 1285 Results.AddResult(Result("union", CCP_Type)); 1286 Results.AddResult(Result("const", CCP_Type)); 1287 Results.AddResult(Result("volatile", CCP_Type)); 1288 1289 if (LangOpts.C99) { 1290 // C99-specific 1291 Results.AddResult(Result("_Complex", CCP_Type)); 1292 Results.AddResult(Result("_Imaginary", CCP_Type)); 1293 Results.AddResult(Result("_Bool", CCP_Type)); 1294 Results.AddResult(Result("restrict", CCP_Type)); 1295 } 1296 1297 CodeCompletionBuilder Builder(Results.getAllocator(), 1298 Results.getCodeCompletionTUInfo()); 1299 if (LangOpts.CPlusPlus) { 1300 // C++-specific 1301 Results.AddResult(Result("bool", CCP_Type + 1302 (LangOpts.ObjC1? CCD_bool_in_ObjC : 0))); 1303 Results.AddResult(Result("class", CCP_Type)); 1304 Results.AddResult(Result("wchar_t", CCP_Type)); 1305 1306 // typename qualified-id 1307 Builder.AddTypedTextChunk("typename"); 1308 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1309 Builder.AddPlaceholderChunk("qualifier"); 1310 Builder.AddTextChunk("::"); 1311 Builder.AddPlaceholderChunk("name"); 1312 Results.AddResult(Result(Builder.TakeString())); 1313 1314 if (LangOpts.CPlusPlus11) { 1315 Results.AddResult(Result("auto", CCP_Type)); 1316 Results.AddResult(Result("char16_t", CCP_Type)); 1317 Results.AddResult(Result("char32_t", CCP_Type)); 1318 1319 Builder.AddTypedTextChunk("decltype"); 1320 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1321 Builder.AddPlaceholderChunk("expression"); 1322 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1323 Results.AddResult(Result(Builder.TakeString())); 1324 } 1325 } 1326 1327 // GNU extensions 1328 if (LangOpts.GNUMode) { 1329 // FIXME: Enable when we actually support decimal floating point. 1330 // Results.AddResult(Result("_Decimal32")); 1331 // Results.AddResult(Result("_Decimal64")); 1332 // Results.AddResult(Result("_Decimal128")); 1333 1334 Builder.AddTypedTextChunk("typeof"); 1335 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1336 Builder.AddPlaceholderChunk("expression"); 1337 Results.AddResult(Result(Builder.TakeString())); 1338 1339 Builder.AddTypedTextChunk("typeof"); 1340 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1341 Builder.AddPlaceholderChunk("type"); 1342 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1343 Results.AddResult(Result(Builder.TakeString())); 1344 } 1345 } 1346 1347 static void AddStorageSpecifiers(Sema::ParserCompletionContext CCC, 1348 const LangOptions &LangOpts, 1349 ResultBuilder &Results) { 1350 typedef CodeCompletionResult Result; 1351 // Note: we don't suggest either "auto" or "register", because both 1352 // are pointless as storage specifiers. Elsewhere, we suggest "auto" 1353 // in C++0x as a type specifier. 1354 Results.AddResult(Result("extern")); 1355 Results.AddResult(Result("static")); 1356 } 1357 1358 static void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, 1359 const LangOptions &LangOpts, 1360 ResultBuilder &Results) { 1361 typedef CodeCompletionResult Result; 1362 switch (CCC) { 1363 case Sema::PCC_Class: 1364 case Sema::PCC_MemberTemplate: 1365 if (LangOpts.CPlusPlus) { 1366 Results.AddResult(Result("explicit")); 1367 Results.AddResult(Result("friend")); 1368 Results.AddResult(Result("mutable")); 1369 Results.AddResult(Result("virtual")); 1370 } 1371 // Fall through 1372 1373 case Sema::PCC_ObjCInterface: 1374 case Sema::PCC_ObjCImplementation: 1375 case Sema::PCC_Namespace: 1376 case Sema::PCC_Template: 1377 if (LangOpts.CPlusPlus || LangOpts.C99) 1378 Results.AddResult(Result("inline")); 1379 break; 1380 1381 case Sema::PCC_ObjCInstanceVariableList: 1382 case Sema::PCC_Expression: 1383 case Sema::PCC_Statement: 1384 case Sema::PCC_ForInit: 1385 case Sema::PCC_Condition: 1386 case Sema::PCC_RecoveryInFunction: 1387 case Sema::PCC_Type: 1388 case Sema::PCC_ParenthesizedExpression: 1389 case Sema::PCC_LocalDeclarationSpecifiers: 1390 break; 1391 } 1392 } 1393 1394 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt); 1395 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt); 1396 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 1397 ResultBuilder &Results, 1398 bool NeedAt); 1399 static void AddObjCImplementationResults(const LangOptions &LangOpts, 1400 ResultBuilder &Results, 1401 bool NeedAt); 1402 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 1403 ResultBuilder &Results, 1404 bool NeedAt); 1405 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt); 1406 1407 static void AddTypedefResult(ResultBuilder &Results) { 1408 CodeCompletionBuilder Builder(Results.getAllocator(), 1409 Results.getCodeCompletionTUInfo()); 1410 Builder.AddTypedTextChunk("typedef"); 1411 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1412 Builder.AddPlaceholderChunk("type"); 1413 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1414 Builder.AddPlaceholderChunk("name"); 1415 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1416 } 1417 1418 static bool WantTypesInContext(Sema::ParserCompletionContext CCC, 1419 const LangOptions &LangOpts) { 1420 switch (CCC) { 1421 case Sema::PCC_Namespace: 1422 case Sema::PCC_Class: 1423 case Sema::PCC_ObjCInstanceVariableList: 1424 case Sema::PCC_Template: 1425 case Sema::PCC_MemberTemplate: 1426 case Sema::PCC_Statement: 1427 case Sema::PCC_RecoveryInFunction: 1428 case Sema::PCC_Type: 1429 case Sema::PCC_ParenthesizedExpression: 1430 case Sema::PCC_LocalDeclarationSpecifiers: 1431 return true; 1432 1433 case Sema::PCC_Expression: 1434 case Sema::PCC_Condition: 1435 return LangOpts.CPlusPlus; 1436 1437 case Sema::PCC_ObjCInterface: 1438 case Sema::PCC_ObjCImplementation: 1439 return false; 1440 1441 case Sema::PCC_ForInit: 1442 return LangOpts.CPlusPlus || LangOpts.ObjC1 || LangOpts.C99; 1443 } 1444 1445 llvm_unreachable("Invalid ParserCompletionContext!"); 1446 } 1447 1448 static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context, 1449 const Preprocessor &PP) { 1450 PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP); 1451 Policy.AnonymousTagLocations = false; 1452 Policy.SuppressStrongLifetime = true; 1453 Policy.SuppressUnwrittenScope = true; 1454 return Policy; 1455 } 1456 1457 /// \brief Retrieve a printing policy suitable for code completion. 1458 static PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1459 return getCompletionPrintingPolicy(S.Context, S.PP); 1460 } 1461 1462 /// \brief Retrieve the string representation of the given type as a string 1463 /// that has the appropriate lifetime for code completion. 1464 /// 1465 /// This routine provides a fast path where we provide constant strings for 1466 /// common type names. 1467 static const char *GetCompletionTypeString(QualType T, 1468 ASTContext &Context, 1469 const PrintingPolicy &Policy, 1470 CodeCompletionAllocator &Allocator) { 1471 if (!T.getLocalQualifiers()) { 1472 // Built-in type names are constant strings. 1473 if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 1474 return BT->getNameAsCString(Policy); 1475 1476 // Anonymous tag types are constant strings. 1477 if (const TagType *TagT = dyn_cast<TagType>(T)) 1478 if (TagDecl *Tag = TagT->getDecl()) 1479 if (!Tag->hasNameForLinkage()) { 1480 switch (Tag->getTagKind()) { 1481 case TTK_Struct: return "struct <anonymous>"; 1482 case TTK_Interface: return "__interface <anonymous>"; 1483 case TTK_Class: return "class <anonymous>"; 1484 case TTK_Union: return "union <anonymous>"; 1485 case TTK_Enum: return "enum <anonymous>"; 1486 } 1487 } 1488 } 1489 1490 // Slow path: format the type as a string. 1491 std::string Result; 1492 T.getAsStringInternal(Result, Policy); 1493 return Allocator.CopyString(Result); 1494 } 1495 1496 /// \brief Add a completion for "this", if we're in a member function. 1497 static void addThisCompletion(Sema &S, ResultBuilder &Results) { 1498 QualType ThisTy = S.getCurrentThisType(); 1499 if (ThisTy.isNull()) 1500 return; 1501 1502 CodeCompletionAllocator &Allocator = Results.getAllocator(); 1503 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 1504 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 1505 Builder.AddResultTypeChunk(GetCompletionTypeString(ThisTy, 1506 S.Context, 1507 Policy, 1508 Allocator)); 1509 Builder.AddTypedTextChunk("this"); 1510 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1511 } 1512 1513 /// \brief Add language constructs that show up for "ordinary" names. 1514 static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, 1515 Scope *S, 1516 Sema &SemaRef, 1517 ResultBuilder &Results) { 1518 CodeCompletionAllocator &Allocator = Results.getAllocator(); 1519 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 1520 PrintingPolicy Policy = getCompletionPrintingPolicy(SemaRef); 1521 1522 typedef CodeCompletionResult Result; 1523 switch (CCC) { 1524 case Sema::PCC_Namespace: 1525 if (SemaRef.getLangOpts().CPlusPlus) { 1526 if (Results.includeCodePatterns()) { 1527 // namespace <identifier> { declarations } 1528 Builder.AddTypedTextChunk("namespace"); 1529 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1530 Builder.AddPlaceholderChunk("identifier"); 1531 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1532 Builder.AddPlaceholderChunk("declarations"); 1533 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1534 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1535 Results.AddResult(Result(Builder.TakeString())); 1536 } 1537 1538 // namespace identifier = identifier ; 1539 Builder.AddTypedTextChunk("namespace"); 1540 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1541 Builder.AddPlaceholderChunk("name"); 1542 Builder.AddChunk(CodeCompletionString::CK_Equal); 1543 Builder.AddPlaceholderChunk("namespace"); 1544 Results.AddResult(Result(Builder.TakeString())); 1545 1546 // Using directives 1547 Builder.AddTypedTextChunk("using"); 1548 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1549 Builder.AddTextChunk("namespace"); 1550 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1551 Builder.AddPlaceholderChunk("identifier"); 1552 Results.AddResult(Result(Builder.TakeString())); 1553 1554 // asm(string-literal) 1555 Builder.AddTypedTextChunk("asm"); 1556 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1557 Builder.AddPlaceholderChunk("string-literal"); 1558 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1559 Results.AddResult(Result(Builder.TakeString())); 1560 1561 if (Results.includeCodePatterns()) { 1562 // Explicit template instantiation 1563 Builder.AddTypedTextChunk("template"); 1564 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1565 Builder.AddPlaceholderChunk("declaration"); 1566 Results.AddResult(Result(Builder.TakeString())); 1567 } 1568 } 1569 1570 if (SemaRef.getLangOpts().ObjC1) 1571 AddObjCTopLevelResults(Results, true); 1572 1573 AddTypedefResult(Results); 1574 // Fall through 1575 1576 case Sema::PCC_Class: 1577 if (SemaRef.getLangOpts().CPlusPlus) { 1578 // Using declaration 1579 Builder.AddTypedTextChunk("using"); 1580 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1581 Builder.AddPlaceholderChunk("qualifier"); 1582 Builder.AddTextChunk("::"); 1583 Builder.AddPlaceholderChunk("name"); 1584 Results.AddResult(Result(Builder.TakeString())); 1585 1586 // using typename qualifier::name (only in a dependent context) 1587 if (SemaRef.CurContext->isDependentContext()) { 1588 Builder.AddTypedTextChunk("using"); 1589 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1590 Builder.AddTextChunk("typename"); 1591 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1592 Builder.AddPlaceholderChunk("qualifier"); 1593 Builder.AddTextChunk("::"); 1594 Builder.AddPlaceholderChunk("name"); 1595 Results.AddResult(Result(Builder.TakeString())); 1596 } 1597 1598 if (CCC == Sema::PCC_Class) { 1599 AddTypedefResult(Results); 1600 1601 // public: 1602 Builder.AddTypedTextChunk("public"); 1603 if (Results.includeCodePatterns()) 1604 Builder.AddChunk(CodeCompletionString::CK_Colon); 1605 Results.AddResult(Result(Builder.TakeString())); 1606 1607 // protected: 1608 Builder.AddTypedTextChunk("protected"); 1609 if (Results.includeCodePatterns()) 1610 Builder.AddChunk(CodeCompletionString::CK_Colon); 1611 Results.AddResult(Result(Builder.TakeString())); 1612 1613 // private: 1614 Builder.AddTypedTextChunk("private"); 1615 if (Results.includeCodePatterns()) 1616 Builder.AddChunk(CodeCompletionString::CK_Colon); 1617 Results.AddResult(Result(Builder.TakeString())); 1618 } 1619 } 1620 // Fall through 1621 1622 case Sema::PCC_Template: 1623 case Sema::PCC_MemberTemplate: 1624 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns()) { 1625 // template < parameters > 1626 Builder.AddTypedTextChunk("template"); 1627 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1628 Builder.AddPlaceholderChunk("parameters"); 1629 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1630 Results.AddResult(Result(Builder.TakeString())); 1631 } 1632 1633 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1634 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1635 break; 1636 1637 case Sema::PCC_ObjCInterface: 1638 AddObjCInterfaceResults(SemaRef.getLangOpts(), Results, true); 1639 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1640 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1641 break; 1642 1643 case Sema::PCC_ObjCImplementation: 1644 AddObjCImplementationResults(SemaRef.getLangOpts(), Results, true); 1645 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1646 AddFunctionSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1647 break; 1648 1649 case Sema::PCC_ObjCInstanceVariableList: 1650 AddObjCVisibilityResults(SemaRef.getLangOpts(), Results, true); 1651 break; 1652 1653 case Sema::PCC_RecoveryInFunction: 1654 case Sema::PCC_Statement: { 1655 AddTypedefResult(Results); 1656 1657 if (SemaRef.getLangOpts().CPlusPlus && Results.includeCodePatterns() && 1658 SemaRef.getLangOpts().CXXExceptions) { 1659 Builder.AddTypedTextChunk("try"); 1660 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1661 Builder.AddPlaceholderChunk("statements"); 1662 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1663 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1664 Builder.AddTextChunk("catch"); 1665 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1666 Builder.AddPlaceholderChunk("declaration"); 1667 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1668 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1669 Builder.AddPlaceholderChunk("statements"); 1670 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1671 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1672 Results.AddResult(Result(Builder.TakeString())); 1673 } 1674 if (SemaRef.getLangOpts().ObjC1) 1675 AddObjCStatementResults(Results, true); 1676 1677 if (Results.includeCodePatterns()) { 1678 // if (condition) { statements } 1679 Builder.AddTypedTextChunk("if"); 1680 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1681 if (SemaRef.getLangOpts().CPlusPlus) 1682 Builder.AddPlaceholderChunk("condition"); 1683 else 1684 Builder.AddPlaceholderChunk("expression"); 1685 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1686 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1687 Builder.AddPlaceholderChunk("statements"); 1688 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1689 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1690 Results.AddResult(Result(Builder.TakeString())); 1691 1692 // switch (condition) { } 1693 Builder.AddTypedTextChunk("switch"); 1694 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1695 if (SemaRef.getLangOpts().CPlusPlus) 1696 Builder.AddPlaceholderChunk("condition"); 1697 else 1698 Builder.AddPlaceholderChunk("expression"); 1699 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1700 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1701 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1702 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1703 Results.AddResult(Result(Builder.TakeString())); 1704 } 1705 1706 // Switch-specific statements. 1707 if (!SemaRef.getCurFunction()->SwitchStack.empty()) { 1708 // case expression: 1709 Builder.AddTypedTextChunk("case"); 1710 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1711 Builder.AddPlaceholderChunk("expression"); 1712 Builder.AddChunk(CodeCompletionString::CK_Colon); 1713 Results.AddResult(Result(Builder.TakeString())); 1714 1715 // default: 1716 Builder.AddTypedTextChunk("default"); 1717 Builder.AddChunk(CodeCompletionString::CK_Colon); 1718 Results.AddResult(Result(Builder.TakeString())); 1719 } 1720 1721 if (Results.includeCodePatterns()) { 1722 /// while (condition) { statements } 1723 Builder.AddTypedTextChunk("while"); 1724 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1725 if (SemaRef.getLangOpts().CPlusPlus) 1726 Builder.AddPlaceholderChunk("condition"); 1727 else 1728 Builder.AddPlaceholderChunk("expression"); 1729 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1730 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1731 Builder.AddPlaceholderChunk("statements"); 1732 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1733 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1734 Results.AddResult(Result(Builder.TakeString())); 1735 1736 // do { statements } while ( expression ); 1737 Builder.AddTypedTextChunk("do"); 1738 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1739 Builder.AddPlaceholderChunk("statements"); 1740 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1741 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1742 Builder.AddTextChunk("while"); 1743 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1744 Builder.AddPlaceholderChunk("expression"); 1745 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1746 Results.AddResult(Result(Builder.TakeString())); 1747 1748 // for ( for-init-statement ; condition ; expression ) { statements } 1749 Builder.AddTypedTextChunk("for"); 1750 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1751 if (SemaRef.getLangOpts().CPlusPlus || SemaRef.getLangOpts().C99) 1752 Builder.AddPlaceholderChunk("init-statement"); 1753 else 1754 Builder.AddPlaceholderChunk("init-expression"); 1755 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1756 Builder.AddPlaceholderChunk("condition"); 1757 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1758 Builder.AddPlaceholderChunk("inc-expression"); 1759 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1760 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 1761 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1762 Builder.AddPlaceholderChunk("statements"); 1763 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 1764 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 1765 Results.AddResult(Result(Builder.TakeString())); 1766 } 1767 1768 if (S->getContinueParent()) { 1769 // continue ; 1770 Builder.AddTypedTextChunk("continue"); 1771 Results.AddResult(Result(Builder.TakeString())); 1772 } 1773 1774 if (S->getBreakParent()) { 1775 // break ; 1776 Builder.AddTypedTextChunk("break"); 1777 Results.AddResult(Result(Builder.TakeString())); 1778 } 1779 1780 // "return expression ;" or "return ;", depending on whether we 1781 // know the function is void or not. 1782 bool isVoid = false; 1783 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(SemaRef.CurContext)) 1784 isVoid = Function->getResultType()->isVoidType(); 1785 else if (ObjCMethodDecl *Method 1786 = dyn_cast<ObjCMethodDecl>(SemaRef.CurContext)) 1787 isVoid = Method->getResultType()->isVoidType(); 1788 else if (SemaRef.getCurBlock() && 1789 !SemaRef.getCurBlock()->ReturnType.isNull()) 1790 isVoid = SemaRef.getCurBlock()->ReturnType->isVoidType(); 1791 Builder.AddTypedTextChunk("return"); 1792 if (!isVoid) { 1793 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1794 Builder.AddPlaceholderChunk("expression"); 1795 } 1796 Results.AddResult(Result(Builder.TakeString())); 1797 1798 // goto identifier ; 1799 Builder.AddTypedTextChunk("goto"); 1800 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1801 Builder.AddPlaceholderChunk("label"); 1802 Results.AddResult(Result(Builder.TakeString())); 1803 1804 // Using directives 1805 Builder.AddTypedTextChunk("using"); 1806 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1807 Builder.AddTextChunk("namespace"); 1808 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1809 Builder.AddPlaceholderChunk("identifier"); 1810 Results.AddResult(Result(Builder.TakeString())); 1811 } 1812 1813 // Fall through (for statement expressions). 1814 case Sema::PCC_ForInit: 1815 case Sema::PCC_Condition: 1816 AddStorageSpecifiers(CCC, SemaRef.getLangOpts(), Results); 1817 // Fall through: conditions and statements can have expressions. 1818 1819 case Sema::PCC_ParenthesizedExpression: 1820 if (SemaRef.getLangOpts().ObjCAutoRefCount && 1821 CCC == Sema::PCC_ParenthesizedExpression) { 1822 // (__bridge <type>)<expression> 1823 Builder.AddTypedTextChunk("__bridge"); 1824 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1825 Builder.AddPlaceholderChunk("type"); 1826 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1827 Builder.AddPlaceholderChunk("expression"); 1828 Results.AddResult(Result(Builder.TakeString())); 1829 1830 // (__bridge_transfer <Objective-C type>)<expression> 1831 Builder.AddTypedTextChunk("__bridge_transfer"); 1832 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1833 Builder.AddPlaceholderChunk("Objective-C type"); 1834 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1835 Builder.AddPlaceholderChunk("expression"); 1836 Results.AddResult(Result(Builder.TakeString())); 1837 1838 // (__bridge_retained <CF type>)<expression> 1839 Builder.AddTypedTextChunk("__bridge_retained"); 1840 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1841 Builder.AddPlaceholderChunk("CF type"); 1842 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1843 Builder.AddPlaceholderChunk("expression"); 1844 Results.AddResult(Result(Builder.TakeString())); 1845 } 1846 // Fall through 1847 1848 case Sema::PCC_Expression: { 1849 if (SemaRef.getLangOpts().CPlusPlus) { 1850 // 'this', if we're in a non-static member function. 1851 addThisCompletion(SemaRef, Results); 1852 1853 // true 1854 Builder.AddResultTypeChunk("bool"); 1855 Builder.AddTypedTextChunk("true"); 1856 Results.AddResult(Result(Builder.TakeString())); 1857 1858 // false 1859 Builder.AddResultTypeChunk("bool"); 1860 Builder.AddTypedTextChunk("false"); 1861 Results.AddResult(Result(Builder.TakeString())); 1862 1863 if (SemaRef.getLangOpts().RTTI) { 1864 // dynamic_cast < type-id > ( expression ) 1865 Builder.AddTypedTextChunk("dynamic_cast"); 1866 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1867 Builder.AddPlaceholderChunk("type"); 1868 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1869 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1870 Builder.AddPlaceholderChunk("expression"); 1871 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1872 Results.AddResult(Result(Builder.TakeString())); 1873 } 1874 1875 // static_cast < type-id > ( expression ) 1876 Builder.AddTypedTextChunk("static_cast"); 1877 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1878 Builder.AddPlaceholderChunk("type"); 1879 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1880 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1881 Builder.AddPlaceholderChunk("expression"); 1882 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1883 Results.AddResult(Result(Builder.TakeString())); 1884 1885 // reinterpret_cast < type-id > ( expression ) 1886 Builder.AddTypedTextChunk("reinterpret_cast"); 1887 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1888 Builder.AddPlaceholderChunk("type"); 1889 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1890 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1891 Builder.AddPlaceholderChunk("expression"); 1892 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1893 Results.AddResult(Result(Builder.TakeString())); 1894 1895 // const_cast < type-id > ( expression ) 1896 Builder.AddTypedTextChunk("const_cast"); 1897 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 1898 Builder.AddPlaceholderChunk("type"); 1899 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 1900 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1901 Builder.AddPlaceholderChunk("expression"); 1902 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1903 Results.AddResult(Result(Builder.TakeString())); 1904 1905 if (SemaRef.getLangOpts().RTTI) { 1906 // typeid ( expression-or-type ) 1907 Builder.AddResultTypeChunk("std::type_info"); 1908 Builder.AddTypedTextChunk("typeid"); 1909 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1910 Builder.AddPlaceholderChunk("expression-or-type"); 1911 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1912 Results.AddResult(Result(Builder.TakeString())); 1913 } 1914 1915 // new T ( ... ) 1916 Builder.AddTypedTextChunk("new"); 1917 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1918 Builder.AddPlaceholderChunk("type"); 1919 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1920 Builder.AddPlaceholderChunk("expressions"); 1921 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1922 Results.AddResult(Result(Builder.TakeString())); 1923 1924 // new T [ ] ( ... ) 1925 Builder.AddTypedTextChunk("new"); 1926 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1927 Builder.AddPlaceholderChunk("type"); 1928 Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1929 Builder.AddPlaceholderChunk("size"); 1930 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1931 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1932 Builder.AddPlaceholderChunk("expressions"); 1933 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1934 Results.AddResult(Result(Builder.TakeString())); 1935 1936 // delete expression 1937 Builder.AddResultTypeChunk("void"); 1938 Builder.AddTypedTextChunk("delete"); 1939 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1940 Builder.AddPlaceholderChunk("expression"); 1941 Results.AddResult(Result(Builder.TakeString())); 1942 1943 // delete [] expression 1944 Builder.AddResultTypeChunk("void"); 1945 Builder.AddTypedTextChunk("delete"); 1946 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1947 Builder.AddChunk(CodeCompletionString::CK_LeftBracket); 1948 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 1949 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1950 Builder.AddPlaceholderChunk("expression"); 1951 Results.AddResult(Result(Builder.TakeString())); 1952 1953 if (SemaRef.getLangOpts().CXXExceptions) { 1954 // throw expression 1955 Builder.AddResultTypeChunk("void"); 1956 Builder.AddTypedTextChunk("throw"); 1957 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 1958 Builder.AddPlaceholderChunk("expression"); 1959 Results.AddResult(Result(Builder.TakeString())); 1960 } 1961 1962 // FIXME: Rethrow? 1963 1964 if (SemaRef.getLangOpts().CPlusPlus11) { 1965 // nullptr 1966 Builder.AddResultTypeChunk("std::nullptr_t"); 1967 Builder.AddTypedTextChunk("nullptr"); 1968 Results.AddResult(Result(Builder.TakeString())); 1969 1970 // alignof 1971 Builder.AddResultTypeChunk("size_t"); 1972 Builder.AddTypedTextChunk("alignof"); 1973 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1974 Builder.AddPlaceholderChunk("type"); 1975 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1976 Results.AddResult(Result(Builder.TakeString())); 1977 1978 // noexcept 1979 Builder.AddResultTypeChunk("bool"); 1980 Builder.AddTypedTextChunk("noexcept"); 1981 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1982 Builder.AddPlaceholderChunk("expression"); 1983 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1984 Results.AddResult(Result(Builder.TakeString())); 1985 1986 // sizeof... expression 1987 Builder.AddResultTypeChunk("size_t"); 1988 Builder.AddTypedTextChunk("sizeof..."); 1989 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1990 Builder.AddPlaceholderChunk("parameter-pack"); 1991 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1992 Results.AddResult(Result(Builder.TakeString())); 1993 } 1994 } 1995 1996 if (SemaRef.getLangOpts().ObjC1) { 1997 // Add "super", if we're in an Objective-C class with a superclass. 1998 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) { 1999 // The interface can be NULL. 2000 if (ObjCInterfaceDecl *ID = Method->getClassInterface()) 2001 if (ID->getSuperClass()) { 2002 std::string SuperType; 2003 SuperType = ID->getSuperClass()->getNameAsString(); 2004 if (Method->isInstanceMethod()) 2005 SuperType += " *"; 2006 2007 Builder.AddResultTypeChunk(Allocator.CopyString(SuperType)); 2008 Builder.AddTypedTextChunk("super"); 2009 Results.AddResult(Result(Builder.TakeString())); 2010 } 2011 } 2012 2013 AddObjCExpressionResults(Results, true); 2014 } 2015 2016 if (SemaRef.getLangOpts().C11) { 2017 // _Alignof 2018 Builder.AddResultTypeChunk("size_t"); 2019 if (SemaRef.getASTContext().Idents.get("alignof").hasMacroDefinition()) 2020 Builder.AddTypedTextChunk("alignof"); 2021 else 2022 Builder.AddTypedTextChunk("_Alignof"); 2023 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 2024 Builder.AddPlaceholderChunk("type"); 2025 Builder.AddChunk(CodeCompletionString::CK_RightParen); 2026 Results.AddResult(Result(Builder.TakeString())); 2027 } 2028 2029 // sizeof expression 2030 Builder.AddResultTypeChunk("size_t"); 2031 Builder.AddTypedTextChunk("sizeof"); 2032 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 2033 Builder.AddPlaceholderChunk("expression-or-type"); 2034 Builder.AddChunk(CodeCompletionString::CK_RightParen); 2035 Results.AddResult(Result(Builder.TakeString())); 2036 break; 2037 } 2038 2039 case Sema::PCC_Type: 2040 case Sema::PCC_LocalDeclarationSpecifiers: 2041 break; 2042 } 2043 2044 if (WantTypesInContext(CCC, SemaRef.getLangOpts())) 2045 AddTypeSpecifierResults(SemaRef.getLangOpts(), Results); 2046 2047 if (SemaRef.getLangOpts().CPlusPlus && CCC != Sema::PCC_Type) 2048 Results.AddResult(Result("operator")); 2049 } 2050 2051 /// \brief If the given declaration has an associated type, add it as a result 2052 /// type chunk. 2053 static void AddResultTypeChunk(ASTContext &Context, 2054 const PrintingPolicy &Policy, 2055 const NamedDecl *ND, 2056 CodeCompletionBuilder &Result) { 2057 if (!ND) 2058 return; 2059 2060 // Skip constructors and conversion functions, which have their return types 2061 // built into their names. 2062 if (isa<CXXConstructorDecl>(ND) || isa<CXXConversionDecl>(ND)) 2063 return; 2064 2065 // Determine the type of the declaration (if it has a type). 2066 QualType T; 2067 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) 2068 T = Function->getResultType(); 2069 else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) 2070 T = Method->getResultType(); 2071 else if (const FunctionTemplateDecl *FunTmpl = 2072 dyn_cast<FunctionTemplateDecl>(ND)) 2073 T = FunTmpl->getTemplatedDecl()->getResultType(); 2074 else if (const EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) 2075 T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); 2076 else if (isa<UnresolvedUsingValueDecl>(ND)) { 2077 /* Do nothing: ignore unresolved using declarations*/ 2078 } else if (const ValueDecl *Value = dyn_cast<ValueDecl>(ND)) { 2079 T = Value->getType(); 2080 } else if (const ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) 2081 T = Property->getType(); 2082 2083 if (T.isNull() || Context.hasSameType(T, Context.DependentTy)) 2084 return; 2085 2086 Result.AddResultTypeChunk(GetCompletionTypeString(T, Context, Policy, 2087 Result.getAllocator())); 2088 } 2089 2090 static void MaybeAddSentinel(ASTContext &Context, 2091 const NamedDecl *FunctionOrMethod, 2092 CodeCompletionBuilder &Result) { 2093 if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) 2094 if (Sentinel->getSentinel() == 0) { 2095 if (Context.getLangOpts().ObjC1 && 2096 Context.Idents.get("nil").hasMacroDefinition()) 2097 Result.AddTextChunk(", nil"); 2098 else if (Context.Idents.get("NULL").hasMacroDefinition()) 2099 Result.AddTextChunk(", NULL"); 2100 else 2101 Result.AddTextChunk(", (void*)0"); 2102 } 2103 } 2104 2105 static std::string formatObjCParamQualifiers(unsigned ObjCQuals) { 2106 std::string Result; 2107 if (ObjCQuals & Decl::OBJC_TQ_In) 2108 Result += "in "; 2109 else if (ObjCQuals & Decl::OBJC_TQ_Inout) 2110 Result += "inout "; 2111 else if (ObjCQuals & Decl::OBJC_TQ_Out) 2112 Result += "out "; 2113 if (ObjCQuals & Decl::OBJC_TQ_Bycopy) 2114 Result += "bycopy "; 2115 else if (ObjCQuals & Decl::OBJC_TQ_Byref) 2116 Result += "byref "; 2117 if (ObjCQuals & Decl::OBJC_TQ_Oneway) 2118 Result += "oneway "; 2119 return Result; 2120 } 2121 2122 static std::string FormatFunctionParameter(ASTContext &Context, 2123 const PrintingPolicy &Policy, 2124 const ParmVarDecl *Param, 2125 bool SuppressName = false, 2126 bool SuppressBlock = false) { 2127 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 2128 if (Param->getType()->isDependentType() || 2129 !Param->getType()->isBlockPointerType()) { 2130 // The argument for a dependent or non-block parameter is a placeholder 2131 // containing that parameter's type. 2132 std::string Result; 2133 2134 if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 2135 Result = Param->getIdentifier()->getName(); 2136 2137 Param->getType().getAsStringInternal(Result, Policy); 2138 2139 if (ObjCMethodParam) { 2140 Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 2141 + Result + ")"; 2142 if (Param->getIdentifier() && !SuppressName) 2143 Result += Param->getIdentifier()->getName(); 2144 } 2145 return Result; 2146 } 2147 2148 // The argument for a block pointer parameter is a block literal with 2149 // the appropriate type. 2150 FunctionTypeLoc Block; 2151 FunctionProtoTypeLoc BlockProto; 2152 TypeLoc TL; 2153 if (TypeSourceInfo *TSInfo = Param->getTypeSourceInfo()) { 2154 TL = TSInfo->getTypeLoc().getUnqualifiedLoc(); 2155 while (true) { 2156 // Look through typedefs. 2157 if (!SuppressBlock) { 2158 if (TypedefTypeLoc TypedefTL = TL.getAs<TypedefTypeLoc>()) { 2159 if (TypeSourceInfo *InnerTSInfo = 2160 TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) { 2161 TL = InnerTSInfo->getTypeLoc().getUnqualifiedLoc(); 2162 continue; 2163 } 2164 } 2165 2166 // Look through qualified types 2167 if (QualifiedTypeLoc QualifiedTL = TL.getAs<QualifiedTypeLoc>()) { 2168 TL = QualifiedTL.getUnqualifiedLoc(); 2169 continue; 2170 } 2171 } 2172 2173 // Try to get the function prototype behind the block pointer type, 2174 // then we're done. 2175 if (BlockPointerTypeLoc BlockPtr = TL.getAs<BlockPointerTypeLoc>()) { 2176 TL = BlockPtr.getPointeeLoc().IgnoreParens(); 2177 Block = TL.getAs<FunctionTypeLoc>(); 2178 BlockProto = TL.getAs<FunctionProtoTypeLoc>(); 2179 } 2180 break; 2181 } 2182 } 2183 2184 if (!Block) { 2185 // We were unable to find a FunctionProtoTypeLoc with parameter names 2186 // for the block; just use the parameter type as a placeholder. 2187 std::string Result; 2188 if (!ObjCMethodParam && Param->getIdentifier()) 2189 Result = Param->getIdentifier()->getName(); 2190 2191 Param->getType().getUnqualifiedType().getAsStringInternal(Result, Policy); 2192 2193 if (ObjCMethodParam) { 2194 Result = "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier()) 2195 + Result + ")"; 2196 if (Param->getIdentifier()) 2197 Result += Param->getIdentifier()->getName(); 2198 } 2199 2200 return Result; 2201 } 2202 2203 // We have the function prototype behind the block pointer type, as it was 2204 // written in the source. 2205 std::string Result; 2206 QualType ResultType = Block.getTypePtr()->getResultType(); 2207 if (!ResultType->isVoidType() || SuppressBlock) 2208 ResultType.getAsStringInternal(Result, Policy); 2209 2210 // Format the parameter list. 2211 std::string Params; 2212 if (!BlockProto || Block.getNumArgs() == 0) { 2213 if (BlockProto && BlockProto.getTypePtr()->isVariadic()) 2214 Params = "(...)"; 2215 else 2216 Params = "(void)"; 2217 } else { 2218 Params += "("; 2219 for (unsigned I = 0, N = Block.getNumArgs(); I != N; ++I) { 2220 if (I) 2221 Params += ", "; 2222 Params += FormatFunctionParameter(Context, Policy, Block.getArg(I), 2223 /*SuppressName=*/false, 2224 /*SuppressBlock=*/true); 2225 2226 if (I == N - 1 && BlockProto.getTypePtr()->isVariadic()) 2227 Params += ", ..."; 2228 } 2229 Params += ")"; 2230 } 2231 2232 if (SuppressBlock) { 2233 // Format as a parameter. 2234 Result = Result + " (^"; 2235 if (Param->getIdentifier()) 2236 Result += Param->getIdentifier()->getName(); 2237 Result += ")"; 2238 Result += Params; 2239 } else { 2240 // Format as a block literal argument. 2241 Result = '^' + Result; 2242 Result += Params; 2243 2244 if (Param->getIdentifier()) 2245 Result += Param->getIdentifier()->getName(); 2246 } 2247 2248 return Result; 2249 } 2250 2251 /// \brief Add function parameter chunks to the given code completion string. 2252 static void AddFunctionParameterChunks(ASTContext &Context, 2253 const PrintingPolicy &Policy, 2254 const FunctionDecl *Function, 2255 CodeCompletionBuilder &Result, 2256 unsigned Start = 0, 2257 bool InOptional = false) { 2258 bool FirstParameter = true; 2259 2260 for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 2261 const ParmVarDecl *Param = Function->getParamDecl(P); 2262 2263 if (Param->hasDefaultArg() && !InOptional) { 2264 // When we see an optional default argument, put that argument and 2265 // the remaining default arguments into a new, optional string. 2266 CodeCompletionBuilder Opt(Result.getAllocator(), 2267 Result.getCodeCompletionTUInfo()); 2268 if (!FirstParameter) 2269 Opt.AddChunk(CodeCompletionString::CK_Comma); 2270 AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); 2271 Result.AddOptionalChunk(Opt.TakeString()); 2272 break; 2273 } 2274 2275 if (FirstParameter) 2276 FirstParameter = false; 2277 else 2278 Result.AddChunk(CodeCompletionString::CK_Comma); 2279 2280 InOptional = false; 2281 2282 // Format the placeholder string. 2283 std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, 2284 Param); 2285 2286 if (Function->isVariadic() && P == N - 1) 2287 PlaceholderStr += ", ..."; 2288 2289 // Add the placeholder string. 2290 Result.AddPlaceholderChunk( 2291 Result.getAllocator().CopyString(PlaceholderStr)); 2292 } 2293 2294 if (const FunctionProtoType *Proto 2295 = Function->getType()->getAs<FunctionProtoType>()) 2296 if (Proto->isVariadic()) { 2297 if (Proto->getNumArgs() == 0) 2298 Result.AddPlaceholderChunk("..."); 2299 2300 MaybeAddSentinel(Context, Function, Result); 2301 } 2302 } 2303 2304 /// \brief Add template parameter chunks to the given code completion string. 2305 static void AddTemplateParameterChunks(ASTContext &Context, 2306 const PrintingPolicy &Policy, 2307 const TemplateDecl *Template, 2308 CodeCompletionBuilder &Result, 2309 unsigned MaxParameters = 0, 2310 unsigned Start = 0, 2311 bool InDefaultArg = false) { 2312 bool FirstParameter = true; 2313 2314 TemplateParameterList *Params = Template->getTemplateParameters(); 2315 TemplateParameterList::iterator PEnd = Params->end(); 2316 if (MaxParameters) 2317 PEnd = Params->begin() + MaxParameters; 2318 for (TemplateParameterList::iterator P = Params->begin() + Start; 2319 P != PEnd; ++P) { 2320 bool HasDefaultArg = false; 2321 std::string PlaceholderStr; 2322 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 2323 if (TTP->wasDeclaredWithTypename()) 2324 PlaceholderStr = "typename"; 2325 else 2326 PlaceholderStr = "class"; 2327 2328 if (TTP->getIdentifier()) { 2329 PlaceholderStr += ' '; 2330 PlaceholderStr += TTP->getIdentifier()->getName(); 2331 } 2332 2333 HasDefaultArg = TTP->hasDefaultArgument(); 2334 } else if (NonTypeTemplateParmDecl *NTTP 2335 = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2336 if (NTTP->getIdentifier()) 2337 PlaceholderStr = NTTP->getIdentifier()->getName(); 2338 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 2339 HasDefaultArg = NTTP->hasDefaultArgument(); 2340 } else { 2341 assert(isa<TemplateTemplateParmDecl>(*P)); 2342 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 2343 2344 // Since putting the template argument list into the placeholder would 2345 // be very, very long, we just use an abbreviation. 2346 PlaceholderStr = "template<...> class"; 2347 if (TTP->getIdentifier()) { 2348 PlaceholderStr += ' '; 2349 PlaceholderStr += TTP->getIdentifier()->getName(); 2350 } 2351 2352 HasDefaultArg = TTP->hasDefaultArgument(); 2353 } 2354 2355 if (HasDefaultArg && !InDefaultArg) { 2356 // When we see an optional default argument, put that argument and 2357 // the remaining default arguments into a new, optional string. 2358 CodeCompletionBuilder Opt(Result.getAllocator(), 2359 Result.getCodeCompletionTUInfo()); 2360 if (!FirstParameter) 2361 Opt.AddChunk(CodeCompletionString::CK_Comma); 2362 AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 2363 P - Params->begin(), true); 2364 Result.AddOptionalChunk(Opt.TakeString()); 2365 break; 2366 } 2367 2368 InDefaultArg = false; 2369 2370 if (FirstParameter) 2371 FirstParameter = false; 2372 else 2373 Result.AddChunk(CodeCompletionString::CK_Comma); 2374 2375 // Add the placeholder string. 2376 Result.AddPlaceholderChunk( 2377 Result.getAllocator().CopyString(PlaceholderStr)); 2378 } 2379 } 2380 2381 /// \brief Add a qualifier to the given code-completion string, if the 2382 /// provided nested-name-specifier is non-NULL. 2383 static void 2384 AddQualifierToCompletionString(CodeCompletionBuilder &Result, 2385 NestedNameSpecifier *Qualifier, 2386 bool QualifierIsInformative, 2387 ASTContext &Context, 2388 const PrintingPolicy &Policy) { 2389 if (!Qualifier) 2390 return; 2391 2392 std::string PrintedNNS; 2393 { 2394 llvm::raw_string_ostream OS(PrintedNNS); 2395 Qualifier->print(OS, Policy); 2396 } 2397 if (QualifierIsInformative) 2398 Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 2399 else 2400 Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 2401 } 2402 2403 static void 2404 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 2405 const FunctionDecl *Function) { 2406 const FunctionProtoType *Proto 2407 = Function->getType()->getAs<FunctionProtoType>(); 2408 if (!Proto || !Proto->getTypeQuals()) 2409 return; 2410 2411 // FIXME: Add ref-qualifier! 2412 2413 // Handle single qualifiers without copying 2414 if (Proto->getTypeQuals() == Qualifiers::Const) { 2415 Result.AddInformativeChunk(" const"); 2416 return; 2417 } 2418 2419 if (Proto->getTypeQuals() == Qualifiers::Volatile) { 2420 Result.AddInformativeChunk(" volatile"); 2421 return; 2422 } 2423 2424 if (Proto->getTypeQuals() == Qualifiers::Restrict) { 2425 Result.AddInformativeChunk(" restrict"); 2426 return; 2427 } 2428 2429 // Handle multiple qualifiers. 2430 std::string QualsStr; 2431 if (Proto->isConst()) 2432 QualsStr += " const"; 2433 if (Proto->isVolatile()) 2434 QualsStr += " volatile"; 2435 if (Proto->isRestrict()) 2436 QualsStr += " restrict"; 2437 Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 2438 } 2439 2440 /// \brief Add the name of the given declaration 2441 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 2442 const NamedDecl *ND, 2443 CodeCompletionBuilder &Result) { 2444 DeclarationName Name = ND->getDeclName(); 2445 if (!Name) 2446 return; 2447 2448 switch (Name.getNameKind()) { 2449 case DeclarationName::CXXOperatorName: { 2450 const char *OperatorName = 0; 2451 switch (Name.getCXXOverloadedOperator()) { 2452 case OO_None: 2453 case OO_Conditional: 2454 case NUM_OVERLOADED_OPERATORS: 2455 OperatorName = "operator"; 2456 break; 2457 2458 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2459 case OO_##Name: OperatorName = "operator" Spelling; break; 2460 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2461 #include "clang/Basic/OperatorKinds.def" 2462 2463 case OO_New: OperatorName = "operator new"; break; 2464 case OO_Delete: OperatorName = "operator delete"; break; 2465 case OO_Array_New: OperatorName = "operator new[]"; break; 2466 case OO_Array_Delete: OperatorName = "operator delete[]"; break; 2467 case OO_Call: OperatorName = "operator()"; break; 2468 case OO_Subscript: OperatorName = "operator[]"; break; 2469 } 2470 Result.AddTypedTextChunk(OperatorName); 2471 break; 2472 } 2473 2474 case DeclarationName::Identifier: 2475 case DeclarationName::CXXConversionFunctionName: 2476 case DeclarationName::CXXDestructorName: 2477 case DeclarationName::CXXLiteralOperatorName: 2478 Result.AddTypedTextChunk( 2479 Result.getAllocator().CopyString(ND->getNameAsString())); 2480 break; 2481 2482 case DeclarationName::CXXUsingDirective: 2483 case DeclarationName::ObjCZeroArgSelector: 2484 case DeclarationName::ObjCOneArgSelector: 2485 case DeclarationName::ObjCMultiArgSelector: 2486 break; 2487 2488 case DeclarationName::CXXConstructorName: { 2489 CXXRecordDecl *Record = 0; 2490 QualType Ty = Name.getCXXNameType(); 2491 if (const RecordType *RecordTy = Ty->getAs<RecordType>()) 2492 Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 2493 else if (const InjectedClassNameType *InjectedTy 2494 = Ty->getAs<InjectedClassNameType>()) 2495 Record = InjectedTy->getDecl(); 2496 else { 2497 Result.AddTypedTextChunk( 2498 Result.getAllocator().CopyString(ND->getNameAsString())); 2499 break; 2500 } 2501 2502 Result.AddTypedTextChunk( 2503 Result.getAllocator().CopyString(Record->getNameAsString())); 2504 if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 2505 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2506 AddTemplateParameterChunks(Context, Policy, Template, Result); 2507 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2508 } 2509 break; 2510 } 2511 } 2512 } 2513 2514 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString(Sema &S, 2515 CodeCompletionAllocator &Allocator, 2516 CodeCompletionTUInfo &CCTUInfo, 2517 bool IncludeBriefComments) { 2518 return CreateCodeCompletionString(S.Context, S.PP, Allocator, CCTUInfo, 2519 IncludeBriefComments); 2520 } 2521 2522 /// \brief If possible, create a new code completion string for the given 2523 /// result. 2524 /// 2525 /// \returns Either a new, heap-allocated code completion string describing 2526 /// how to use this result, or NULL to indicate that the string or name of the 2527 /// result is all that is needed. 2528 CodeCompletionString * 2529 CodeCompletionResult::CreateCodeCompletionString(ASTContext &Ctx, 2530 Preprocessor &PP, 2531 CodeCompletionAllocator &Allocator, 2532 CodeCompletionTUInfo &CCTUInfo, 2533 bool IncludeBriefComments) { 2534 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 2535 2536 PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 2537 if (Kind == RK_Pattern) { 2538 Pattern->Priority = Priority; 2539 Pattern->Availability = Availability; 2540 2541 if (Declaration) { 2542 Result.addParentContext(Declaration->getDeclContext()); 2543 Pattern->ParentName = Result.getParentName(); 2544 // Provide code completion comment for self.GetterName where 2545 // GetterName is the getter method for a property with name 2546 // different from the property name (declared via a property 2547 // getter attribute. 2548 const NamedDecl *ND = Declaration; 2549 if (const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(ND)) 2550 if (M->isPropertyAccessor()) 2551 if (const ObjCPropertyDecl *PDecl = M->findPropertyDecl()) 2552 if (PDecl->getGetterName() == M->getSelector() && 2553 PDecl->getIdentifier() != M->getIdentifier()) { 2554 if (const RawComment *RC = 2555 Ctx.getRawCommentForAnyRedecl(M)) { 2556 Result.addBriefComment(RC->getBriefText(Ctx)); 2557 Pattern->BriefComment = Result.getBriefComment(); 2558 } 2559 else if (const RawComment *RC = 2560 Ctx.getRawCommentForAnyRedecl(PDecl)) { 2561 Result.addBriefComment(RC->getBriefText(Ctx)); 2562 Pattern->BriefComment = Result.getBriefComment(); 2563 } 2564 } 2565 } 2566 2567 return Pattern; 2568 } 2569 2570 if (Kind == RK_Keyword) { 2571 Result.AddTypedTextChunk(Keyword); 2572 return Result.TakeString(); 2573 } 2574 2575 if (Kind == RK_Macro) { 2576 const MacroDirective *MD = PP.getMacroDirectiveHistory(Macro); 2577 assert(MD && "Not a macro?"); 2578 const MacroInfo *MI = MD->getMacroInfo(); 2579 2580 Result.AddTypedTextChunk( 2581 Result.getAllocator().CopyString(Macro->getName())); 2582 2583 if (!MI->isFunctionLike()) 2584 return Result.TakeString(); 2585 2586 // Format a function-like macro with placeholders for the arguments. 2587 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2588 MacroInfo::arg_iterator A = MI->arg_begin(), AEnd = MI->arg_end(); 2589 2590 // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 2591 if (MI->isC99Varargs()) { 2592 --AEnd; 2593 2594 if (A == AEnd) { 2595 Result.AddPlaceholderChunk("..."); 2596 } 2597 } 2598 2599 for (MacroInfo::arg_iterator A = MI->arg_begin(); A != AEnd; ++A) { 2600 if (A != MI->arg_begin()) 2601 Result.AddChunk(CodeCompletionString::CK_Comma); 2602 2603 if (MI->isVariadic() && (A+1) == AEnd) { 2604 SmallString<32> Arg = (*A)->getName(); 2605 if (MI->isC99Varargs()) 2606 Arg += ", ..."; 2607 else 2608 Arg += "..."; 2609 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2610 break; 2611 } 2612 2613 // Non-variadic macros are simple. 2614 Result.AddPlaceholderChunk( 2615 Result.getAllocator().CopyString((*A)->getName())); 2616 } 2617 Result.AddChunk(CodeCompletionString::CK_RightParen); 2618 return Result.TakeString(); 2619 } 2620 2621 assert(Kind == RK_Declaration && "Missed a result kind?"); 2622 const NamedDecl *ND = Declaration; 2623 Result.addParentContext(ND->getDeclContext()); 2624 2625 if (IncludeBriefComments) { 2626 // Add documentation comment, if it exists. 2627 if (const RawComment *RC = Ctx.getRawCommentForAnyRedecl(ND)) { 2628 Result.addBriefComment(RC->getBriefText(Ctx)); 2629 } 2630 else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 2631 if (OMD->isPropertyAccessor()) 2632 if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl()) 2633 if (const RawComment *RC = Ctx.getRawCommentForAnyRedecl(PDecl)) 2634 Result.addBriefComment(RC->getBriefText(Ctx)); 2635 } 2636 2637 if (StartsNestedNameSpecifier) { 2638 Result.AddTypedTextChunk( 2639 Result.getAllocator().CopyString(ND->getNameAsString())); 2640 Result.AddTextChunk("::"); 2641 return Result.TakeString(); 2642 } 2643 2644 for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) { 2645 if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) { 2646 Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation())); 2647 } 2648 } 2649 2650 AddResultTypeChunk(Ctx, Policy, ND, Result); 2651 2652 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) { 2653 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2654 Ctx, Policy); 2655 AddTypedNameChunk(Ctx, Policy, ND, Result); 2656 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2657 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2658 Result.AddChunk(CodeCompletionString::CK_RightParen); 2659 AddFunctionTypeQualsToCompletionString(Result, Function); 2660 return Result.TakeString(); 2661 } 2662 2663 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(ND)) { 2664 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2665 Ctx, Policy); 2666 FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 2667 AddTypedNameChunk(Ctx, Policy, Function, Result); 2668 2669 // Figure out which template parameters are deduced (or have default 2670 // arguments). 2671 llvm::SmallBitVector Deduced; 2672 Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 2673 unsigned LastDeducibleArgument; 2674 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 2675 --LastDeducibleArgument) { 2676 if (!Deduced[LastDeducibleArgument - 1]) { 2677 // C++0x: Figure out if the template argument has a default. If so, 2678 // the user doesn't need to type this argument. 2679 // FIXME: We need to abstract template parameters better! 2680 bool HasDefaultArg = false; 2681 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 2682 LastDeducibleArgument - 1); 2683 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 2684 HasDefaultArg = TTP->hasDefaultArgument(); 2685 else if (NonTypeTemplateParmDecl *NTTP 2686 = dyn_cast<NonTypeTemplateParmDecl>(Param)) 2687 HasDefaultArg = NTTP->hasDefaultArgument(); 2688 else { 2689 assert(isa<TemplateTemplateParmDecl>(Param)); 2690 HasDefaultArg 2691 = cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 2692 } 2693 2694 if (!HasDefaultArg) 2695 break; 2696 } 2697 } 2698 2699 if (LastDeducibleArgument) { 2700 // Some of the function template arguments cannot be deduced from a 2701 // function call, so we introduce an explicit template argument list 2702 // containing all of the arguments up to the first deducible argument. 2703 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2704 AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 2705 LastDeducibleArgument); 2706 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2707 } 2708 2709 // Add the function parameters 2710 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2711 AddFunctionParameterChunks(Ctx, Policy, Function, Result); 2712 Result.AddChunk(CodeCompletionString::CK_RightParen); 2713 AddFunctionTypeQualsToCompletionString(Result, Function); 2714 return Result.TakeString(); 2715 } 2716 2717 if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(ND)) { 2718 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2719 Ctx, Policy); 2720 Result.AddTypedTextChunk( 2721 Result.getAllocator().CopyString(Template->getNameAsString())); 2722 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 2723 AddTemplateParameterChunks(Ctx, Policy, Template, Result); 2724 Result.AddChunk(CodeCompletionString::CK_RightAngle); 2725 return Result.TakeString(); 2726 } 2727 2728 if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) { 2729 Selector Sel = Method->getSelector(); 2730 if (Sel.isUnarySelector()) { 2731 Result.AddTypedTextChunk(Result.getAllocator().CopyString( 2732 Sel.getNameForSlot(0))); 2733 return Result.TakeString(); 2734 } 2735 2736 std::string SelName = Sel.getNameForSlot(0).str(); 2737 SelName += ':'; 2738 if (StartParameter == 0) 2739 Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 2740 else { 2741 Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 2742 2743 // If there is only one parameter, and we're past it, add an empty 2744 // typed-text chunk since there is nothing to type. 2745 if (Method->param_size() == 1) 2746 Result.AddTypedTextChunk(""); 2747 } 2748 unsigned Idx = 0; 2749 for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(), 2750 PEnd = Method->param_end(); 2751 P != PEnd; (void)++P, ++Idx) { 2752 if (Idx > 0) { 2753 std::string Keyword; 2754 if (Idx > StartParameter) 2755 Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2756 if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 2757 Keyword += II->getName(); 2758 Keyword += ":"; 2759 if (Idx < StartParameter || AllParametersAreInformative) 2760 Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 2761 else 2762 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 2763 } 2764 2765 // If we're before the starting parameter, skip the placeholder. 2766 if (Idx < StartParameter) 2767 continue; 2768 2769 std::string Arg; 2770 2771 if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) 2772 Arg = FormatFunctionParameter(Ctx, Policy, *P, true); 2773 else { 2774 (*P)->getType().getAsStringInternal(Arg, Policy); 2775 Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) 2776 + Arg + ")"; 2777 if (IdentifierInfo *II = (*P)->getIdentifier()) 2778 if (DeclaringEntity || AllParametersAreInformative) 2779 Arg += II->getName(); 2780 } 2781 2782 if (Method->isVariadic() && (P + 1) == PEnd) 2783 Arg += ", ..."; 2784 2785 if (DeclaringEntity) 2786 Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 2787 else if (AllParametersAreInformative) 2788 Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 2789 else 2790 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 2791 } 2792 2793 if (Method->isVariadic()) { 2794 if (Method->param_size() == 0) { 2795 if (DeclaringEntity) 2796 Result.AddTextChunk(", ..."); 2797 else if (AllParametersAreInformative) 2798 Result.AddInformativeChunk(", ..."); 2799 else 2800 Result.AddPlaceholderChunk(", ..."); 2801 } 2802 2803 MaybeAddSentinel(Ctx, Method, Result); 2804 } 2805 2806 return Result.TakeString(); 2807 } 2808 2809 if (Qualifier) 2810 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 2811 Ctx, Policy); 2812 2813 Result.AddTypedTextChunk( 2814 Result.getAllocator().CopyString(ND->getNameAsString())); 2815 return Result.TakeString(); 2816 } 2817 2818 CodeCompletionString * 2819 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 2820 unsigned CurrentArg, 2821 Sema &S, 2822 CodeCompletionAllocator &Allocator, 2823 CodeCompletionTUInfo &CCTUInfo) const { 2824 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 2825 2826 // FIXME: Set priority, availability appropriately. 2827 CodeCompletionBuilder Result(Allocator,CCTUInfo, 1, CXAvailability_Available); 2828 FunctionDecl *FDecl = getFunction(); 2829 AddResultTypeChunk(S.Context, Policy, FDecl, Result); 2830 const FunctionProtoType *Proto 2831 = dyn_cast<FunctionProtoType>(getFunctionType()); 2832 if (!FDecl && !Proto) { 2833 // Function without a prototype. Just give the return type and a 2834 // highlighted ellipsis. 2835 const FunctionType *FT = getFunctionType(); 2836 Result.AddTextChunk(GetCompletionTypeString(FT->getResultType(), 2837 S.Context, Policy, 2838 Result.getAllocator())); 2839 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2840 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2841 Result.AddChunk(CodeCompletionString::CK_RightParen); 2842 return Result.TakeString(); 2843 } 2844 2845 if (FDecl) 2846 Result.AddTextChunk( 2847 Result.getAllocator().CopyString(FDecl->getNameAsString())); 2848 else 2849 Result.AddTextChunk( 2850 Result.getAllocator().CopyString( 2851 Proto->getResultType().getAsString(Policy))); 2852 2853 Result.AddChunk(CodeCompletionString::CK_LeftParen); 2854 unsigned NumParams = FDecl? FDecl->getNumParams() : Proto->getNumArgs(); 2855 for (unsigned I = 0; I != NumParams; ++I) { 2856 if (I) 2857 Result.AddChunk(CodeCompletionString::CK_Comma); 2858 2859 std::string ArgString; 2860 QualType ArgType; 2861 2862 if (FDecl) { 2863 ArgString = FDecl->getParamDecl(I)->getNameAsString(); 2864 ArgType = FDecl->getParamDecl(I)->getOriginalType(); 2865 } else { 2866 ArgType = Proto->getArgType(I); 2867 } 2868 2869 ArgType.getAsStringInternal(ArgString, Policy); 2870 2871 if (I == CurrentArg) 2872 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, 2873 Result.getAllocator().CopyString(ArgString)); 2874 else 2875 Result.AddTextChunk(Result.getAllocator().CopyString(ArgString)); 2876 } 2877 2878 if (Proto && Proto->isVariadic()) { 2879 Result.AddChunk(CodeCompletionString::CK_Comma); 2880 if (CurrentArg < NumParams) 2881 Result.AddTextChunk("..."); 2882 else 2883 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 2884 } 2885 Result.AddChunk(CodeCompletionString::CK_RightParen); 2886 2887 return Result.TakeString(); 2888 } 2889 2890 unsigned clang::getMacroUsagePriority(StringRef MacroName, 2891 const LangOptions &LangOpts, 2892 bool PreferredTypeIsPointer) { 2893 unsigned Priority = CCP_Macro; 2894 2895 // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 2896 if (MacroName.equals("nil") || MacroName.equals("NULL") || 2897 MacroName.equals("Nil")) { 2898 Priority = CCP_Constant; 2899 if (PreferredTypeIsPointer) 2900 Priority = Priority / CCF_SimilarTypeMatch; 2901 } 2902 // Treat "YES", "NO", "true", and "false" as constants. 2903 else if (MacroName.equals("YES") || MacroName.equals("NO") || 2904 MacroName.equals("true") || MacroName.equals("false")) 2905 Priority = CCP_Constant; 2906 // Treat "bool" as a type. 2907 else if (MacroName.equals("bool")) 2908 Priority = CCP_Type + (LangOpts.ObjC1? CCD_bool_in_ObjC : 0); 2909 2910 2911 return Priority; 2912 } 2913 2914 CXCursorKind clang::getCursorKindForDecl(const Decl *D) { 2915 if (!D) 2916 return CXCursor_UnexposedDecl; 2917 2918 switch (D->getKind()) { 2919 case Decl::Enum: return CXCursor_EnumDecl; 2920 case Decl::EnumConstant: return CXCursor_EnumConstantDecl; 2921 case Decl::Field: return CXCursor_FieldDecl; 2922 case Decl::Function: 2923 return CXCursor_FunctionDecl; 2924 case Decl::ObjCCategory: return CXCursor_ObjCCategoryDecl; 2925 case Decl::ObjCCategoryImpl: return CXCursor_ObjCCategoryImplDecl; 2926 case Decl::ObjCImplementation: return CXCursor_ObjCImplementationDecl; 2927 2928 case Decl::ObjCInterface: return CXCursor_ObjCInterfaceDecl; 2929 case Decl::ObjCIvar: return CXCursor_ObjCIvarDecl; 2930 case Decl::ObjCMethod: 2931 return cast<ObjCMethodDecl>(D)->isInstanceMethod() 2932 ? CXCursor_ObjCInstanceMethodDecl : CXCursor_ObjCClassMethodDecl; 2933 case Decl::CXXMethod: return CXCursor_CXXMethod; 2934 case Decl::CXXConstructor: return CXCursor_Constructor; 2935 case Decl::CXXDestructor: return CXCursor_Destructor; 2936 case Decl::CXXConversion: return CXCursor_ConversionFunction; 2937 case Decl::ObjCProperty: return CXCursor_ObjCPropertyDecl; 2938 case Decl::ObjCProtocol: return CXCursor_ObjCProtocolDecl; 2939 case Decl::ParmVar: return CXCursor_ParmDecl; 2940 case Decl::Typedef: return CXCursor_TypedefDecl; 2941 case Decl::TypeAlias: return CXCursor_TypeAliasDecl; 2942 case Decl::Var: return CXCursor_VarDecl; 2943 case Decl::Namespace: return CXCursor_Namespace; 2944 case Decl::NamespaceAlias: return CXCursor_NamespaceAlias; 2945 case Decl::TemplateTypeParm: return CXCursor_TemplateTypeParameter; 2946 case Decl::NonTypeTemplateParm:return CXCursor_NonTypeTemplateParameter; 2947 case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; 2948 case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; 2949 case Decl::ClassTemplate: return CXCursor_ClassTemplate; 2950 case Decl::AccessSpec: return CXCursor_CXXAccessSpecifier; 2951 case Decl::ClassTemplatePartialSpecialization: 2952 return CXCursor_ClassTemplatePartialSpecialization; 2953 case Decl::UsingDirective: return CXCursor_UsingDirective; 2954 case Decl::TranslationUnit: return CXCursor_TranslationUnit; 2955 2956 case Decl::Using: 2957 case Decl::UnresolvedUsingValue: 2958 case Decl::UnresolvedUsingTypename: 2959 return CXCursor_UsingDeclaration; 2960 2961 case Decl::ObjCPropertyImpl: 2962 switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 2963 case ObjCPropertyImplDecl::Dynamic: 2964 return CXCursor_ObjCDynamicDecl; 2965 2966 case ObjCPropertyImplDecl::Synthesize: 2967 return CXCursor_ObjCSynthesizeDecl; 2968 } 2969 2970 case Decl::Import: 2971 return CXCursor_ModuleImportDecl; 2972 2973 default: 2974 if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 2975 switch (TD->getTagKind()) { 2976 case TTK_Interface: // fall through 2977 case TTK_Struct: return CXCursor_StructDecl; 2978 case TTK_Class: return CXCursor_ClassDecl; 2979 case TTK_Union: return CXCursor_UnionDecl; 2980 case TTK_Enum: return CXCursor_EnumDecl; 2981 } 2982 } 2983 } 2984 2985 return CXCursor_UnexposedDecl; 2986 } 2987 2988 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 2989 bool IncludeUndefined, 2990 bool TargetTypeIsPointer = false) { 2991 typedef CodeCompletionResult Result; 2992 2993 Results.EnterNewScope(); 2994 2995 for (Preprocessor::macro_iterator M = PP.macro_begin(), 2996 MEnd = PP.macro_end(); 2997 M != MEnd; ++M) { 2998 if (IncludeUndefined || M->first->hasMacroDefinition()) 2999 Results.AddResult(Result(M->first, 3000 getMacroUsagePriority(M->first->getName(), 3001 PP.getLangOpts(), 3002 TargetTypeIsPointer))); 3003 } 3004 3005 Results.ExitScope(); 3006 3007 } 3008 3009 static void AddPrettyFunctionResults(const LangOptions &LangOpts, 3010 ResultBuilder &Results) { 3011 typedef CodeCompletionResult Result; 3012 3013 Results.EnterNewScope(); 3014 3015 Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 3016 Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 3017 if (LangOpts.C99 || LangOpts.CPlusPlus11) 3018 Results.AddResult(Result("__func__", CCP_Constant)); 3019 Results.ExitScope(); 3020 } 3021 3022 static void HandleCodeCompleteResults(Sema *S, 3023 CodeCompleteConsumer *CodeCompleter, 3024 CodeCompletionContext Context, 3025 CodeCompletionResult *Results, 3026 unsigned NumResults) { 3027 if (CodeCompleter) 3028 CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 3029 } 3030 3031 static enum CodeCompletionContext::Kind mapCodeCompletionContext(Sema &S, 3032 Sema::ParserCompletionContext PCC) { 3033 switch (PCC) { 3034 case Sema::PCC_Namespace: 3035 return CodeCompletionContext::CCC_TopLevel; 3036 3037 case Sema::PCC_Class: 3038 return CodeCompletionContext::CCC_ClassStructUnion; 3039 3040 case Sema::PCC_ObjCInterface: 3041 return CodeCompletionContext::CCC_ObjCInterface; 3042 3043 case Sema::PCC_ObjCImplementation: 3044 return CodeCompletionContext::CCC_ObjCImplementation; 3045 3046 case Sema::PCC_ObjCInstanceVariableList: 3047 return CodeCompletionContext::CCC_ObjCIvarList; 3048 3049 case Sema::PCC_Template: 3050 case Sema::PCC_MemberTemplate: 3051 if (S.CurContext->isFileContext()) 3052 return CodeCompletionContext::CCC_TopLevel; 3053 if (S.CurContext->isRecord()) 3054 return CodeCompletionContext::CCC_ClassStructUnion; 3055 return CodeCompletionContext::CCC_Other; 3056 3057 case Sema::PCC_RecoveryInFunction: 3058 return CodeCompletionContext::CCC_Recovery; 3059 3060 case Sema::PCC_ForInit: 3061 if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 3062 S.getLangOpts().ObjC1) 3063 return CodeCompletionContext::CCC_ParenthesizedExpression; 3064 else 3065 return CodeCompletionContext::CCC_Expression; 3066 3067 case Sema::PCC_Expression: 3068 case Sema::PCC_Condition: 3069 return CodeCompletionContext::CCC_Expression; 3070 3071 case Sema::PCC_Statement: 3072 return CodeCompletionContext::CCC_Statement; 3073 3074 case Sema::PCC_Type: 3075 return CodeCompletionContext::CCC_Type; 3076 3077 case Sema::PCC_ParenthesizedExpression: 3078 return CodeCompletionContext::CCC_ParenthesizedExpression; 3079 3080 case Sema::PCC_LocalDeclarationSpecifiers: 3081 return CodeCompletionContext::CCC_Type; 3082 } 3083 3084 llvm_unreachable("Invalid ParserCompletionContext!"); 3085 } 3086 3087 /// \brief If we're in a C++ virtual member function, add completion results 3088 /// that invoke the functions we override, since it's common to invoke the 3089 /// overridden function as well as adding new functionality. 3090 /// 3091 /// \param S The semantic analysis object for which we are generating results. 3092 /// 3093 /// \param InContext This context in which the nested-name-specifier preceding 3094 /// the code-completion point 3095 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 3096 ResultBuilder &Results) { 3097 // Look through blocks. 3098 DeclContext *CurContext = S.CurContext; 3099 while (isa<BlockDecl>(CurContext)) 3100 CurContext = CurContext->getParent(); 3101 3102 3103 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 3104 if (!Method || !Method->isVirtual()) 3105 return; 3106 3107 // We need to have names for all of the parameters, if we're going to 3108 // generate a forwarding call. 3109 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3110 PEnd = Method->param_end(); 3111 P != PEnd; 3112 ++P) { 3113 if (!(*P)->getDeclName()) 3114 return; 3115 } 3116 3117 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3118 for (CXXMethodDecl::method_iterator M = Method->begin_overridden_methods(), 3119 MEnd = Method->end_overridden_methods(); 3120 M != MEnd; ++M) { 3121 CodeCompletionBuilder Builder(Results.getAllocator(), 3122 Results.getCodeCompletionTUInfo()); 3123 const CXXMethodDecl *Overridden = *M; 3124 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 3125 continue; 3126 3127 // If we need a nested-name-specifier, add one now. 3128 if (!InContext) { 3129 NestedNameSpecifier *NNS 3130 = getRequiredQualification(S.Context, CurContext, 3131 Overridden->getDeclContext()); 3132 if (NNS) { 3133 std::string Str; 3134 llvm::raw_string_ostream OS(Str); 3135 NNS->print(OS, Policy); 3136 Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 3137 } 3138 } else if (!InContext->Equals(Overridden->getDeclContext())) 3139 continue; 3140 3141 Builder.AddTypedTextChunk(Results.getAllocator().CopyString( 3142 Overridden->getNameAsString())); 3143 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 3144 bool FirstParam = true; 3145 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 3146 PEnd = Method->param_end(); 3147 P != PEnd; ++P) { 3148 if (FirstParam) 3149 FirstParam = false; 3150 else 3151 Builder.AddChunk(CodeCompletionString::CK_Comma); 3152 3153 Builder.AddPlaceholderChunk(Results.getAllocator().CopyString( 3154 (*P)->getIdentifier()->getName())); 3155 } 3156 Builder.AddChunk(CodeCompletionString::CK_RightParen); 3157 Results.AddResult(CodeCompletionResult(Builder.TakeString(), 3158 CCP_SuperCompletion, 3159 CXCursor_CXXMethod, 3160 CXAvailability_Available, 3161 Overridden)); 3162 Results.Ignore(Overridden); 3163 } 3164 } 3165 3166 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 3167 ModuleIdPath Path) { 3168 typedef CodeCompletionResult Result; 3169 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3170 CodeCompleter->getCodeCompletionTUInfo(), 3171 CodeCompletionContext::CCC_Other); 3172 Results.EnterNewScope(); 3173 3174 CodeCompletionAllocator &Allocator = Results.getAllocator(); 3175 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 3176 typedef CodeCompletionResult Result; 3177 if (Path.empty()) { 3178 // Enumerate all top-level modules. 3179 SmallVector<Module *, 8> Modules; 3180 PP.getHeaderSearchInfo().collectAllModules(Modules); 3181 for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 3182 Builder.AddTypedTextChunk( 3183 Builder.getAllocator().CopyString(Modules[I]->Name)); 3184 Results.AddResult(Result(Builder.TakeString(), 3185 CCP_Declaration, 3186 CXCursor_ModuleImportDecl, 3187 Modules[I]->isAvailable() 3188 ? CXAvailability_Available 3189 : CXAvailability_NotAvailable)); 3190 } 3191 } else if (getLangOpts().Modules) { 3192 // Load the named module. 3193 Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path, 3194 Module::AllVisible, 3195 /*IsInclusionDirective=*/false); 3196 // Enumerate submodules. 3197 if (Mod) { 3198 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 3199 SubEnd = Mod->submodule_end(); 3200 Sub != SubEnd; ++Sub) { 3201 3202 Builder.AddTypedTextChunk( 3203 Builder.getAllocator().CopyString((*Sub)->Name)); 3204 Results.AddResult(Result(Builder.TakeString(), 3205 CCP_Declaration, 3206 CXCursor_ModuleImportDecl, 3207 (*Sub)->isAvailable() 3208 ? CXAvailability_Available 3209 : CXAvailability_NotAvailable)); 3210 } 3211 } 3212 } 3213 Results.ExitScope(); 3214 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3215 Results.data(),Results.size()); 3216 } 3217 3218 void Sema::CodeCompleteOrdinaryName(Scope *S, 3219 ParserCompletionContext CompletionContext) { 3220 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3221 CodeCompleter->getCodeCompletionTUInfo(), 3222 mapCodeCompletionContext(*this, CompletionContext)); 3223 Results.EnterNewScope(); 3224 3225 // Determine how to filter results, e.g., so that the names of 3226 // values (functions, enumerators, function templates, etc.) are 3227 // only allowed where we can have an expression. 3228 switch (CompletionContext) { 3229 case PCC_Namespace: 3230 case PCC_Class: 3231 case PCC_ObjCInterface: 3232 case PCC_ObjCImplementation: 3233 case PCC_ObjCInstanceVariableList: 3234 case PCC_Template: 3235 case PCC_MemberTemplate: 3236 case PCC_Type: 3237 case PCC_LocalDeclarationSpecifiers: 3238 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 3239 break; 3240 3241 case PCC_Statement: 3242 case PCC_ParenthesizedExpression: 3243 case PCC_Expression: 3244 case PCC_ForInit: 3245 case PCC_Condition: 3246 if (WantTypesInContext(CompletionContext, getLangOpts())) 3247 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3248 else 3249 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3250 3251 if (getLangOpts().CPlusPlus) 3252 MaybeAddOverrideCalls(*this, /*InContext=*/0, Results); 3253 break; 3254 3255 case PCC_RecoveryInFunction: 3256 // Unfiltered 3257 break; 3258 } 3259 3260 // If we are in a C++ non-static member function, check the qualifiers on 3261 // the member function to filter/prioritize the results list. 3262 if (CXXMethodDecl *CurMethod = dyn_cast<CXXMethodDecl>(CurContext)) 3263 if (CurMethod->isInstance()) 3264 Results.setObjectTypeQualifiers( 3265 Qualifiers::fromCVRMask(CurMethod->getTypeQualifiers())); 3266 3267 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3268 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3269 CodeCompleter->includeGlobals()); 3270 3271 AddOrdinaryNameResults(CompletionContext, S, *this, Results); 3272 Results.ExitScope(); 3273 3274 switch (CompletionContext) { 3275 case PCC_ParenthesizedExpression: 3276 case PCC_Expression: 3277 case PCC_Statement: 3278 case PCC_RecoveryInFunction: 3279 if (S->getFnParent()) 3280 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3281 break; 3282 3283 case PCC_Namespace: 3284 case PCC_Class: 3285 case PCC_ObjCInterface: 3286 case PCC_ObjCImplementation: 3287 case PCC_ObjCInstanceVariableList: 3288 case PCC_Template: 3289 case PCC_MemberTemplate: 3290 case PCC_ForInit: 3291 case PCC_Condition: 3292 case PCC_Type: 3293 case PCC_LocalDeclarationSpecifiers: 3294 break; 3295 } 3296 3297 if (CodeCompleter->includeMacros()) 3298 AddMacroResults(PP, Results, false); 3299 3300 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3301 Results.data(),Results.size()); 3302 } 3303 3304 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 3305 ParsedType Receiver, 3306 ArrayRef<IdentifierInfo *> SelIdents, 3307 bool AtArgumentExpression, 3308 bool IsSuper, 3309 ResultBuilder &Results); 3310 3311 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 3312 bool AllowNonIdentifiers, 3313 bool AllowNestedNameSpecifiers) { 3314 typedef CodeCompletionResult Result; 3315 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3316 CodeCompleter->getCodeCompletionTUInfo(), 3317 AllowNestedNameSpecifiers 3318 ? CodeCompletionContext::CCC_PotentiallyQualifiedName 3319 : CodeCompletionContext::CCC_Name); 3320 Results.EnterNewScope(); 3321 3322 // Type qualifiers can come after names. 3323 Results.AddResult(Result("const")); 3324 Results.AddResult(Result("volatile")); 3325 if (getLangOpts().C99) 3326 Results.AddResult(Result("restrict")); 3327 3328 if (getLangOpts().CPlusPlus) { 3329 if (AllowNonIdentifiers) { 3330 Results.AddResult(Result("operator")); 3331 } 3332 3333 // Add nested-name-specifiers. 3334 if (AllowNestedNameSpecifiers) { 3335 Results.allowNestedNameSpecifiers(); 3336 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 3337 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3338 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 3339 CodeCompleter->includeGlobals()); 3340 Results.setFilter(0); 3341 } 3342 } 3343 Results.ExitScope(); 3344 3345 // If we're in a context where we might have an expression (rather than a 3346 // declaration), and what we've seen so far is an Objective-C type that could 3347 // be a receiver of a class message, this may be a class message send with 3348 // the initial opening bracket '[' missing. Add appropriate completions. 3349 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 3350 DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier && 3351 DS.getTypeSpecType() == DeclSpec::TST_typename && 3352 DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 3353 DS.getTypeSpecSign() == DeclSpec::TSS_unspecified && 3354 !DS.isTypeAltiVecVector() && 3355 S && 3356 (S->getFlags() & Scope::DeclScope) != 0 && 3357 (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 3358 Scope::FunctionPrototypeScope | 3359 Scope::AtCatchScope)) == 0) { 3360 ParsedType T = DS.getRepAsType(); 3361 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 3362 AddClassMessageCompletions(*this, S, T, None, false, false, Results); 3363 } 3364 3365 // Note that we intentionally suppress macro results here, since we do not 3366 // encourage using macros to produce the names of entities. 3367 3368 HandleCodeCompleteResults(this, CodeCompleter, 3369 Results.getCompletionContext(), 3370 Results.data(), Results.size()); 3371 } 3372 3373 struct Sema::CodeCompleteExpressionData { 3374 CodeCompleteExpressionData(QualType PreferredType = QualType()) 3375 : PreferredType(PreferredType), IntegralConstantExpression(false), 3376 ObjCCollection(false) { } 3377 3378 QualType PreferredType; 3379 bool IntegralConstantExpression; 3380 bool ObjCCollection; 3381 SmallVector<Decl *, 4> IgnoreDecls; 3382 }; 3383 3384 /// \brief Perform code-completion in an expression context when we know what 3385 /// type we're looking for. 3386 void Sema::CodeCompleteExpression(Scope *S, 3387 const CodeCompleteExpressionData &Data) { 3388 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3389 CodeCompleter->getCodeCompletionTUInfo(), 3390 CodeCompletionContext::CCC_Expression); 3391 if (Data.ObjCCollection) 3392 Results.setFilter(&ResultBuilder::IsObjCCollection); 3393 else if (Data.IntegralConstantExpression) 3394 Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 3395 else if (WantTypesInContext(PCC_Expression, getLangOpts())) 3396 Results.setFilter(&ResultBuilder::IsOrdinaryName); 3397 else 3398 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 3399 3400 if (!Data.PreferredType.isNull()) 3401 Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 3402 3403 // Ignore any declarations that we were told that we don't care about. 3404 for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 3405 Results.Ignore(Data.IgnoreDecls[I]); 3406 3407 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3408 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 3409 CodeCompleter->includeGlobals()); 3410 3411 Results.EnterNewScope(); 3412 AddOrdinaryNameResults(PCC_Expression, S, *this, Results); 3413 Results.ExitScope(); 3414 3415 bool PreferredTypeIsPointer = false; 3416 if (!Data.PreferredType.isNull()) 3417 PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() 3418 || Data.PreferredType->isMemberPointerType() 3419 || Data.PreferredType->isBlockPointerType(); 3420 3421 if (S->getFnParent() && 3422 !Data.ObjCCollection && 3423 !Data.IntegralConstantExpression) 3424 AddPrettyFunctionResults(PP.getLangOpts(), Results); 3425 3426 if (CodeCompleter->includeMacros()) 3427 AddMacroResults(PP, Results, false, PreferredTypeIsPointer); 3428 HandleCodeCompleteResults(this, CodeCompleter, 3429 CodeCompletionContext(CodeCompletionContext::CCC_Expression, 3430 Data.PreferredType), 3431 Results.data(),Results.size()); 3432 } 3433 3434 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) { 3435 if (E.isInvalid()) 3436 CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction); 3437 else if (getLangOpts().ObjC1) 3438 CodeCompleteObjCInstanceMessage(S, E.take(), None, false); 3439 } 3440 3441 /// \brief The set of properties that have already been added, referenced by 3442 /// property name. 3443 typedef llvm::SmallPtrSet<IdentifierInfo*, 16> AddedPropertiesSet; 3444 3445 /// \brief Retrieve the container definition, if any? 3446 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 3447 if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 3448 if (Interface->hasDefinition()) 3449 return Interface->getDefinition(); 3450 3451 return Interface; 3452 } 3453 3454 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3455 if (Protocol->hasDefinition()) 3456 return Protocol->getDefinition(); 3457 3458 return Protocol; 3459 } 3460 return Container; 3461 } 3462 3463 static void AddObjCProperties(ObjCContainerDecl *Container, 3464 bool AllowCategories, 3465 bool AllowNullaryMethods, 3466 DeclContext *CurContext, 3467 AddedPropertiesSet &AddedProperties, 3468 ResultBuilder &Results) { 3469 typedef CodeCompletionResult Result; 3470 3471 // Retrieve the definition. 3472 Container = getContainerDef(Container); 3473 3474 // Add properties in this container. 3475 for (ObjCContainerDecl::prop_iterator P = Container->prop_begin(), 3476 PEnd = Container->prop_end(); 3477 P != PEnd; 3478 ++P) { 3479 if (AddedProperties.insert(P->getIdentifier())) 3480 Results.MaybeAddResult(Result(*P, Results.getBasePriority(*P), 0), 3481 CurContext); 3482 } 3483 3484 // Add nullary methods 3485 if (AllowNullaryMethods) { 3486 ASTContext &Context = Container->getASTContext(); 3487 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 3488 for (ObjCContainerDecl::method_iterator M = Container->meth_begin(), 3489 MEnd = Container->meth_end(); 3490 M != MEnd; ++M) { 3491 if (M->getSelector().isUnarySelector()) 3492 if (IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0)) 3493 if (AddedProperties.insert(Name)) { 3494 CodeCompletionBuilder Builder(Results.getAllocator(), 3495 Results.getCodeCompletionTUInfo()); 3496 AddResultTypeChunk(Context, Policy, *M, Builder); 3497 Builder.AddTypedTextChunk( 3498 Results.getAllocator().CopyString(Name->getName())); 3499 3500 Results.MaybeAddResult(Result(Builder.TakeString(), *M, 3501 CCP_MemberDeclaration + CCD_MethodAsProperty), 3502 CurContext); 3503 } 3504 } 3505 } 3506 3507 3508 // Add properties in referenced protocols. 3509 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 3510 for (ObjCProtocolDecl::protocol_iterator P = Protocol->protocol_begin(), 3511 PEnd = Protocol->protocol_end(); 3512 P != PEnd; ++P) 3513 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3514 AddedProperties, Results); 3515 } else if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)){ 3516 if (AllowCategories) { 3517 // Look through categories. 3518 for (ObjCInterfaceDecl::known_categories_iterator 3519 Cat = IFace->known_categories_begin(), 3520 CatEnd = IFace->known_categories_end(); 3521 Cat != CatEnd; ++Cat) 3522 AddObjCProperties(*Cat, AllowCategories, AllowNullaryMethods, 3523 CurContext, AddedProperties, Results); 3524 } 3525 3526 // Look through protocols. 3527 for (ObjCInterfaceDecl::all_protocol_iterator 3528 I = IFace->all_referenced_protocol_begin(), 3529 E = IFace->all_referenced_protocol_end(); I != E; ++I) 3530 AddObjCProperties(*I, AllowCategories, AllowNullaryMethods, CurContext, 3531 AddedProperties, Results); 3532 3533 // Look in the superclass. 3534 if (IFace->getSuperClass()) 3535 AddObjCProperties(IFace->getSuperClass(), AllowCategories, 3536 AllowNullaryMethods, CurContext, 3537 AddedProperties, Results); 3538 } else if (const ObjCCategoryDecl *Category 3539 = dyn_cast<ObjCCategoryDecl>(Container)) { 3540 // Look through protocols. 3541 for (ObjCCategoryDecl::protocol_iterator P = Category->protocol_begin(), 3542 PEnd = Category->protocol_end(); 3543 P != PEnd; ++P) 3544 AddObjCProperties(*P, AllowCategories, AllowNullaryMethods, CurContext, 3545 AddedProperties, Results); 3546 } 3547 } 3548 3549 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 3550 SourceLocation OpLoc, 3551 bool IsArrow) { 3552 if (!Base || !CodeCompleter) 3553 return; 3554 3555 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 3556 if (ConvertedBase.isInvalid()) 3557 return; 3558 Base = ConvertedBase.get(); 3559 3560 typedef CodeCompletionResult Result; 3561 3562 QualType BaseType = Base->getType(); 3563 3564 if (IsArrow) { 3565 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 3566 BaseType = Ptr->getPointeeType(); 3567 else if (BaseType->isObjCObjectPointerType()) 3568 /*Do nothing*/ ; 3569 else 3570 return; 3571 } 3572 3573 enum CodeCompletionContext::Kind contextKind; 3574 3575 if (IsArrow) { 3576 contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 3577 } 3578 else { 3579 if (BaseType->isObjCObjectPointerType() || 3580 BaseType->isObjCObjectOrInterfaceType()) { 3581 contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 3582 } 3583 else { 3584 contextKind = CodeCompletionContext::CCC_DotMemberAccess; 3585 } 3586 } 3587 3588 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3589 CodeCompleter->getCodeCompletionTUInfo(), 3590 CodeCompletionContext(contextKind, 3591 BaseType), 3592 &ResultBuilder::IsMember); 3593 Results.EnterNewScope(); 3594 if (const RecordType *Record = BaseType->getAs<RecordType>()) { 3595 // Indicate that we are performing a member access, and the cv-qualifiers 3596 // for the base object type. 3597 Results.setObjectTypeQualifiers(BaseType.getQualifiers()); 3598 3599 // Access to a C/C++ class, struct, or union. 3600 Results.allowNestedNameSpecifiers(); 3601 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3602 LookupVisibleDecls(Record->getDecl(), LookupMemberName, Consumer, 3603 CodeCompleter->includeGlobals()); 3604 3605 if (getLangOpts().CPlusPlus) { 3606 if (!Results.empty()) { 3607 // The "template" keyword can follow "->" or "." in the grammar. 3608 // However, we only want to suggest the template keyword if something 3609 // is dependent. 3610 bool IsDependent = BaseType->isDependentType(); 3611 if (!IsDependent) { 3612 for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 3613 if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { 3614 IsDependent = Ctx->isDependentContext(); 3615 break; 3616 } 3617 } 3618 3619 if (IsDependent) 3620 Results.AddResult(Result("template")); 3621 } 3622 } 3623 } else if (!IsArrow && BaseType->getAsObjCInterfacePointerType()) { 3624 // Objective-C property reference. 3625 AddedPropertiesSet AddedProperties; 3626 3627 // Add property results based on our interface. 3628 const ObjCObjectPointerType *ObjCPtr 3629 = BaseType->getAsObjCInterfacePointerType(); 3630 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 3631 AddObjCProperties(ObjCPtr->getInterfaceDecl(), true, 3632 /*AllowNullaryMethods=*/true, CurContext, 3633 AddedProperties, Results); 3634 3635 // Add properties from the protocols in a qualified interface. 3636 for (ObjCObjectPointerType::qual_iterator I = ObjCPtr->qual_begin(), 3637 E = ObjCPtr->qual_end(); 3638 I != E; ++I) 3639 AddObjCProperties(*I, true, /*AllowNullaryMethods=*/true, CurContext, 3640 AddedProperties, Results); 3641 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 3642 (!IsArrow && BaseType->isObjCObjectType())) { 3643 // Objective-C instance variable access. 3644 ObjCInterfaceDecl *Class = 0; 3645 if (const ObjCObjectPointerType *ObjCPtr 3646 = BaseType->getAs<ObjCObjectPointerType>()) 3647 Class = ObjCPtr->getInterfaceDecl(); 3648 else 3649 Class = BaseType->getAs<ObjCObjectType>()->getInterface(); 3650 3651 // Add all ivars from this class and its superclasses. 3652 if (Class) { 3653 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3654 Results.setFilter(&ResultBuilder::IsObjCIvar); 3655 LookupVisibleDecls(Class, LookupMemberName, Consumer, 3656 CodeCompleter->includeGlobals()); 3657 } 3658 } 3659 3660 // FIXME: How do we cope with isa? 3661 3662 Results.ExitScope(); 3663 3664 // Hand off the results found for code completion. 3665 HandleCodeCompleteResults(this, CodeCompleter, 3666 Results.getCompletionContext(), 3667 Results.data(),Results.size()); 3668 } 3669 3670 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 3671 if (!CodeCompleter) 3672 return; 3673 3674 ResultBuilder::LookupFilter Filter = 0; 3675 enum CodeCompletionContext::Kind ContextKind 3676 = CodeCompletionContext::CCC_Other; 3677 switch ((DeclSpec::TST)TagSpec) { 3678 case DeclSpec::TST_enum: 3679 Filter = &ResultBuilder::IsEnum; 3680 ContextKind = CodeCompletionContext::CCC_EnumTag; 3681 break; 3682 3683 case DeclSpec::TST_union: 3684 Filter = &ResultBuilder::IsUnion; 3685 ContextKind = CodeCompletionContext::CCC_UnionTag; 3686 break; 3687 3688 case DeclSpec::TST_struct: 3689 case DeclSpec::TST_class: 3690 case DeclSpec::TST_interface: 3691 Filter = &ResultBuilder::IsClassOrStruct; 3692 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 3693 break; 3694 3695 default: 3696 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 3697 } 3698 3699 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3700 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 3701 CodeCompletionDeclConsumer Consumer(Results, CurContext); 3702 3703 // First pass: look for tags. 3704 Results.setFilter(Filter); 3705 LookupVisibleDecls(S, LookupTagName, Consumer, 3706 CodeCompleter->includeGlobals()); 3707 3708 if (CodeCompleter->includeGlobals()) { 3709 // Second pass: look for nested name specifiers. 3710 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 3711 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer); 3712 } 3713 3714 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 3715 Results.data(),Results.size()); 3716 } 3717 3718 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 3719 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3720 CodeCompleter->getCodeCompletionTUInfo(), 3721 CodeCompletionContext::CCC_TypeQualifiers); 3722 Results.EnterNewScope(); 3723 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 3724 Results.AddResult("const"); 3725 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 3726 Results.AddResult("volatile"); 3727 if (getLangOpts().C99 && 3728 !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 3729 Results.AddResult("restrict"); 3730 if (getLangOpts().C11 && 3731 !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic)) 3732 Results.AddResult("_Atomic"); 3733 Results.ExitScope(); 3734 HandleCodeCompleteResults(this, CodeCompleter, 3735 Results.getCompletionContext(), 3736 Results.data(), Results.size()); 3737 } 3738 3739 void Sema::CodeCompleteCase(Scope *S) { 3740 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 3741 return; 3742 3743 SwitchStmt *Switch = getCurFunction()->SwitchStack.back(); 3744 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 3745 if (!type->isEnumeralType()) { 3746 CodeCompleteExpressionData Data(type); 3747 Data.IntegralConstantExpression = true; 3748 CodeCompleteExpression(S, Data); 3749 return; 3750 } 3751 3752 // Code-complete the cases of a switch statement over an enumeration type 3753 // by providing the list of 3754 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 3755 if (EnumDecl *Def = Enum->getDefinition()) 3756 Enum = Def; 3757 3758 // Determine which enumerators we have already seen in the switch statement. 3759 // FIXME: Ideally, we would also be able to look *past* the code-completion 3760 // token, in case we are code-completing in the middle of the switch and not 3761 // at the end. However, we aren't able to do so at the moment. 3762 llvm::SmallPtrSet<EnumConstantDecl *, 8> EnumeratorsSeen; 3763 NestedNameSpecifier *Qualifier = 0; 3764 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 3765 SC = SC->getNextSwitchCase()) { 3766 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 3767 if (!Case) 3768 continue; 3769 3770 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 3771 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 3772 if (EnumConstantDecl *Enumerator 3773 = dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 3774 // We look into the AST of the case statement to determine which 3775 // enumerator was named. Alternatively, we could compute the value of 3776 // the integral constant expression, then compare it against the 3777 // values of each enumerator. However, value-based approach would not 3778 // work as well with C++ templates where enumerators declared within a 3779 // template are type- and value-dependent. 3780 EnumeratorsSeen.insert(Enumerator); 3781 3782 // If this is a qualified-id, keep track of the nested-name-specifier 3783 // so that we can reproduce it as part of code completion, e.g., 3784 // 3785 // switch (TagD.getKind()) { 3786 // case TagDecl::TK_enum: 3787 // break; 3788 // case XXX 3789 // 3790 // At the XXX, our completions are TagDecl::TK_union, 3791 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 3792 // TK_struct, and TK_class. 3793 Qualifier = DRE->getQualifier(); 3794 } 3795 } 3796 3797 if (getLangOpts().CPlusPlus && !Qualifier && EnumeratorsSeen.empty()) { 3798 // If there are no prior enumerators in C++, check whether we have to 3799 // qualify the names of the enumerators that we suggest, because they 3800 // may not be visible in this scope. 3801 Qualifier = getRequiredQualification(Context, CurContext, Enum); 3802 } 3803 3804 // Add any enumerators that have not yet been mentioned. 3805 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 3806 CodeCompleter->getCodeCompletionTUInfo(), 3807 CodeCompletionContext::CCC_Expression); 3808 Results.EnterNewScope(); 3809 for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), 3810 EEnd = Enum->enumerator_end(); 3811 E != EEnd; ++E) { 3812 if (EnumeratorsSeen.count(*E)) 3813 continue; 3814 3815 CodeCompletionResult R(*E, CCP_EnumInCase, Qualifier); 3816 Results.AddResult(R, CurContext, 0, false); 3817 } 3818 Results.ExitScope(); 3819 3820 //We need to make sure we're setting the right context, 3821 //so only say we include macros if the code completer says we do 3822 enum CodeCompletionContext::Kind kind = CodeCompletionContext::CCC_Other; 3823 if (CodeCompleter->includeMacros()) { 3824 AddMacroResults(PP, Results, false); 3825 kind = CodeCompletionContext::CCC_OtherWithMacros; 3826 } 3827 3828 HandleCodeCompleteResults(this, CodeCompleter, 3829 kind, 3830 Results.data(),Results.size()); 3831 } 3832 3833 namespace { 3834 struct IsBetterOverloadCandidate { 3835 Sema &S; 3836 SourceLocation Loc; 3837 3838 public: 3839 explicit IsBetterOverloadCandidate(Sema &S, SourceLocation Loc) 3840 : S(S), Loc(Loc) { } 3841 3842 bool 3843 operator()(const OverloadCandidate &X, const OverloadCandidate &Y) const { 3844 return isBetterOverloadCandidate(S, X, Y, Loc); 3845 } 3846 }; 3847 } 3848 3849 static bool anyNullArgument