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