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