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