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 return Policy; 1900 } 1901 1902 /// Retrieve a printing policy suitable for code completion. 1903 static PrintingPolicy getCompletionPrintingPolicy(Sema &S) { 1904 return getCompletionPrintingPolicy(S.Context, S.PP); 1905 } 1906 1907 /// Retrieve the string representation of the given type as a string 1908 /// that has the appropriate lifetime for code completion. 1909 /// 1910 /// This routine provides a fast path where we provide constant strings for 1911 /// common type names. 1912 static const char *GetCompletionTypeString(QualType T, ASTContext &Context, 1913 const PrintingPolicy &Policy, 1914 CodeCompletionAllocator &Allocator) { 1915 if (!T.getLocalQualifiers()) { 1916 // Built-in type names are constant strings. 1917 if (const BuiltinType *BT = dyn_cast<BuiltinType>(T)) 1918 return BT->getNameAsCString(Policy); 1919 1920 // Anonymous tag types are constant strings. 1921 if (const TagType *TagT = dyn_cast<TagType>(T)) 1922 if (TagDecl *Tag = TagT->getDecl()) 1923 if (!Tag->hasNameForLinkage()) { 1924 switch (Tag->getTagKind()) { 1925 case TTK_Struct: 1926 return "struct <anonymous>"; 1927 case TTK_Interface: 1928 return "__interface <anonymous>"; 1929 case TTK_Class: 1930 return "class <anonymous>"; 1931 case TTK_Union: 1932 return "union <anonymous>"; 1933 case TTK_Enum: 1934 return "enum <anonymous>"; 1935 } 1936 } 1937 } 1938 1939 // Slow path: format the type as a string. 1940 std::string Result; 1941 T.getAsStringInternal(Result, Policy); 1942 return Allocator.CopyString(Result); 1943 } 1944 1945 /// Add a completion for "this", if we're in a member function. 1946 static void addThisCompletion(Sema &S, ResultBuilder &Results) { 1947 QualType ThisTy = S.getCurrentThisType(); 1948 if (ThisTy.isNull()) 1949 return; 1950 1951 CodeCompletionAllocator &Allocator = Results.getAllocator(); 1952 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 1953 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 1954 Builder.AddResultTypeChunk( 1955 GetCompletionTypeString(ThisTy, S.Context, Policy, Allocator)); 1956 Builder.AddTypedTextChunk("this"); 1957 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1958 } 1959 1960 static void AddStaticAssertResult(CodeCompletionBuilder &Builder, 1961 ResultBuilder &Results, 1962 const LangOptions &LangOpts) { 1963 if (!LangOpts.CPlusPlus11) 1964 return; 1965 1966 Builder.AddTypedTextChunk("static_assert"); 1967 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 1968 Builder.AddPlaceholderChunk("expression"); 1969 Builder.AddChunk(CodeCompletionString::CK_Comma); 1970 Builder.AddPlaceholderChunk("message"); 1971 Builder.AddChunk(CodeCompletionString::CK_RightParen); 1972 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 1973 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 1974 } 1975 1976 static void AddOverrideResults(ResultBuilder &Results, 1977 const CodeCompletionContext &CCContext, 1978 CodeCompletionBuilder &Builder) { 1979 Sema &S = Results.getSema(); 1980 const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.CurContext); 1981 // If not inside a class/struct/union return empty. 1982 if (!CR) 1983 return; 1984 // First store overrides within current class. 1985 // These are stored by name to make querying fast in the later step. 1986 llvm::StringMap<std::vector<FunctionDecl *>> Overrides; 1987 for (auto *Method : CR->methods()) { 1988 if (!Method->isVirtual() || !Method->getIdentifier()) 1989 continue; 1990 Overrides[Method->getName()].push_back(Method); 1991 } 1992 1993 for (const auto &Base : CR->bases()) { 1994 const auto *BR = Base.getType().getTypePtr()->getAsCXXRecordDecl(); 1995 if (!BR) 1996 continue; 1997 for (auto *Method : BR->methods()) { 1998 if (!Method->isVirtual() || !Method->getIdentifier()) 1999 continue; 2000 const auto it = Overrides.find(Method->getName()); 2001 bool IsOverriden = false; 2002 if (it != Overrides.end()) { 2003 for (auto *MD : it->second) { 2004 // If the method in current body is not an overload of this virtual 2005 // function, then it overrides this one. 2006 if (!S.IsOverload(MD, Method, false)) { 2007 IsOverriden = true; 2008 break; 2009 } 2010 } 2011 } 2012 if (!IsOverriden) { 2013 // Generates a new CodeCompletionResult by taking this function and 2014 // converting it into an override declaration with only one chunk in the 2015 // final CodeCompletionString as a TypedTextChunk. 2016 std::string OverrideSignature; 2017 llvm::raw_string_ostream OS(OverrideSignature); 2018 CodeCompletionResult CCR(Method, 0); 2019 PrintingPolicy Policy = 2020 getCompletionPrintingPolicy(S.getASTContext(), S.getPreprocessor()); 2021 auto *CCS = CCR.createCodeCompletionStringForOverride( 2022 S.getPreprocessor(), S.getASTContext(), Builder, 2023 /*IncludeBriefComments=*/false, CCContext, Policy); 2024 Results.AddResult(CodeCompletionResult(CCS, Method, CCP_CodePattern)); 2025 } 2026 } 2027 } 2028 } 2029 2030 /// Add language constructs that show up for "ordinary" names. 2031 static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, Scope *S, 2032 Sema &SemaRef, ResultBuilder &Results) { 2033 CodeCompletionAllocator &Allocator = Results.getAllocator(); 2034 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 2035 2036 typedef CodeCompletionResult Result; 2037 switch (CCC) { 2038 case Sema::PCC_Namespace: 2039 if (SemaRef.getLangOpts().CPlusPlus) { 2040 if (Results.includeCodePatterns()) { 2041 // namespace <identifier> { declarations } 2042 Builder.AddTypedTextChunk("namespace"); 2043 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2044 Builder.AddPlaceholderChunk("identifier"); 2045 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2046 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 2047 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 2048 Builder.AddPlaceholderChunk("declarations"); 2049 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 2050 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 2051 Results.AddResult(Result(Builder.TakeString())); 2052 } 2053 2054 // namespace identifier = identifier ; 2055 Builder.AddTypedTextChunk("namespace"); 2056 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2057 Builder.AddPlaceholderChunk("name"); 2058 Builder.AddChunk(CodeCompletionString::CK_Equal); 2059 Builder.AddPlaceholderChunk("namespace"); 2060 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 2061 Results.AddResult(Result(Builder.TakeString())); 2062 2063 // Using directives 2064 Builder.AddTypedTextChunk("using namespace"); 2065 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2066 Builder.AddPlaceholderChunk("identifier"); 2067 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 2068 Results.AddResult(Result(Builder.TakeString())); 2069 2070 // asm(string-literal) 2071 Builder.AddTypedTextChunk("asm"); 2072 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 2073 Builder.AddPlaceholderChunk("string-literal"); 2074 Builder.AddChunk(CodeCompletionString::CK_RightParen); 2075 Results.AddResult(Result(Builder.TakeString())); 2076 2077 if (Results.includeCodePatterns()) { 2078 // Explicit template instantiation 2079 Builder.AddTypedTextChunk("template"); 2080 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2081 Builder.AddPlaceholderChunk("declaration"); 2082 Results.AddResult(Result(Builder.TakeString())); 2083 } else { 2084 Results.AddResult(Result("template", CodeCompletionResult::RK_Keyword)); 2085 } 2086 } 2087 2088 if (SemaRef.getLangOpts().ObjC) 2089 AddObjCTopLevelResults(Results, true); 2090 2091 AddTypedefResult(Results); 2092 LLVM_FALLTHROUGH; 2093 2094 case Sema::PCC_Class: 2095 if (SemaRef.getLangOpts().CPlusPlus) { 2096 // Using declaration 2097 Builder.AddTypedTextChunk("using"); 2098 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2099 Builder.AddPlaceholderChunk("qualifier"); 2100 Builder.AddTextChunk("::"); 2101 Builder.AddPlaceholderChunk("name"); 2102 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 2103 Results.AddResult(Result(Builder.TakeString())); 2104 2105 if (SemaRef.getLangOpts().CPlusPlus11) 2106 AddUsingAliasResult(Builder, Results); 2107 2108 // using typename qualifier::name (only in a dependent context) 2109 if (SemaRef.CurContext->isDependentContext()) { 2110 Builder.AddTypedTextChunk("using typename"); 2111 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 2112 Builder.AddPlaceholderChunk("qualifier"); 2113 Builder.AddTextChunk("::"); 2114 Builder.AddPlaceholderChunk("name"); 2115 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 2116 Results.AddResult(Result(Builder.TakeString())); 2117 } 2118 2119 AddStaticAssertResult(Builder, Results, SemaRef.getLangOpts()); 2120 2121 if (CCC == Sema::PCC_Class) { 2122 AddTypedefResult(Results); 2123 2124 bool IsNotInheritanceScope = 2125 !(S->getFlags() & Scope::ClassInheritanceScope); 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()->getName()); 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()->getName(); 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()->getName()); 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()->getName(); 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()->getName(); 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()->getName()); 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()->getName(); 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 = Base.isNull() 5523 ? nullptr 5524 : llvm::dyn_cast<CXXRecordDecl>(getAsRecordDecl(Base)); 5525 if (RD && RD->isCompleteDefinition()) { 5526 // Look up member heuristically, including in bases. 5527 for (const auto *Member : RD->lookupDependentName( 5528 CDSME->getMember(), [](const NamedDecl *Member) { 5529 return llvm::isa<ValueDecl>(Member); 5530 })) { 5531 return llvm::cast<ValueDecl>(Member)->getType().getNonReferenceType(); 5532 } 5533 } 5534 } 5535 return Unresolved; 5536 } 5537 5538 // If \p Base is ParenListExpr, assume a chain of comma operators and pick the 5539 // last expr. We expect other ParenListExprs to be resolved to e.g. constructor 5540 // calls before here. (So the ParenListExpr should be nonempty, but check just 5541 // in case) 5542 Expr *unwrapParenList(Expr *Base) { 5543 if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) { 5544 if (PLE->getNumExprs() == 0) 5545 return nullptr; 5546 Base = PLE->getExpr(PLE->getNumExprs() - 1); 5547 } 5548 return Base; 5549 } 5550 5551 } // namespace 5552 5553 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 5554 Expr *OtherOpBase, 5555 SourceLocation OpLoc, bool IsArrow, 5556 bool IsBaseExprStatement, 5557 QualType PreferredType) { 5558 Base = unwrapParenList(Base); 5559 OtherOpBase = unwrapParenList(OtherOpBase); 5560 if (!Base || !CodeCompleter) 5561 return; 5562 5563 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 5564 if (ConvertedBase.isInvalid()) 5565 return; 5566 QualType ConvertedBaseType = getApproximateType(ConvertedBase.get()); 5567 5568 enum CodeCompletionContext::Kind contextKind; 5569 5570 if (IsArrow) { 5571 if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>()) 5572 ConvertedBaseType = Ptr->getPointeeType(); 5573 } 5574 5575 if (IsArrow) { 5576 contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 5577 } else { 5578 if (ConvertedBaseType->isObjCObjectPointerType() || 5579 ConvertedBaseType->isObjCObjectOrInterfaceType()) { 5580 contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 5581 } else { 5582 contextKind = CodeCompletionContext::CCC_DotMemberAccess; 5583 } 5584 } 5585 5586 CodeCompletionContext CCContext(contextKind, ConvertedBaseType); 5587 CCContext.setPreferredType(PreferredType); 5588 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5589 CodeCompleter->getCodeCompletionTUInfo(), CCContext, 5590 &ResultBuilder::IsMember); 5591 5592 auto DoCompletion = [&](Expr *Base, bool IsArrow, 5593 Optional<FixItHint> AccessOpFixIt) -> bool { 5594 if (!Base) 5595 return false; 5596 5597 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 5598 if (ConvertedBase.isInvalid()) 5599 return false; 5600 Base = ConvertedBase.get(); 5601 5602 QualType BaseType = getApproximateType(Base); 5603 if (BaseType.isNull()) 5604 return false; 5605 ExprValueKind BaseKind = Base->getValueKind(); 5606 5607 if (IsArrow) { 5608 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) { 5609 BaseType = Ptr->getPointeeType(); 5610 BaseKind = VK_LValue; 5611 } else if (BaseType->isObjCObjectPointerType() || 5612 BaseType->isTemplateTypeParmType()) { 5613 // Both cases (dot/arrow) handled below. 5614 } else { 5615 return false; 5616 } 5617 } 5618 5619 if (RecordDecl *RD = getAsRecordDecl(BaseType)) { 5620 AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind, 5621 RD, std::move(AccessOpFixIt)); 5622 } else if (const auto *TTPT = 5623 dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) { 5624 auto Operator = 5625 IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot; 5626 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 5627 if (R.Operator != Operator) 5628 continue; 5629 CodeCompletionResult Result( 5630 R.render(*this, CodeCompleter->getAllocator(), 5631 CodeCompleter->getCodeCompletionTUInfo())); 5632 if (AccessOpFixIt) 5633 Result.FixIts.push_back(*AccessOpFixIt); 5634 Results.AddResult(std::move(Result)); 5635 } 5636 } else if (!IsArrow && BaseType->isObjCObjectPointerType()) { 5637 // Objective-C property reference. Bail if we're performing fix-it code 5638 // completion since Objective-C properties are normally backed by ivars, 5639 // most Objective-C fix-its here would have little value. 5640 if (AccessOpFixIt.hasValue()) { 5641 return false; 5642 } 5643 AddedPropertiesSet AddedProperties; 5644 5645 if (const ObjCObjectPointerType *ObjCPtr = 5646 BaseType->getAsObjCInterfacePointerType()) { 5647 // Add property results based on our interface. 5648 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 5649 AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true, 5650 /*AllowNullaryMethods=*/true, CurContext, 5651 AddedProperties, Results, IsBaseExprStatement); 5652 } 5653 5654 // Add properties from the protocols in a qualified interface. 5655 for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals()) 5656 AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true, 5657 CurContext, AddedProperties, Results, 5658 IsBaseExprStatement, /*IsClassProperty*/ false, 5659 /*InOriginalClass*/ false); 5660 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 5661 (!IsArrow && BaseType->isObjCObjectType())) { 5662 // Objective-C instance variable access. Bail if we're performing fix-it 5663 // code completion since Objective-C properties are normally backed by 5664 // ivars, most Objective-C fix-its here would have little value. 5665 if (AccessOpFixIt.hasValue()) { 5666 return false; 5667 } 5668 ObjCInterfaceDecl *Class = nullptr; 5669 if (const ObjCObjectPointerType *ObjCPtr = 5670 BaseType->getAs<ObjCObjectPointerType>()) 5671 Class = ObjCPtr->getInterfaceDecl(); 5672 else 5673 Class = BaseType->castAs<ObjCObjectType>()->getInterface(); 5674 5675 // Add all ivars from this class and its superclasses. 5676 if (Class) { 5677 CodeCompletionDeclConsumer Consumer(Results, Class, BaseType); 5678 Results.setFilter(&ResultBuilder::IsObjCIvar); 5679 LookupVisibleDecls( 5680 Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(), 5681 /*IncludeDependentBases=*/false, CodeCompleter->loadExternal()); 5682 } 5683 } 5684 5685 // FIXME: How do we cope with isa? 5686 return true; 5687 }; 5688 5689 Results.EnterNewScope(); 5690 5691 bool CompletionSucceded = DoCompletion(Base, IsArrow, None); 5692 if (CodeCompleter->includeFixIts()) { 5693 const CharSourceRange OpRange = 5694 CharSourceRange::getTokenRange(OpLoc, OpLoc); 5695 CompletionSucceded |= DoCompletion( 5696 OtherOpBase, !IsArrow, 5697 FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->")); 5698 } 5699 5700 Results.ExitScope(); 5701 5702 if (!CompletionSucceded) 5703 return; 5704 5705 // Hand off the results found for code completion. 5706 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5707 Results.data(), Results.size()); 5708 } 5709 5710 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S, 5711 IdentifierInfo &ClassName, 5712 SourceLocation ClassNameLoc, 5713 bool IsBaseExprStatement) { 5714 IdentifierInfo *ClassNamePtr = &ClassName; 5715 ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc); 5716 if (!IFace) 5717 return; 5718 CodeCompletionContext CCContext( 5719 CodeCompletionContext::CCC_ObjCPropertyAccess); 5720 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5721 CodeCompleter->getCodeCompletionTUInfo(), CCContext, 5722 &ResultBuilder::IsMember); 5723 Results.EnterNewScope(); 5724 AddedPropertiesSet AddedProperties; 5725 AddObjCProperties(CCContext, IFace, true, 5726 /*AllowNullaryMethods=*/true, CurContext, AddedProperties, 5727 Results, IsBaseExprStatement, 5728 /*IsClassProperty=*/true); 5729 Results.ExitScope(); 5730 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5731 Results.data(), Results.size()); 5732 } 5733 5734 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 5735 if (!CodeCompleter) 5736 return; 5737 5738 ResultBuilder::LookupFilter Filter = nullptr; 5739 enum CodeCompletionContext::Kind ContextKind = 5740 CodeCompletionContext::CCC_Other; 5741 switch ((DeclSpec::TST)TagSpec) { 5742 case DeclSpec::TST_enum: 5743 Filter = &ResultBuilder::IsEnum; 5744 ContextKind = CodeCompletionContext::CCC_EnumTag; 5745 break; 5746 5747 case DeclSpec::TST_union: 5748 Filter = &ResultBuilder::IsUnion; 5749 ContextKind = CodeCompletionContext::CCC_UnionTag; 5750 break; 5751 5752 case DeclSpec::TST_struct: 5753 case DeclSpec::TST_class: 5754 case DeclSpec::TST_interface: 5755 Filter = &ResultBuilder::IsClassOrStruct; 5756 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 5757 break; 5758 5759 default: 5760 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 5761 } 5762 5763 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5764 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 5765 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5766 5767 // First pass: look for tags. 5768 Results.setFilter(Filter); 5769 LookupVisibleDecls(S, LookupTagName, Consumer, 5770 CodeCompleter->includeGlobals(), 5771 CodeCompleter->loadExternal()); 5772 5773 if (CodeCompleter->includeGlobals()) { 5774 // Second pass: look for nested name specifiers. 5775 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 5776 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 5777 CodeCompleter->includeGlobals(), 5778 CodeCompleter->loadExternal()); 5779 } 5780 5781 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5782 Results.data(), Results.size()); 5783 } 5784 5785 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results, 5786 const LangOptions &LangOpts) { 5787 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 5788 Results.AddResult("const"); 5789 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 5790 Results.AddResult("volatile"); 5791 if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 5792 Results.AddResult("restrict"); 5793 if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic)) 5794 Results.AddResult("_Atomic"); 5795 if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)) 5796 Results.AddResult("__unaligned"); 5797 } 5798 5799 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 5800 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5801 CodeCompleter->getCodeCompletionTUInfo(), 5802 CodeCompletionContext::CCC_TypeQualifiers); 5803 Results.EnterNewScope(); 5804 AddTypeQualifierResults(DS, Results, LangOpts); 5805 Results.ExitScope(); 5806 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5807 Results.data(), Results.size()); 5808 } 5809 5810 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D, 5811 const VirtSpecifiers *VS) { 5812 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5813 CodeCompleter->getCodeCompletionTUInfo(), 5814 CodeCompletionContext::CCC_TypeQualifiers); 5815 Results.EnterNewScope(); 5816 AddTypeQualifierResults(DS, Results, LangOpts); 5817 if (LangOpts.CPlusPlus11) { 5818 Results.AddResult("noexcept"); 5819 if (D.getContext() == DeclaratorContext::Member && !D.isCtorOrDtor() && 5820 !D.isStaticMember()) { 5821 if (!VS || !VS->isFinalSpecified()) 5822 Results.AddResult("final"); 5823 if (!VS || !VS->isOverrideSpecified()) 5824 Results.AddResult("override"); 5825 } 5826 } 5827 Results.ExitScope(); 5828 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5829 Results.data(), Results.size()); 5830 } 5831 5832 void Sema::CodeCompleteBracketDeclarator(Scope *S) { 5833 CodeCompleteExpression(S, QualType(getASTContext().getSizeType())); 5834 } 5835 5836 void Sema::CodeCompleteCase(Scope *S) { 5837 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 5838 return; 5839 5840 SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer(); 5841 // Condition expression might be invalid, do not continue in this case. 5842 if (!Switch->getCond()) 5843 return; 5844 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 5845 if (!type->isEnumeralType()) { 5846 CodeCompleteExpressionData Data(type); 5847 Data.IntegralConstantExpression = true; 5848 CodeCompleteExpression(S, Data); 5849 return; 5850 } 5851 5852 // Code-complete the cases of a switch statement over an enumeration type 5853 // by providing the list of 5854 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 5855 if (EnumDecl *Def = Enum->getDefinition()) 5856 Enum = Def; 5857 5858 // Determine which enumerators we have already seen in the switch statement. 5859 // FIXME: Ideally, we would also be able to look *past* the code-completion 5860 // token, in case we are code-completing in the middle of the switch and not 5861 // at the end. However, we aren't able to do so at the moment. 5862 CoveredEnumerators Enumerators; 5863 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 5864 SC = SC->getNextSwitchCase()) { 5865 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 5866 if (!Case) 5867 continue; 5868 5869 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 5870 if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 5871 if (auto *Enumerator = 5872 dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 5873 // We look into the AST of the case statement to determine which 5874 // enumerator was named. Alternatively, we could compute the value of 5875 // the integral constant expression, then compare it against the 5876 // values of each enumerator. However, value-based approach would not 5877 // work as well with C++ templates where enumerators declared within a 5878 // template are type- and value-dependent. 5879 Enumerators.Seen.insert(Enumerator); 5880 5881 // If this is a qualified-id, keep track of the nested-name-specifier 5882 // so that we can reproduce it as part of code completion, e.g., 5883 // 5884 // switch (TagD.getKind()) { 5885 // case TagDecl::TK_enum: 5886 // break; 5887 // case XXX 5888 // 5889 // At the XXX, our completions are TagDecl::TK_union, 5890 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 5891 // TK_struct, and TK_class. 5892 Enumerators.SuggestedQualifier = DRE->getQualifier(); 5893 } 5894 } 5895 5896 // Add any enumerators that have not yet been mentioned. 5897 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5898 CodeCompleter->getCodeCompletionTUInfo(), 5899 CodeCompletionContext::CCC_Expression); 5900 AddEnumerators(Results, Context, Enum, CurContext, Enumerators); 5901 5902 if (CodeCompleter->includeMacros()) { 5903 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 5904 } 5905 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5906 Results.data(), Results.size()); 5907 } 5908 5909 static bool anyNullArguments(ArrayRef<Expr *> Args) { 5910 if (Args.size() && !Args.data()) 5911 return true; 5912 5913 for (unsigned I = 0; I != Args.size(); ++I) 5914 if (!Args[I]) 5915 return true; 5916 5917 return false; 5918 } 5919 5920 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 5921 5922 static void mergeCandidatesWithResults( 5923 Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results, 5924 OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) { 5925 // Sort the overload candidate set by placing the best overloads first. 5926 llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X, 5927 const OverloadCandidate &Y) { 5928 return isBetterOverloadCandidate(SemaRef, X, Y, Loc, 5929 CandidateSet.getKind()); 5930 }); 5931 5932 // Add the remaining viable overload candidates as code-completion results. 5933 for (OverloadCandidate &Candidate : CandidateSet) { 5934 if (Candidate.Function) { 5935 if (Candidate.Function->isDeleted()) 5936 continue; 5937 if (shouldEnforceArgLimit(/*PartialOverloading=*/true, 5938 Candidate.Function) && 5939 Candidate.Function->getNumParams() <= ArgSize && 5940 // Having zero args is annoying, normally we don't surface a function 5941 // with 2 params, if you already have 2 params, because you are 5942 // inserting the 3rd now. But with zero, it helps the user to figure 5943 // out there are no overloads that take any arguments. Hence we are 5944 // keeping the overload. 5945 ArgSize > 0) 5946 continue; 5947 } 5948 if (Candidate.Viable) 5949 Results.push_back(ResultCandidate(Candidate.Function)); 5950 } 5951 } 5952 5953 /// Get the type of the Nth parameter from a given set of overload 5954 /// candidates. 5955 static QualType getParamType(Sema &SemaRef, 5956 ArrayRef<ResultCandidate> Candidates, unsigned N) { 5957 5958 // Given the overloads 'Candidates' for a function call matching all arguments 5959 // up to N, return the type of the Nth parameter if it is the same for all 5960 // overload candidates. 5961 QualType ParamType; 5962 for (auto &Candidate : Candidates) { 5963 QualType CandidateParamType = Candidate.getParamType(N); 5964 if (CandidateParamType.isNull()) 5965 continue; 5966 if (ParamType.isNull()) { 5967 ParamType = CandidateParamType; 5968 continue; 5969 } 5970 if (!SemaRef.Context.hasSameUnqualifiedType( 5971 ParamType.getNonReferenceType(), 5972 CandidateParamType.getNonReferenceType())) 5973 // Two conflicting types, give up. 5974 return QualType(); 5975 } 5976 5977 return ParamType; 5978 } 5979 5980 static QualType 5981 ProduceSignatureHelp(Sema &SemaRef, MutableArrayRef<ResultCandidate> Candidates, 5982 unsigned CurrentArg, SourceLocation OpenParLoc, 5983 bool Braced) { 5984 if (Candidates.empty()) 5985 return QualType(); 5986 if (SemaRef.getPreprocessor().isCodeCompletionReached()) 5987 SemaRef.CodeCompleter->ProcessOverloadCandidates( 5988 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc, 5989 Braced); 5990 return getParamType(SemaRef, Candidates, CurrentArg); 5991 } 5992 5993 QualType Sema::ProduceCallSignatureHelp(Expr *Fn, ArrayRef<Expr *> Args, 5994 SourceLocation OpenParLoc) { 5995 Fn = unwrapParenList(Fn); 5996 if (!CodeCompleter || !Fn) 5997 return QualType(); 5998 5999 // FIXME: Provide support for variadic template functions. 6000 // Ignore type-dependent call expressions entirely. 6001 if (Fn->isTypeDependent() || anyNullArguments(Args)) 6002 return QualType(); 6003 // In presence of dependent args we surface all possible signatures using the 6004 // non-dependent args in the prefix. Afterwards we do a post filtering to make 6005 // sure provided candidates satisfy parameter count restrictions. 6006 auto ArgsWithoutDependentTypes = 6007 Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); }); 6008 6009 SmallVector<ResultCandidate, 8> Results; 6010 6011 Expr *NakedFn = Fn->IgnoreParenCasts(); 6012 // Build an overload candidate set based on the functions we find. 6013 SourceLocation Loc = Fn->getExprLoc(); 6014 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 6015 6016 if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) { 6017 AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes, CandidateSet, 6018 /*PartialOverloading=*/true); 6019 } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) { 6020 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; 6021 if (UME->hasExplicitTemplateArgs()) { 6022 UME->copyTemplateArgumentsInto(TemplateArgsBuffer); 6023 TemplateArgs = &TemplateArgsBuffer; 6024 } 6025 6026 // Add the base as first argument (use a nullptr if the base is implicit). 6027 SmallVector<Expr *, 12> ArgExprs( 6028 1, UME->isImplicitAccess() ? nullptr : UME->getBase()); 6029 ArgExprs.append(ArgsWithoutDependentTypes.begin(), 6030 ArgsWithoutDependentTypes.end()); 6031 UnresolvedSet<8> Decls; 6032 Decls.append(UME->decls_begin(), UME->decls_end()); 6033 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase(); 6034 AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs, 6035 /*SuppressUserConversions=*/false, 6036 /*PartialOverloading=*/true, FirstArgumentIsBase); 6037 } else { 6038 FunctionDecl *FD = nullptr; 6039 if (auto *MCE = dyn_cast<MemberExpr>(NakedFn)) 6040 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl()); 6041 else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) 6042 FD = dyn_cast<FunctionDecl>(DRE->getDecl()); 6043 if (FD) { // We check whether it's a resolved function declaration. 6044 if (!getLangOpts().CPlusPlus || 6045 !FD->getType()->getAs<FunctionProtoType>()) 6046 Results.push_back(ResultCandidate(FD)); 6047 else 6048 AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()), 6049 ArgsWithoutDependentTypes, CandidateSet, 6050 /*SuppressUserConversions=*/false, 6051 /*PartialOverloading=*/true); 6052 6053 } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) { 6054 // If expression's type is CXXRecordDecl, it may overload the function 6055 // call operator, so we check if it does and add them as candidates. 6056 // A complete type is needed to lookup for member function call operators. 6057 if (isCompleteType(Loc, NakedFn->getType())) { 6058 DeclarationName OpName = 6059 Context.DeclarationNames.getCXXOperatorName(OO_Call); 6060 LookupResult R(*this, OpName, Loc, LookupOrdinaryName); 6061 LookupQualifiedName(R, DC); 6062 R.suppressDiagnostics(); 6063 SmallVector<Expr *, 12> ArgExprs(1, NakedFn); 6064 ArgExprs.append(ArgsWithoutDependentTypes.begin(), 6065 ArgsWithoutDependentTypes.end()); 6066 AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet, 6067 /*ExplicitArgs=*/nullptr, 6068 /*SuppressUserConversions=*/false, 6069 /*PartialOverloading=*/true); 6070 } 6071 } else { 6072 // Lastly we check whether expression's type is function pointer or 6073 // function. 6074 QualType T = NakedFn->getType(); 6075 if (!T->getPointeeType().isNull()) 6076 T = T->getPointeeType(); 6077 6078 if (auto FP = T->getAs<FunctionProtoType>()) { 6079 if (!TooManyArguments(FP->getNumParams(), 6080 ArgsWithoutDependentTypes.size(), 6081 /*PartialOverloading=*/true) || 6082 FP->isVariadic()) 6083 Results.push_back(ResultCandidate(FP)); 6084 } else if (auto FT = T->getAs<FunctionType>()) 6085 // No prototype and declaration, it may be a K & R style function. 6086 Results.push_back(ResultCandidate(FT)); 6087 } 6088 } 6089 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size()); 6090 QualType ParamType = ProduceSignatureHelp(*this, Results, Args.size(), 6091 OpenParLoc, /*Braced=*/false); 6092 return !CandidateSet.empty() ? ParamType : QualType(); 6093 } 6094 6095 // Determine which param to continue aggregate initialization from after 6096 // a designated initializer. 6097 // 6098 // Given struct S { int a,b,c,d,e; }: 6099 // after `S{.b=1,` we want to suggest c to continue 6100 // after `S{.b=1, 2,` we continue with d (this is legal C and ext in C++) 6101 // after `S{.b=1, .a=2,` we continue with b (this is legal C and ext in C++) 6102 // 6103 // Possible outcomes: 6104 // - we saw a designator for a field, and continue from the returned index. 6105 // Only aggregate initialization is allowed. 6106 // - we saw a designator, but it was complex or we couldn't find the field. 6107 // Only aggregate initialization is possible, but we can't assist with it. 6108 // Returns an out-of-range index. 6109 // - we saw no designators, just positional arguments. 6110 // Returns None. 6111 static llvm::Optional<unsigned> 6112 getNextAggregateIndexAfterDesignatedInit(const ResultCandidate &Aggregate, 6113 ArrayRef<Expr *> Args) { 6114 static constexpr unsigned Invalid = std::numeric_limits<unsigned>::max(); 6115 assert(Aggregate.getKind() == ResultCandidate::CK_Aggregate); 6116 6117 // Look for designated initializers. 6118 // They're in their syntactic form, not yet resolved to fields. 6119 IdentifierInfo *DesignatedFieldName = nullptr; 6120 unsigned ArgsAfterDesignator = 0; 6121 for (const Expr *Arg : Args) { 6122 if (const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) { 6123 if (DIE->size() == 1 && DIE->getDesignator(0)->isFieldDesignator()) { 6124 DesignatedFieldName = DIE->getDesignator(0)->getFieldName(); 6125 ArgsAfterDesignator = 0; 6126 } else { 6127 return Invalid; // Complicated designator. 6128 } 6129 } else if (isa<DesignatedInitUpdateExpr>(Arg)) { 6130 return Invalid; // Unsupported. 6131 } else { 6132 ++ArgsAfterDesignator; 6133 } 6134 } 6135 if (!DesignatedFieldName) 6136 return llvm::None; 6137 6138 // Find the index within the class's fields. 6139 // (Probing getParamDecl() directly would be quadratic in number of fields). 6140 unsigned DesignatedIndex = 0; 6141 const FieldDecl *DesignatedField = nullptr; 6142 for (const auto *Field : Aggregate.getAggregate()->fields()) { 6143 if (Field->getIdentifier() == DesignatedFieldName) { 6144 DesignatedField = Field; 6145 break; 6146 } 6147 ++DesignatedIndex; 6148 } 6149 if (!DesignatedField) 6150 return Invalid; // Designator referred to a missing field, give up. 6151 6152 // Find the index within the aggregate (which may have leading bases). 6153 unsigned AggregateSize = Aggregate.getNumParams(); 6154 while (DesignatedIndex < AggregateSize && 6155 Aggregate.getParamDecl(DesignatedIndex) != DesignatedField) 6156 ++DesignatedIndex; 6157 6158 // Continue from the index after the last named field. 6159 return DesignatedIndex + ArgsAfterDesignator + 1; 6160 } 6161 6162 QualType Sema::ProduceConstructorSignatureHelp(QualType Type, 6163 SourceLocation Loc, 6164 ArrayRef<Expr *> Args, 6165 SourceLocation OpenParLoc, 6166 bool Braced) { 6167 if (!CodeCompleter) 6168 return QualType(); 6169 SmallVector<ResultCandidate, 8> Results; 6170 6171 // A complete type is needed to lookup for constructors. 6172 RecordDecl *RD = 6173 isCompleteType(Loc, Type) ? Type->getAsRecordDecl() : nullptr; 6174 if (!RD) 6175 return Type; 6176 CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD); 6177 6178 // Consider aggregate initialization. 6179 // We don't check that types so far are correct. 6180 // We also don't handle C99/C++17 brace-elision, we assume init-list elements 6181 // are 1:1 with fields. 6182 // FIXME: it would be nice to support "unwrapping" aggregates that contain 6183 // a single subaggregate, like std::array<T, N> -> T __elements[N]. 6184 if (Braced && !RD->isUnion() && 6185 (!LangOpts.CPlusPlus || (CRD && CRD->isAggregate()))) { 6186 ResultCandidate AggregateSig(RD); 6187 unsigned AggregateSize = AggregateSig.getNumParams(); 6188 6189 if (auto NextIndex = 6190 getNextAggregateIndexAfterDesignatedInit(AggregateSig, Args)) { 6191 // A designator was used, only aggregate init is possible. 6192 if (*NextIndex >= AggregateSize) 6193 return Type; 6194 Results.push_back(AggregateSig); 6195 return ProduceSignatureHelp(*this, Results, *NextIndex, OpenParLoc, 6196 Braced); 6197 } 6198 6199 // Describe aggregate initialization, but also constructors below. 6200 if (Args.size() < AggregateSize) 6201 Results.push_back(AggregateSig); 6202 } 6203 6204 // FIXME: Provide support for member initializers. 6205 // FIXME: Provide support for variadic template constructors. 6206 6207 if (CRD) { 6208 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 6209 for (NamedDecl *C : LookupConstructors(CRD)) { 6210 if (auto *FD = dyn_cast<FunctionDecl>(C)) { 6211 // FIXME: we can't yet provide correct signature help for initializer 6212 // list constructors, so skip them entirely. 6213 if (Braced && LangOpts.CPlusPlus && isInitListConstructor(FD)) 6214 continue; 6215 AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args, 6216 CandidateSet, 6217 /*SuppressUserConversions=*/false, 6218 /*PartialOverloading=*/true, 6219 /*AllowExplicit*/ true); 6220 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) { 6221 if (Braced && LangOpts.CPlusPlus && 6222 isInitListConstructor(FTD->getTemplatedDecl())) 6223 continue; 6224 6225 AddTemplateOverloadCandidate( 6226 FTD, DeclAccessPair::make(FTD, C->getAccess()), 6227 /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet, 6228 /*SuppressUserConversions=*/false, 6229 /*PartialOverloading=*/true); 6230 } 6231 } 6232 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size()); 6233 } 6234 6235 return ProduceSignatureHelp(*this, Results, Args.size(), OpenParLoc, Braced); 6236 } 6237 6238 QualType Sema::ProduceCtorInitMemberSignatureHelp( 6239 Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy, 6240 ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc, 6241 bool Braced) { 6242 if (!CodeCompleter) 6243 return QualType(); 6244 6245 CXXConstructorDecl *Constructor = 6246 dyn_cast<CXXConstructorDecl>(ConstructorDecl); 6247 if (!Constructor) 6248 return QualType(); 6249 // FIXME: Add support for Base class constructors as well. 6250 if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl( 6251 Constructor->getParent(), SS, TemplateTypeTy, II)) 6252 return ProduceConstructorSignatureHelp(MemberDecl->getType(), 6253 MemberDecl->getLocation(), ArgExprs, 6254 OpenParLoc, Braced); 6255 return QualType(); 6256 } 6257 6258 static bool argMatchesTemplateParams(const ParsedTemplateArgument &Arg, 6259 unsigned Index, 6260 const TemplateParameterList &Params) { 6261 const NamedDecl *Param; 6262 if (Index < Params.size()) 6263 Param = Params.getParam(Index); 6264 else if (Params.hasParameterPack()) 6265 Param = Params.asArray().back(); 6266 else 6267 return false; // too many args 6268 6269 switch (Arg.getKind()) { 6270 case ParsedTemplateArgument::Type: 6271 return llvm::isa<TemplateTypeParmDecl>(Param); // constraints not checked 6272 case ParsedTemplateArgument::NonType: 6273 return llvm::isa<NonTypeTemplateParmDecl>(Param); // type not checked 6274 case ParsedTemplateArgument::Template: 6275 return llvm::isa<TemplateTemplateParmDecl>(Param); // signature not checked 6276 } 6277 llvm_unreachable("Unhandled switch case"); 6278 } 6279 6280 QualType Sema::ProduceTemplateArgumentSignatureHelp( 6281 TemplateTy ParsedTemplate, ArrayRef<ParsedTemplateArgument> Args, 6282 SourceLocation LAngleLoc) { 6283 if (!CodeCompleter || !ParsedTemplate) 6284 return QualType(); 6285 6286 SmallVector<ResultCandidate, 8> Results; 6287 auto Consider = [&](const TemplateDecl *TD) { 6288 // Only add if the existing args are compatible with the template. 6289 bool Matches = true; 6290 for (unsigned I = 0; I < Args.size(); ++I) { 6291 if (!argMatchesTemplateParams(Args[I], I, *TD->getTemplateParameters())) { 6292 Matches = false; 6293 break; 6294 } 6295 } 6296 if (Matches) 6297 Results.emplace_back(TD); 6298 }; 6299 6300 TemplateName Template = ParsedTemplate.get(); 6301 if (const auto *TD = Template.getAsTemplateDecl()) { 6302 Consider(TD); 6303 } else if (const auto *OTS = Template.getAsOverloadedTemplate()) { 6304 for (const NamedDecl *ND : *OTS) 6305 if (const auto *TD = llvm::dyn_cast<TemplateDecl>(ND)) 6306 Consider(TD); 6307 } 6308 return ProduceSignatureHelp(*this, Results, Args.size(), LAngleLoc, 6309 /*Braced=*/false); 6310 } 6311 6312 static QualType getDesignatedType(QualType BaseType, const Designation &Desig) { 6313 for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) { 6314 if (BaseType.isNull()) 6315 break; 6316 QualType NextType; 6317 const auto &D = Desig.getDesignator(I); 6318 if (D.isArrayDesignator() || D.isArrayRangeDesignator()) { 6319 if (BaseType->isArrayType()) 6320 NextType = BaseType->getAsArrayTypeUnsafe()->getElementType(); 6321 } else { 6322 assert(D.isFieldDesignator()); 6323 auto *RD = getAsRecordDecl(BaseType); 6324 if (RD && RD->isCompleteDefinition()) { 6325 for (const auto *Member : RD->lookup(D.getField())) 6326 if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) { 6327 NextType = FD->getType(); 6328 break; 6329 } 6330 } 6331 } 6332 BaseType = NextType; 6333 } 6334 return BaseType; 6335 } 6336 6337 void Sema::CodeCompleteDesignator(QualType BaseType, 6338 llvm::ArrayRef<Expr *> InitExprs, 6339 const Designation &D) { 6340 BaseType = getDesignatedType(BaseType, D); 6341 if (BaseType.isNull()) 6342 return; 6343 const auto *RD = getAsRecordDecl(BaseType); 6344 if (!RD || RD->fields().empty()) 6345 return; 6346 6347 CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess, 6348 BaseType); 6349 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6350 CodeCompleter->getCodeCompletionTUInfo(), CCC); 6351 6352 Results.EnterNewScope(); 6353 for (const Decl *D : RD->decls()) { 6354 const FieldDecl *FD; 6355 if (auto *IFD = dyn_cast<IndirectFieldDecl>(D)) 6356 FD = IFD->getAnonField(); 6357 else if (auto *DFD = dyn_cast<FieldDecl>(D)) 6358 FD = DFD; 6359 else 6360 continue; 6361 6362 // FIXME: Make use of previous designators to mark any fields before those 6363 // inaccessible, and also compute the next initializer priority. 6364 ResultBuilder::Result Result(FD, Results.getBasePriority(FD)); 6365 Results.AddResult(Result, CurContext, /*Hiding=*/nullptr); 6366 } 6367 Results.ExitScope(); 6368 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6369 Results.data(), Results.size()); 6370 } 6371 6372 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 6373 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 6374 if (!VD) { 6375 CodeCompleteOrdinaryName(S, PCC_Expression); 6376 return; 6377 } 6378 6379 CodeCompleteExpressionData Data; 6380 Data.PreferredType = VD->getType(); 6381 // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'. 6382 Data.IgnoreDecls.push_back(VD); 6383 6384 CodeCompleteExpression(S, Data); 6385 } 6386 6387 void Sema::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) { 6388 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6389 CodeCompleter->getCodeCompletionTUInfo(), 6390 mapCodeCompletionContext(*this, PCC_Statement)); 6391 Results.setFilter(&ResultBuilder::IsOrdinaryName); 6392 Results.EnterNewScope(); 6393 6394 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6395 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6396 CodeCompleter->includeGlobals(), 6397 CodeCompleter->loadExternal()); 6398 6399 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 6400 6401 // "else" block 6402 CodeCompletionBuilder Builder(Results.getAllocator(), 6403 Results.getCodeCompletionTUInfo()); 6404 6405 auto AddElseBodyPattern = [&] { 6406 if (IsBracedThen) { 6407 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6408 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6409 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6410 Builder.AddPlaceholderChunk("statements"); 6411 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6412 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6413 } else { 6414 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6415 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6416 Builder.AddPlaceholderChunk("statement"); 6417 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6418 } 6419 }; 6420 Builder.AddTypedTextChunk("else"); 6421 if (Results.includeCodePatterns()) 6422 AddElseBodyPattern(); 6423 Results.AddResult(Builder.TakeString()); 6424 6425 // "else if" block 6426 Builder.AddTypedTextChunk("else if"); 6427 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6428 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6429 if (getLangOpts().CPlusPlus) 6430 Builder.AddPlaceholderChunk("condition"); 6431 else 6432 Builder.AddPlaceholderChunk("expression"); 6433 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6434 if (Results.includeCodePatterns()) { 6435 AddElseBodyPattern(); 6436 } 6437 Results.AddResult(Builder.TakeString()); 6438 6439 Results.ExitScope(); 6440 6441 if (S->getFnParent()) 6442 AddPrettyFunctionResults(getLangOpts(), Results); 6443 6444 if (CodeCompleter->includeMacros()) 6445 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 6446 6447 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6448 Results.data(), Results.size()); 6449 } 6450 6451 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 6452 bool EnteringContext, 6453 bool IsUsingDeclaration, QualType BaseType, 6454 QualType PreferredType) { 6455 if (SS.isEmpty() || !CodeCompleter) 6456 return; 6457 6458 CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType); 6459 CC.setIsUsingDeclaration(IsUsingDeclaration); 6460 CC.setCXXScopeSpecifier(SS); 6461 6462 // We want to keep the scope specifier even if it's invalid (e.g. the scope 6463 // "a::b::" is not corresponding to any context/namespace in the AST), since 6464 // it can be useful for global code completion which have information about 6465 // contexts/symbols that are not in the AST. 6466 if (SS.isInvalid()) { 6467 // As SS is invalid, we try to collect accessible contexts from the current 6468 // scope with a dummy lookup so that the completion consumer can try to 6469 // guess what the specified scope is. 6470 ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(), 6471 CodeCompleter->getCodeCompletionTUInfo(), CC); 6472 if (!PreferredType.isNull()) 6473 DummyResults.setPreferredType(PreferredType); 6474 if (S->getEntity()) { 6475 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(), 6476 BaseType); 6477 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6478 /*IncludeGlobalScope=*/false, 6479 /*LoadExternal=*/false); 6480 } 6481 HandleCodeCompleteResults(this, CodeCompleter, 6482 DummyResults.getCompletionContext(), nullptr, 0); 6483 return; 6484 } 6485 // Always pretend to enter a context to ensure that a dependent type 6486 // resolves to a dependent record. 6487 DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true); 6488 6489 // Try to instantiate any non-dependent declaration contexts before 6490 // we look in them. Bail out if we fail. 6491 NestedNameSpecifier *NNS = SS.getScopeRep(); 6492 if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) { 6493 if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx)) 6494 return; 6495 } 6496 6497 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6498 CodeCompleter->getCodeCompletionTUInfo(), CC); 6499 if (!PreferredType.isNull()) 6500 Results.setPreferredType(PreferredType); 6501 Results.EnterNewScope(); 6502 6503 // The "template" keyword can follow "::" in the grammar, but only 6504 // put it into the grammar if the nested-name-specifier is dependent. 6505 // FIXME: results is always empty, this appears to be dead. 6506 if (!Results.empty() && NNS->isDependent()) 6507 Results.AddResult("template"); 6508 6509 // If the scope is a concept-constrained type parameter, infer nested 6510 // members based on the constraints. 6511 if (const auto *TTPT = 6512 dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) { 6513 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 6514 if (R.Operator != ConceptInfo::Member::Colons) 6515 continue; 6516 Results.AddResult(CodeCompletionResult( 6517 R.render(*this, CodeCompleter->getAllocator(), 6518 CodeCompleter->getCodeCompletionTUInfo()))); 6519 } 6520 } 6521 6522 // Add calls to overridden virtual functions, if there are any. 6523 // 6524 // FIXME: This isn't wonderful, because we don't know whether we're actually 6525 // in a context that permits expressions. This is a general issue with 6526 // qualified-id completions. 6527 if (Ctx && !EnteringContext) 6528 MaybeAddOverrideCalls(*this, Ctx, Results); 6529 Results.ExitScope(); 6530 6531 if (Ctx && 6532 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) { 6533 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType); 6534 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer, 6535 /*IncludeGlobalScope=*/true, 6536 /*IncludeDependentBases=*/true, 6537 CodeCompleter->loadExternal()); 6538 } 6539 6540 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6541 Results.data(), Results.size()); 6542 } 6543 6544 void Sema::CodeCompleteUsing(Scope *S) { 6545 if (!CodeCompleter) 6546 return; 6547 6548 // This can be both a using alias or using declaration, in the former we 6549 // expect a new name and a symbol in the latter case. 6550 CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName); 6551 Context.setIsUsingDeclaration(true); 6552 6553 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6554 CodeCompleter->getCodeCompletionTUInfo(), Context, 6555 &ResultBuilder::IsNestedNameSpecifier); 6556 Results.EnterNewScope(); 6557 6558 // If we aren't in class scope, we could see the "namespace" keyword. 6559 if (!S->isClassScope()) 6560 Results.AddResult(CodeCompletionResult("namespace")); 6561 6562 // After "using", we can see anything that would start a 6563 // nested-name-specifier. 6564 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6565 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6566 CodeCompleter->includeGlobals(), 6567 CodeCompleter->loadExternal()); 6568 Results.ExitScope(); 6569 6570 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6571 Results.data(), Results.size()); 6572 } 6573 6574 void Sema::CodeCompleteUsingDirective(Scope *S) { 6575 if (!CodeCompleter) 6576 return; 6577 6578 // After "using namespace", we expect to see a namespace name or namespace 6579 // alias. 6580 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6581 CodeCompleter->getCodeCompletionTUInfo(), 6582 CodeCompletionContext::CCC_Namespace, 6583 &ResultBuilder::IsNamespaceOrAlias); 6584 Results.EnterNewScope(); 6585 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6586 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6587 CodeCompleter->includeGlobals(), 6588 CodeCompleter->loadExternal()); 6589 Results.ExitScope(); 6590 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6591 Results.data(), Results.size()); 6592 } 6593 6594 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 6595 if (!CodeCompleter) 6596 return; 6597 6598 DeclContext *Ctx = S->getEntity(); 6599 if (!S->getParent()) 6600 Ctx = Context.getTranslationUnitDecl(); 6601 6602 bool SuppressedGlobalResults = 6603 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 6604 6605 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6606 CodeCompleter->getCodeCompletionTUInfo(), 6607 SuppressedGlobalResults 6608 ? CodeCompletionContext::CCC_Namespace 6609 : CodeCompletionContext::CCC_Other, 6610 &ResultBuilder::IsNamespace); 6611 6612 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 6613 // We only want to see those namespaces that have already been defined 6614 // within this scope, because its likely that the user is creating an 6615 // extended namespace declaration. Keep track of the most recent 6616 // definition of each namespace. 6617 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 6618 for (DeclContext::specific_decl_iterator<NamespaceDecl> 6619 NS(Ctx->decls_begin()), 6620 NSEnd(Ctx->decls_end()); 6621 NS != NSEnd; ++NS) 6622 OrigToLatest[NS->getOriginalNamespace()] = *NS; 6623 6624 // Add the most recent definition (or extended definition) of each 6625 // namespace to the list of results. 6626 Results.EnterNewScope(); 6627 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 6628 NS = OrigToLatest.begin(), 6629 NSEnd = OrigToLatest.end(); 6630 NS != NSEnd; ++NS) 6631 Results.AddResult( 6632 CodeCompletionResult(NS->second, Results.getBasePriority(NS->second), 6633 nullptr), 6634 CurContext, nullptr, false); 6635 Results.ExitScope(); 6636 } 6637 6638 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6639 Results.data(), Results.size()); 6640 } 6641 6642 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 6643 if (!CodeCompleter) 6644 return; 6645 6646 // After "namespace", we expect to see a namespace or alias. 6647 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6648 CodeCompleter->getCodeCompletionTUInfo(), 6649 CodeCompletionContext::CCC_Namespace, 6650 &ResultBuilder::IsNamespaceOrAlias); 6651 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6652 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6653 CodeCompleter->includeGlobals(), 6654 CodeCompleter->loadExternal()); 6655 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6656 Results.data(), Results.size()); 6657 } 6658 6659 void Sema::CodeCompleteOperatorName(Scope *S) { 6660 if (!CodeCompleter) 6661 return; 6662 6663 typedef CodeCompletionResult Result; 6664 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6665 CodeCompleter->getCodeCompletionTUInfo(), 6666 CodeCompletionContext::CCC_Type, 6667 &ResultBuilder::IsType); 6668 Results.EnterNewScope(); 6669 6670 // Add the names of overloadable operators. Note that OO_Conditional is not 6671 // actually overloadable. 6672 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 6673 if (OO_##Name != OO_Conditional) \ 6674 Results.AddResult(Result(Spelling)); 6675 #include "clang/Basic/OperatorKinds.def" 6676 6677 // Add any type names visible from the current scope 6678 Results.allowNestedNameSpecifiers(); 6679 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6680 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6681 CodeCompleter->includeGlobals(), 6682 CodeCompleter->loadExternal()); 6683 6684 // Add any type specifiers 6685 AddTypeSpecifierResults(getLangOpts(), Results); 6686 Results.ExitScope(); 6687 6688 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6689 Results.data(), Results.size()); 6690 } 6691 6692 void Sema::CodeCompleteConstructorInitializer( 6693 Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) { 6694 if (!ConstructorD) 6695 return; 6696 6697 AdjustDeclIfTemplate(ConstructorD); 6698 6699 auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD); 6700 if (!Constructor) 6701 return; 6702 6703 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6704 CodeCompleter->getCodeCompletionTUInfo(), 6705 CodeCompletionContext::CCC_Symbol); 6706 Results.EnterNewScope(); 6707 6708 // Fill in any already-initialized fields or base classes. 6709 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 6710 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 6711 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) { 6712 if (Initializers[I]->isBaseInitializer()) 6713 InitializedBases.insert(Context.getCanonicalType( 6714 QualType(Initializers[I]->getBaseClass(), 0))); 6715 else 6716 InitializedFields.insert( 6717 cast<FieldDecl>(Initializers[I]->getAnyMember())); 6718 } 6719 6720 // Add completions for base classes. 6721 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6722 bool SawLastInitializer = Initializers.empty(); 6723 CXXRecordDecl *ClassDecl = Constructor->getParent(); 6724 6725 auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) { 6726 CodeCompletionBuilder Builder(Results.getAllocator(), 6727 Results.getCodeCompletionTUInfo()); 6728 Builder.AddTypedTextChunk(Name); 6729 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6730 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) 6731 AddFunctionParameterChunks(PP, Policy, Function, Builder); 6732 else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND)) 6733 AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(), 6734 Builder); 6735 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6736 return Builder.TakeString(); 6737 }; 6738 auto AddDefaultCtorInit = [&](const char *Name, const char *Type, 6739 const NamedDecl *ND) { 6740 CodeCompletionBuilder Builder(Results.getAllocator(), 6741 Results.getCodeCompletionTUInfo()); 6742 Builder.AddTypedTextChunk(Name); 6743 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6744 Builder.AddPlaceholderChunk(Type); 6745 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6746 if (ND) { 6747 auto CCR = CodeCompletionResult( 6748 Builder.TakeString(), ND, 6749 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration); 6750 if (isa<FieldDecl>(ND)) 6751 CCR.CursorKind = CXCursor_MemberRef; 6752 return Results.AddResult(CCR); 6753 } 6754 return Results.AddResult(CodeCompletionResult( 6755 Builder.TakeString(), 6756 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration)); 6757 }; 6758 auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority, 6759 const char *Name, const FieldDecl *FD) { 6760 if (!RD) 6761 return AddDefaultCtorInit(Name, 6762 FD ? Results.getAllocator().CopyString( 6763 FD->getType().getAsString(Policy)) 6764 : Name, 6765 FD); 6766 auto Ctors = getConstructors(Context, RD); 6767 if (Ctors.begin() == Ctors.end()) 6768 return AddDefaultCtorInit(Name, Name, RD); 6769 for (const NamedDecl *Ctor : Ctors) { 6770 auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority); 6771 CCR.CursorKind = getCursorKindForDecl(Ctor); 6772 Results.AddResult(CCR); 6773 } 6774 }; 6775 auto AddBase = [&](const CXXBaseSpecifier &Base) { 6776 const char *BaseName = 6777 Results.getAllocator().CopyString(Base.getType().getAsString(Policy)); 6778 const auto *RD = Base.getType()->getAsCXXRecordDecl(); 6779 AddCtorsWithName( 6780 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6781 BaseName, nullptr); 6782 }; 6783 auto AddField = [&](const FieldDecl *FD) { 6784 const char *FieldName = 6785 Results.getAllocator().CopyString(FD->getIdentifier()->getName()); 6786 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl(); 6787 AddCtorsWithName( 6788 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6789 FieldName, FD); 6790 }; 6791 6792 for (const auto &Base : ClassDecl->bases()) { 6793 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6794 .second) { 6795 SawLastInitializer = 6796 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6797 Context.hasSameUnqualifiedType( 6798 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6799 continue; 6800 } 6801 6802 AddBase(Base); 6803 SawLastInitializer = false; 6804 } 6805 6806 // Add completions for virtual base classes. 6807 for (const auto &Base : ClassDecl->vbases()) { 6808 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6809 .second) { 6810 SawLastInitializer = 6811 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6812 Context.hasSameUnqualifiedType( 6813 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6814 continue; 6815 } 6816 6817 AddBase(Base); 6818 SawLastInitializer = false; 6819 } 6820 6821 // Add completions for members. 6822 for (auto *Field : ClassDecl->fields()) { 6823 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl())) 6824 .second) { 6825 SawLastInitializer = !Initializers.empty() && 6826 Initializers.back()->isAnyMemberInitializer() && 6827 Initializers.back()->getAnyMember() == Field; 6828 continue; 6829 } 6830 6831 if (!Field->getDeclName()) 6832 continue; 6833 6834 AddField(Field); 6835 SawLastInitializer = false; 6836 } 6837 Results.ExitScope(); 6838 6839 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6840 Results.data(), Results.size()); 6841 } 6842 6843 /// Determine whether this scope denotes a namespace. 6844 static bool isNamespaceScope(Scope *S) { 6845 DeclContext *DC = S->getEntity(); 6846 if (!DC) 6847 return false; 6848 6849 return DC->isFileContext(); 6850 } 6851 6852 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 6853 bool AfterAmpersand) { 6854 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6855 CodeCompleter->getCodeCompletionTUInfo(), 6856 CodeCompletionContext::CCC_Other); 6857 Results.EnterNewScope(); 6858 6859 // Note what has already been captured. 6860 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 6861 bool IncludedThis = false; 6862 for (const auto &C : Intro.Captures) { 6863 if (C.Kind == LCK_This) { 6864 IncludedThis = true; 6865 continue; 6866 } 6867 6868 Known.insert(C.Id); 6869 } 6870 6871 // Look for other capturable variables. 6872 for (; S && !isNamespaceScope(S); S = S->getParent()) { 6873 for (const auto *D : S->decls()) { 6874 const auto *Var = dyn_cast<VarDecl>(D); 6875 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>()) 6876 continue; 6877 6878 if (Known.insert(Var->getIdentifier()).second) 6879 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 6880 CurContext, nullptr, false); 6881 } 6882 } 6883 6884 // Add 'this', if it would be valid. 6885 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 6886 addThisCompletion(*this, Results); 6887 6888 Results.ExitScope(); 6889 6890 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6891 Results.data(), Results.size()); 6892 } 6893 6894 void Sema::CodeCompleteAfterFunctionEquals(Declarator &D) { 6895 if (!LangOpts.CPlusPlus11) 6896 return; 6897 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6898 CodeCompleter->getCodeCompletionTUInfo(), 6899 CodeCompletionContext::CCC_Other); 6900 auto ShouldAddDefault = [&D, this]() { 6901 if (!D.isFunctionDeclarator()) 6902 return false; 6903 auto &Id = D.getName(); 6904 if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName) 6905 return true; 6906 // FIXME(liuhui): Ideally, we should check the constructor parameter list to 6907 // verify that it is the default, copy or move constructor? 6908 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName && 6909 D.getFunctionTypeInfo().NumParams <= 1) 6910 return true; 6911 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) { 6912 auto Op = Id.OperatorFunctionId.Operator; 6913 // FIXME(liuhui): Ideally, we should check the function parameter list to 6914 // verify that it is the copy or move assignment? 6915 if (Op == OverloadedOperatorKind::OO_Equal) 6916 return true; 6917 if (LangOpts.CPlusPlus20 && 6918 (Op == OverloadedOperatorKind::OO_EqualEqual || 6919 Op == OverloadedOperatorKind::OO_ExclaimEqual || 6920 Op == OverloadedOperatorKind::OO_Less || 6921 Op == OverloadedOperatorKind::OO_LessEqual || 6922 Op == OverloadedOperatorKind::OO_Greater || 6923 Op == OverloadedOperatorKind::OO_GreaterEqual || 6924 Op == OverloadedOperatorKind::OO_Spaceship)) 6925 return true; 6926 } 6927 return false; 6928 }; 6929 6930 Results.EnterNewScope(); 6931 if (ShouldAddDefault()) 6932 Results.AddResult("default"); 6933 // FIXME(liuhui): Ideally, we should only provide `delete` completion for the 6934 // first function declaration. 6935 Results.AddResult("delete"); 6936 Results.ExitScope(); 6937 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6938 Results.data(), Results.size()); 6939 } 6940 6941 /// Macro that optionally prepends an "@" to the string literal passed in via 6942 /// Keyword, depending on whether NeedAt is true or false. 6943 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword) 6944 6945 static void AddObjCImplementationResults(const LangOptions &LangOpts, 6946 ResultBuilder &Results, bool NeedAt) { 6947 typedef CodeCompletionResult Result; 6948 // Since we have an implementation, we can end it. 6949 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6950 6951 CodeCompletionBuilder Builder(Results.getAllocator(), 6952 Results.getCodeCompletionTUInfo()); 6953 if (LangOpts.ObjC) { 6954 // @dynamic 6955 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic")); 6956 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6957 Builder.AddPlaceholderChunk("property"); 6958 Results.AddResult(Result(Builder.TakeString())); 6959 6960 // @synthesize 6961 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize")); 6962 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6963 Builder.AddPlaceholderChunk("property"); 6964 Results.AddResult(Result(Builder.TakeString())); 6965 } 6966 } 6967 6968 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 6969 ResultBuilder &Results, bool NeedAt) { 6970 typedef CodeCompletionResult Result; 6971 6972 // Since we have an interface or protocol, we can end it. 6973 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6974 6975 if (LangOpts.ObjC) { 6976 // @property 6977 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property"))); 6978 6979 // @required 6980 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required"))); 6981 6982 // @optional 6983 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional"))); 6984 } 6985 } 6986 6987 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 6988 typedef CodeCompletionResult Result; 6989 CodeCompletionBuilder Builder(Results.getAllocator(), 6990 Results.getCodeCompletionTUInfo()); 6991 6992 // @class name ; 6993 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class")); 6994 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6995 Builder.AddPlaceholderChunk("name"); 6996 Results.AddResult(Result(Builder.TakeString())); 6997 6998 if (Results.includeCodePatterns()) { 6999 // @interface name 7000 // FIXME: Could introduce the whole pattern, including superclasses and 7001 // such. 7002 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface")); 7003 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7004 Builder.AddPlaceholderChunk("class"); 7005 Results.AddResult(Result(Builder.TakeString())); 7006 7007 // @protocol name 7008 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 7009 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7010 Builder.AddPlaceholderChunk("protocol"); 7011 Results.AddResult(Result(Builder.TakeString())); 7012 7013 // @implementation name 7014 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation")); 7015 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7016 Builder.AddPlaceholderChunk("class"); 7017 Results.AddResult(Result(Builder.TakeString())); 7018 } 7019 7020 // @compatibility_alias name 7021 Builder.AddTypedTextChunk( 7022 OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias")); 7023 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7024 Builder.AddPlaceholderChunk("alias"); 7025 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7026 Builder.AddPlaceholderChunk("class"); 7027 Results.AddResult(Result(Builder.TakeString())); 7028 7029 if (Results.getSema().getLangOpts().Modules) { 7030 // @import name 7031 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 7032 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7033 Builder.AddPlaceholderChunk("module"); 7034 Results.AddResult(Result(Builder.TakeString())); 7035 } 7036 } 7037 7038 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 7039 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7040 CodeCompleter->getCodeCompletionTUInfo(), 7041 CodeCompletionContext::CCC_Other); 7042 Results.EnterNewScope(); 7043 if (isa<ObjCImplDecl>(CurContext)) 7044 AddObjCImplementationResults(getLangOpts(), Results, false); 7045 else if (CurContext->isObjCContainer()) 7046 AddObjCInterfaceResults(getLangOpts(), Results, false); 7047 else 7048 AddObjCTopLevelResults(Results, false); 7049 Results.ExitScope(); 7050 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7051 Results.data(), Results.size()); 7052 } 7053 7054 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 7055 typedef CodeCompletionResult Result; 7056 CodeCompletionBuilder Builder(Results.getAllocator(), 7057 Results.getCodeCompletionTUInfo()); 7058 7059 // @encode ( type-name ) 7060 const char *EncodeType = "char[]"; 7061 if (Results.getSema().getLangOpts().CPlusPlus || 7062 Results.getSema().getLangOpts().ConstStrings) 7063 EncodeType = "const char[]"; 7064 Builder.AddResultTypeChunk(EncodeType); 7065 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode")); 7066 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7067 Builder.AddPlaceholderChunk("type-name"); 7068 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7069 Results.AddResult(Result(Builder.TakeString())); 7070 7071 // @protocol ( protocol-name ) 7072 Builder.AddResultTypeChunk("Protocol *"); 7073 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 7074 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7075 Builder.AddPlaceholderChunk("protocol-name"); 7076 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7077 Results.AddResult(Result(Builder.TakeString())); 7078 7079 // @selector ( selector ) 7080 Builder.AddResultTypeChunk("SEL"); 7081 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector")); 7082 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7083 Builder.AddPlaceholderChunk("selector"); 7084 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7085 Results.AddResult(Result(Builder.TakeString())); 7086 7087 // @"string" 7088 Builder.AddResultTypeChunk("NSString *"); 7089 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\"")); 7090 Builder.AddPlaceholderChunk("string"); 7091 Builder.AddTextChunk("\""); 7092 Results.AddResult(Result(Builder.TakeString())); 7093 7094 // @[objects, ...] 7095 Builder.AddResultTypeChunk("NSArray *"); 7096 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "[")); 7097 Builder.AddPlaceholderChunk("objects, ..."); 7098 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 7099 Results.AddResult(Result(Builder.TakeString())); 7100 7101 // @{key : object, ...} 7102 Builder.AddResultTypeChunk("NSDictionary *"); 7103 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{")); 7104 Builder.AddPlaceholderChunk("key"); 7105 Builder.AddChunk(CodeCompletionString::CK_Colon); 7106 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7107 Builder.AddPlaceholderChunk("object, ..."); 7108 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7109 Results.AddResult(Result(Builder.TakeString())); 7110 7111 // @(expression) 7112 Builder.AddResultTypeChunk("id"); 7113 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 7114 Builder.AddPlaceholderChunk("expression"); 7115 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7116 Results.AddResult(Result(Builder.TakeString())); 7117 } 7118 7119 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 7120 typedef CodeCompletionResult Result; 7121 CodeCompletionBuilder Builder(Results.getAllocator(), 7122 Results.getCodeCompletionTUInfo()); 7123 7124 if (Results.includeCodePatterns()) { 7125 // @try { statements } @catch ( declaration ) { statements } @finally 7126 // { statements } 7127 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try")); 7128 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7129 Builder.AddPlaceholderChunk("statements"); 7130 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7131 Builder.AddTextChunk("@catch"); 7132 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7133 Builder.AddPlaceholderChunk("parameter"); 7134 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7135 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7136 Builder.AddPlaceholderChunk("statements"); 7137 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7138 Builder.AddTextChunk("@finally"); 7139 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7140 Builder.AddPlaceholderChunk("statements"); 7141 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7142 Results.AddResult(Result(Builder.TakeString())); 7143 } 7144 7145 // @throw 7146 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw")); 7147 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7148 Builder.AddPlaceholderChunk("expression"); 7149 Results.AddResult(Result(Builder.TakeString())); 7150 7151 if (Results.includeCodePatterns()) { 7152 // @synchronized ( expression ) { statements } 7153 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized")); 7154 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7155 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7156 Builder.AddPlaceholderChunk("expression"); 7157 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7158 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7159 Builder.AddPlaceholderChunk("statements"); 7160 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7161 Results.AddResult(Result(Builder.TakeString())); 7162 } 7163 } 7164 7165 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 7166 ResultBuilder &Results, bool NeedAt) { 7167 typedef CodeCompletionResult Result; 7168 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private"))); 7169 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected"))); 7170 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public"))); 7171 if (LangOpts.ObjC) 7172 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package"))); 7173 } 7174 7175 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 7176 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7177 CodeCompleter->getCodeCompletionTUInfo(), 7178 CodeCompletionContext::CCC_Other); 7179 Results.EnterNewScope(); 7180 AddObjCVisibilityResults(getLangOpts(), Results, false); 7181 Results.ExitScope(); 7182 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7183 Results.data(), Results.size()); 7184 } 7185 7186 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 7187 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7188 CodeCompleter->getCodeCompletionTUInfo(), 7189 CodeCompletionContext::CCC_Other); 7190 Results.EnterNewScope(); 7191 AddObjCStatementResults(Results, false); 7192 AddObjCExpressionResults(Results, false); 7193 Results.ExitScope(); 7194 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7195 Results.data(), Results.size()); 7196 } 7197 7198 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 7199 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7200 CodeCompleter->getCodeCompletionTUInfo(), 7201 CodeCompletionContext::CCC_Other); 7202 Results.EnterNewScope(); 7203 AddObjCExpressionResults(Results, false); 7204 Results.ExitScope(); 7205 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7206 Results.data(), Results.size()); 7207 } 7208 7209 /// Determine whether the addition of the given flag to an Objective-C 7210 /// property's attributes will cause a conflict. 7211 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 7212 // Check if we've already added this flag. 7213 if (Attributes & NewFlag) 7214 return true; 7215 7216 Attributes |= NewFlag; 7217 7218 // Check for collisions with "readonly". 7219 if ((Attributes & ObjCPropertyAttribute::kind_readonly) && 7220 (Attributes & ObjCPropertyAttribute::kind_readwrite)) 7221 return true; 7222 7223 // Check for more than one of { assign, copy, retain, strong, weak }. 7224 unsigned AssignCopyRetMask = 7225 Attributes & 7226 (ObjCPropertyAttribute::kind_assign | 7227 ObjCPropertyAttribute::kind_unsafe_unretained | 7228 ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain | 7229 ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak); 7230 if (AssignCopyRetMask && 7231 AssignCopyRetMask != ObjCPropertyAttribute::kind_assign && 7232 AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained && 7233 AssignCopyRetMask != ObjCPropertyAttribute::kind_copy && 7234 AssignCopyRetMask != ObjCPropertyAttribute::kind_retain && 7235 AssignCopyRetMask != ObjCPropertyAttribute::kind_strong && 7236 AssignCopyRetMask != ObjCPropertyAttribute::kind_weak) 7237 return true; 7238 7239 return false; 7240 } 7241 7242 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 7243 if (!CodeCompleter) 7244 return; 7245 7246 unsigned Attributes = ODS.getPropertyAttributes(); 7247 7248 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7249 CodeCompleter->getCodeCompletionTUInfo(), 7250 CodeCompletionContext::CCC_Other); 7251 Results.EnterNewScope(); 7252 if (!ObjCPropertyFlagConflicts(Attributes, 7253 ObjCPropertyAttribute::kind_readonly)) 7254 Results.AddResult(CodeCompletionResult("readonly")); 7255 if (!ObjCPropertyFlagConflicts(Attributes, 7256 ObjCPropertyAttribute::kind_assign)) 7257 Results.AddResult(CodeCompletionResult("assign")); 7258 if (!ObjCPropertyFlagConflicts(Attributes, 7259 ObjCPropertyAttribute::kind_unsafe_unretained)) 7260 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 7261 if (!ObjCPropertyFlagConflicts(Attributes, 7262 ObjCPropertyAttribute::kind_readwrite)) 7263 Results.AddResult(CodeCompletionResult("readwrite")); 7264 if (!ObjCPropertyFlagConflicts(Attributes, 7265 ObjCPropertyAttribute::kind_retain)) 7266 Results.AddResult(CodeCompletionResult("retain")); 7267 if (!ObjCPropertyFlagConflicts(Attributes, 7268 ObjCPropertyAttribute::kind_strong)) 7269 Results.AddResult(CodeCompletionResult("strong")); 7270 if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy)) 7271 Results.AddResult(CodeCompletionResult("copy")); 7272 if (!ObjCPropertyFlagConflicts(Attributes, 7273 ObjCPropertyAttribute::kind_nonatomic)) 7274 Results.AddResult(CodeCompletionResult("nonatomic")); 7275 if (!ObjCPropertyFlagConflicts(Attributes, 7276 ObjCPropertyAttribute::kind_atomic)) 7277 Results.AddResult(CodeCompletionResult("atomic")); 7278 7279 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 7280 if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC) 7281 if (!ObjCPropertyFlagConflicts(Attributes, 7282 ObjCPropertyAttribute::kind_weak)) 7283 Results.AddResult(CodeCompletionResult("weak")); 7284 7285 if (!ObjCPropertyFlagConflicts(Attributes, 7286 ObjCPropertyAttribute::kind_setter)) { 7287 CodeCompletionBuilder Setter(Results.getAllocator(), 7288 Results.getCodeCompletionTUInfo()); 7289 Setter.AddTypedTextChunk("setter"); 7290 Setter.AddTextChunk("="); 7291 Setter.AddPlaceholderChunk("method"); 7292 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 7293 } 7294 if (!ObjCPropertyFlagConflicts(Attributes, 7295 ObjCPropertyAttribute::kind_getter)) { 7296 CodeCompletionBuilder Getter(Results.getAllocator(), 7297 Results.getCodeCompletionTUInfo()); 7298 Getter.AddTypedTextChunk("getter"); 7299 Getter.AddTextChunk("="); 7300 Getter.AddPlaceholderChunk("method"); 7301 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 7302 } 7303 if (!ObjCPropertyFlagConflicts(Attributes, 7304 ObjCPropertyAttribute::kind_nullability)) { 7305 Results.AddResult(CodeCompletionResult("nonnull")); 7306 Results.AddResult(CodeCompletionResult("nullable")); 7307 Results.AddResult(CodeCompletionResult("null_unspecified")); 7308 Results.AddResult(CodeCompletionResult("null_resettable")); 7309 } 7310 Results.ExitScope(); 7311 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7312 Results.data(), Results.size()); 7313 } 7314 7315 /// Describes the kind of Objective-C method that we want to find 7316 /// via code completion. 7317 enum ObjCMethodKind { 7318 MK_Any, ///< Any kind of method, provided it means other specified criteria. 7319 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 7320 MK_OneArgSelector ///< One-argument selector. 7321 }; 7322 7323 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind, 7324 ArrayRef<IdentifierInfo *> SelIdents, 7325 bool AllowSameLength = true) { 7326 unsigned NumSelIdents = SelIdents.size(); 7327 if (NumSelIdents > Sel.getNumArgs()) 7328 return false; 7329 7330 switch (WantKind) { 7331 case MK_Any: 7332 break; 7333 case MK_ZeroArgSelector: 7334 return Sel.isUnarySelector(); 7335 case MK_OneArgSelector: 7336 return Sel.getNumArgs() == 1; 7337 } 7338 7339 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 7340 return false; 7341 7342 for (unsigned I = 0; I != NumSelIdents; ++I) 7343 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 7344 return false; 7345 7346 return true; 7347 } 7348 7349 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 7350 ObjCMethodKind WantKind, 7351 ArrayRef<IdentifierInfo *> SelIdents, 7352 bool AllowSameLength = true) { 7353 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 7354 AllowSameLength); 7355 } 7356 7357 /// A set of selectors, which is used to avoid introducing multiple 7358 /// completions with the same selector into the result set. 7359 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 7360 7361 /// Add all of the Objective-C methods in the given Objective-C 7362 /// container to the set of results. 7363 /// 7364 /// The container will be a class, protocol, category, or implementation of 7365 /// any of the above. This mether will recurse to include methods from 7366 /// the superclasses of classes along with their categories, protocols, and 7367 /// implementations. 7368 /// 7369 /// \param Container the container in which we'll look to find methods. 7370 /// 7371 /// \param WantInstanceMethods Whether to add instance methods (only); if 7372 /// false, this routine will add factory methods (only). 7373 /// 7374 /// \param CurContext the context in which we're performing the lookup that 7375 /// finds methods. 7376 /// 7377 /// \param AllowSameLength Whether we allow a method to be added to the list 7378 /// when it has the same number of parameters as we have selector identifiers. 7379 /// 7380 /// \param Results the structure into which we'll add results. 7381 static void AddObjCMethods(ObjCContainerDecl *Container, 7382 bool WantInstanceMethods, ObjCMethodKind WantKind, 7383 ArrayRef<IdentifierInfo *> SelIdents, 7384 DeclContext *CurContext, 7385 VisitedSelectorSet &Selectors, bool AllowSameLength, 7386 ResultBuilder &Results, bool InOriginalClass = true, 7387 bool IsRootClass = false) { 7388 typedef CodeCompletionResult Result; 7389 Container = getContainerDef(Container); 7390 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 7391 IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass()); 7392 for (ObjCMethodDecl *M : Container->methods()) { 7393 // The instance methods on the root class can be messaged via the 7394 // metaclass. 7395 if (M->isInstanceMethod() == WantInstanceMethods || 7396 (IsRootClass && !WantInstanceMethods)) { 7397 // Check whether the selector identifiers we've been given are a 7398 // subset of the identifiers for this particular method. 7399 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength)) 7400 continue; 7401 7402 if (!Selectors.insert(M->getSelector()).second) 7403 continue; 7404 7405 Result R = Result(M, Results.getBasePriority(M), nullptr); 7406 R.StartParameter = SelIdents.size(); 7407 R.AllParametersAreInformative = (WantKind != MK_Any); 7408 if (!InOriginalClass) 7409 setInBaseClass(R); 7410 Results.MaybeAddResult(R, CurContext); 7411 } 7412 } 7413 7414 // Visit the protocols of protocols. 7415 if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 7416 if (Protocol->hasDefinition()) { 7417 const ObjCList<ObjCProtocolDecl> &Protocols = 7418 Protocol->getReferencedProtocols(); 7419 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7420 E = Protocols.end(); 7421 I != E; ++I) 7422 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7423 Selectors, AllowSameLength, Results, false, IsRootClass); 7424 } 7425 } 7426 7427 if (!IFace || !IFace->hasDefinition()) 7428 return; 7429 7430 // Add methods in protocols. 7431 for (ObjCProtocolDecl *I : IFace->protocols()) 7432 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7433 Selectors, AllowSameLength, Results, false, IsRootClass); 7434 7435 // Add methods in categories. 7436 for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) { 7437 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 7438 CurContext, Selectors, AllowSameLength, Results, 7439 InOriginalClass, IsRootClass); 7440 7441 // Add a categories protocol methods. 7442 const ObjCList<ObjCProtocolDecl> &Protocols = 7443 CatDecl->getReferencedProtocols(); 7444 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7445 E = Protocols.end(); 7446 I != E; ++I) 7447 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7448 Selectors, AllowSameLength, Results, false, IsRootClass); 7449 7450 // Add methods in category implementations. 7451 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 7452 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7453 Selectors, AllowSameLength, Results, InOriginalClass, 7454 IsRootClass); 7455 } 7456 7457 // Add methods in superclass. 7458 // Avoid passing in IsRootClass since root classes won't have super classes. 7459 if (IFace->getSuperClass()) 7460 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 7461 SelIdents, CurContext, Selectors, AllowSameLength, Results, 7462 /*IsRootClass=*/false); 7463 7464 // Add methods in our implementation, if any. 7465 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 7466 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7467 Selectors, AllowSameLength, Results, InOriginalClass, 7468 IsRootClass); 7469 } 7470 7471 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 7472 // Try to find the interface where getters might live. 7473 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7474 if (!Class) { 7475 if (ObjCCategoryDecl *Category = 7476 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7477 Class = Category->getClassInterface(); 7478 7479 if (!Class) 7480 return; 7481 } 7482 7483 // Find all of the potential getters. 7484 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7485 CodeCompleter->getCodeCompletionTUInfo(), 7486 CodeCompletionContext::CCC_Other); 7487 Results.EnterNewScope(); 7488 7489 VisitedSelectorSet Selectors; 7490 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 7491 /*AllowSameLength=*/true, Results); 7492 Results.ExitScope(); 7493 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7494 Results.data(), Results.size()); 7495 } 7496 7497 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 7498 // Try to find the interface where setters might live. 7499 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7500 if (!Class) { 7501 if (ObjCCategoryDecl *Category = 7502 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7503 Class = Category->getClassInterface(); 7504 7505 if (!Class) 7506 return; 7507 } 7508 7509 // Find all of the potential getters. 7510 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7511 CodeCompleter->getCodeCompletionTUInfo(), 7512 CodeCompletionContext::CCC_Other); 7513 Results.EnterNewScope(); 7514 7515 VisitedSelectorSet Selectors; 7516 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors, 7517 /*AllowSameLength=*/true, Results); 7518 7519 Results.ExitScope(); 7520 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7521 Results.data(), Results.size()); 7522 } 7523 7524 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 7525 bool IsParameter) { 7526 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7527 CodeCompleter->getCodeCompletionTUInfo(), 7528 CodeCompletionContext::CCC_Type); 7529 Results.EnterNewScope(); 7530 7531 // Add context-sensitive, Objective-C parameter-passing keywords. 7532 bool AddedInOut = false; 7533 if ((DS.getObjCDeclQualifier() & 7534 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 7535 Results.AddResult("in"); 7536 Results.AddResult("inout"); 7537 AddedInOut = true; 7538 } 7539 if ((DS.getObjCDeclQualifier() & 7540 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 7541 Results.AddResult("out"); 7542 if (!AddedInOut) 7543 Results.AddResult("inout"); 7544 } 7545 if ((DS.getObjCDeclQualifier() & 7546 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 7547 ObjCDeclSpec::DQ_Oneway)) == 0) { 7548 Results.AddResult("bycopy"); 7549 Results.AddResult("byref"); 7550 Results.AddResult("oneway"); 7551 } 7552 if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) { 7553 Results.AddResult("nonnull"); 7554 Results.AddResult("nullable"); 7555 Results.AddResult("null_unspecified"); 7556 } 7557 7558 // If we're completing the return type of an Objective-C method and the 7559 // identifier IBAction refers to a macro, provide a completion item for 7560 // an action, e.g., 7561 // IBAction)<#selector#>:(id)sender 7562 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 7563 PP.isMacroDefined("IBAction")) { 7564 CodeCompletionBuilder Builder(Results.getAllocator(), 7565 Results.getCodeCompletionTUInfo(), 7566 CCP_CodePattern, CXAvailability_Available); 7567 Builder.AddTypedTextChunk("IBAction"); 7568 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7569 Builder.AddPlaceholderChunk("selector"); 7570 Builder.AddChunk(CodeCompletionString::CK_Colon); 7571 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7572 Builder.AddTextChunk("id"); 7573 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7574 Builder.AddTextChunk("sender"); 7575 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 7576 } 7577 7578 // If we're completing the return type, provide 'instancetype'. 7579 if (!IsParameter) { 7580 Results.AddResult(CodeCompletionResult("instancetype")); 7581 } 7582 7583 // Add various builtin type names and specifiers. 7584 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 7585 Results.ExitScope(); 7586 7587 // Add the various type names 7588 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 7589 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7590 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7591 CodeCompleter->includeGlobals(), 7592 CodeCompleter->loadExternal()); 7593 7594 if (CodeCompleter->includeMacros()) 7595 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7596 7597 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7598 Results.data(), Results.size()); 7599 } 7600 7601 /// When we have an expression with type "id", we may assume 7602 /// that it has some more-specific class type based on knowledge of 7603 /// common uses of Objective-C. This routine returns that class type, 7604 /// or NULL if no better result could be determined. 7605 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 7606 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 7607 if (!Msg) 7608 return nullptr; 7609 7610 Selector Sel = Msg->getSelector(); 7611 if (Sel.isNull()) 7612 return nullptr; 7613 7614 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 7615 if (!Id) 7616 return nullptr; 7617 7618 ObjCMethodDecl *Method = Msg->getMethodDecl(); 7619 if (!Method) 7620 return nullptr; 7621 7622 // Determine the class that we're sending the message to. 7623 ObjCInterfaceDecl *IFace = nullptr; 7624 switch (Msg->getReceiverKind()) { 7625 case ObjCMessageExpr::Class: 7626 if (const ObjCObjectType *ObjType = 7627 Msg->getClassReceiver()->getAs<ObjCObjectType>()) 7628 IFace = ObjType->getInterface(); 7629 break; 7630 7631 case ObjCMessageExpr::Instance: { 7632 QualType T = Msg->getInstanceReceiver()->getType(); 7633 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 7634 IFace = Ptr->getInterfaceDecl(); 7635 break; 7636 } 7637 7638 case ObjCMessageExpr::SuperInstance: 7639 case ObjCMessageExpr::SuperClass: 7640 break; 7641 } 7642 7643 if (!IFace) 7644 return nullptr; 7645 7646 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 7647 if (Method->isInstanceMethod()) 7648 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7649 .Case("retain", IFace) 7650 .Case("strong", IFace) 7651 .Case("autorelease", IFace) 7652 .Case("copy", IFace) 7653 .Case("copyWithZone", IFace) 7654 .Case("mutableCopy", IFace) 7655 .Case("mutableCopyWithZone", IFace) 7656 .Case("awakeFromCoder", IFace) 7657 .Case("replacementObjectFromCoder", IFace) 7658 .Case("class", IFace) 7659 .Case("classForCoder", IFace) 7660 .Case("superclass", Super) 7661 .Default(nullptr); 7662 7663 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7664 .Case("new", IFace) 7665 .Case("alloc", IFace) 7666 .Case("allocWithZone", IFace) 7667 .Case("class", IFace) 7668 .Case("superclass", Super) 7669 .Default(nullptr); 7670 } 7671 7672 // Add a special completion for a message send to "super", which fills in the 7673 // most likely case of forwarding all of our arguments to the superclass 7674 // function. 7675 /// 7676 /// \param S The semantic analysis object. 7677 /// 7678 /// \param NeedSuperKeyword Whether we need to prefix this completion with 7679 /// the "super" keyword. Otherwise, we just need to provide the arguments. 7680 /// 7681 /// \param SelIdents The identifiers in the selector that have already been 7682 /// provided as arguments for a send to "super". 7683 /// 7684 /// \param Results The set of results to augment. 7685 /// 7686 /// \returns the Objective-C method declaration that would be invoked by 7687 /// this "super" completion. If NULL, no completion was added. 7688 static ObjCMethodDecl * 7689 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 7690 ArrayRef<IdentifierInfo *> SelIdents, 7691 ResultBuilder &Results) { 7692 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 7693 if (!CurMethod) 7694 return nullptr; 7695 7696 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 7697 if (!Class) 7698 return nullptr; 7699 7700 // Try to find a superclass method with the same selector. 7701 ObjCMethodDecl *SuperMethod = nullptr; 7702 while ((Class = Class->getSuperClass()) && !SuperMethod) { 7703 // Check in the class 7704 SuperMethod = Class->getMethod(CurMethod->getSelector(), 7705 CurMethod->isInstanceMethod()); 7706 7707 // Check in categories or class extensions. 7708 if (!SuperMethod) { 7709 for (const auto *Cat : Class->known_categories()) { 7710 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 7711 CurMethod->isInstanceMethod()))) 7712 break; 7713 } 7714 } 7715 } 7716 7717 if (!SuperMethod) 7718 return nullptr; 7719 7720 // Check whether the superclass method has the same signature. 7721 if (CurMethod->param_size() != SuperMethod->param_size() || 7722 CurMethod->isVariadic() != SuperMethod->isVariadic()) 7723 return nullptr; 7724 7725 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 7726 CurPEnd = CurMethod->param_end(), 7727 SuperP = SuperMethod->param_begin(); 7728 CurP != CurPEnd; ++CurP, ++SuperP) { 7729 // Make sure the parameter types are compatible. 7730 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 7731 (*SuperP)->getType())) 7732 return nullptr; 7733 7734 // Make sure we have a parameter name to forward! 7735 if (!(*CurP)->getIdentifier()) 7736 return nullptr; 7737 } 7738 7739 // We have a superclass method. Now, form the send-to-super completion. 7740 CodeCompletionBuilder Builder(Results.getAllocator(), 7741 Results.getCodeCompletionTUInfo()); 7742 7743 // Give this completion a return type. 7744 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 7745 Results.getCompletionContext().getBaseType(), Builder); 7746 7747 // If we need the "super" keyword, add it (plus some spacing). 7748 if (NeedSuperKeyword) { 7749 Builder.AddTypedTextChunk("super"); 7750 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7751 } 7752 7753 Selector Sel = CurMethod->getSelector(); 7754 if (Sel.isUnarySelector()) { 7755 if (NeedSuperKeyword) 7756 Builder.AddTextChunk( 7757 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7758 else 7759 Builder.AddTypedTextChunk( 7760 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7761 } else { 7762 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 7763 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 7764 if (I > SelIdents.size()) 7765 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7766 7767 if (I < SelIdents.size()) 7768 Builder.AddInformativeChunk( 7769 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7770 else if (NeedSuperKeyword || I > SelIdents.size()) { 7771 Builder.AddTextChunk( 7772 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7773 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7774 (*CurP)->getIdentifier()->getName())); 7775 } else { 7776 Builder.AddTypedTextChunk( 7777 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7778 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7779 (*CurP)->getIdentifier()->getName())); 7780 } 7781 } 7782 } 7783 7784 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 7785 CCP_SuperCompletion)); 7786 return SuperMethod; 7787 } 7788 7789 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 7790 typedef CodeCompletionResult Result; 7791 ResultBuilder Results( 7792 *this, CodeCompleter->getAllocator(), 7793 CodeCompleter->getCodeCompletionTUInfo(), 7794 CodeCompletionContext::CCC_ObjCMessageReceiver, 7795 getLangOpts().CPlusPlus11 7796 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 7797 : &ResultBuilder::IsObjCMessageReceiver); 7798 7799 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7800 Results.EnterNewScope(); 7801 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7802 CodeCompleter->includeGlobals(), 7803 CodeCompleter->loadExternal()); 7804 7805 // If we are in an Objective-C method inside a class that has a superclass, 7806 // add "super" as an option. 7807 if (ObjCMethodDecl *Method = getCurMethodDecl()) 7808 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 7809 if (Iface->getSuperClass()) { 7810 Results.AddResult(Result("super")); 7811 7812 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 7813 } 7814 7815 if (getLangOpts().CPlusPlus11) 7816 addThisCompletion(*this, Results); 7817 7818 Results.ExitScope(); 7819 7820 if (CodeCompleter->includeMacros()) 7821 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7822 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7823 Results.data(), Results.size()); 7824 } 7825 7826 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 7827 ArrayRef<IdentifierInfo *> SelIdents, 7828 bool AtArgumentExpression) { 7829 ObjCInterfaceDecl *CDecl = nullptr; 7830 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7831 // Figure out which interface we're in. 7832 CDecl = CurMethod->getClassInterface(); 7833 if (!CDecl) 7834 return; 7835 7836 // Find the superclass of this class. 7837 CDecl = CDecl->getSuperClass(); 7838 if (!CDecl) 7839 return; 7840 7841 if (CurMethod->isInstanceMethod()) { 7842 // We are inside an instance method, which means that the message 7843 // send [super ...] is actually calling an instance method on the 7844 // current object. 7845 return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents, 7846 AtArgumentExpression, CDecl); 7847 } 7848 7849 // Fall through to send to the superclass in CDecl. 7850 } else { 7851 // "super" may be the name of a type or variable. Figure out which 7852 // it is. 7853 IdentifierInfo *Super = getSuperIdentifier(); 7854 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName); 7855 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 7856 // "super" names an interface. Use it. 7857 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 7858 if (const ObjCObjectType *Iface = 7859 Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 7860 CDecl = Iface->getInterface(); 7861 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 7862 // "super" names an unresolved type; we can't be more specific. 7863 } else { 7864 // Assume that "super" names some kind of value and parse that way. 7865 CXXScopeSpec SS; 7866 SourceLocation TemplateKWLoc; 7867 UnqualifiedId id; 7868 id.setIdentifier(Super, SuperLoc); 7869 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 7870 /*HasTrailingLParen=*/false, 7871 /*IsAddressOfOperand=*/false); 7872 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 7873 SelIdents, AtArgumentExpression); 7874 } 7875 7876 // Fall through 7877 } 7878 7879 ParsedType Receiver; 7880 if (CDecl) 7881 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 7882 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 7883 AtArgumentExpression, 7884 /*IsSuper=*/true); 7885 } 7886 7887 /// Given a set of code-completion results for the argument of a message 7888 /// send, determine the preferred type (if any) for that argument expression. 7889 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 7890 unsigned NumSelIdents) { 7891 typedef CodeCompletionResult Result; 7892 ASTContext &Context = Results.getSema().Context; 7893 7894 QualType PreferredType; 7895 unsigned BestPriority = CCP_Unlikely * 2; 7896 Result *ResultsData = Results.data(); 7897 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 7898 Result &R = ResultsData[I]; 7899 if (R.Kind == Result::RK_Declaration && 7900 isa<ObjCMethodDecl>(R.Declaration)) { 7901 if (R.Priority <= BestPriority) { 7902 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 7903 if (NumSelIdents <= Method->param_size()) { 7904 QualType MyPreferredType = 7905 Method->parameters()[NumSelIdents - 1]->getType(); 7906 if (R.Priority < BestPriority || PreferredType.isNull()) { 7907 BestPriority = R.Priority; 7908 PreferredType = MyPreferredType; 7909 } else if (!Context.hasSameUnqualifiedType(PreferredType, 7910 MyPreferredType)) { 7911 PreferredType = QualType(); 7912 } 7913 } 7914 } 7915 } 7916 } 7917 7918 return PreferredType; 7919 } 7920 7921 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 7922 ParsedType Receiver, 7923 ArrayRef<IdentifierInfo *> SelIdents, 7924 bool AtArgumentExpression, bool IsSuper, 7925 ResultBuilder &Results) { 7926 typedef CodeCompletionResult Result; 7927 ObjCInterfaceDecl *CDecl = nullptr; 7928 7929 // If the given name refers to an interface type, retrieve the 7930 // corresponding declaration. 7931 if (Receiver) { 7932 QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr); 7933 if (!T.isNull()) 7934 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 7935 CDecl = Interface->getInterface(); 7936 } 7937 7938 // Add all of the factory methods in this Objective-C class, its protocols, 7939 // superclasses, categories, implementation, etc. 7940 Results.EnterNewScope(); 7941 7942 // If this is a send-to-super, try to add the special "super" send 7943 // completion. 7944 if (IsSuper) { 7945 if (ObjCMethodDecl *SuperMethod = 7946 AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 7947 Results.Ignore(SuperMethod); 7948 } 7949 7950 // If we're inside an Objective-C method definition, prefer its selector to 7951 // others. 7952 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 7953 Results.setPreferredSelector(CurMethod->getSelector()); 7954 7955 VisitedSelectorSet Selectors; 7956 if (CDecl) 7957 AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext, 7958 Selectors, AtArgumentExpression, Results); 7959 else { 7960 // We're messaging "id" as a type; provide all class/factory methods. 7961 7962 // If we have an external source, load the entire class method 7963 // pool from the AST file. 7964 if (SemaRef.getExternalSource()) { 7965 for (uint32_t I = 0, 7966 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 7967 I != N; ++I) { 7968 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 7969 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 7970 continue; 7971 7972 SemaRef.ReadMethodPool(Sel); 7973 } 7974 } 7975 7976 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 7977 MEnd = SemaRef.MethodPool.end(); 7978 M != MEnd; ++M) { 7979 for (ObjCMethodList *MethList = &M->second.second; 7980 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 7981 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 7982 continue; 7983 7984 Result R(MethList->getMethod(), 7985 Results.getBasePriority(MethList->getMethod()), nullptr); 7986 R.StartParameter = SelIdents.size(); 7987 R.AllParametersAreInformative = false; 7988 Results.MaybeAddResult(R, SemaRef.CurContext); 7989 } 7990 } 7991 } 7992 7993 Results.ExitScope(); 7994 } 7995 7996 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 7997 ArrayRef<IdentifierInfo *> SelIdents, 7998 bool AtArgumentExpression, 7999 bool IsSuper) { 8000 8001 QualType T = this->GetTypeFromParser(Receiver); 8002 8003 ResultBuilder Results( 8004 *this, CodeCompleter->getAllocator(), 8005 CodeCompleter->getCodeCompletionTUInfo(), 8006 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T, 8007 SelIdents)); 8008 8009 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 8010 AtArgumentExpression, IsSuper, Results); 8011 8012 // If we're actually at the argument expression (rather than prior to the 8013 // selector), we're actually performing code completion for an expression. 8014 // Determine whether we have a single, best method. If so, we can 8015 // code-complete the expression using the corresponding parameter type as 8016 // our preferred type, improving completion results. 8017 if (AtArgumentExpression) { 8018 QualType PreferredType = 8019 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 8020 if (PreferredType.isNull()) 8021 CodeCompleteOrdinaryName(S, PCC_Expression); 8022 else 8023 CodeCompleteExpression(S, PreferredType); 8024 return; 8025 } 8026 8027 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8028 Results.data(), Results.size()); 8029 } 8030 8031 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 8032 ArrayRef<IdentifierInfo *> SelIdents, 8033 bool AtArgumentExpression, 8034 ObjCInterfaceDecl *Super) { 8035 typedef CodeCompletionResult Result; 8036 8037 Expr *RecExpr = static_cast<Expr *>(Receiver); 8038 8039 // If necessary, apply function/array conversion to the receiver. 8040 // C99 6.7.5.3p[7,8]. 8041 if (RecExpr) { 8042 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 8043 if (Conv.isInvalid()) // conversion failed. bail. 8044 return; 8045 RecExpr = Conv.get(); 8046 } 8047 QualType ReceiverType = RecExpr 8048 ? RecExpr->getType() 8049 : Super ? Context.getObjCObjectPointerType( 8050 Context.getObjCInterfaceType(Super)) 8051 : Context.getObjCIdType(); 8052 8053 // If we're messaging an expression with type "id" or "Class", check 8054 // whether we know something special about the receiver that allows 8055 // us to assume a more-specific receiver type. 8056 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 8057 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 8058 if (ReceiverType->isObjCClassType()) 8059 return CodeCompleteObjCClassMessage( 8060 S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents, 8061 AtArgumentExpression, Super); 8062 8063 ReceiverType = 8064 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace)); 8065 } 8066 } else if (RecExpr && getLangOpts().CPlusPlus) { 8067 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 8068 if (Conv.isUsable()) { 8069 RecExpr = Conv.get(); 8070 ReceiverType = RecExpr->getType(); 8071 } 8072 } 8073 8074 // Build the set of methods we can see. 8075 ResultBuilder Results( 8076 *this, CodeCompleter->getAllocator(), 8077 CodeCompleter->getCodeCompletionTUInfo(), 8078 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 8079 ReceiverType, SelIdents)); 8080 8081 Results.EnterNewScope(); 8082 8083 // If this is a send-to-super, try to add the special "super" send 8084 // completion. 8085 if (Super) { 8086 if (ObjCMethodDecl *SuperMethod = 8087 AddSuperSendCompletion(*this, false, SelIdents, Results)) 8088 Results.Ignore(SuperMethod); 8089 } 8090 8091 // If we're inside an Objective-C method definition, prefer its selector to 8092 // others. 8093 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 8094 Results.setPreferredSelector(CurMethod->getSelector()); 8095 8096 // Keep track of the selectors we've already added. 8097 VisitedSelectorSet Selectors; 8098 8099 // Handle messages to Class. This really isn't a message to an instance 8100 // method, so we treat it the same way we would treat a message send to a 8101 // class method. 8102 if (ReceiverType->isObjCClassType() || 8103 ReceiverType->isObjCQualifiedClassType()) { 8104 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 8105 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 8106 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext, 8107 Selectors, AtArgumentExpression, Results); 8108 } 8109 } 8110 // Handle messages to a qualified ID ("id<foo>"). 8111 else if (const ObjCObjectPointerType *QualID = 8112 ReceiverType->getAsObjCQualifiedIdType()) { 8113 // Search protocols for instance methods. 8114 for (auto *I : QualID->quals()) 8115 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 8116 AtArgumentExpression, Results); 8117 } 8118 // Handle messages to a pointer to interface type. 8119 else if (const ObjCObjectPointerType *IFacePtr = 8120 ReceiverType->getAsObjCInterfacePointerType()) { 8121 // Search the class, its superclasses, etc., for instance methods. 8122 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 8123 CurContext, Selectors, AtArgumentExpression, Results); 8124 8125 // Search protocols for instance methods. 8126 for (auto *I : IFacePtr->quals()) 8127 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 8128 AtArgumentExpression, Results); 8129 } 8130 // Handle messages to "id". 8131 else if (ReceiverType->isObjCIdType()) { 8132 // We're messaging "id", so provide all instance methods we know 8133 // about as code-completion results. 8134 8135 // If we have an external source, load the entire class method 8136 // pool from the AST file. 8137 if (ExternalSource) { 8138 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 8139 I != N; ++I) { 8140 Selector Sel = ExternalSource->GetExternalSelector(I); 8141 if (Sel.isNull() || MethodPool.count(Sel)) 8142 continue; 8143 8144 ReadMethodPool(Sel); 8145 } 8146 } 8147 8148 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8149 MEnd = MethodPool.end(); 8150 M != MEnd; ++M) { 8151 for (ObjCMethodList *MethList = &M->second.first; 8152 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 8153 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 8154 continue; 8155 8156 if (!Selectors.insert(MethList->getMethod()->getSelector()).second) 8157 continue; 8158 8159 Result R(MethList->getMethod(), 8160 Results.getBasePriority(MethList->getMethod()), nullptr); 8161 R.StartParameter = SelIdents.size(); 8162 R.AllParametersAreInformative = false; 8163 Results.MaybeAddResult(R, CurContext); 8164 } 8165 } 8166 } 8167 Results.ExitScope(); 8168 8169 // If we're actually at the argument expression (rather than prior to the 8170 // selector), we're actually performing code completion for an expression. 8171 // Determine whether we have a single, best method. If so, we can 8172 // code-complete the expression using the corresponding parameter type as 8173 // our preferred type, improving completion results. 8174 if (AtArgumentExpression) { 8175 QualType PreferredType = 8176 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 8177 if (PreferredType.isNull()) 8178 CodeCompleteOrdinaryName(S, PCC_Expression); 8179 else 8180 CodeCompleteExpression(S, PreferredType); 8181 return; 8182 } 8183 8184 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8185 Results.data(), Results.size()); 8186 } 8187 8188 void Sema::CodeCompleteObjCForCollection(Scope *S, 8189 DeclGroupPtrTy IterationVar) { 8190 CodeCompleteExpressionData Data; 8191 Data.ObjCCollection = true; 8192 8193 if (IterationVar.getAsOpaquePtr()) { 8194 DeclGroupRef DG = IterationVar.get(); 8195 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 8196 if (*I) 8197 Data.IgnoreDecls.push_back(*I); 8198 } 8199 } 8200 8201 CodeCompleteExpression(S, Data); 8202 } 8203 8204 void Sema::CodeCompleteObjCSelector(Scope *S, 8205 ArrayRef<IdentifierInfo *> SelIdents) { 8206 // If we have an external source, load the entire class method 8207 // pool from the AST file. 8208 if (ExternalSource) { 8209 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 8210 ++I) { 8211 Selector Sel = ExternalSource->GetExternalSelector(I); 8212 if (Sel.isNull() || MethodPool.count(Sel)) 8213 continue; 8214 8215 ReadMethodPool(Sel); 8216 } 8217 } 8218 8219 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8220 CodeCompleter->getCodeCompletionTUInfo(), 8221 CodeCompletionContext::CCC_SelectorName); 8222 Results.EnterNewScope(); 8223 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8224 MEnd = MethodPool.end(); 8225 M != MEnd; ++M) { 8226 8227 Selector Sel = M->first; 8228 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 8229 continue; 8230 8231 CodeCompletionBuilder Builder(Results.getAllocator(), 8232 Results.getCodeCompletionTUInfo()); 8233 if (Sel.isUnarySelector()) { 8234 Builder.AddTypedTextChunk( 8235 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 8236 Results.AddResult(Builder.TakeString()); 8237 continue; 8238 } 8239 8240 std::string Accumulator; 8241 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 8242 if (I == SelIdents.size()) { 8243 if (!Accumulator.empty()) { 8244 Builder.AddInformativeChunk( 8245 Builder.getAllocator().CopyString(Accumulator)); 8246 Accumulator.clear(); 8247 } 8248 } 8249 8250 Accumulator += Sel.getNameForSlot(I); 8251 Accumulator += ':'; 8252 } 8253 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator)); 8254 Results.AddResult(Builder.TakeString()); 8255 } 8256 Results.ExitScope(); 8257 8258 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8259 Results.data(), Results.size()); 8260 } 8261 8262 /// Add all of the protocol declarations that we find in the given 8263 /// (translation unit) context. 8264 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 8265 bool OnlyForwardDeclarations, 8266 ResultBuilder &Results) { 8267 typedef CodeCompletionResult Result; 8268 8269 for (const auto *D : Ctx->decls()) { 8270 // Record any protocols we find. 8271 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 8272 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 8273 Results.AddResult( 8274 Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext, 8275 nullptr, false); 8276 } 8277 } 8278 8279 void Sema::CodeCompleteObjCProtocolReferences( 8280 ArrayRef<IdentifierLocPair> Protocols) { 8281 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8282 CodeCompleter->getCodeCompletionTUInfo(), 8283 CodeCompletionContext::CCC_ObjCProtocolName); 8284 8285 if (CodeCompleter->includeGlobals()) { 8286 Results.EnterNewScope(); 8287 8288 // Tell the result set to ignore all of the protocols we have 8289 // already seen. 8290 // FIXME: This doesn't work when caching code-completion results. 8291 for (const IdentifierLocPair &Pair : Protocols) 8292 if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second)) 8293 Results.Ignore(Protocol); 8294 8295 // Add all protocols. 8296 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 8297 Results); 8298 8299 Results.ExitScope(); 8300 } 8301 8302 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8303 Results.data(), Results.size()); 8304 } 8305 8306 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 8307 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8308 CodeCompleter->getCodeCompletionTUInfo(), 8309 CodeCompletionContext::CCC_ObjCProtocolName); 8310 8311 if (CodeCompleter->includeGlobals()) { 8312 Results.EnterNewScope(); 8313 8314 // Add all protocols. 8315 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 8316 Results); 8317 8318 Results.ExitScope(); 8319 } 8320 8321 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8322 Results.data(), Results.size()); 8323 } 8324 8325 /// Add all of the Objective-C interface declarations that we find in 8326 /// the given (translation unit) context. 8327 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 8328 bool OnlyForwardDeclarations, 8329 bool OnlyUnimplemented, 8330 ResultBuilder &Results) { 8331 typedef CodeCompletionResult Result; 8332 8333 for (const auto *D : Ctx->decls()) { 8334 // Record any interfaces we find. 8335 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 8336 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 8337 (!OnlyUnimplemented || !Class->getImplementation())) 8338 Results.AddResult( 8339 Result(Class, Results.getBasePriority(Class), nullptr), CurContext, 8340 nullptr, false); 8341 } 8342 } 8343 8344 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 8345 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8346 CodeCompleter->getCodeCompletionTUInfo(), 8347 CodeCompletionContext::CCC_ObjCInterfaceName); 8348 Results.EnterNewScope(); 8349 8350 if (CodeCompleter->includeGlobals()) { 8351 // Add all classes. 8352 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8353 false, Results); 8354 } 8355 8356 Results.ExitScope(); 8357 8358 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8359 Results.data(), Results.size()); 8360 } 8361 8362 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 8363 SourceLocation ClassNameLoc) { 8364 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8365 CodeCompleter->getCodeCompletionTUInfo(), 8366 CodeCompletionContext::CCC_ObjCInterfaceName); 8367 Results.EnterNewScope(); 8368 8369 // Make sure that we ignore the class we're currently defining. 8370 NamedDecl *CurClass = 8371 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8372 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 8373 Results.Ignore(CurClass); 8374 8375 if (CodeCompleter->includeGlobals()) { 8376 // Add all classes. 8377 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8378 false, Results); 8379 } 8380 8381 Results.ExitScope(); 8382 8383 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8384 Results.data(), Results.size()); 8385 } 8386 8387 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 8388 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8389 CodeCompleter->getCodeCompletionTUInfo(), 8390 CodeCompletionContext::CCC_ObjCImplementation); 8391 Results.EnterNewScope(); 8392 8393 if (CodeCompleter->includeGlobals()) { 8394 // Add all unimplemented classes. 8395 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8396 true, Results); 8397 } 8398 8399 Results.ExitScope(); 8400 8401 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8402 Results.data(), Results.size()); 8403 } 8404 8405 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 8406 IdentifierInfo *ClassName, 8407 SourceLocation ClassNameLoc) { 8408 typedef CodeCompletionResult Result; 8409 8410 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8411 CodeCompleter->getCodeCompletionTUInfo(), 8412 CodeCompletionContext::CCC_ObjCCategoryName); 8413 8414 // Ignore any categories we find that have already been implemented by this 8415 // interface. 8416 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8417 NamedDecl *CurClass = 8418 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8419 if (ObjCInterfaceDecl *Class = 8420 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) { 8421 for (const auto *Cat : Class->visible_categories()) 8422 CategoryNames.insert(Cat->getIdentifier()); 8423 } 8424 8425 // Add all of the categories we know about. 8426 Results.EnterNewScope(); 8427 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 8428 for (const auto *D : TU->decls()) 8429 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 8430 if (CategoryNames.insert(Category->getIdentifier()).second) 8431 Results.AddResult( 8432 Result(Category, Results.getBasePriority(Category), nullptr), 8433 CurContext, nullptr, false); 8434 Results.ExitScope(); 8435 8436 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8437 Results.data(), Results.size()); 8438 } 8439 8440 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 8441 IdentifierInfo *ClassName, 8442 SourceLocation ClassNameLoc) { 8443 typedef CodeCompletionResult Result; 8444 8445 // Find the corresponding interface. If we couldn't find the interface, the 8446 // program itself is ill-formed. However, we'll try to be helpful still by 8447 // providing the list of all of the categories we know about. 8448 NamedDecl *CurClass = 8449 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8450 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 8451 if (!Class) 8452 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 8453 8454 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8455 CodeCompleter->getCodeCompletionTUInfo(), 8456 CodeCompletionContext::CCC_ObjCCategoryName); 8457 8458 // Add all of the categories that have have corresponding interface 8459 // declarations in this class and any of its superclasses, except for 8460 // already-implemented categories in the class itself. 8461 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8462 Results.EnterNewScope(); 8463 bool IgnoreImplemented = true; 8464 while (Class) { 8465 for (const auto *Cat : Class->visible_categories()) { 8466 if ((!IgnoreImplemented || !Cat->getImplementation()) && 8467 CategoryNames.insert(Cat->getIdentifier()).second) 8468 Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr), 8469 CurContext, nullptr, false); 8470 } 8471 8472 Class = Class->getSuperClass(); 8473 IgnoreImplemented = false; 8474 } 8475 Results.ExitScope(); 8476 8477 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8478 Results.data(), Results.size()); 8479 } 8480 8481 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 8482 CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other); 8483 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8484 CodeCompleter->getCodeCompletionTUInfo(), CCContext); 8485 8486 // Figure out where this @synthesize lives. 8487 ObjCContainerDecl *Container = 8488 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8489 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8490 !isa<ObjCCategoryImplDecl>(Container))) 8491 return; 8492 8493 // Ignore any properties that have already been implemented. 8494 Container = getContainerDef(Container); 8495 for (const auto *D : Container->decls()) 8496 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 8497 Results.Ignore(PropertyImpl->getPropertyDecl()); 8498 8499 // Add any properties that we find. 8500 AddedPropertiesSet AddedProperties; 8501 Results.EnterNewScope(); 8502 if (ObjCImplementationDecl *ClassImpl = 8503 dyn_cast<ObjCImplementationDecl>(Container)) 8504 AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false, 8505 /*AllowNullaryMethods=*/false, CurContext, 8506 AddedProperties, Results); 8507 else 8508 AddObjCProperties(CCContext, 8509 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 8510 false, /*AllowNullaryMethods=*/false, CurContext, 8511 AddedProperties, Results); 8512 Results.ExitScope(); 8513 8514 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8515 Results.data(), Results.size()); 8516 } 8517 8518 void Sema::CodeCompleteObjCPropertySynthesizeIvar( 8519 Scope *S, IdentifierInfo *PropertyName) { 8520 typedef CodeCompletionResult Result; 8521 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8522 CodeCompleter->getCodeCompletionTUInfo(), 8523 CodeCompletionContext::CCC_Other); 8524 8525 // Figure out where this @synthesize lives. 8526 ObjCContainerDecl *Container = 8527 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8528 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8529 !isa<ObjCCategoryImplDecl>(Container))) 8530 return; 8531 8532 // Figure out which interface we're looking into. 8533 ObjCInterfaceDecl *Class = nullptr; 8534 if (ObjCImplementationDecl *ClassImpl = 8535 dyn_cast<ObjCImplementationDecl>(Container)) 8536 Class = ClassImpl->getClassInterface(); 8537 else 8538 Class = cast<ObjCCategoryImplDecl>(Container) 8539 ->getCategoryDecl() 8540 ->getClassInterface(); 8541 8542 // Determine the type of the property we're synthesizing. 8543 QualType PropertyType = Context.getObjCIdType(); 8544 if (Class) { 8545 if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration( 8546 PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) { 8547 PropertyType = 8548 Property->getType().getNonReferenceType().getUnqualifiedType(); 8549 8550 // Give preference to ivars 8551 Results.setPreferredType(PropertyType); 8552 } 8553 } 8554 8555 // Add all of the instance variables in this class and its superclasses. 8556 Results.EnterNewScope(); 8557 bool SawSimilarlyNamedIvar = false; 8558 std::string NameWithPrefix; 8559 NameWithPrefix += '_'; 8560 NameWithPrefix += PropertyName->getName(); 8561 std::string NameWithSuffix = PropertyName->getName().str(); 8562 NameWithSuffix += '_'; 8563 for (; Class; Class = Class->getSuperClass()) { 8564 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 8565 Ivar = Ivar->getNextIvar()) { 8566 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr), 8567 CurContext, nullptr, false); 8568 8569 // Determine whether we've seen an ivar with a name similar to the 8570 // property. 8571 if ((PropertyName == Ivar->getIdentifier() || 8572 NameWithPrefix == Ivar->getName() || 8573 NameWithSuffix == Ivar->getName())) { 8574 SawSimilarlyNamedIvar = true; 8575 8576 // Reduce the priority of this result by one, to give it a slight 8577 // advantage over other results whose names don't match so closely. 8578 if (Results.size() && 8579 Results.data()[Results.size() - 1].Kind == 8580 CodeCompletionResult::RK_Declaration && 8581 Results.data()[Results.size() - 1].Declaration == Ivar) 8582 Results.data()[Results.size() - 1].Priority--; 8583 } 8584 } 8585 } 8586 8587 if (!SawSimilarlyNamedIvar) { 8588 // Create ivar result _propName, that the user can use to synthesize 8589 // an ivar of the appropriate type. 8590 unsigned Priority = CCP_MemberDeclaration + 1; 8591 typedef CodeCompletionResult Result; 8592 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8593 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 8594 Priority, CXAvailability_Available); 8595 8596 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 8597 Builder.AddResultTypeChunk( 8598 GetCompletionTypeString(PropertyType, Context, Policy, Allocator)); 8599 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 8600 Results.AddResult( 8601 Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl)); 8602 } 8603 8604 Results.ExitScope(); 8605 8606 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8607 Results.data(), Results.size()); 8608 } 8609 8610 // Mapping from selectors to the methods that implement that selector, along 8611 // with the "in original class" flag. 8612 typedef llvm::DenseMap<Selector, 8613 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>> 8614 KnownMethodsMap; 8615 8616 /// Find all of the methods that reside in the given container 8617 /// (and its superclasses, protocols, etc.) that meet the given 8618 /// criteria. Insert those methods into the map of known methods, 8619 /// indexed by selector so they can be easily found. 8620 static void FindImplementableMethods(ASTContext &Context, 8621 ObjCContainerDecl *Container, 8622 Optional<bool> WantInstanceMethods, 8623 QualType ReturnType, 8624 KnownMethodsMap &KnownMethods, 8625 bool InOriginalClass = true) { 8626 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 8627 // Make sure we have a definition; that's what we'll walk. 8628 if (!IFace->hasDefinition()) 8629 return; 8630 8631 IFace = IFace->getDefinition(); 8632 Container = IFace; 8633 8634 const ObjCList<ObjCProtocolDecl> &Protocols = 8635 IFace->getReferencedProtocols(); 8636 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8637 E = Protocols.end(); 8638 I != E; ++I) 8639 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8640 KnownMethods, InOriginalClass); 8641 8642 // Add methods from any class extensions and categories. 8643 for (auto *Cat : IFace->visible_categories()) { 8644 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType, 8645 KnownMethods, false); 8646 } 8647 8648 // Visit the superclass. 8649 if (IFace->getSuperClass()) 8650 FindImplementableMethods(Context, IFace->getSuperClass(), 8651 WantInstanceMethods, ReturnType, KnownMethods, 8652 false); 8653 } 8654 8655 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 8656 // Recurse into protocols. 8657 const ObjCList<ObjCProtocolDecl> &Protocols = 8658 Category->getReferencedProtocols(); 8659 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8660 E = Protocols.end(); 8661 I != E; ++I) 8662 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8663 KnownMethods, InOriginalClass); 8664 8665 // If this category is the original class, jump to the interface. 8666 if (InOriginalClass && Category->getClassInterface()) 8667 FindImplementableMethods(Context, Category->getClassInterface(), 8668 WantInstanceMethods, ReturnType, KnownMethods, 8669 false); 8670 } 8671 8672 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 8673 // Make sure we have a definition; that's what we'll walk. 8674 if (!Protocol->hasDefinition()) 8675 return; 8676 Protocol = Protocol->getDefinition(); 8677 Container = Protocol; 8678 8679 // Recurse into protocols. 8680 const ObjCList<ObjCProtocolDecl> &Protocols = 8681 Protocol->getReferencedProtocols(); 8682 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8683 E = Protocols.end(); 8684 I != E; ++I) 8685 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8686 KnownMethods, false); 8687 } 8688 8689 // Add methods in this container. This operation occurs last because 8690 // we want the methods from this container to override any methods 8691 // we've previously seen with the same selector. 8692 for (auto *M : Container->methods()) { 8693 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) { 8694 if (!ReturnType.isNull() && 8695 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 8696 continue; 8697 8698 KnownMethods[M->getSelector()] = 8699 KnownMethodsMap::mapped_type(M, InOriginalClass); 8700 } 8701 } 8702 } 8703 8704 /// Add the parenthesized return or parameter type chunk to a code 8705 /// completion string. 8706 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals, 8707 ASTContext &Context, 8708 const PrintingPolicy &Policy, 8709 CodeCompletionBuilder &Builder) { 8710 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8711 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type); 8712 if (!Quals.empty()) 8713 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 8714 Builder.AddTextChunk( 8715 GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator())); 8716 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8717 } 8718 8719 /// Determine whether the given class is or inherits from a class by 8720 /// the given name. 8721 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) { 8722 if (!Class) 8723 return false; 8724 8725 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 8726 return true; 8727 8728 return InheritsFromClassNamed(Class->getSuperClass(), Name); 8729 } 8730 8731 /// Add code completions for Objective-C Key-Value Coding (KVC) and 8732 /// Key-Value Observing (KVO). 8733 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 8734 bool IsInstanceMethod, 8735 QualType ReturnType, ASTContext &Context, 8736 VisitedSelectorSet &KnownSelectors, 8737 ResultBuilder &Results) { 8738 IdentifierInfo *PropName = Property->getIdentifier(); 8739 if (!PropName || PropName->getLength() == 0) 8740 return; 8741 8742 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 8743 8744 // Builder that will create each code completion. 8745 typedef CodeCompletionResult Result; 8746 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8747 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 8748 8749 // The selector table. 8750 SelectorTable &Selectors = Context.Selectors; 8751 8752 // The property name, copied into the code completion allocation region 8753 // on demand. 8754 struct KeyHolder { 8755 CodeCompletionAllocator &Allocator; 8756 StringRef Key; 8757 const char *CopiedKey; 8758 8759 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 8760 : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {} 8761 8762 operator const char *() { 8763 if (CopiedKey) 8764 return CopiedKey; 8765 8766 return CopiedKey = Allocator.CopyString(Key); 8767 } 8768 } Key(Allocator, PropName->getName()); 8769 8770 // The uppercased name of the property name. 8771 std::string UpperKey = std::string(PropName->getName()); 8772 if (!UpperKey.empty()) 8773 UpperKey[0] = toUppercase(UpperKey[0]); 8774 8775 bool ReturnTypeMatchesProperty = 8776 ReturnType.isNull() || 8777 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 8778 Property->getType()); 8779 bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType(); 8780 8781 // Add the normal accessor -(type)key. 8782 if (IsInstanceMethod && 8783 KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second && 8784 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 8785 if (ReturnType.isNull()) 8786 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8787 Builder); 8788 8789 Builder.AddTypedTextChunk(Key); 8790 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8791 CXCursor_ObjCInstanceMethodDecl)); 8792 } 8793 8794 // If we have an integral or boolean property (or the user has provided 8795 // an integral or boolean return type), add the accessor -(type)isKey. 8796 if (IsInstanceMethod && 8797 ((!ReturnType.isNull() && 8798 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 8799 (ReturnType.isNull() && (Property->getType()->isIntegerType() || 8800 Property->getType()->isBooleanType())))) { 8801 std::string SelectorName = (Twine("is") + UpperKey).str(); 8802 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8803 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8804 .second) { 8805 if (ReturnType.isNull()) { 8806 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8807 Builder.AddTextChunk("BOOL"); 8808 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8809 } 8810 8811 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8812 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8813 CXCursor_ObjCInstanceMethodDecl)); 8814 } 8815 } 8816 8817 // Add the normal mutator. 8818 if (IsInstanceMethod && ReturnTypeMatchesVoid && 8819 !Property->getSetterMethodDecl()) { 8820 std::string SelectorName = (Twine("set") + UpperKey).str(); 8821 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8822 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8823 if (ReturnType.isNull()) { 8824 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8825 Builder.AddTextChunk("void"); 8826 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8827 } 8828 8829 Builder.AddTypedTextChunk( 8830 Allocator.CopyString(SelectorId->getName() + ":")); 8831 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8832 Builder); 8833 Builder.AddTextChunk(Key); 8834 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8835 CXCursor_ObjCInstanceMethodDecl)); 8836 } 8837 } 8838 8839 // Indexed and unordered accessors 8840 unsigned IndexedGetterPriority = CCP_CodePattern; 8841 unsigned IndexedSetterPriority = CCP_CodePattern; 8842 unsigned UnorderedGetterPriority = CCP_CodePattern; 8843 unsigned UnorderedSetterPriority = CCP_CodePattern; 8844 if (const auto *ObjCPointer = 8845 Property->getType()->getAs<ObjCObjectPointerType>()) { 8846 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 8847 // If this interface type is not provably derived from a known 8848 // collection, penalize the corresponding completions. 8849 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 8850 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8851 if (!InheritsFromClassNamed(IFace, "NSArray")) 8852 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8853 } 8854 8855 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 8856 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8857 if (!InheritsFromClassNamed(IFace, "NSSet")) 8858 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8859 } 8860 } 8861 } else { 8862 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8863 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8864 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8865 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8866 } 8867 8868 // Add -(NSUInteger)countOf<key> 8869 if (IsInstanceMethod && 8870 (ReturnType.isNull() || ReturnType->isIntegerType())) { 8871 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 8872 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8873 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8874 .second) { 8875 if (ReturnType.isNull()) { 8876 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8877 Builder.AddTextChunk("NSUInteger"); 8878 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8879 } 8880 8881 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8882 Results.AddResult( 8883 Result(Builder.TakeString(), 8884 std::min(IndexedGetterPriority, UnorderedGetterPriority), 8885 CXCursor_ObjCInstanceMethodDecl)); 8886 } 8887 } 8888 8889 // Indexed getters 8890 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 8891 if (IsInstanceMethod && 8892 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 8893 std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str(); 8894 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8895 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8896 if (ReturnType.isNull()) { 8897 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8898 Builder.AddTextChunk("id"); 8899 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8900 } 8901 8902 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8903 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8904 Builder.AddTextChunk("NSUInteger"); 8905 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8906 Builder.AddTextChunk("index"); 8907 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8908 CXCursor_ObjCInstanceMethodDecl)); 8909 } 8910 } 8911 8912 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 8913 if (IsInstanceMethod && 8914 (ReturnType.isNull() || 8915 (ReturnType->isObjCObjectPointerType() && 8916 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8917 ReturnType->castAs<ObjCObjectPointerType>() 8918 ->getInterfaceDecl() 8919 ->getName() == "NSArray"))) { 8920 std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str(); 8921 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8922 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8923 if (ReturnType.isNull()) { 8924 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8925 Builder.AddTextChunk("NSArray *"); 8926 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8927 } 8928 8929 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8930 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8931 Builder.AddTextChunk("NSIndexSet *"); 8932 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8933 Builder.AddTextChunk("indexes"); 8934 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8935 CXCursor_ObjCInstanceMethodDecl)); 8936 } 8937 } 8938 8939 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 8940 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8941 std::string SelectorName = (Twine("get") + UpperKey).str(); 8942 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8943 &Context.Idents.get("range")}; 8944 8945 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8946 if (ReturnType.isNull()) { 8947 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8948 Builder.AddTextChunk("void"); 8949 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8950 } 8951 8952 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8953 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8954 Builder.AddPlaceholderChunk("object-type"); 8955 Builder.AddTextChunk(" **"); 8956 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8957 Builder.AddTextChunk("buffer"); 8958 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8959 Builder.AddTypedTextChunk("range:"); 8960 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8961 Builder.AddTextChunk("NSRange"); 8962 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8963 Builder.AddTextChunk("inRange"); 8964 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8965 CXCursor_ObjCInstanceMethodDecl)); 8966 } 8967 } 8968 8969 // Mutable indexed accessors 8970 8971 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 8972 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8973 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 8974 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"), 8975 &Context.Idents.get(SelectorName)}; 8976 8977 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8978 if (ReturnType.isNull()) { 8979 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8980 Builder.AddTextChunk("void"); 8981 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8982 } 8983 8984 Builder.AddTypedTextChunk("insertObject:"); 8985 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8986 Builder.AddPlaceholderChunk("object-type"); 8987 Builder.AddTextChunk(" *"); 8988 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8989 Builder.AddTextChunk("object"); 8990 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8991 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8992 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8993 Builder.AddPlaceholderChunk("NSUInteger"); 8994 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8995 Builder.AddTextChunk("index"); 8996 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8997 CXCursor_ObjCInstanceMethodDecl)); 8998 } 8999 } 9000 9001 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 9002 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9003 std::string SelectorName = (Twine("insert") + UpperKey).str(); 9004 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 9005 &Context.Idents.get("atIndexes")}; 9006 9007 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9008 if (ReturnType.isNull()) { 9009 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9010 Builder.AddTextChunk("void"); 9011 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9012 } 9013 9014 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9015 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9016 Builder.AddTextChunk("NSArray *"); 9017 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9018 Builder.AddTextChunk("array"); 9019 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9020 Builder.AddTypedTextChunk("atIndexes:"); 9021 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9022 Builder.AddPlaceholderChunk("NSIndexSet *"); 9023 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9024 Builder.AddTextChunk("indexes"); 9025 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9026 CXCursor_ObjCInstanceMethodDecl)); 9027 } 9028 } 9029 9030 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 9031 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9032 std::string SelectorName = 9033 (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 9034 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9035 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9036 if (ReturnType.isNull()) { 9037 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9038 Builder.AddTextChunk("void"); 9039 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9040 } 9041 9042 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9043 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9044 Builder.AddTextChunk("NSUInteger"); 9045 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9046 Builder.AddTextChunk("index"); 9047 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9048 CXCursor_ObjCInstanceMethodDecl)); 9049 } 9050 } 9051 9052 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 9053 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9054 std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str(); 9055 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9056 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9057 if (ReturnType.isNull()) { 9058 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9059 Builder.AddTextChunk("void"); 9060 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9061 } 9062 9063 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9064 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9065 Builder.AddTextChunk("NSIndexSet *"); 9066 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9067 Builder.AddTextChunk("indexes"); 9068 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9069 CXCursor_ObjCInstanceMethodDecl)); 9070 } 9071 } 9072 9073 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 9074 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9075 std::string SelectorName = 9076 (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 9077 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 9078 &Context.Idents.get("withObject")}; 9079 9080 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9081 if (ReturnType.isNull()) { 9082 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9083 Builder.AddTextChunk("void"); 9084 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9085 } 9086 9087 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9088 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9089 Builder.AddPlaceholderChunk("NSUInteger"); 9090 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9091 Builder.AddTextChunk("index"); 9092 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9093 Builder.AddTypedTextChunk("withObject:"); 9094 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9095 Builder.AddTextChunk("id"); 9096 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9097 Builder.AddTextChunk("object"); 9098 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9099 CXCursor_ObjCInstanceMethodDecl)); 9100 } 9101 } 9102 9103 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 9104 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9105 std::string SelectorName1 = 9106 (Twine("replace") + UpperKey + "AtIndexes").str(); 9107 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 9108 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1), 9109 &Context.Idents.get(SelectorName2)}; 9110 9111 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9112 if (ReturnType.isNull()) { 9113 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9114 Builder.AddTextChunk("void"); 9115 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9116 } 9117 9118 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 9119 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9120 Builder.AddPlaceholderChunk("NSIndexSet *"); 9121 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9122 Builder.AddTextChunk("indexes"); 9123 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9124 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 9125 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9126 Builder.AddTextChunk("NSArray *"); 9127 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9128 Builder.AddTextChunk("array"); 9129 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9130 CXCursor_ObjCInstanceMethodDecl)); 9131 } 9132 } 9133 9134 // Unordered getters 9135 // - (NSEnumerator *)enumeratorOfKey 9136 if (IsInstanceMethod && 9137 (ReturnType.isNull() || 9138 (ReturnType->isObjCObjectPointerType() && 9139 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9140 ReturnType->getAs<ObjCObjectPointerType>() 9141 ->getInterfaceDecl() 9142 ->getName() == "NSEnumerator"))) { 9143 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 9144 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9145 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9146 .second) { 9147 if (ReturnType.isNull()) { 9148 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9149 Builder.AddTextChunk("NSEnumerator *"); 9150 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9151 } 9152 9153 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9154 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9155 CXCursor_ObjCInstanceMethodDecl)); 9156 } 9157 } 9158 9159 // - (type *)memberOfKey:(type *)object 9160 if (IsInstanceMethod && 9161 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 9162 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 9163 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9164 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9165 if (ReturnType.isNull()) { 9166 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9167 Builder.AddPlaceholderChunk("object-type"); 9168 Builder.AddTextChunk(" *"); 9169 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9170 } 9171 9172 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9173 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9174 if (ReturnType.isNull()) { 9175 Builder.AddPlaceholderChunk("object-type"); 9176 Builder.AddTextChunk(" *"); 9177 } else { 9178 Builder.AddTextChunk(GetCompletionTypeString( 9179 ReturnType, Context, Policy, Builder.getAllocator())); 9180 } 9181 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9182 Builder.AddTextChunk("object"); 9183 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9184 CXCursor_ObjCInstanceMethodDecl)); 9185 } 9186 } 9187 9188 // Mutable unordered accessors 9189 // - (void)addKeyObject:(type *)object 9190 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9191 std::string SelectorName = 9192 (Twine("add") + UpperKey + Twine("Object")).str(); 9193 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9194 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9195 if (ReturnType.isNull()) { 9196 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9197 Builder.AddTextChunk("void"); 9198 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9199 } 9200 9201 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9202 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9203 Builder.AddPlaceholderChunk("object-type"); 9204 Builder.AddTextChunk(" *"); 9205 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9206 Builder.AddTextChunk("object"); 9207 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9208 CXCursor_ObjCInstanceMethodDecl)); 9209 } 9210 } 9211 9212 // - (void)addKey:(NSSet *)objects 9213 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9214 std::string SelectorName = (Twine("add") + UpperKey).str(); 9215 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9216 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9217 if (ReturnType.isNull()) { 9218 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9219 Builder.AddTextChunk("void"); 9220 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9221 } 9222 9223 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9224 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9225 Builder.AddTextChunk("NSSet *"); 9226 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9227 Builder.AddTextChunk("objects"); 9228 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9229 CXCursor_ObjCInstanceMethodDecl)); 9230 } 9231 } 9232 9233 // - (void)removeKeyObject:(type *)object 9234 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9235 std::string SelectorName = 9236 (Twine("remove") + UpperKey + Twine("Object")).str(); 9237 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9238 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9239 if (ReturnType.isNull()) { 9240 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9241 Builder.AddTextChunk("void"); 9242 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9243 } 9244 9245 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9246 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9247 Builder.AddPlaceholderChunk("object-type"); 9248 Builder.AddTextChunk(" *"); 9249 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9250 Builder.AddTextChunk("object"); 9251 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9252 CXCursor_ObjCInstanceMethodDecl)); 9253 } 9254 } 9255 9256 // - (void)removeKey:(NSSet *)objects 9257 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9258 std::string SelectorName = (Twine("remove") + UpperKey).str(); 9259 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9260 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9261 if (ReturnType.isNull()) { 9262 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9263 Builder.AddTextChunk("void"); 9264 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9265 } 9266 9267 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9268 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9269 Builder.AddTextChunk("NSSet *"); 9270 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9271 Builder.AddTextChunk("objects"); 9272 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9273 CXCursor_ObjCInstanceMethodDecl)); 9274 } 9275 } 9276 9277 // - (void)intersectKey:(NSSet *)objects 9278 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9279 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 9280 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9281 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9282 if (ReturnType.isNull()) { 9283 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9284 Builder.AddTextChunk("void"); 9285 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9286 } 9287 9288 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9289 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9290 Builder.AddTextChunk("NSSet *"); 9291 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9292 Builder.AddTextChunk("objects"); 9293 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9294 CXCursor_ObjCInstanceMethodDecl)); 9295 } 9296 } 9297 9298 // Key-Value Observing 9299 // + (NSSet *)keyPathsForValuesAffectingKey 9300 if (!IsInstanceMethod && 9301 (ReturnType.isNull() || 9302 (ReturnType->isObjCObjectPointerType() && 9303 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9304 ReturnType->castAs<ObjCObjectPointerType>() 9305 ->getInterfaceDecl() 9306 ->getName() == "NSSet"))) { 9307 std::string SelectorName = 9308 (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 9309 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9310 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9311 .second) { 9312 if (ReturnType.isNull()) { 9313 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9314 Builder.AddTextChunk("NSSet<NSString *> *"); 9315 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9316 } 9317 9318 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9319 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9320 CXCursor_ObjCClassMethodDecl)); 9321 } 9322 } 9323 9324 // + (BOOL)automaticallyNotifiesObserversForKey 9325 if (!IsInstanceMethod && 9326 (ReturnType.isNull() || ReturnType->isIntegerType() || 9327 ReturnType->isBooleanType())) { 9328 std::string SelectorName = 9329 (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 9330 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9331 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9332 .second) { 9333 if (ReturnType.isNull()) { 9334 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9335 Builder.AddTextChunk("BOOL"); 9336 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9337 } 9338 9339 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9340 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9341 CXCursor_ObjCClassMethodDecl)); 9342 } 9343 } 9344 } 9345 9346 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod, 9347 ParsedType ReturnTy) { 9348 // Determine the return type of the method we're declaring, if 9349 // provided. 9350 QualType ReturnType = GetTypeFromParser(ReturnTy); 9351 Decl *IDecl = nullptr; 9352 if (CurContext->isObjCContainer()) { 9353 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 9354 IDecl = OCD; 9355 } 9356 // Determine where we should start searching for methods. 9357 ObjCContainerDecl *SearchDecl = nullptr; 9358 bool IsInImplementation = false; 9359 if (Decl *D = IDecl) { 9360 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 9361 SearchDecl = Impl->getClassInterface(); 9362 IsInImplementation = true; 9363 } else if (ObjCCategoryImplDecl *CatImpl = 9364 dyn_cast<ObjCCategoryImplDecl>(D)) { 9365 SearchDecl = CatImpl->getCategoryDecl(); 9366 IsInImplementation = true; 9367 } else 9368 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 9369 } 9370 9371 if (!SearchDecl && S) { 9372 if (DeclContext *DC = S->getEntity()) 9373 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 9374 } 9375 9376 if (!SearchDecl) { 9377 HandleCodeCompleteResults(this, CodeCompleter, 9378 CodeCompletionContext::CCC_Other, nullptr, 0); 9379 return; 9380 } 9381 9382 // Find all of the methods that we could declare/implement here. 9383 KnownMethodsMap KnownMethods; 9384 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType, 9385 KnownMethods); 9386 9387 // Add declarations or definitions for each of the known methods. 9388 typedef CodeCompletionResult Result; 9389 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9390 CodeCompleter->getCodeCompletionTUInfo(), 9391 CodeCompletionContext::CCC_Other); 9392 Results.EnterNewScope(); 9393 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 9394 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9395 MEnd = KnownMethods.end(); 9396 M != MEnd; ++M) { 9397 ObjCMethodDecl *Method = M->second.getPointer(); 9398 CodeCompletionBuilder Builder(Results.getAllocator(), 9399 Results.getCodeCompletionTUInfo()); 9400 9401 // Add the '-'/'+' prefix if it wasn't provided yet. 9402 if (!IsInstanceMethod) { 9403 Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+"); 9404 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9405 } 9406 9407 // If the result type was not already provided, add it to the 9408 // pattern as (type). 9409 if (ReturnType.isNull()) { 9410 QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context); 9411 AttributedType::stripOuterNullability(ResTy); 9412 AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context, 9413 Policy, Builder); 9414 } 9415 9416 Selector Sel = Method->getSelector(); 9417 9418 if (Sel.isUnarySelector()) { 9419 // Unary selectors have no arguments. 9420 Builder.AddTypedTextChunk( 9421 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 9422 } else { 9423 // Add all parameters to the pattern. 9424 unsigned I = 0; 9425 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 9426 PEnd = Method->param_end(); 9427 P != PEnd; (void)++P, ++I) { 9428 // Add the part of the selector name. 9429 if (I == 0) 9430 Builder.AddTypedTextChunk( 9431 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9432 else if (I < Sel.getNumArgs()) { 9433 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9434 Builder.AddTypedTextChunk( 9435 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9436 } else 9437 break; 9438 9439 // Add the parameter type. 9440 QualType ParamType; 9441 if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability) 9442 ParamType = (*P)->getType(); 9443 else 9444 ParamType = (*P)->getOriginalType(); 9445 ParamType = ParamType.substObjCTypeArgs( 9446 Context, {}, ObjCSubstitutionContext::Parameter); 9447 AttributedType::stripOuterNullability(ParamType); 9448 AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), 9449 Context, Policy, Builder); 9450 9451 if (IdentifierInfo *Id = (*P)->getIdentifier()) 9452 Builder.AddTextChunk( 9453 Builder.getAllocator().CopyString(Id->getName())); 9454 } 9455 } 9456 9457 if (Method->isVariadic()) { 9458 if (Method->param_size() > 0) 9459 Builder.AddChunk(CodeCompletionString::CK_Comma); 9460 Builder.AddTextChunk("..."); 9461 } 9462 9463 if (IsInImplementation && Results.includeCodePatterns()) { 9464 // We will be defining the method here, so add a compound statement. 9465 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9466 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 9467 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9468 if (!Method->getReturnType()->isVoidType()) { 9469 // If the result type is not void, add a return clause. 9470 Builder.AddTextChunk("return"); 9471 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9472 Builder.AddPlaceholderChunk("expression"); 9473 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 9474 } else 9475 Builder.AddPlaceholderChunk("statements"); 9476 9477 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9478 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 9479 } 9480 9481 unsigned Priority = CCP_CodePattern; 9482 auto R = Result(Builder.TakeString(), Method, Priority); 9483 if (!M->second.getInt()) 9484 setInBaseClass(R); 9485 Results.AddResult(std::move(R)); 9486 } 9487 9488 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 9489 // the properties in this class and its categories. 9490 if (Context.getLangOpts().ObjC) { 9491 SmallVector<ObjCContainerDecl *, 4> Containers; 9492 Containers.push_back(SearchDecl); 9493 9494 VisitedSelectorSet KnownSelectors; 9495 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9496 MEnd = KnownMethods.end(); 9497 M != MEnd; ++M) 9498 KnownSelectors.insert(M->first); 9499 9500 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 9501 if (!IFace) 9502 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 9503 IFace = Category->getClassInterface(); 9504 9505 if (IFace) 9506 for (auto *Cat : IFace->visible_categories()) 9507 Containers.push_back(Cat); 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 || 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 || CodeCompleter->includeMacros()) 9816 AddMacroResults(PP, Results, 9817 !CodeCompleter || CodeCompleter->loadExternal(), true); 9818 9819 // defined (<macro>) 9820 Results.EnterNewScope(); 9821 CodeCompletionBuilder Builder(Results.getAllocator(), 9822 Results.getCodeCompletionTUInfo()); 9823 Builder.AddTypedTextChunk("defined"); 9824 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9825 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9826 Builder.AddPlaceholderChunk("macro"); 9827 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9828 Results.AddResult(Builder.TakeString()); 9829 Results.ExitScope(); 9830 9831 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9832 Results.data(), Results.size()); 9833 } 9834 9835 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 9836 IdentifierInfo *Macro, 9837 MacroInfo *MacroInfo, 9838 unsigned Argument) { 9839 // FIXME: In the future, we could provide "overload" results, much like we 9840 // do for function calls. 9841 9842 // Now just ignore this. There will be another code-completion callback 9843 // for the expanded tokens. 9844 } 9845 9846 // This handles completion inside an #include filename, e.g. #include <foo/ba 9847 // We look for the directory "foo" under each directory on the include path, 9848 // list its files, and reassemble the appropriate #include. 9849 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { 9850 // RelDir should use /, but unescaped \ is possible on windows! 9851 // Our completions will normalize to / for simplicity, this case is rare. 9852 std::string RelDir = llvm::sys::path::convert_to_slash(Dir); 9853 // We need the native slashes for the actual file system interactions. 9854 SmallString<128> NativeRelDir = StringRef(RelDir); 9855 llvm::sys::path::native(NativeRelDir); 9856 llvm::vfs::FileSystem &FS = 9857 getSourceManager().getFileManager().getVirtualFileSystem(); 9858 9859 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9860 CodeCompleter->getCodeCompletionTUInfo(), 9861 CodeCompletionContext::CCC_IncludedFile); 9862 llvm::DenseSet<StringRef> SeenResults; // To deduplicate results. 9863 9864 // Helper: adds one file or directory completion result. 9865 auto AddCompletion = [&](StringRef Filename, bool IsDirectory) { 9866 SmallString<64> TypedChunk = Filename; 9867 // Directory completion is up to the slash, e.g. <sys/ 9868 TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"'); 9869 auto R = SeenResults.insert(TypedChunk); 9870 if (R.second) { // New completion 9871 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk); 9872 *R.first = InternedTyped; // Avoid dangling StringRef. 9873 CodeCompletionBuilder Builder(CodeCompleter->getAllocator(), 9874 CodeCompleter->getCodeCompletionTUInfo()); 9875 Builder.AddTypedTextChunk(InternedTyped); 9876 // The result is a "Pattern", which is pretty opaque. 9877 // We may want to include the real filename to allow smart ranking. 9878 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 9879 } 9880 }; 9881 9882 // Helper: scans IncludeDir for nice files, and adds results for each. 9883 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir, 9884 bool IsSystem, 9885 DirectoryLookup::LookupType_t LookupType) { 9886 llvm::SmallString<128> Dir = IncludeDir; 9887 if (!NativeRelDir.empty()) { 9888 if (LookupType == DirectoryLookup::LT_Framework) { 9889 // For a framework dir, #include <Foo/Bar/> actually maps to 9890 // a path of Foo.framework/Headers/Bar/. 9891 auto Begin = llvm::sys::path::begin(NativeRelDir); 9892 auto End = llvm::sys::path::end(NativeRelDir); 9893 9894 llvm::sys::path::append(Dir, *Begin + ".framework", "Headers"); 9895 llvm::sys::path::append(Dir, ++Begin, End); 9896 } else { 9897 llvm::sys::path::append(Dir, NativeRelDir); 9898 } 9899 } 9900 9901 const StringRef &Dirname = llvm::sys::path::filename(Dir); 9902 const bool isQt = Dirname.startswith("Qt") || Dirname == "ActiveQt"; 9903 const bool ExtensionlessHeaders = 9904 IsSystem || isQt || Dir.endswith(".framework/Headers"); 9905 std::error_code EC; 9906 unsigned Count = 0; 9907 for (auto It = FS.dir_begin(Dir, EC); 9908 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) { 9909 if (++Count == 2500) // If we happen to hit a huge directory, 9910 break; // bail out early so we're not too slow. 9911 StringRef Filename = llvm::sys::path::filename(It->path()); 9912 9913 // To know whether a symlink should be treated as file or a directory, we 9914 // have to stat it. This should be cheap enough as there shouldn't be many 9915 // symlinks. 9916 llvm::sys::fs::file_type Type = It->type(); 9917 if (Type == llvm::sys::fs::file_type::symlink_file) { 9918 if (auto FileStatus = FS.status(It->path())) 9919 Type = FileStatus->getType(); 9920 } 9921 switch (Type) { 9922 case llvm::sys::fs::file_type::directory_file: 9923 // All entries in a framework directory must have a ".framework" suffix, 9924 // but the suffix does not appear in the source code's include/import. 9925 if (LookupType == DirectoryLookup::LT_Framework && 9926 NativeRelDir.empty() && !Filename.consume_back(".framework")) 9927 break; 9928 9929 AddCompletion(Filename, /*IsDirectory=*/true); 9930 break; 9931 case llvm::sys::fs::file_type::regular_file: { 9932 // Only files that really look like headers. (Except in special dirs). 9933 // Header extensions from Types.def, which we can't depend on here. 9934 const bool IsHeader = Filename.endswith_insensitive(".h") || 9935 Filename.endswith_insensitive(".hh") || 9936 Filename.endswith_insensitive(".hpp") || 9937 Filename.endswith_insensitive(".inc") || 9938 (ExtensionlessHeaders && !Filename.contains('.')); 9939 if (!IsHeader) 9940 break; 9941 AddCompletion(Filename, /*IsDirectory=*/false); 9942 break; 9943 } 9944 default: 9945 break; 9946 } 9947 } 9948 }; 9949 9950 // Helper: adds results relative to IncludeDir, if possible. 9951 auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir, 9952 bool IsSystem) { 9953 switch (IncludeDir.getLookupType()) { 9954 case DirectoryLookup::LT_HeaderMap: 9955 // header maps are not (currently) enumerable. 9956 break; 9957 case DirectoryLookup::LT_NormalDir: 9958 AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem, 9959 DirectoryLookup::LT_NormalDir); 9960 break; 9961 case DirectoryLookup::LT_Framework: 9962 AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem, 9963 DirectoryLookup::LT_Framework); 9964 break; 9965 } 9966 }; 9967 9968 // Finally with all our helpers, we can scan the include path. 9969 // Do this in standard order so deduplication keeps the right file. 9970 // (In case we decide to add more details to the results later). 9971 const auto &S = PP.getHeaderSearchInfo(); 9972 using llvm::make_range; 9973 if (!Angled) { 9974 // The current directory is on the include path for "quoted" includes. 9975 auto *CurFile = PP.getCurrentFileLexer()->getFileEntry(); 9976 if (CurFile && CurFile->getDir()) 9977 AddFilesFromIncludeDir(CurFile->getDir()->getName(), false, 9978 DirectoryLookup::LT_NormalDir); 9979 for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end())) 9980 AddFilesFromDirLookup(D, false); 9981 } 9982 for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end())) 9983 AddFilesFromDirLookup(D, false); 9984 for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end())) 9985 AddFilesFromDirLookup(D, true); 9986 9987 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9988 Results.data(), Results.size()); 9989 } 9990 9991 void Sema::CodeCompleteNaturalLanguage() { 9992 HandleCodeCompleteResults(this, CodeCompleter, 9993 CodeCompletionContext::CCC_NaturalLanguage, nullptr, 9994 0); 9995 } 9996 9997 void Sema::CodeCompleteAvailabilityPlatformName() { 9998 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9999 CodeCompleter->getCodeCompletionTUInfo(), 10000 CodeCompletionContext::CCC_Other); 10001 Results.EnterNewScope(); 10002 static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"}; 10003 for (const char *Platform : llvm::makeArrayRef(Platforms)) { 10004 Results.AddResult(CodeCompletionResult(Platform)); 10005 Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString( 10006 Twine(Platform) + "ApplicationExtension"))); 10007 } 10008 Results.ExitScope(); 10009 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 10010 Results.data(), Results.size()); 10011 } 10012 10013 void Sema::GatherGlobalCodeCompletions( 10014 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 10015 SmallVectorImpl<CodeCompletionResult> &Results) { 10016 ResultBuilder Builder(*this, Allocator, CCTUInfo, 10017 CodeCompletionContext::CCC_Recovery); 10018 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 10019 CodeCompletionDeclConsumer Consumer(Builder, 10020 Context.getTranslationUnitDecl()); 10021 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 10022 Consumer, 10023 !CodeCompleter || CodeCompleter->loadExternal()); 10024 } 10025 10026 if (!CodeCompleter || CodeCompleter->includeMacros()) 10027 AddMacroResults(PP, Builder, 10028 !CodeCompleter || CodeCompleter->loadExternal(), true); 10029 10030 Results.clear(); 10031 Results.insert(Results.end(), Builder.data(), 10032 Builder.data() + Builder.size()); 10033 } 10034