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