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 Decl *D : RD->decls()) { 6348 const FieldDecl *FD; 6349 if (auto *IFD = dyn_cast<IndirectFieldDecl>(D)) 6350 FD = IFD->getAnonField(); 6351 else if (auto *DFD = dyn_cast<FieldDecl>(D)) 6352 FD = DFD; 6353 else 6354 continue; 6355 6356 // FIXME: Make use of previous designators to mark any fields before those 6357 // inaccessible, and also compute the next initializer priority. 6358 ResultBuilder::Result Result(FD, Results.getBasePriority(FD)); 6359 Results.AddResult(Result, CurContext, /*Hiding=*/nullptr); 6360 } 6361 Results.ExitScope(); 6362 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6363 Results.data(), Results.size()); 6364 } 6365 6366 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 6367 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 6368 if (!VD) { 6369 CodeCompleteOrdinaryName(S, PCC_Expression); 6370 return; 6371 } 6372 6373 CodeCompleteExpressionData Data; 6374 Data.PreferredType = VD->getType(); 6375 // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'. 6376 Data.IgnoreDecls.push_back(VD); 6377 6378 CodeCompleteExpression(S, Data); 6379 } 6380 6381 void Sema::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) { 6382 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6383 CodeCompleter->getCodeCompletionTUInfo(), 6384 mapCodeCompletionContext(*this, PCC_Statement)); 6385 Results.setFilter(&ResultBuilder::IsOrdinaryName); 6386 Results.EnterNewScope(); 6387 6388 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6389 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6390 CodeCompleter->includeGlobals(), 6391 CodeCompleter->loadExternal()); 6392 6393 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 6394 6395 // "else" block 6396 CodeCompletionBuilder Builder(Results.getAllocator(), 6397 Results.getCodeCompletionTUInfo()); 6398 6399 auto AddElseBodyPattern = [&] { 6400 if (IsBracedThen) { 6401 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6402 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6403 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6404 Builder.AddPlaceholderChunk("statements"); 6405 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6406 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6407 } else { 6408 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6409 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6410 Builder.AddPlaceholderChunk("statement"); 6411 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6412 } 6413 }; 6414 Builder.AddTypedTextChunk("else"); 6415 if (Results.includeCodePatterns()) 6416 AddElseBodyPattern(); 6417 Results.AddResult(Builder.TakeString()); 6418 6419 // "else if" block 6420 Builder.AddTypedTextChunk("else if"); 6421 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6422 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6423 if (getLangOpts().CPlusPlus) 6424 Builder.AddPlaceholderChunk("condition"); 6425 else 6426 Builder.AddPlaceholderChunk("expression"); 6427 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6428 if (Results.includeCodePatterns()) { 6429 AddElseBodyPattern(); 6430 } 6431 Results.AddResult(Builder.TakeString()); 6432 6433 Results.ExitScope(); 6434 6435 if (S->getFnParent()) 6436 AddPrettyFunctionResults(getLangOpts(), Results); 6437 6438 if (CodeCompleter->includeMacros()) 6439 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 6440 6441 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6442 Results.data(), Results.size()); 6443 } 6444 6445 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 6446 bool EnteringContext, 6447 bool IsUsingDeclaration, QualType BaseType, 6448 QualType PreferredType) { 6449 if (SS.isEmpty() || !CodeCompleter) 6450 return; 6451 6452 CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType); 6453 CC.setIsUsingDeclaration(IsUsingDeclaration); 6454 CC.setCXXScopeSpecifier(SS); 6455 6456 // We want to keep the scope specifier even if it's invalid (e.g. the scope 6457 // "a::b::" is not corresponding to any context/namespace in the AST), since 6458 // it can be useful for global code completion which have information about 6459 // contexts/symbols that are not in the AST. 6460 if (SS.isInvalid()) { 6461 // As SS is invalid, we try to collect accessible contexts from the current 6462 // scope with a dummy lookup so that the completion consumer can try to 6463 // guess what the specified scope is. 6464 ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(), 6465 CodeCompleter->getCodeCompletionTUInfo(), CC); 6466 if (!PreferredType.isNull()) 6467 DummyResults.setPreferredType(PreferredType); 6468 if (S->getEntity()) { 6469 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(), 6470 BaseType); 6471 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6472 /*IncludeGlobalScope=*/false, 6473 /*LoadExternal=*/false); 6474 } 6475 HandleCodeCompleteResults(this, CodeCompleter, 6476 DummyResults.getCompletionContext(), nullptr, 0); 6477 return; 6478 } 6479 // Always pretend to enter a context to ensure that a dependent type 6480 // resolves to a dependent record. 6481 DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true); 6482 6483 // Try to instantiate any non-dependent declaration contexts before 6484 // we look in them. Bail out if we fail. 6485 NestedNameSpecifier *NNS = SS.getScopeRep(); 6486 if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) { 6487 if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx)) 6488 return; 6489 } 6490 6491 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6492 CodeCompleter->getCodeCompletionTUInfo(), CC); 6493 if (!PreferredType.isNull()) 6494 Results.setPreferredType(PreferredType); 6495 Results.EnterNewScope(); 6496 6497 // The "template" keyword can follow "::" in the grammar, but only 6498 // put it into the grammar if the nested-name-specifier is dependent. 6499 // FIXME: results is always empty, this appears to be dead. 6500 if (!Results.empty() && NNS->isDependent()) 6501 Results.AddResult("template"); 6502 6503 // If the scope is a concept-constrained type parameter, infer nested 6504 // members based on the constraints. 6505 if (const auto *TTPT = 6506 dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) { 6507 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 6508 if (R.Operator != ConceptInfo::Member::Colons) 6509 continue; 6510 Results.AddResult(CodeCompletionResult( 6511 R.render(*this, CodeCompleter->getAllocator(), 6512 CodeCompleter->getCodeCompletionTUInfo()))); 6513 } 6514 } 6515 6516 // Add calls to overridden virtual functions, if there are any. 6517 // 6518 // FIXME: This isn't wonderful, because we don't know whether we're actually 6519 // in a context that permits expressions. This is a general issue with 6520 // qualified-id completions. 6521 if (Ctx && !EnteringContext) 6522 MaybeAddOverrideCalls(*this, Ctx, Results); 6523 Results.ExitScope(); 6524 6525 if (Ctx && 6526 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) { 6527 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType); 6528 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer, 6529 /*IncludeGlobalScope=*/true, 6530 /*IncludeDependentBases=*/true, 6531 CodeCompleter->loadExternal()); 6532 } 6533 6534 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6535 Results.data(), Results.size()); 6536 } 6537 6538 void Sema::CodeCompleteUsing(Scope *S) { 6539 if (!CodeCompleter) 6540 return; 6541 6542 // This can be both a using alias or using declaration, in the former we 6543 // expect a new name and a symbol in the latter case. 6544 CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName); 6545 Context.setIsUsingDeclaration(true); 6546 6547 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6548 CodeCompleter->getCodeCompletionTUInfo(), Context, 6549 &ResultBuilder::IsNestedNameSpecifier); 6550 Results.EnterNewScope(); 6551 6552 // If we aren't in class scope, we could see the "namespace" keyword. 6553 if (!S->isClassScope()) 6554 Results.AddResult(CodeCompletionResult("namespace")); 6555 6556 // After "using", we can see anything that would start a 6557 // nested-name-specifier. 6558 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6559 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6560 CodeCompleter->includeGlobals(), 6561 CodeCompleter->loadExternal()); 6562 Results.ExitScope(); 6563 6564 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6565 Results.data(), Results.size()); 6566 } 6567 6568 void Sema::CodeCompleteUsingDirective(Scope *S) { 6569 if (!CodeCompleter) 6570 return; 6571 6572 // After "using namespace", we expect to see a namespace name or namespace 6573 // alias. 6574 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6575 CodeCompleter->getCodeCompletionTUInfo(), 6576 CodeCompletionContext::CCC_Namespace, 6577 &ResultBuilder::IsNamespaceOrAlias); 6578 Results.EnterNewScope(); 6579 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6580 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6581 CodeCompleter->includeGlobals(), 6582 CodeCompleter->loadExternal()); 6583 Results.ExitScope(); 6584 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6585 Results.data(), Results.size()); 6586 } 6587 6588 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 6589 if (!CodeCompleter) 6590 return; 6591 6592 DeclContext *Ctx = S->getEntity(); 6593 if (!S->getParent()) 6594 Ctx = Context.getTranslationUnitDecl(); 6595 6596 bool SuppressedGlobalResults = 6597 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 6598 6599 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6600 CodeCompleter->getCodeCompletionTUInfo(), 6601 SuppressedGlobalResults 6602 ? CodeCompletionContext::CCC_Namespace 6603 : CodeCompletionContext::CCC_Other, 6604 &ResultBuilder::IsNamespace); 6605 6606 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 6607 // We only want to see those namespaces that have already been defined 6608 // within this scope, because its likely that the user is creating an 6609 // extended namespace declaration. Keep track of the most recent 6610 // definition of each namespace. 6611 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 6612 for (DeclContext::specific_decl_iterator<NamespaceDecl> 6613 NS(Ctx->decls_begin()), 6614 NSEnd(Ctx->decls_end()); 6615 NS != NSEnd; ++NS) 6616 OrigToLatest[NS->getOriginalNamespace()] = *NS; 6617 6618 // Add the most recent definition (or extended definition) of each 6619 // namespace to the list of results. 6620 Results.EnterNewScope(); 6621 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 6622 NS = OrigToLatest.begin(), 6623 NSEnd = OrigToLatest.end(); 6624 NS != NSEnd; ++NS) 6625 Results.AddResult( 6626 CodeCompletionResult(NS->second, Results.getBasePriority(NS->second), 6627 nullptr), 6628 CurContext, nullptr, false); 6629 Results.ExitScope(); 6630 } 6631 6632 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6633 Results.data(), Results.size()); 6634 } 6635 6636 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 6637 if (!CodeCompleter) 6638 return; 6639 6640 // After "namespace", we expect to see a namespace or alias. 6641 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6642 CodeCompleter->getCodeCompletionTUInfo(), 6643 CodeCompletionContext::CCC_Namespace, 6644 &ResultBuilder::IsNamespaceOrAlias); 6645 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6646 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6647 CodeCompleter->includeGlobals(), 6648 CodeCompleter->loadExternal()); 6649 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6650 Results.data(), Results.size()); 6651 } 6652 6653 void Sema::CodeCompleteOperatorName(Scope *S) { 6654 if (!CodeCompleter) 6655 return; 6656 6657 typedef CodeCompletionResult Result; 6658 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6659 CodeCompleter->getCodeCompletionTUInfo(), 6660 CodeCompletionContext::CCC_Type, 6661 &ResultBuilder::IsType); 6662 Results.EnterNewScope(); 6663 6664 // Add the names of overloadable operators. Note that OO_Conditional is not 6665 // actually overloadable. 6666 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 6667 if (OO_##Name != OO_Conditional) \ 6668 Results.AddResult(Result(Spelling)); 6669 #include "clang/Basic/OperatorKinds.def" 6670 6671 // Add any type names visible from the current scope 6672 Results.allowNestedNameSpecifiers(); 6673 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6674 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6675 CodeCompleter->includeGlobals(), 6676 CodeCompleter->loadExternal()); 6677 6678 // Add any type specifiers 6679 AddTypeSpecifierResults(getLangOpts(), Results); 6680 Results.ExitScope(); 6681 6682 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6683 Results.data(), Results.size()); 6684 } 6685 6686 void Sema::CodeCompleteConstructorInitializer( 6687 Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) { 6688 if (!ConstructorD) 6689 return; 6690 6691 AdjustDeclIfTemplate(ConstructorD); 6692 6693 auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD); 6694 if (!Constructor) 6695 return; 6696 6697 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6698 CodeCompleter->getCodeCompletionTUInfo(), 6699 CodeCompletionContext::CCC_Symbol); 6700 Results.EnterNewScope(); 6701 6702 // Fill in any already-initialized fields or base classes. 6703 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 6704 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 6705 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) { 6706 if (Initializers[I]->isBaseInitializer()) 6707 InitializedBases.insert(Context.getCanonicalType( 6708 QualType(Initializers[I]->getBaseClass(), 0))); 6709 else 6710 InitializedFields.insert( 6711 cast<FieldDecl>(Initializers[I]->getAnyMember())); 6712 } 6713 6714 // Add completions for base classes. 6715 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6716 bool SawLastInitializer = Initializers.empty(); 6717 CXXRecordDecl *ClassDecl = Constructor->getParent(); 6718 6719 auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) { 6720 CodeCompletionBuilder Builder(Results.getAllocator(), 6721 Results.getCodeCompletionTUInfo()); 6722 Builder.AddTypedTextChunk(Name); 6723 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6724 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) 6725 AddFunctionParameterChunks(PP, Policy, Function, Builder); 6726 else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND)) 6727 AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(), 6728 Builder); 6729 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6730 return Builder.TakeString(); 6731 }; 6732 auto AddDefaultCtorInit = [&](const char *Name, const char *Type, 6733 const NamedDecl *ND) { 6734 CodeCompletionBuilder Builder(Results.getAllocator(), 6735 Results.getCodeCompletionTUInfo()); 6736 Builder.AddTypedTextChunk(Name); 6737 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6738 Builder.AddPlaceholderChunk(Type); 6739 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6740 if (ND) { 6741 auto CCR = CodeCompletionResult( 6742 Builder.TakeString(), ND, 6743 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration); 6744 if (isa<FieldDecl>(ND)) 6745 CCR.CursorKind = CXCursor_MemberRef; 6746 return Results.AddResult(CCR); 6747 } 6748 return Results.AddResult(CodeCompletionResult( 6749 Builder.TakeString(), 6750 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration)); 6751 }; 6752 auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority, 6753 const char *Name, const FieldDecl *FD) { 6754 if (!RD) 6755 return AddDefaultCtorInit(Name, 6756 FD ? Results.getAllocator().CopyString( 6757 FD->getType().getAsString(Policy)) 6758 : Name, 6759 FD); 6760 auto Ctors = getConstructors(Context, RD); 6761 if (Ctors.begin() == Ctors.end()) 6762 return AddDefaultCtorInit(Name, Name, RD); 6763 for (const NamedDecl *Ctor : Ctors) { 6764 auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority); 6765 CCR.CursorKind = getCursorKindForDecl(Ctor); 6766 Results.AddResult(CCR); 6767 } 6768 }; 6769 auto AddBase = [&](const CXXBaseSpecifier &Base) { 6770 const char *BaseName = 6771 Results.getAllocator().CopyString(Base.getType().getAsString(Policy)); 6772 const auto *RD = Base.getType()->getAsCXXRecordDecl(); 6773 AddCtorsWithName( 6774 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6775 BaseName, nullptr); 6776 }; 6777 auto AddField = [&](const FieldDecl *FD) { 6778 const char *FieldName = 6779 Results.getAllocator().CopyString(FD->getIdentifier()->getName()); 6780 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl(); 6781 AddCtorsWithName( 6782 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6783 FieldName, FD); 6784 }; 6785 6786 for (const auto &Base : ClassDecl->bases()) { 6787 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6788 .second) { 6789 SawLastInitializer = 6790 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6791 Context.hasSameUnqualifiedType( 6792 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6793 continue; 6794 } 6795 6796 AddBase(Base); 6797 SawLastInitializer = false; 6798 } 6799 6800 // Add completions for virtual base classes. 6801 for (const auto &Base : ClassDecl->vbases()) { 6802 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6803 .second) { 6804 SawLastInitializer = 6805 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6806 Context.hasSameUnqualifiedType( 6807 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6808 continue; 6809 } 6810 6811 AddBase(Base); 6812 SawLastInitializer = false; 6813 } 6814 6815 // Add completions for members. 6816 for (auto *Field : ClassDecl->fields()) { 6817 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl())) 6818 .second) { 6819 SawLastInitializer = !Initializers.empty() && 6820 Initializers.back()->isAnyMemberInitializer() && 6821 Initializers.back()->getAnyMember() == Field; 6822 continue; 6823 } 6824 6825 if (!Field->getDeclName()) 6826 continue; 6827 6828 AddField(Field); 6829 SawLastInitializer = false; 6830 } 6831 Results.ExitScope(); 6832 6833 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6834 Results.data(), Results.size()); 6835 } 6836 6837 /// Determine whether this scope denotes a namespace. 6838 static bool isNamespaceScope(Scope *S) { 6839 DeclContext *DC = S->getEntity(); 6840 if (!DC) 6841 return false; 6842 6843 return DC->isFileContext(); 6844 } 6845 6846 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 6847 bool AfterAmpersand) { 6848 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6849 CodeCompleter->getCodeCompletionTUInfo(), 6850 CodeCompletionContext::CCC_Other); 6851 Results.EnterNewScope(); 6852 6853 // Note what has already been captured. 6854 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 6855 bool IncludedThis = false; 6856 for (const auto &C : Intro.Captures) { 6857 if (C.Kind == LCK_This) { 6858 IncludedThis = true; 6859 continue; 6860 } 6861 6862 Known.insert(C.Id); 6863 } 6864 6865 // Look for other capturable variables. 6866 for (; S && !isNamespaceScope(S); S = S->getParent()) { 6867 for (const auto *D : S->decls()) { 6868 const auto *Var = dyn_cast<VarDecl>(D); 6869 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>()) 6870 continue; 6871 6872 if (Known.insert(Var->getIdentifier()).second) 6873 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 6874 CurContext, nullptr, false); 6875 } 6876 } 6877 6878 // Add 'this', if it would be valid. 6879 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 6880 addThisCompletion(*this, Results); 6881 6882 Results.ExitScope(); 6883 6884 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6885 Results.data(), Results.size()); 6886 } 6887 6888 void Sema::CodeCompleteAfterFunctionEquals(Declarator &D) { 6889 if (!LangOpts.CPlusPlus11) 6890 return; 6891 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6892 CodeCompleter->getCodeCompletionTUInfo(), 6893 CodeCompletionContext::CCC_Other); 6894 auto ShouldAddDefault = [&D, this]() { 6895 if (!D.isFunctionDeclarator()) 6896 return false; 6897 auto &Id = D.getName(); 6898 if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName) 6899 return true; 6900 // FIXME(liuhui): Ideally, we should check the constructor parameter list to 6901 // verify that it is the default, copy or move constructor? 6902 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName && 6903 D.getFunctionTypeInfo().NumParams <= 1) 6904 return true; 6905 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) { 6906 auto Op = Id.OperatorFunctionId.Operator; 6907 // FIXME(liuhui): Ideally, we should check the function parameter list to 6908 // verify that it is the copy or move assignment? 6909 if (Op == OverloadedOperatorKind::OO_Equal) 6910 return true; 6911 if (LangOpts.CPlusPlus20 && 6912 (Op == OverloadedOperatorKind::OO_EqualEqual || 6913 Op == OverloadedOperatorKind::OO_ExclaimEqual || 6914 Op == OverloadedOperatorKind::OO_Less || 6915 Op == OverloadedOperatorKind::OO_LessEqual || 6916 Op == OverloadedOperatorKind::OO_Greater || 6917 Op == OverloadedOperatorKind::OO_GreaterEqual || 6918 Op == OverloadedOperatorKind::OO_Spaceship)) 6919 return true; 6920 } 6921 return false; 6922 }; 6923 6924 Results.EnterNewScope(); 6925 if (ShouldAddDefault()) 6926 Results.AddResult("default"); 6927 // FIXME(liuhui): Ideally, we should only provide `delete` completion for the 6928 // first function declaration. 6929 Results.AddResult("delete"); 6930 Results.ExitScope(); 6931 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6932 Results.data(), Results.size()); 6933 } 6934 6935 /// Macro that optionally prepends an "@" to the string literal passed in via 6936 /// Keyword, depending on whether NeedAt is true or false. 6937 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword) 6938 6939 static void AddObjCImplementationResults(const LangOptions &LangOpts, 6940 ResultBuilder &Results, bool NeedAt) { 6941 typedef CodeCompletionResult Result; 6942 // Since we have an implementation, we can end it. 6943 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6944 6945 CodeCompletionBuilder Builder(Results.getAllocator(), 6946 Results.getCodeCompletionTUInfo()); 6947 if (LangOpts.ObjC) { 6948 // @dynamic 6949 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic")); 6950 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6951 Builder.AddPlaceholderChunk("property"); 6952 Results.AddResult(Result(Builder.TakeString())); 6953 6954 // @synthesize 6955 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize")); 6956 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6957 Builder.AddPlaceholderChunk("property"); 6958 Results.AddResult(Result(Builder.TakeString())); 6959 } 6960 } 6961 6962 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 6963 ResultBuilder &Results, bool NeedAt) { 6964 typedef CodeCompletionResult Result; 6965 6966 // Since we have an interface or protocol, we can end it. 6967 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6968 6969 if (LangOpts.ObjC) { 6970 // @property 6971 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property"))); 6972 6973 // @required 6974 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required"))); 6975 6976 // @optional 6977 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional"))); 6978 } 6979 } 6980 6981 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 6982 typedef CodeCompletionResult Result; 6983 CodeCompletionBuilder Builder(Results.getAllocator(), 6984 Results.getCodeCompletionTUInfo()); 6985 6986 // @class name ; 6987 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class")); 6988 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6989 Builder.AddPlaceholderChunk("name"); 6990 Results.AddResult(Result(Builder.TakeString())); 6991 6992 if (Results.includeCodePatterns()) { 6993 // @interface name 6994 // FIXME: Could introduce the whole pattern, including superclasses and 6995 // such. 6996 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface")); 6997 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6998 Builder.AddPlaceholderChunk("class"); 6999 Results.AddResult(Result(Builder.TakeString())); 7000 7001 // @protocol name 7002 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 7003 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7004 Builder.AddPlaceholderChunk("protocol"); 7005 Results.AddResult(Result(Builder.TakeString())); 7006 7007 // @implementation name 7008 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation")); 7009 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7010 Builder.AddPlaceholderChunk("class"); 7011 Results.AddResult(Result(Builder.TakeString())); 7012 } 7013 7014 // @compatibility_alias name 7015 Builder.AddTypedTextChunk( 7016 OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias")); 7017 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7018 Builder.AddPlaceholderChunk("alias"); 7019 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7020 Builder.AddPlaceholderChunk("class"); 7021 Results.AddResult(Result(Builder.TakeString())); 7022 7023 if (Results.getSema().getLangOpts().Modules) { 7024 // @import name 7025 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 7026 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7027 Builder.AddPlaceholderChunk("module"); 7028 Results.AddResult(Result(Builder.TakeString())); 7029 } 7030 } 7031 7032 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 7033 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7034 CodeCompleter->getCodeCompletionTUInfo(), 7035 CodeCompletionContext::CCC_Other); 7036 Results.EnterNewScope(); 7037 if (isa<ObjCImplDecl>(CurContext)) 7038 AddObjCImplementationResults(getLangOpts(), Results, false); 7039 else if (CurContext->isObjCContainer()) 7040 AddObjCInterfaceResults(getLangOpts(), Results, false); 7041 else 7042 AddObjCTopLevelResults(Results, false); 7043 Results.ExitScope(); 7044 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7045 Results.data(), Results.size()); 7046 } 7047 7048 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 7049 typedef CodeCompletionResult Result; 7050 CodeCompletionBuilder Builder(Results.getAllocator(), 7051 Results.getCodeCompletionTUInfo()); 7052 7053 // @encode ( type-name ) 7054 const char *EncodeType = "char[]"; 7055 if (Results.getSema().getLangOpts().CPlusPlus || 7056 Results.getSema().getLangOpts().ConstStrings) 7057 EncodeType = "const char[]"; 7058 Builder.AddResultTypeChunk(EncodeType); 7059 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode")); 7060 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7061 Builder.AddPlaceholderChunk("type-name"); 7062 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7063 Results.AddResult(Result(Builder.TakeString())); 7064 7065 // @protocol ( protocol-name ) 7066 Builder.AddResultTypeChunk("Protocol *"); 7067 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 7068 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7069 Builder.AddPlaceholderChunk("protocol-name"); 7070 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7071 Results.AddResult(Result(Builder.TakeString())); 7072 7073 // @selector ( selector ) 7074 Builder.AddResultTypeChunk("SEL"); 7075 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector")); 7076 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7077 Builder.AddPlaceholderChunk("selector"); 7078 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7079 Results.AddResult(Result(Builder.TakeString())); 7080 7081 // @"string" 7082 Builder.AddResultTypeChunk("NSString *"); 7083 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\"")); 7084 Builder.AddPlaceholderChunk("string"); 7085 Builder.AddTextChunk("\""); 7086 Results.AddResult(Result(Builder.TakeString())); 7087 7088 // @[objects, ...] 7089 Builder.AddResultTypeChunk("NSArray *"); 7090 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "[")); 7091 Builder.AddPlaceholderChunk("objects, ..."); 7092 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 7093 Results.AddResult(Result(Builder.TakeString())); 7094 7095 // @{key : object, ...} 7096 Builder.AddResultTypeChunk("NSDictionary *"); 7097 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{")); 7098 Builder.AddPlaceholderChunk("key"); 7099 Builder.AddChunk(CodeCompletionString::CK_Colon); 7100 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7101 Builder.AddPlaceholderChunk("object, ..."); 7102 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7103 Results.AddResult(Result(Builder.TakeString())); 7104 7105 // @(expression) 7106 Builder.AddResultTypeChunk("id"); 7107 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 7108 Builder.AddPlaceholderChunk("expression"); 7109 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7110 Results.AddResult(Result(Builder.TakeString())); 7111 } 7112 7113 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 7114 typedef CodeCompletionResult Result; 7115 CodeCompletionBuilder Builder(Results.getAllocator(), 7116 Results.getCodeCompletionTUInfo()); 7117 7118 if (Results.includeCodePatterns()) { 7119 // @try { statements } @catch ( declaration ) { statements } @finally 7120 // { statements } 7121 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try")); 7122 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7123 Builder.AddPlaceholderChunk("statements"); 7124 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7125 Builder.AddTextChunk("@catch"); 7126 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7127 Builder.AddPlaceholderChunk("parameter"); 7128 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7129 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7130 Builder.AddPlaceholderChunk("statements"); 7131 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7132 Builder.AddTextChunk("@finally"); 7133 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7134 Builder.AddPlaceholderChunk("statements"); 7135 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7136 Results.AddResult(Result(Builder.TakeString())); 7137 } 7138 7139 // @throw 7140 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw")); 7141 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7142 Builder.AddPlaceholderChunk("expression"); 7143 Results.AddResult(Result(Builder.TakeString())); 7144 7145 if (Results.includeCodePatterns()) { 7146 // @synchronized ( expression ) { statements } 7147 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized")); 7148 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7149 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7150 Builder.AddPlaceholderChunk("expression"); 7151 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7152 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7153 Builder.AddPlaceholderChunk("statements"); 7154 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7155 Results.AddResult(Result(Builder.TakeString())); 7156 } 7157 } 7158 7159 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 7160 ResultBuilder &Results, bool NeedAt) { 7161 typedef CodeCompletionResult Result; 7162 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private"))); 7163 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected"))); 7164 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public"))); 7165 if (LangOpts.ObjC) 7166 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package"))); 7167 } 7168 7169 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 7170 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7171 CodeCompleter->getCodeCompletionTUInfo(), 7172 CodeCompletionContext::CCC_Other); 7173 Results.EnterNewScope(); 7174 AddObjCVisibilityResults(getLangOpts(), Results, false); 7175 Results.ExitScope(); 7176 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7177 Results.data(), Results.size()); 7178 } 7179 7180 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 7181 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7182 CodeCompleter->getCodeCompletionTUInfo(), 7183 CodeCompletionContext::CCC_Other); 7184 Results.EnterNewScope(); 7185 AddObjCStatementResults(Results, false); 7186 AddObjCExpressionResults(Results, false); 7187 Results.ExitScope(); 7188 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7189 Results.data(), Results.size()); 7190 } 7191 7192 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 7193 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7194 CodeCompleter->getCodeCompletionTUInfo(), 7195 CodeCompletionContext::CCC_Other); 7196 Results.EnterNewScope(); 7197 AddObjCExpressionResults(Results, false); 7198 Results.ExitScope(); 7199 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7200 Results.data(), Results.size()); 7201 } 7202 7203 /// Determine whether the addition of the given flag to an Objective-C 7204 /// property's attributes will cause a conflict. 7205 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 7206 // Check if we've already added this flag. 7207 if (Attributes & NewFlag) 7208 return true; 7209 7210 Attributes |= NewFlag; 7211 7212 // Check for collisions with "readonly". 7213 if ((Attributes & ObjCPropertyAttribute::kind_readonly) && 7214 (Attributes & ObjCPropertyAttribute::kind_readwrite)) 7215 return true; 7216 7217 // Check for more than one of { assign, copy, retain, strong, weak }. 7218 unsigned AssignCopyRetMask = 7219 Attributes & 7220 (ObjCPropertyAttribute::kind_assign | 7221 ObjCPropertyAttribute::kind_unsafe_unretained | 7222 ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain | 7223 ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak); 7224 if (AssignCopyRetMask && 7225 AssignCopyRetMask != ObjCPropertyAttribute::kind_assign && 7226 AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained && 7227 AssignCopyRetMask != ObjCPropertyAttribute::kind_copy && 7228 AssignCopyRetMask != ObjCPropertyAttribute::kind_retain && 7229 AssignCopyRetMask != ObjCPropertyAttribute::kind_strong && 7230 AssignCopyRetMask != ObjCPropertyAttribute::kind_weak) 7231 return true; 7232 7233 return false; 7234 } 7235 7236 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 7237 if (!CodeCompleter) 7238 return; 7239 7240 unsigned Attributes = ODS.getPropertyAttributes(); 7241 7242 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7243 CodeCompleter->getCodeCompletionTUInfo(), 7244 CodeCompletionContext::CCC_Other); 7245 Results.EnterNewScope(); 7246 if (!ObjCPropertyFlagConflicts(Attributes, 7247 ObjCPropertyAttribute::kind_readonly)) 7248 Results.AddResult(CodeCompletionResult("readonly")); 7249 if (!ObjCPropertyFlagConflicts(Attributes, 7250 ObjCPropertyAttribute::kind_assign)) 7251 Results.AddResult(CodeCompletionResult("assign")); 7252 if (!ObjCPropertyFlagConflicts(Attributes, 7253 ObjCPropertyAttribute::kind_unsafe_unretained)) 7254 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 7255 if (!ObjCPropertyFlagConflicts(Attributes, 7256 ObjCPropertyAttribute::kind_readwrite)) 7257 Results.AddResult(CodeCompletionResult("readwrite")); 7258 if (!ObjCPropertyFlagConflicts(Attributes, 7259 ObjCPropertyAttribute::kind_retain)) 7260 Results.AddResult(CodeCompletionResult("retain")); 7261 if (!ObjCPropertyFlagConflicts(Attributes, 7262 ObjCPropertyAttribute::kind_strong)) 7263 Results.AddResult(CodeCompletionResult("strong")); 7264 if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy)) 7265 Results.AddResult(CodeCompletionResult("copy")); 7266 if (!ObjCPropertyFlagConflicts(Attributes, 7267 ObjCPropertyAttribute::kind_nonatomic)) 7268 Results.AddResult(CodeCompletionResult("nonatomic")); 7269 if (!ObjCPropertyFlagConflicts(Attributes, 7270 ObjCPropertyAttribute::kind_atomic)) 7271 Results.AddResult(CodeCompletionResult("atomic")); 7272 7273 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 7274 if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC) 7275 if (!ObjCPropertyFlagConflicts(Attributes, 7276 ObjCPropertyAttribute::kind_weak)) 7277 Results.AddResult(CodeCompletionResult("weak")); 7278 7279 if (!ObjCPropertyFlagConflicts(Attributes, 7280 ObjCPropertyAttribute::kind_setter)) { 7281 CodeCompletionBuilder Setter(Results.getAllocator(), 7282 Results.getCodeCompletionTUInfo()); 7283 Setter.AddTypedTextChunk("setter"); 7284 Setter.AddTextChunk("="); 7285 Setter.AddPlaceholderChunk("method"); 7286 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 7287 } 7288 if (!ObjCPropertyFlagConflicts(Attributes, 7289 ObjCPropertyAttribute::kind_getter)) { 7290 CodeCompletionBuilder Getter(Results.getAllocator(), 7291 Results.getCodeCompletionTUInfo()); 7292 Getter.AddTypedTextChunk("getter"); 7293 Getter.AddTextChunk("="); 7294 Getter.AddPlaceholderChunk("method"); 7295 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 7296 } 7297 if (!ObjCPropertyFlagConflicts(Attributes, 7298 ObjCPropertyAttribute::kind_nullability)) { 7299 Results.AddResult(CodeCompletionResult("nonnull")); 7300 Results.AddResult(CodeCompletionResult("nullable")); 7301 Results.AddResult(CodeCompletionResult("null_unspecified")); 7302 Results.AddResult(CodeCompletionResult("null_resettable")); 7303 } 7304 Results.ExitScope(); 7305 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7306 Results.data(), Results.size()); 7307 } 7308 7309 /// Describes the kind of Objective-C method that we want to find 7310 /// via code completion. 7311 enum ObjCMethodKind { 7312 MK_Any, ///< Any kind of method, provided it means other specified criteria. 7313 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 7314 MK_OneArgSelector ///< One-argument selector. 7315 }; 7316 7317 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind, 7318 ArrayRef<IdentifierInfo *> SelIdents, 7319 bool AllowSameLength = true) { 7320 unsigned NumSelIdents = SelIdents.size(); 7321 if (NumSelIdents > Sel.getNumArgs()) 7322 return false; 7323 7324 switch (WantKind) { 7325 case MK_Any: 7326 break; 7327 case MK_ZeroArgSelector: 7328 return Sel.isUnarySelector(); 7329 case MK_OneArgSelector: 7330 return Sel.getNumArgs() == 1; 7331 } 7332 7333 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 7334 return false; 7335 7336 for (unsigned I = 0; I != NumSelIdents; ++I) 7337 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 7338 return false; 7339 7340 return true; 7341 } 7342 7343 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 7344 ObjCMethodKind WantKind, 7345 ArrayRef<IdentifierInfo *> SelIdents, 7346 bool AllowSameLength = true) { 7347 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 7348 AllowSameLength); 7349 } 7350 7351 /// A set of selectors, which is used to avoid introducing multiple 7352 /// completions with the same selector into the result set. 7353 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 7354 7355 /// Add all of the Objective-C methods in the given Objective-C 7356 /// container to the set of results. 7357 /// 7358 /// The container will be a class, protocol, category, or implementation of 7359 /// any of the above. This mether will recurse to include methods from 7360 /// the superclasses of classes along with their categories, protocols, and 7361 /// implementations. 7362 /// 7363 /// \param Container the container in which we'll look to find methods. 7364 /// 7365 /// \param WantInstanceMethods Whether to add instance methods (only); if 7366 /// false, this routine will add factory methods (only). 7367 /// 7368 /// \param CurContext the context in which we're performing the lookup that 7369 /// finds methods. 7370 /// 7371 /// \param AllowSameLength Whether we allow a method to be added to the list 7372 /// when it has the same number of parameters as we have selector identifiers. 7373 /// 7374 /// \param Results the structure into which we'll add results. 7375 static void AddObjCMethods(ObjCContainerDecl *Container, 7376 bool WantInstanceMethods, ObjCMethodKind WantKind, 7377 ArrayRef<IdentifierInfo *> SelIdents, 7378 DeclContext *CurContext, 7379 VisitedSelectorSet &Selectors, bool AllowSameLength, 7380 ResultBuilder &Results, bool InOriginalClass = true, 7381 bool IsRootClass = false) { 7382 typedef CodeCompletionResult Result; 7383 Container = getContainerDef(Container); 7384 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 7385 IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass()); 7386 for (ObjCMethodDecl *M : Container->methods()) { 7387 // The instance methods on the root class can be messaged via the 7388 // metaclass. 7389 if (M->isInstanceMethod() == WantInstanceMethods || 7390 (IsRootClass && !WantInstanceMethods)) { 7391 // Check whether the selector identifiers we've been given are a 7392 // subset of the identifiers for this particular method. 7393 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength)) 7394 continue; 7395 7396 if (!Selectors.insert(M->getSelector()).second) 7397 continue; 7398 7399 Result R = Result(M, Results.getBasePriority(M), nullptr); 7400 R.StartParameter = SelIdents.size(); 7401 R.AllParametersAreInformative = (WantKind != MK_Any); 7402 if (!InOriginalClass) 7403 setInBaseClass(R); 7404 Results.MaybeAddResult(R, CurContext); 7405 } 7406 } 7407 7408 // Visit the protocols of protocols. 7409 if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 7410 if (Protocol->hasDefinition()) { 7411 const ObjCList<ObjCProtocolDecl> &Protocols = 7412 Protocol->getReferencedProtocols(); 7413 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7414 E = Protocols.end(); 7415 I != E; ++I) 7416 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7417 Selectors, AllowSameLength, Results, false, IsRootClass); 7418 } 7419 } 7420 7421 if (!IFace || !IFace->hasDefinition()) 7422 return; 7423 7424 // Add methods in protocols. 7425 for (ObjCProtocolDecl *I : IFace->protocols()) 7426 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7427 Selectors, AllowSameLength, Results, false, IsRootClass); 7428 7429 // Add methods in categories. 7430 for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) { 7431 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 7432 CurContext, Selectors, AllowSameLength, Results, 7433 InOriginalClass, IsRootClass); 7434 7435 // Add a categories protocol methods. 7436 const ObjCList<ObjCProtocolDecl> &Protocols = 7437 CatDecl->getReferencedProtocols(); 7438 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7439 E = Protocols.end(); 7440 I != E; ++I) 7441 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7442 Selectors, AllowSameLength, Results, false, IsRootClass); 7443 7444 // Add methods in category implementations. 7445 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 7446 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7447 Selectors, AllowSameLength, Results, InOriginalClass, 7448 IsRootClass); 7449 } 7450 7451 // Add methods in superclass. 7452 // Avoid passing in IsRootClass since root classes won't have super classes. 7453 if (IFace->getSuperClass()) 7454 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 7455 SelIdents, CurContext, Selectors, AllowSameLength, Results, 7456 /*IsRootClass=*/false); 7457 7458 // Add methods in our implementation, if any. 7459 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 7460 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7461 Selectors, AllowSameLength, Results, InOriginalClass, 7462 IsRootClass); 7463 } 7464 7465 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 7466 // Try to find the interface where getters might live. 7467 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7468 if (!Class) { 7469 if (ObjCCategoryDecl *Category = 7470 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7471 Class = Category->getClassInterface(); 7472 7473 if (!Class) 7474 return; 7475 } 7476 7477 // Find all of the potential getters. 7478 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7479 CodeCompleter->getCodeCompletionTUInfo(), 7480 CodeCompletionContext::CCC_Other); 7481 Results.EnterNewScope(); 7482 7483 VisitedSelectorSet Selectors; 7484 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 7485 /*AllowSameLength=*/true, Results); 7486 Results.ExitScope(); 7487 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7488 Results.data(), Results.size()); 7489 } 7490 7491 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 7492 // Try to find the interface where setters might live. 7493 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7494 if (!Class) { 7495 if (ObjCCategoryDecl *Category = 7496 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7497 Class = Category->getClassInterface(); 7498 7499 if (!Class) 7500 return; 7501 } 7502 7503 // Find all of the potential getters. 7504 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7505 CodeCompleter->getCodeCompletionTUInfo(), 7506 CodeCompletionContext::CCC_Other); 7507 Results.EnterNewScope(); 7508 7509 VisitedSelectorSet Selectors; 7510 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors, 7511 /*AllowSameLength=*/true, Results); 7512 7513 Results.ExitScope(); 7514 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7515 Results.data(), Results.size()); 7516 } 7517 7518 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 7519 bool IsParameter) { 7520 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7521 CodeCompleter->getCodeCompletionTUInfo(), 7522 CodeCompletionContext::CCC_Type); 7523 Results.EnterNewScope(); 7524 7525 // Add context-sensitive, Objective-C parameter-passing keywords. 7526 bool AddedInOut = false; 7527 if ((DS.getObjCDeclQualifier() & 7528 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 7529 Results.AddResult("in"); 7530 Results.AddResult("inout"); 7531 AddedInOut = true; 7532 } 7533 if ((DS.getObjCDeclQualifier() & 7534 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 7535 Results.AddResult("out"); 7536 if (!AddedInOut) 7537 Results.AddResult("inout"); 7538 } 7539 if ((DS.getObjCDeclQualifier() & 7540 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 7541 ObjCDeclSpec::DQ_Oneway)) == 0) { 7542 Results.AddResult("bycopy"); 7543 Results.AddResult("byref"); 7544 Results.AddResult("oneway"); 7545 } 7546 if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) { 7547 Results.AddResult("nonnull"); 7548 Results.AddResult("nullable"); 7549 Results.AddResult("null_unspecified"); 7550 } 7551 7552 // If we're completing the return type of an Objective-C method and the 7553 // identifier IBAction refers to a macro, provide a completion item for 7554 // an action, e.g., 7555 // IBAction)<#selector#>:(id)sender 7556 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 7557 PP.isMacroDefined("IBAction")) { 7558 CodeCompletionBuilder Builder(Results.getAllocator(), 7559 Results.getCodeCompletionTUInfo(), 7560 CCP_CodePattern, CXAvailability_Available); 7561 Builder.AddTypedTextChunk("IBAction"); 7562 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7563 Builder.AddPlaceholderChunk("selector"); 7564 Builder.AddChunk(CodeCompletionString::CK_Colon); 7565 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7566 Builder.AddTextChunk("id"); 7567 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7568 Builder.AddTextChunk("sender"); 7569 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 7570 } 7571 7572 // If we're completing the return type, provide 'instancetype'. 7573 if (!IsParameter) { 7574 Results.AddResult(CodeCompletionResult("instancetype")); 7575 } 7576 7577 // Add various builtin type names and specifiers. 7578 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 7579 Results.ExitScope(); 7580 7581 // Add the various type names 7582 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 7583 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7584 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7585 CodeCompleter->includeGlobals(), 7586 CodeCompleter->loadExternal()); 7587 7588 if (CodeCompleter->includeMacros()) 7589 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7590 7591 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7592 Results.data(), Results.size()); 7593 } 7594 7595 /// When we have an expression with type "id", we may assume 7596 /// that it has some more-specific class type based on knowledge of 7597 /// common uses of Objective-C. This routine returns that class type, 7598 /// or NULL if no better result could be determined. 7599 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 7600 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 7601 if (!Msg) 7602 return nullptr; 7603 7604 Selector Sel = Msg->getSelector(); 7605 if (Sel.isNull()) 7606 return nullptr; 7607 7608 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 7609 if (!Id) 7610 return nullptr; 7611 7612 ObjCMethodDecl *Method = Msg->getMethodDecl(); 7613 if (!Method) 7614 return nullptr; 7615 7616 // Determine the class that we're sending the message to. 7617 ObjCInterfaceDecl *IFace = nullptr; 7618 switch (Msg->getReceiverKind()) { 7619 case ObjCMessageExpr::Class: 7620 if (const ObjCObjectType *ObjType = 7621 Msg->getClassReceiver()->getAs<ObjCObjectType>()) 7622 IFace = ObjType->getInterface(); 7623 break; 7624 7625 case ObjCMessageExpr::Instance: { 7626 QualType T = Msg->getInstanceReceiver()->getType(); 7627 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 7628 IFace = Ptr->getInterfaceDecl(); 7629 break; 7630 } 7631 7632 case ObjCMessageExpr::SuperInstance: 7633 case ObjCMessageExpr::SuperClass: 7634 break; 7635 } 7636 7637 if (!IFace) 7638 return nullptr; 7639 7640 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 7641 if (Method->isInstanceMethod()) 7642 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7643 .Case("retain", IFace) 7644 .Case("strong", IFace) 7645 .Case("autorelease", IFace) 7646 .Case("copy", IFace) 7647 .Case("copyWithZone", IFace) 7648 .Case("mutableCopy", IFace) 7649 .Case("mutableCopyWithZone", IFace) 7650 .Case("awakeFromCoder", IFace) 7651 .Case("replacementObjectFromCoder", IFace) 7652 .Case("class", IFace) 7653 .Case("classForCoder", IFace) 7654 .Case("superclass", Super) 7655 .Default(nullptr); 7656 7657 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7658 .Case("new", IFace) 7659 .Case("alloc", IFace) 7660 .Case("allocWithZone", IFace) 7661 .Case("class", IFace) 7662 .Case("superclass", Super) 7663 .Default(nullptr); 7664 } 7665 7666 // Add a special completion for a message send to "super", which fills in the 7667 // most likely case of forwarding all of our arguments to the superclass 7668 // function. 7669 /// 7670 /// \param S The semantic analysis object. 7671 /// 7672 /// \param NeedSuperKeyword Whether we need to prefix this completion with 7673 /// the "super" keyword. Otherwise, we just need to provide the arguments. 7674 /// 7675 /// \param SelIdents The identifiers in the selector that have already been 7676 /// provided as arguments for a send to "super". 7677 /// 7678 /// \param Results The set of results to augment. 7679 /// 7680 /// \returns the Objective-C method declaration that would be invoked by 7681 /// this "super" completion. If NULL, no completion was added. 7682 static ObjCMethodDecl * 7683 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 7684 ArrayRef<IdentifierInfo *> SelIdents, 7685 ResultBuilder &Results) { 7686 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 7687 if (!CurMethod) 7688 return nullptr; 7689 7690 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 7691 if (!Class) 7692 return nullptr; 7693 7694 // Try to find a superclass method with the same selector. 7695 ObjCMethodDecl *SuperMethod = nullptr; 7696 while ((Class = Class->getSuperClass()) && !SuperMethod) { 7697 // Check in the class 7698 SuperMethod = Class->getMethod(CurMethod->getSelector(), 7699 CurMethod->isInstanceMethod()); 7700 7701 // Check in categories or class extensions. 7702 if (!SuperMethod) { 7703 for (const auto *Cat : Class->known_categories()) { 7704 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 7705 CurMethod->isInstanceMethod()))) 7706 break; 7707 } 7708 } 7709 } 7710 7711 if (!SuperMethod) 7712 return nullptr; 7713 7714 // Check whether the superclass method has the same signature. 7715 if (CurMethod->param_size() != SuperMethod->param_size() || 7716 CurMethod->isVariadic() != SuperMethod->isVariadic()) 7717 return nullptr; 7718 7719 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 7720 CurPEnd = CurMethod->param_end(), 7721 SuperP = SuperMethod->param_begin(); 7722 CurP != CurPEnd; ++CurP, ++SuperP) { 7723 // Make sure the parameter types are compatible. 7724 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 7725 (*SuperP)->getType())) 7726 return nullptr; 7727 7728 // Make sure we have a parameter name to forward! 7729 if (!(*CurP)->getIdentifier()) 7730 return nullptr; 7731 } 7732 7733 // We have a superclass method. Now, form the send-to-super completion. 7734 CodeCompletionBuilder Builder(Results.getAllocator(), 7735 Results.getCodeCompletionTUInfo()); 7736 7737 // Give this completion a return type. 7738 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 7739 Results.getCompletionContext().getBaseType(), Builder); 7740 7741 // If we need the "super" keyword, add it (plus some spacing). 7742 if (NeedSuperKeyword) { 7743 Builder.AddTypedTextChunk("super"); 7744 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7745 } 7746 7747 Selector Sel = CurMethod->getSelector(); 7748 if (Sel.isUnarySelector()) { 7749 if (NeedSuperKeyword) 7750 Builder.AddTextChunk( 7751 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7752 else 7753 Builder.AddTypedTextChunk( 7754 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7755 } else { 7756 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 7757 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 7758 if (I > SelIdents.size()) 7759 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7760 7761 if (I < SelIdents.size()) 7762 Builder.AddInformativeChunk( 7763 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7764 else if (NeedSuperKeyword || I > SelIdents.size()) { 7765 Builder.AddTextChunk( 7766 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7767 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7768 (*CurP)->getIdentifier()->getName())); 7769 } else { 7770 Builder.AddTypedTextChunk( 7771 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7772 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7773 (*CurP)->getIdentifier()->getName())); 7774 } 7775 } 7776 } 7777 7778 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 7779 CCP_SuperCompletion)); 7780 return SuperMethod; 7781 } 7782 7783 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 7784 typedef CodeCompletionResult Result; 7785 ResultBuilder Results( 7786 *this, CodeCompleter->getAllocator(), 7787 CodeCompleter->getCodeCompletionTUInfo(), 7788 CodeCompletionContext::CCC_ObjCMessageReceiver, 7789 getLangOpts().CPlusPlus11 7790 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 7791 : &ResultBuilder::IsObjCMessageReceiver); 7792 7793 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7794 Results.EnterNewScope(); 7795 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7796 CodeCompleter->includeGlobals(), 7797 CodeCompleter->loadExternal()); 7798 7799 // If we are in an Objective-C method inside a class that has a superclass, 7800 // add "super" as an option. 7801 if (ObjCMethodDecl *Method = getCurMethodDecl()) 7802 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 7803 if (Iface->getSuperClass()) { 7804 Results.AddResult(Result("super")); 7805 7806 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 7807 } 7808 7809 if (getLangOpts().CPlusPlus11) 7810 addThisCompletion(*this, Results); 7811 7812 Results.ExitScope(); 7813 7814 if (CodeCompleter->includeMacros()) 7815 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7816 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7817 Results.data(), Results.size()); 7818 } 7819 7820 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 7821 ArrayRef<IdentifierInfo *> SelIdents, 7822 bool AtArgumentExpression) { 7823 ObjCInterfaceDecl *CDecl = nullptr; 7824 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7825 // Figure out which interface we're in. 7826 CDecl = CurMethod->getClassInterface(); 7827 if (!CDecl) 7828 return; 7829 7830 // Find the superclass of this class. 7831 CDecl = CDecl->getSuperClass(); 7832 if (!CDecl) 7833 return; 7834 7835 if (CurMethod->isInstanceMethod()) { 7836 // We are inside an instance method, which means that the message 7837 // send [super ...] is actually calling an instance method on the 7838 // current object. 7839 return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents, 7840 AtArgumentExpression, CDecl); 7841 } 7842 7843 // Fall through to send to the superclass in CDecl. 7844 } else { 7845 // "super" may be the name of a type or variable. Figure out which 7846 // it is. 7847 IdentifierInfo *Super = getSuperIdentifier(); 7848 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName); 7849 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 7850 // "super" names an interface. Use it. 7851 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 7852 if (const ObjCObjectType *Iface = 7853 Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 7854 CDecl = Iface->getInterface(); 7855 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 7856 // "super" names an unresolved type; we can't be more specific. 7857 } else { 7858 // Assume that "super" names some kind of value and parse that way. 7859 CXXScopeSpec SS; 7860 SourceLocation TemplateKWLoc; 7861 UnqualifiedId id; 7862 id.setIdentifier(Super, SuperLoc); 7863 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 7864 /*HasTrailingLParen=*/false, 7865 /*IsAddressOfOperand=*/false); 7866 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 7867 SelIdents, AtArgumentExpression); 7868 } 7869 7870 // Fall through 7871 } 7872 7873 ParsedType Receiver; 7874 if (CDecl) 7875 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 7876 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 7877 AtArgumentExpression, 7878 /*IsSuper=*/true); 7879 } 7880 7881 /// Given a set of code-completion results for the argument of a message 7882 /// send, determine the preferred type (if any) for that argument expression. 7883 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 7884 unsigned NumSelIdents) { 7885 typedef CodeCompletionResult Result; 7886 ASTContext &Context = Results.getSema().Context; 7887 7888 QualType PreferredType; 7889 unsigned BestPriority = CCP_Unlikely * 2; 7890 Result *ResultsData = Results.data(); 7891 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 7892 Result &R = ResultsData[I]; 7893 if (R.Kind == Result::RK_Declaration && 7894 isa<ObjCMethodDecl>(R.Declaration)) { 7895 if (R.Priority <= BestPriority) { 7896 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 7897 if (NumSelIdents <= Method->param_size()) { 7898 QualType MyPreferredType = 7899 Method->parameters()[NumSelIdents - 1]->getType(); 7900 if (R.Priority < BestPriority || PreferredType.isNull()) { 7901 BestPriority = R.Priority; 7902 PreferredType = MyPreferredType; 7903 } else if (!Context.hasSameUnqualifiedType(PreferredType, 7904 MyPreferredType)) { 7905 PreferredType = QualType(); 7906 } 7907 } 7908 } 7909 } 7910 } 7911 7912 return PreferredType; 7913 } 7914 7915 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 7916 ParsedType Receiver, 7917 ArrayRef<IdentifierInfo *> SelIdents, 7918 bool AtArgumentExpression, bool IsSuper, 7919 ResultBuilder &Results) { 7920 typedef CodeCompletionResult Result; 7921 ObjCInterfaceDecl *CDecl = nullptr; 7922 7923 // If the given name refers to an interface type, retrieve the 7924 // corresponding declaration. 7925 if (Receiver) { 7926 QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr); 7927 if (!T.isNull()) 7928 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 7929 CDecl = Interface->getInterface(); 7930 } 7931 7932 // Add all of the factory methods in this Objective-C class, its protocols, 7933 // superclasses, categories, implementation, etc. 7934 Results.EnterNewScope(); 7935 7936 // If this is a send-to-super, try to add the special "super" send 7937 // completion. 7938 if (IsSuper) { 7939 if (ObjCMethodDecl *SuperMethod = 7940 AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 7941 Results.Ignore(SuperMethod); 7942 } 7943 7944 // If we're inside an Objective-C method definition, prefer its selector to 7945 // others. 7946 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 7947 Results.setPreferredSelector(CurMethod->getSelector()); 7948 7949 VisitedSelectorSet Selectors; 7950 if (CDecl) 7951 AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext, 7952 Selectors, AtArgumentExpression, Results); 7953 else { 7954 // We're messaging "id" as a type; provide all class/factory methods. 7955 7956 // If we have an external source, load the entire class method 7957 // pool from the AST file. 7958 if (SemaRef.getExternalSource()) { 7959 for (uint32_t I = 0, 7960 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 7961 I != N; ++I) { 7962 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 7963 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 7964 continue; 7965 7966 SemaRef.ReadMethodPool(Sel); 7967 } 7968 } 7969 7970 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 7971 MEnd = SemaRef.MethodPool.end(); 7972 M != MEnd; ++M) { 7973 for (ObjCMethodList *MethList = &M->second.second; 7974 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 7975 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 7976 continue; 7977 7978 Result R(MethList->getMethod(), 7979 Results.getBasePriority(MethList->getMethod()), nullptr); 7980 R.StartParameter = SelIdents.size(); 7981 R.AllParametersAreInformative = false; 7982 Results.MaybeAddResult(R, SemaRef.CurContext); 7983 } 7984 } 7985 } 7986 7987 Results.ExitScope(); 7988 } 7989 7990 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 7991 ArrayRef<IdentifierInfo *> SelIdents, 7992 bool AtArgumentExpression, 7993 bool IsSuper) { 7994 7995 QualType T = this->GetTypeFromParser(Receiver); 7996 7997 ResultBuilder Results( 7998 *this, CodeCompleter->getAllocator(), 7999 CodeCompleter->getCodeCompletionTUInfo(), 8000 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T, 8001 SelIdents)); 8002 8003 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 8004 AtArgumentExpression, IsSuper, Results); 8005 8006 // If we're actually at the argument expression (rather than prior to the 8007 // selector), we're actually performing code completion for an expression. 8008 // Determine whether we have a single, best method. If so, we can 8009 // code-complete the expression using the corresponding parameter type as 8010 // our preferred type, improving completion results. 8011 if (AtArgumentExpression) { 8012 QualType PreferredType = 8013 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 8014 if (PreferredType.isNull()) 8015 CodeCompleteOrdinaryName(S, PCC_Expression); 8016 else 8017 CodeCompleteExpression(S, PreferredType); 8018 return; 8019 } 8020 8021 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8022 Results.data(), Results.size()); 8023 } 8024 8025 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 8026 ArrayRef<IdentifierInfo *> SelIdents, 8027 bool AtArgumentExpression, 8028 ObjCInterfaceDecl *Super) { 8029 typedef CodeCompletionResult Result; 8030 8031 Expr *RecExpr = static_cast<Expr *>(Receiver); 8032 8033 // If necessary, apply function/array conversion to the receiver. 8034 // C99 6.7.5.3p[7,8]. 8035 if (RecExpr) { 8036 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 8037 if (Conv.isInvalid()) // conversion failed. bail. 8038 return; 8039 RecExpr = Conv.get(); 8040 } 8041 QualType ReceiverType = RecExpr 8042 ? RecExpr->getType() 8043 : Super ? Context.getObjCObjectPointerType( 8044 Context.getObjCInterfaceType(Super)) 8045 : Context.getObjCIdType(); 8046 8047 // If we're messaging an expression with type "id" or "Class", check 8048 // whether we know something special about the receiver that allows 8049 // us to assume a more-specific receiver type. 8050 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 8051 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 8052 if (ReceiverType->isObjCClassType()) 8053 return CodeCompleteObjCClassMessage( 8054 S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents, 8055 AtArgumentExpression, Super); 8056 8057 ReceiverType = 8058 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace)); 8059 } 8060 } else if (RecExpr && getLangOpts().CPlusPlus) { 8061 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 8062 if (Conv.isUsable()) { 8063 RecExpr = Conv.get(); 8064 ReceiverType = RecExpr->getType(); 8065 } 8066 } 8067 8068 // Build the set of methods we can see. 8069 ResultBuilder Results( 8070 *this, CodeCompleter->getAllocator(), 8071 CodeCompleter->getCodeCompletionTUInfo(), 8072 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 8073 ReceiverType, SelIdents)); 8074 8075 Results.EnterNewScope(); 8076 8077 // If this is a send-to-super, try to add the special "super" send 8078 // completion. 8079 if (Super) { 8080 if (ObjCMethodDecl *SuperMethod = 8081 AddSuperSendCompletion(*this, false, SelIdents, Results)) 8082 Results.Ignore(SuperMethod); 8083 } 8084 8085 // If we're inside an Objective-C method definition, prefer its selector to 8086 // others. 8087 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 8088 Results.setPreferredSelector(CurMethod->getSelector()); 8089 8090 // Keep track of the selectors we've already added. 8091 VisitedSelectorSet Selectors; 8092 8093 // Handle messages to Class. This really isn't a message to an instance 8094 // method, so we treat it the same way we would treat a message send to a 8095 // class method. 8096 if (ReceiverType->isObjCClassType() || 8097 ReceiverType->isObjCQualifiedClassType()) { 8098 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 8099 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 8100 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext, 8101 Selectors, AtArgumentExpression, Results); 8102 } 8103 } 8104 // Handle messages to a qualified ID ("id<foo>"). 8105 else if (const ObjCObjectPointerType *QualID = 8106 ReceiverType->getAsObjCQualifiedIdType()) { 8107 // Search protocols for instance methods. 8108 for (auto *I : QualID->quals()) 8109 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 8110 AtArgumentExpression, Results); 8111 } 8112 // Handle messages to a pointer to interface type. 8113 else if (const ObjCObjectPointerType *IFacePtr = 8114 ReceiverType->getAsObjCInterfacePointerType()) { 8115 // Search the class, its superclasses, etc., for instance methods. 8116 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 8117 CurContext, Selectors, AtArgumentExpression, Results); 8118 8119 // Search protocols for instance methods. 8120 for (auto *I : IFacePtr->quals()) 8121 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 8122 AtArgumentExpression, Results); 8123 } 8124 // Handle messages to "id". 8125 else if (ReceiverType->isObjCIdType()) { 8126 // We're messaging "id", so provide all instance methods we know 8127 // about as code-completion results. 8128 8129 // If we have an external source, load the entire class method 8130 // pool from the AST file. 8131 if (ExternalSource) { 8132 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 8133 I != N; ++I) { 8134 Selector Sel = ExternalSource->GetExternalSelector(I); 8135 if (Sel.isNull() || MethodPool.count(Sel)) 8136 continue; 8137 8138 ReadMethodPool(Sel); 8139 } 8140 } 8141 8142 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8143 MEnd = MethodPool.end(); 8144 M != MEnd; ++M) { 8145 for (ObjCMethodList *MethList = &M->second.first; 8146 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 8147 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 8148 continue; 8149 8150 if (!Selectors.insert(MethList->getMethod()->getSelector()).second) 8151 continue; 8152 8153 Result R(MethList->getMethod(), 8154 Results.getBasePriority(MethList->getMethod()), nullptr); 8155 R.StartParameter = SelIdents.size(); 8156 R.AllParametersAreInformative = false; 8157 Results.MaybeAddResult(R, CurContext); 8158 } 8159 } 8160 } 8161 Results.ExitScope(); 8162 8163 // If we're actually at the argument expression (rather than prior to the 8164 // selector), we're actually performing code completion for an expression. 8165 // Determine whether we have a single, best method. If so, we can 8166 // code-complete the expression using the corresponding parameter type as 8167 // our preferred type, improving completion results. 8168 if (AtArgumentExpression) { 8169 QualType PreferredType = 8170 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 8171 if (PreferredType.isNull()) 8172 CodeCompleteOrdinaryName(S, PCC_Expression); 8173 else 8174 CodeCompleteExpression(S, PreferredType); 8175 return; 8176 } 8177 8178 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8179 Results.data(), Results.size()); 8180 } 8181 8182 void Sema::CodeCompleteObjCForCollection(Scope *S, 8183 DeclGroupPtrTy IterationVar) { 8184 CodeCompleteExpressionData Data; 8185 Data.ObjCCollection = true; 8186 8187 if (IterationVar.getAsOpaquePtr()) { 8188 DeclGroupRef DG = IterationVar.get(); 8189 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 8190 if (*I) 8191 Data.IgnoreDecls.push_back(*I); 8192 } 8193 } 8194 8195 CodeCompleteExpression(S, Data); 8196 } 8197 8198 void Sema::CodeCompleteObjCSelector(Scope *S, 8199 ArrayRef<IdentifierInfo *> SelIdents) { 8200 // If we have an external source, load the entire class method 8201 // pool from the AST file. 8202 if (ExternalSource) { 8203 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 8204 ++I) { 8205 Selector Sel = ExternalSource->GetExternalSelector(I); 8206 if (Sel.isNull() || MethodPool.count(Sel)) 8207 continue; 8208 8209 ReadMethodPool(Sel); 8210 } 8211 } 8212 8213 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8214 CodeCompleter->getCodeCompletionTUInfo(), 8215 CodeCompletionContext::CCC_SelectorName); 8216 Results.EnterNewScope(); 8217 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8218 MEnd = MethodPool.end(); 8219 M != MEnd; ++M) { 8220 8221 Selector Sel = M->first; 8222 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 8223 continue; 8224 8225 CodeCompletionBuilder Builder(Results.getAllocator(), 8226 Results.getCodeCompletionTUInfo()); 8227 if (Sel.isUnarySelector()) { 8228 Builder.AddTypedTextChunk( 8229 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 8230 Results.AddResult(Builder.TakeString()); 8231 continue; 8232 } 8233 8234 std::string Accumulator; 8235 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 8236 if (I == SelIdents.size()) { 8237 if (!Accumulator.empty()) { 8238 Builder.AddInformativeChunk( 8239 Builder.getAllocator().CopyString(Accumulator)); 8240 Accumulator.clear(); 8241 } 8242 } 8243 8244 Accumulator += Sel.getNameForSlot(I); 8245 Accumulator += ':'; 8246 } 8247 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator)); 8248 Results.AddResult(Builder.TakeString()); 8249 } 8250 Results.ExitScope(); 8251 8252 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8253 Results.data(), Results.size()); 8254 } 8255 8256 /// Add all of the protocol declarations that we find in the given 8257 /// (translation unit) context. 8258 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 8259 bool OnlyForwardDeclarations, 8260 ResultBuilder &Results) { 8261 typedef CodeCompletionResult Result; 8262 8263 for (const auto *D : Ctx->decls()) { 8264 // Record any protocols we find. 8265 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 8266 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 8267 Results.AddResult( 8268 Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext, 8269 nullptr, false); 8270 } 8271 } 8272 8273 void Sema::CodeCompleteObjCProtocolReferences( 8274 ArrayRef<IdentifierLocPair> Protocols) { 8275 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8276 CodeCompleter->getCodeCompletionTUInfo(), 8277 CodeCompletionContext::CCC_ObjCProtocolName); 8278 8279 if (CodeCompleter->includeGlobals()) { 8280 Results.EnterNewScope(); 8281 8282 // Tell the result set to ignore all of the protocols we have 8283 // already seen. 8284 // FIXME: This doesn't work when caching code-completion results. 8285 for (const IdentifierLocPair &Pair : Protocols) 8286 if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second)) 8287 Results.Ignore(Protocol); 8288 8289 // Add all protocols. 8290 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 8291 Results); 8292 8293 Results.ExitScope(); 8294 } 8295 8296 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8297 Results.data(), Results.size()); 8298 } 8299 8300 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 8301 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8302 CodeCompleter->getCodeCompletionTUInfo(), 8303 CodeCompletionContext::CCC_ObjCProtocolName); 8304 8305 if (CodeCompleter->includeGlobals()) { 8306 Results.EnterNewScope(); 8307 8308 // Add all protocols. 8309 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 8310 Results); 8311 8312 Results.ExitScope(); 8313 } 8314 8315 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8316 Results.data(), Results.size()); 8317 } 8318 8319 /// Add all of the Objective-C interface declarations that we find in 8320 /// the given (translation unit) context. 8321 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 8322 bool OnlyForwardDeclarations, 8323 bool OnlyUnimplemented, 8324 ResultBuilder &Results) { 8325 typedef CodeCompletionResult Result; 8326 8327 for (const auto *D : Ctx->decls()) { 8328 // Record any interfaces we find. 8329 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 8330 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 8331 (!OnlyUnimplemented || !Class->getImplementation())) 8332 Results.AddResult( 8333 Result(Class, Results.getBasePriority(Class), nullptr), CurContext, 8334 nullptr, false); 8335 } 8336 } 8337 8338 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 8339 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8340 CodeCompleter->getCodeCompletionTUInfo(), 8341 CodeCompletionContext::CCC_ObjCInterfaceName); 8342 Results.EnterNewScope(); 8343 8344 if (CodeCompleter->includeGlobals()) { 8345 // Add all classes. 8346 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8347 false, Results); 8348 } 8349 8350 Results.ExitScope(); 8351 8352 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8353 Results.data(), Results.size()); 8354 } 8355 8356 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 8357 SourceLocation ClassNameLoc) { 8358 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8359 CodeCompleter->getCodeCompletionTUInfo(), 8360 CodeCompletionContext::CCC_ObjCInterfaceName); 8361 Results.EnterNewScope(); 8362 8363 // Make sure that we ignore the class we're currently defining. 8364 NamedDecl *CurClass = 8365 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8366 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 8367 Results.Ignore(CurClass); 8368 8369 if (CodeCompleter->includeGlobals()) { 8370 // Add all classes. 8371 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8372 false, Results); 8373 } 8374 8375 Results.ExitScope(); 8376 8377 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8378 Results.data(), Results.size()); 8379 } 8380 8381 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 8382 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8383 CodeCompleter->getCodeCompletionTUInfo(), 8384 CodeCompletionContext::CCC_ObjCImplementation); 8385 Results.EnterNewScope(); 8386 8387 if (CodeCompleter->includeGlobals()) { 8388 // Add all unimplemented classes. 8389 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8390 true, Results); 8391 } 8392 8393 Results.ExitScope(); 8394 8395 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8396 Results.data(), Results.size()); 8397 } 8398 8399 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 8400 IdentifierInfo *ClassName, 8401 SourceLocation ClassNameLoc) { 8402 typedef CodeCompletionResult Result; 8403 8404 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8405 CodeCompleter->getCodeCompletionTUInfo(), 8406 CodeCompletionContext::CCC_ObjCCategoryName); 8407 8408 // Ignore any categories we find that have already been implemented by this 8409 // interface. 8410 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8411 NamedDecl *CurClass = 8412 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8413 if (ObjCInterfaceDecl *Class = 8414 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) { 8415 for (const auto *Cat : Class->visible_categories()) 8416 CategoryNames.insert(Cat->getIdentifier()); 8417 } 8418 8419 // Add all of the categories we know about. 8420 Results.EnterNewScope(); 8421 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 8422 for (const auto *D : TU->decls()) 8423 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 8424 if (CategoryNames.insert(Category->getIdentifier()).second) 8425 Results.AddResult( 8426 Result(Category, Results.getBasePriority(Category), nullptr), 8427 CurContext, nullptr, false); 8428 Results.ExitScope(); 8429 8430 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8431 Results.data(), Results.size()); 8432 } 8433 8434 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 8435 IdentifierInfo *ClassName, 8436 SourceLocation ClassNameLoc) { 8437 typedef CodeCompletionResult Result; 8438 8439 // Find the corresponding interface. If we couldn't find the interface, the 8440 // program itself is ill-formed. However, we'll try to be helpful still by 8441 // providing the list of all of the categories we know about. 8442 NamedDecl *CurClass = 8443 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8444 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 8445 if (!Class) 8446 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 8447 8448 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8449 CodeCompleter->getCodeCompletionTUInfo(), 8450 CodeCompletionContext::CCC_ObjCCategoryName); 8451 8452 // Add all of the categories that have have corresponding interface 8453 // declarations in this class and any of its superclasses, except for 8454 // already-implemented categories in the class itself. 8455 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8456 Results.EnterNewScope(); 8457 bool IgnoreImplemented = true; 8458 while (Class) { 8459 for (const auto *Cat : Class->visible_categories()) { 8460 if ((!IgnoreImplemented || !Cat->getImplementation()) && 8461 CategoryNames.insert(Cat->getIdentifier()).second) 8462 Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr), 8463 CurContext, nullptr, false); 8464 } 8465 8466 Class = Class->getSuperClass(); 8467 IgnoreImplemented = false; 8468 } 8469 Results.ExitScope(); 8470 8471 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8472 Results.data(), Results.size()); 8473 } 8474 8475 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 8476 CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other); 8477 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8478 CodeCompleter->getCodeCompletionTUInfo(), CCContext); 8479 8480 // Figure out where this @synthesize lives. 8481 ObjCContainerDecl *Container = 8482 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8483 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8484 !isa<ObjCCategoryImplDecl>(Container))) 8485 return; 8486 8487 // Ignore any properties that have already been implemented. 8488 Container = getContainerDef(Container); 8489 for (const auto *D : Container->decls()) 8490 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 8491 Results.Ignore(PropertyImpl->getPropertyDecl()); 8492 8493 // Add any properties that we find. 8494 AddedPropertiesSet AddedProperties; 8495 Results.EnterNewScope(); 8496 if (ObjCImplementationDecl *ClassImpl = 8497 dyn_cast<ObjCImplementationDecl>(Container)) 8498 AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false, 8499 /*AllowNullaryMethods=*/false, CurContext, 8500 AddedProperties, Results); 8501 else 8502 AddObjCProperties(CCContext, 8503 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 8504 false, /*AllowNullaryMethods=*/false, CurContext, 8505 AddedProperties, Results); 8506 Results.ExitScope(); 8507 8508 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8509 Results.data(), Results.size()); 8510 } 8511 8512 void Sema::CodeCompleteObjCPropertySynthesizeIvar( 8513 Scope *S, IdentifierInfo *PropertyName) { 8514 typedef CodeCompletionResult Result; 8515 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8516 CodeCompleter->getCodeCompletionTUInfo(), 8517 CodeCompletionContext::CCC_Other); 8518 8519 // Figure out where this @synthesize lives. 8520 ObjCContainerDecl *Container = 8521 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8522 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8523 !isa<ObjCCategoryImplDecl>(Container))) 8524 return; 8525 8526 // Figure out which interface we're looking into. 8527 ObjCInterfaceDecl *Class = nullptr; 8528 if (ObjCImplementationDecl *ClassImpl = 8529 dyn_cast<ObjCImplementationDecl>(Container)) 8530 Class = ClassImpl->getClassInterface(); 8531 else 8532 Class = cast<ObjCCategoryImplDecl>(Container) 8533 ->getCategoryDecl() 8534 ->getClassInterface(); 8535 8536 // Determine the type of the property we're synthesizing. 8537 QualType PropertyType = Context.getObjCIdType(); 8538 if (Class) { 8539 if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration( 8540 PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) { 8541 PropertyType = 8542 Property->getType().getNonReferenceType().getUnqualifiedType(); 8543 8544 // Give preference to ivars 8545 Results.setPreferredType(PropertyType); 8546 } 8547 } 8548 8549 // Add all of the instance variables in this class and its superclasses. 8550 Results.EnterNewScope(); 8551 bool SawSimilarlyNamedIvar = false; 8552 std::string NameWithPrefix; 8553 NameWithPrefix += '_'; 8554 NameWithPrefix += PropertyName->getName(); 8555 std::string NameWithSuffix = PropertyName->getName().str(); 8556 NameWithSuffix += '_'; 8557 for (; Class; Class = Class->getSuperClass()) { 8558 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 8559 Ivar = Ivar->getNextIvar()) { 8560 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr), 8561 CurContext, nullptr, false); 8562 8563 // Determine whether we've seen an ivar with a name similar to the 8564 // property. 8565 if ((PropertyName == Ivar->getIdentifier() || 8566 NameWithPrefix == Ivar->getName() || 8567 NameWithSuffix == Ivar->getName())) { 8568 SawSimilarlyNamedIvar = true; 8569 8570 // Reduce the priority of this result by one, to give it a slight 8571 // advantage over other results whose names don't match so closely. 8572 if (Results.size() && 8573 Results.data()[Results.size() - 1].Kind == 8574 CodeCompletionResult::RK_Declaration && 8575 Results.data()[Results.size() - 1].Declaration == Ivar) 8576 Results.data()[Results.size() - 1].Priority--; 8577 } 8578 } 8579 } 8580 8581 if (!SawSimilarlyNamedIvar) { 8582 // Create ivar result _propName, that the user can use to synthesize 8583 // an ivar of the appropriate type. 8584 unsigned Priority = CCP_MemberDeclaration + 1; 8585 typedef CodeCompletionResult Result; 8586 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8587 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 8588 Priority, CXAvailability_Available); 8589 8590 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 8591 Builder.AddResultTypeChunk( 8592 GetCompletionTypeString(PropertyType, Context, Policy, Allocator)); 8593 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 8594 Results.AddResult( 8595 Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl)); 8596 } 8597 8598 Results.ExitScope(); 8599 8600 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8601 Results.data(), Results.size()); 8602 } 8603 8604 // Mapping from selectors to the methods that implement that selector, along 8605 // with the "in original class" flag. 8606 typedef llvm::DenseMap<Selector, 8607 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>> 8608 KnownMethodsMap; 8609 8610 /// Find all of the methods that reside in the given container 8611 /// (and its superclasses, protocols, etc.) that meet the given 8612 /// criteria. Insert those methods into the map of known methods, 8613 /// indexed by selector so they can be easily found. 8614 static void FindImplementableMethods(ASTContext &Context, 8615 ObjCContainerDecl *Container, 8616 Optional<bool> WantInstanceMethods, 8617 QualType ReturnType, 8618 KnownMethodsMap &KnownMethods, 8619 bool InOriginalClass = true) { 8620 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 8621 // Make sure we have a definition; that's what we'll walk. 8622 if (!IFace->hasDefinition()) 8623 return; 8624 8625 IFace = IFace->getDefinition(); 8626 Container = IFace; 8627 8628 const ObjCList<ObjCProtocolDecl> &Protocols = 8629 IFace->getReferencedProtocols(); 8630 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8631 E = Protocols.end(); 8632 I != E; ++I) 8633 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8634 KnownMethods, InOriginalClass); 8635 8636 // Add methods from any class extensions and categories. 8637 for (auto *Cat : IFace->visible_categories()) { 8638 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType, 8639 KnownMethods, false); 8640 } 8641 8642 // Visit the superclass. 8643 if (IFace->getSuperClass()) 8644 FindImplementableMethods(Context, IFace->getSuperClass(), 8645 WantInstanceMethods, ReturnType, KnownMethods, 8646 false); 8647 } 8648 8649 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 8650 // Recurse into protocols. 8651 const ObjCList<ObjCProtocolDecl> &Protocols = 8652 Category->getReferencedProtocols(); 8653 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8654 E = Protocols.end(); 8655 I != E; ++I) 8656 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8657 KnownMethods, InOriginalClass); 8658 8659 // If this category is the original class, jump to the interface. 8660 if (InOriginalClass && Category->getClassInterface()) 8661 FindImplementableMethods(Context, Category->getClassInterface(), 8662 WantInstanceMethods, ReturnType, KnownMethods, 8663 false); 8664 } 8665 8666 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 8667 // Make sure we have a definition; that's what we'll walk. 8668 if (!Protocol->hasDefinition()) 8669 return; 8670 Protocol = Protocol->getDefinition(); 8671 Container = Protocol; 8672 8673 // Recurse into protocols. 8674 const ObjCList<ObjCProtocolDecl> &Protocols = 8675 Protocol->getReferencedProtocols(); 8676 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8677 E = Protocols.end(); 8678 I != E; ++I) 8679 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8680 KnownMethods, false); 8681 } 8682 8683 // Add methods in this container. This operation occurs last because 8684 // we want the methods from this container to override any methods 8685 // we've previously seen with the same selector. 8686 for (auto *M : Container->methods()) { 8687 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) { 8688 if (!ReturnType.isNull() && 8689 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 8690 continue; 8691 8692 KnownMethods[M->getSelector()] = 8693 KnownMethodsMap::mapped_type(M, InOriginalClass); 8694 } 8695 } 8696 } 8697 8698 /// Add the parenthesized return or parameter type chunk to a code 8699 /// completion string. 8700 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals, 8701 ASTContext &Context, 8702 const PrintingPolicy &Policy, 8703 CodeCompletionBuilder &Builder) { 8704 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8705 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type); 8706 if (!Quals.empty()) 8707 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 8708 Builder.AddTextChunk( 8709 GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator())); 8710 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8711 } 8712 8713 /// Determine whether the given class is or inherits from a class by 8714 /// the given name. 8715 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) { 8716 if (!Class) 8717 return false; 8718 8719 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 8720 return true; 8721 8722 return InheritsFromClassNamed(Class->getSuperClass(), Name); 8723 } 8724 8725 /// Add code completions for Objective-C Key-Value Coding (KVC) and 8726 /// Key-Value Observing (KVO). 8727 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 8728 bool IsInstanceMethod, 8729 QualType ReturnType, ASTContext &Context, 8730 VisitedSelectorSet &KnownSelectors, 8731 ResultBuilder &Results) { 8732 IdentifierInfo *PropName = Property->getIdentifier(); 8733 if (!PropName || PropName->getLength() == 0) 8734 return; 8735 8736 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 8737 8738 // Builder that will create each code completion. 8739 typedef CodeCompletionResult Result; 8740 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8741 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 8742 8743 // The selector table. 8744 SelectorTable &Selectors = Context.Selectors; 8745 8746 // The property name, copied into the code completion allocation region 8747 // on demand. 8748 struct KeyHolder { 8749 CodeCompletionAllocator &Allocator; 8750 StringRef Key; 8751 const char *CopiedKey; 8752 8753 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 8754 : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {} 8755 8756 operator const char *() { 8757 if (CopiedKey) 8758 return CopiedKey; 8759 8760 return CopiedKey = Allocator.CopyString(Key); 8761 } 8762 } Key(Allocator, PropName->getName()); 8763 8764 // The uppercased name of the property name. 8765 std::string UpperKey = std::string(PropName->getName()); 8766 if (!UpperKey.empty()) 8767 UpperKey[0] = toUppercase(UpperKey[0]); 8768 8769 bool ReturnTypeMatchesProperty = 8770 ReturnType.isNull() || 8771 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 8772 Property->getType()); 8773 bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType(); 8774 8775 // Add the normal accessor -(type)key. 8776 if (IsInstanceMethod && 8777 KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second && 8778 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 8779 if (ReturnType.isNull()) 8780 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8781 Builder); 8782 8783 Builder.AddTypedTextChunk(Key); 8784 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8785 CXCursor_ObjCInstanceMethodDecl)); 8786 } 8787 8788 // If we have an integral or boolean property (or the user has provided 8789 // an integral or boolean return type), add the accessor -(type)isKey. 8790 if (IsInstanceMethod && 8791 ((!ReturnType.isNull() && 8792 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 8793 (ReturnType.isNull() && (Property->getType()->isIntegerType() || 8794 Property->getType()->isBooleanType())))) { 8795 std::string SelectorName = (Twine("is") + UpperKey).str(); 8796 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8797 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8798 .second) { 8799 if (ReturnType.isNull()) { 8800 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8801 Builder.AddTextChunk("BOOL"); 8802 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8803 } 8804 8805 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8806 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8807 CXCursor_ObjCInstanceMethodDecl)); 8808 } 8809 } 8810 8811 // Add the normal mutator. 8812 if (IsInstanceMethod && ReturnTypeMatchesVoid && 8813 !Property->getSetterMethodDecl()) { 8814 std::string SelectorName = (Twine("set") + UpperKey).str(); 8815 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8816 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8817 if (ReturnType.isNull()) { 8818 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8819 Builder.AddTextChunk("void"); 8820 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8821 } 8822 8823 Builder.AddTypedTextChunk( 8824 Allocator.CopyString(SelectorId->getName() + ":")); 8825 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8826 Builder); 8827 Builder.AddTextChunk(Key); 8828 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8829 CXCursor_ObjCInstanceMethodDecl)); 8830 } 8831 } 8832 8833 // Indexed and unordered accessors 8834 unsigned IndexedGetterPriority = CCP_CodePattern; 8835 unsigned IndexedSetterPriority = CCP_CodePattern; 8836 unsigned UnorderedGetterPriority = CCP_CodePattern; 8837 unsigned UnorderedSetterPriority = CCP_CodePattern; 8838 if (const auto *ObjCPointer = 8839 Property->getType()->getAs<ObjCObjectPointerType>()) { 8840 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 8841 // If this interface type is not provably derived from a known 8842 // collection, penalize the corresponding completions. 8843 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 8844 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8845 if (!InheritsFromClassNamed(IFace, "NSArray")) 8846 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8847 } 8848 8849 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 8850 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8851 if (!InheritsFromClassNamed(IFace, "NSSet")) 8852 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8853 } 8854 } 8855 } else { 8856 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8857 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8858 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8859 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8860 } 8861 8862 // Add -(NSUInteger)countOf<key> 8863 if (IsInstanceMethod && 8864 (ReturnType.isNull() || ReturnType->isIntegerType())) { 8865 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 8866 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8867 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8868 .second) { 8869 if (ReturnType.isNull()) { 8870 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8871 Builder.AddTextChunk("NSUInteger"); 8872 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8873 } 8874 8875 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8876 Results.AddResult( 8877 Result(Builder.TakeString(), 8878 std::min(IndexedGetterPriority, UnorderedGetterPriority), 8879 CXCursor_ObjCInstanceMethodDecl)); 8880 } 8881 } 8882 8883 // Indexed getters 8884 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 8885 if (IsInstanceMethod && 8886 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 8887 std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str(); 8888 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8889 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8890 if (ReturnType.isNull()) { 8891 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8892 Builder.AddTextChunk("id"); 8893 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8894 } 8895 8896 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8897 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8898 Builder.AddTextChunk("NSUInteger"); 8899 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8900 Builder.AddTextChunk("index"); 8901 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8902 CXCursor_ObjCInstanceMethodDecl)); 8903 } 8904 } 8905 8906 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 8907 if (IsInstanceMethod && 8908 (ReturnType.isNull() || 8909 (ReturnType->isObjCObjectPointerType() && 8910 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8911 ReturnType->castAs<ObjCObjectPointerType>() 8912 ->getInterfaceDecl() 8913 ->getName() == "NSArray"))) { 8914 std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str(); 8915 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8916 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8917 if (ReturnType.isNull()) { 8918 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8919 Builder.AddTextChunk("NSArray *"); 8920 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8921 } 8922 8923 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8924 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8925 Builder.AddTextChunk("NSIndexSet *"); 8926 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8927 Builder.AddTextChunk("indexes"); 8928 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8929 CXCursor_ObjCInstanceMethodDecl)); 8930 } 8931 } 8932 8933 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 8934 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8935 std::string SelectorName = (Twine("get") + UpperKey).str(); 8936 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8937 &Context.Idents.get("range")}; 8938 8939 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8940 if (ReturnType.isNull()) { 8941 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8942 Builder.AddTextChunk("void"); 8943 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8944 } 8945 8946 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8947 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8948 Builder.AddPlaceholderChunk("object-type"); 8949 Builder.AddTextChunk(" **"); 8950 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8951 Builder.AddTextChunk("buffer"); 8952 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8953 Builder.AddTypedTextChunk("range:"); 8954 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8955 Builder.AddTextChunk("NSRange"); 8956 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8957 Builder.AddTextChunk("inRange"); 8958 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8959 CXCursor_ObjCInstanceMethodDecl)); 8960 } 8961 } 8962 8963 // Mutable indexed accessors 8964 8965 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 8966 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8967 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 8968 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"), 8969 &Context.Idents.get(SelectorName)}; 8970 8971 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8972 if (ReturnType.isNull()) { 8973 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8974 Builder.AddTextChunk("void"); 8975 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8976 } 8977 8978 Builder.AddTypedTextChunk("insertObject:"); 8979 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8980 Builder.AddPlaceholderChunk("object-type"); 8981 Builder.AddTextChunk(" *"); 8982 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8983 Builder.AddTextChunk("object"); 8984 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8985 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8986 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8987 Builder.AddPlaceholderChunk("NSUInteger"); 8988 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8989 Builder.AddTextChunk("index"); 8990 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8991 CXCursor_ObjCInstanceMethodDecl)); 8992 } 8993 } 8994 8995 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 8996 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8997 std::string SelectorName = (Twine("insert") + UpperKey).str(); 8998 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8999 &Context.Idents.get("atIndexes")}; 9000 9001 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9002 if (ReturnType.isNull()) { 9003 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9004 Builder.AddTextChunk("void"); 9005 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9006 } 9007 9008 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9009 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9010 Builder.AddTextChunk("NSArray *"); 9011 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9012 Builder.AddTextChunk("array"); 9013 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9014 Builder.AddTypedTextChunk("atIndexes:"); 9015 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9016 Builder.AddPlaceholderChunk("NSIndexSet *"); 9017 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9018 Builder.AddTextChunk("indexes"); 9019 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9020 CXCursor_ObjCInstanceMethodDecl)); 9021 } 9022 } 9023 9024 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 9025 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9026 std::string SelectorName = 9027 (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 9028 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9029 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9030 if (ReturnType.isNull()) { 9031 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9032 Builder.AddTextChunk("void"); 9033 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9034 } 9035 9036 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9037 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9038 Builder.AddTextChunk("NSUInteger"); 9039 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9040 Builder.AddTextChunk("index"); 9041 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9042 CXCursor_ObjCInstanceMethodDecl)); 9043 } 9044 } 9045 9046 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 9047 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9048 std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str(); 9049 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9050 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9051 if (ReturnType.isNull()) { 9052 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9053 Builder.AddTextChunk("void"); 9054 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9055 } 9056 9057 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9058 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9059 Builder.AddTextChunk("NSIndexSet *"); 9060 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9061 Builder.AddTextChunk("indexes"); 9062 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9063 CXCursor_ObjCInstanceMethodDecl)); 9064 } 9065 } 9066 9067 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 9068 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9069 std::string SelectorName = 9070 (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 9071 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 9072 &Context.Idents.get("withObject")}; 9073 9074 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9075 if (ReturnType.isNull()) { 9076 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9077 Builder.AddTextChunk("void"); 9078 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9079 } 9080 9081 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9082 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9083 Builder.AddPlaceholderChunk("NSUInteger"); 9084 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9085 Builder.AddTextChunk("index"); 9086 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9087 Builder.AddTypedTextChunk("withObject:"); 9088 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9089 Builder.AddTextChunk("id"); 9090 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9091 Builder.AddTextChunk("object"); 9092 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9093 CXCursor_ObjCInstanceMethodDecl)); 9094 } 9095 } 9096 9097 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 9098 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9099 std::string SelectorName1 = 9100 (Twine("replace") + UpperKey + "AtIndexes").str(); 9101 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 9102 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1), 9103 &Context.Idents.get(SelectorName2)}; 9104 9105 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 9106 if (ReturnType.isNull()) { 9107 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9108 Builder.AddTextChunk("void"); 9109 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9110 } 9111 9112 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 9113 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9114 Builder.AddPlaceholderChunk("NSIndexSet *"); 9115 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9116 Builder.AddTextChunk("indexes"); 9117 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9118 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 9119 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9120 Builder.AddTextChunk("NSArray *"); 9121 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9122 Builder.AddTextChunk("array"); 9123 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 9124 CXCursor_ObjCInstanceMethodDecl)); 9125 } 9126 } 9127 9128 // Unordered getters 9129 // - (NSEnumerator *)enumeratorOfKey 9130 if (IsInstanceMethod && 9131 (ReturnType.isNull() || 9132 (ReturnType->isObjCObjectPointerType() && 9133 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9134 ReturnType->getAs<ObjCObjectPointerType>() 9135 ->getInterfaceDecl() 9136 ->getName() == "NSEnumerator"))) { 9137 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 9138 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9139 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9140 .second) { 9141 if (ReturnType.isNull()) { 9142 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9143 Builder.AddTextChunk("NSEnumerator *"); 9144 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9145 } 9146 9147 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9148 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9149 CXCursor_ObjCInstanceMethodDecl)); 9150 } 9151 } 9152 9153 // - (type *)memberOfKey:(type *)object 9154 if (IsInstanceMethod && 9155 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 9156 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 9157 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9158 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9159 if (ReturnType.isNull()) { 9160 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9161 Builder.AddPlaceholderChunk("object-type"); 9162 Builder.AddTextChunk(" *"); 9163 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9164 } 9165 9166 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9167 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9168 if (ReturnType.isNull()) { 9169 Builder.AddPlaceholderChunk("object-type"); 9170 Builder.AddTextChunk(" *"); 9171 } else { 9172 Builder.AddTextChunk(GetCompletionTypeString( 9173 ReturnType, Context, Policy, Builder.getAllocator())); 9174 } 9175 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9176 Builder.AddTextChunk("object"); 9177 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9178 CXCursor_ObjCInstanceMethodDecl)); 9179 } 9180 } 9181 9182 // Mutable unordered accessors 9183 // - (void)addKeyObject:(type *)object 9184 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9185 std::string SelectorName = 9186 (Twine("add") + UpperKey + Twine("Object")).str(); 9187 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9188 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9189 if (ReturnType.isNull()) { 9190 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9191 Builder.AddTextChunk("void"); 9192 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9193 } 9194 9195 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9196 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9197 Builder.AddPlaceholderChunk("object-type"); 9198 Builder.AddTextChunk(" *"); 9199 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9200 Builder.AddTextChunk("object"); 9201 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9202 CXCursor_ObjCInstanceMethodDecl)); 9203 } 9204 } 9205 9206 // - (void)addKey:(NSSet *)objects 9207 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9208 std::string SelectorName = (Twine("add") + UpperKey).str(); 9209 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9210 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9211 if (ReturnType.isNull()) { 9212 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9213 Builder.AddTextChunk("void"); 9214 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9215 } 9216 9217 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9218 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9219 Builder.AddTextChunk("NSSet *"); 9220 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9221 Builder.AddTextChunk("objects"); 9222 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9223 CXCursor_ObjCInstanceMethodDecl)); 9224 } 9225 } 9226 9227 // - (void)removeKeyObject:(type *)object 9228 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9229 std::string SelectorName = 9230 (Twine("remove") + UpperKey + Twine("Object")).str(); 9231 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9232 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9233 if (ReturnType.isNull()) { 9234 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9235 Builder.AddTextChunk("void"); 9236 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9237 } 9238 9239 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9240 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9241 Builder.AddPlaceholderChunk("object-type"); 9242 Builder.AddTextChunk(" *"); 9243 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9244 Builder.AddTextChunk("object"); 9245 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9246 CXCursor_ObjCInstanceMethodDecl)); 9247 } 9248 } 9249 9250 // - (void)removeKey:(NSSet *)objects 9251 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9252 std::string SelectorName = (Twine("remove") + UpperKey).str(); 9253 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9254 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9255 if (ReturnType.isNull()) { 9256 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9257 Builder.AddTextChunk("void"); 9258 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9259 } 9260 9261 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9262 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9263 Builder.AddTextChunk("NSSet *"); 9264 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9265 Builder.AddTextChunk("objects"); 9266 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9267 CXCursor_ObjCInstanceMethodDecl)); 9268 } 9269 } 9270 9271 // - (void)intersectKey:(NSSet *)objects 9272 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9273 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 9274 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9275 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9276 if (ReturnType.isNull()) { 9277 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9278 Builder.AddTextChunk("void"); 9279 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9280 } 9281 9282 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9283 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9284 Builder.AddTextChunk("NSSet *"); 9285 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9286 Builder.AddTextChunk("objects"); 9287 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9288 CXCursor_ObjCInstanceMethodDecl)); 9289 } 9290 } 9291 9292 // Key-Value Observing 9293 // + (NSSet *)keyPathsForValuesAffectingKey 9294 if (!IsInstanceMethod && 9295 (ReturnType.isNull() || 9296 (ReturnType->isObjCObjectPointerType() && 9297 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9298 ReturnType->castAs<ObjCObjectPointerType>() 9299 ->getInterfaceDecl() 9300 ->getName() == "NSSet"))) { 9301 std::string SelectorName = 9302 (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 9303 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9304 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9305 .second) { 9306 if (ReturnType.isNull()) { 9307 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9308 Builder.AddTextChunk("NSSet<NSString *> *"); 9309 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9310 } 9311 9312 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9313 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9314 CXCursor_ObjCClassMethodDecl)); 9315 } 9316 } 9317 9318 // + (BOOL)automaticallyNotifiesObserversForKey 9319 if (!IsInstanceMethod && 9320 (ReturnType.isNull() || ReturnType->isIntegerType() || 9321 ReturnType->isBooleanType())) { 9322 std::string SelectorName = 9323 (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 9324 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9325 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9326 .second) { 9327 if (ReturnType.isNull()) { 9328 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9329 Builder.AddTextChunk("BOOL"); 9330 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9331 } 9332 9333 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9334 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9335 CXCursor_ObjCClassMethodDecl)); 9336 } 9337 } 9338 } 9339 9340 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod, 9341 ParsedType ReturnTy) { 9342 // Determine the return type of the method we're declaring, if 9343 // provided. 9344 QualType ReturnType = GetTypeFromParser(ReturnTy); 9345 Decl *IDecl = nullptr; 9346 if (CurContext->isObjCContainer()) { 9347 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 9348 IDecl = OCD; 9349 } 9350 // Determine where we should start searching for methods. 9351 ObjCContainerDecl *SearchDecl = nullptr; 9352 bool IsInImplementation = false; 9353 if (Decl *D = IDecl) { 9354 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 9355 SearchDecl = Impl->getClassInterface(); 9356 IsInImplementation = true; 9357 } else if (ObjCCategoryImplDecl *CatImpl = 9358 dyn_cast<ObjCCategoryImplDecl>(D)) { 9359 SearchDecl = CatImpl->getCategoryDecl(); 9360 IsInImplementation = true; 9361 } else 9362 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 9363 } 9364 9365 if (!SearchDecl && S) { 9366 if (DeclContext *DC = S->getEntity()) 9367 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 9368 } 9369 9370 if (!SearchDecl) { 9371 HandleCodeCompleteResults(this, CodeCompleter, 9372 CodeCompletionContext::CCC_Other, nullptr, 0); 9373 return; 9374 } 9375 9376 // Find all of the methods that we could declare/implement here. 9377 KnownMethodsMap KnownMethods; 9378 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType, 9379 KnownMethods); 9380 9381 // Add declarations or definitions for each of the known methods. 9382 typedef CodeCompletionResult Result; 9383 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9384 CodeCompleter->getCodeCompletionTUInfo(), 9385 CodeCompletionContext::CCC_Other); 9386 Results.EnterNewScope(); 9387 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 9388 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9389 MEnd = KnownMethods.end(); 9390 M != MEnd; ++M) { 9391 ObjCMethodDecl *Method = M->second.getPointer(); 9392 CodeCompletionBuilder Builder(Results.getAllocator(), 9393 Results.getCodeCompletionTUInfo()); 9394 9395 // Add the '-'/'+' prefix if it wasn't provided yet. 9396 if (!IsInstanceMethod) { 9397 Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+"); 9398 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9399 } 9400 9401 // If the result type was not already provided, add it to the 9402 // pattern as (type). 9403 if (ReturnType.isNull()) { 9404 QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context); 9405 AttributedType::stripOuterNullability(ResTy); 9406 AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context, 9407 Policy, Builder); 9408 } 9409 9410 Selector Sel = Method->getSelector(); 9411 9412 if (Sel.isUnarySelector()) { 9413 // Unary selectors have no arguments. 9414 Builder.AddTypedTextChunk( 9415 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 9416 } else { 9417 // Add all parameters to the pattern. 9418 unsigned I = 0; 9419 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 9420 PEnd = Method->param_end(); 9421 P != PEnd; (void)++P, ++I) { 9422 // Add the part of the selector name. 9423 if (I == 0) 9424 Builder.AddTypedTextChunk( 9425 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9426 else if (I < Sel.getNumArgs()) { 9427 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9428 Builder.AddTypedTextChunk( 9429 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9430 } else 9431 break; 9432 9433 // Add the parameter type. 9434 QualType ParamType; 9435 if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability) 9436 ParamType = (*P)->getType(); 9437 else 9438 ParamType = (*P)->getOriginalType(); 9439 ParamType = ParamType.substObjCTypeArgs( 9440 Context, {}, ObjCSubstitutionContext::Parameter); 9441 AttributedType::stripOuterNullability(ParamType); 9442 AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), 9443 Context, Policy, Builder); 9444 9445 if (IdentifierInfo *Id = (*P)->getIdentifier()) 9446 Builder.AddTextChunk( 9447 Builder.getAllocator().CopyString(Id->getName())); 9448 } 9449 } 9450 9451 if (Method->isVariadic()) { 9452 if (Method->param_size() > 0) 9453 Builder.AddChunk(CodeCompletionString::CK_Comma); 9454 Builder.AddTextChunk("..."); 9455 } 9456 9457 if (IsInImplementation && Results.includeCodePatterns()) { 9458 // We will be defining the method here, so add a compound statement. 9459 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9460 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 9461 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9462 if (!Method->getReturnType()->isVoidType()) { 9463 // If the result type is not void, add a return clause. 9464 Builder.AddTextChunk("return"); 9465 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9466 Builder.AddPlaceholderChunk("expression"); 9467 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 9468 } else 9469 Builder.AddPlaceholderChunk("statements"); 9470 9471 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9472 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 9473 } 9474 9475 unsigned Priority = CCP_CodePattern; 9476 auto R = Result(Builder.TakeString(), Method, Priority); 9477 if (!M->second.getInt()) 9478 setInBaseClass(R); 9479 Results.AddResult(std::move(R)); 9480 } 9481 9482 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 9483 // the properties in this class and its categories. 9484 if (Context.getLangOpts().ObjC) { 9485 SmallVector<ObjCContainerDecl *, 4> Containers; 9486 Containers.push_back(SearchDecl); 9487 9488 VisitedSelectorSet KnownSelectors; 9489 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9490 MEnd = KnownMethods.end(); 9491 M != MEnd; ++M) 9492 KnownSelectors.insert(M->first); 9493 9494 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 9495 if (!IFace) 9496 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 9497 IFace = Category->getClassInterface(); 9498 9499 if (IFace) 9500 for (auto *Cat : IFace->visible_categories()) 9501 Containers.push_back(Cat); 9502 9503 if (IsInstanceMethod) { 9504 for (unsigned I = 0, N = Containers.size(); I != N; ++I) 9505 for (auto *P : Containers[I]->instance_properties()) 9506 AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context, 9507 KnownSelectors, Results); 9508 } 9509 } 9510 9511 Results.ExitScope(); 9512 9513 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9514 Results.data(), Results.size()); 9515 } 9516 9517 void Sema::CodeCompleteObjCMethodDeclSelector( 9518 Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy, 9519 ArrayRef<IdentifierInfo *> SelIdents) { 9520 // If we have an external source, load the entire class method 9521 // pool from the AST file. 9522 if (ExternalSource) { 9523 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 9524 ++I) { 9525 Selector Sel = ExternalSource->GetExternalSelector(I); 9526 if (Sel.isNull() || MethodPool.count(Sel)) 9527 continue; 9528 9529 ReadMethodPool(Sel); 9530 } 9531 } 9532 9533 // Build the set of methods we can see. 9534 typedef CodeCompletionResult Result; 9535 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9536 CodeCompleter->getCodeCompletionTUInfo(), 9537 CodeCompletionContext::CCC_Other); 9538 9539 if (ReturnTy) 9540 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 9541 9542 Results.EnterNewScope(); 9543 for (GlobalMethodPool::iterator M = MethodPool.begin(), 9544 MEnd = MethodPool.end(); 9545 M != MEnd; ++M) { 9546 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first 9547 : &M->second.second; 9548 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 9549 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 9550 continue; 9551 9552 if (AtParameterName) { 9553 // Suggest parameter names we've seen before. 9554 unsigned NumSelIdents = SelIdents.size(); 9555 if (NumSelIdents && 9556 NumSelIdents <= MethList->getMethod()->param_size()) { 9557 ParmVarDecl *Param = 9558 MethList->getMethod()->parameters()[NumSelIdents - 1]; 9559 if (Param->getIdentifier()) { 9560 CodeCompletionBuilder Builder(Results.getAllocator(), 9561 Results.getCodeCompletionTUInfo()); 9562 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 9563 Param->getIdentifier()->getName())); 9564 Results.AddResult(Builder.TakeString()); 9565 } 9566 } 9567 9568 continue; 9569 } 9570 9571 Result R(MethList->getMethod(), 9572 Results.getBasePriority(MethList->getMethod()), nullptr); 9573 R.StartParameter = SelIdents.size(); 9574 R.AllParametersAreInformative = false; 9575 R.DeclaringEntity = true; 9576 Results.MaybeAddResult(R, CurContext); 9577 } 9578 } 9579 9580 Results.ExitScope(); 9581 9582 if (!AtParameterName && !SelIdents.empty() && 9583 SelIdents.front()->getName().startswith("init")) { 9584 for (const auto &M : PP.macros()) { 9585 if (M.first->getName() != "NS_DESIGNATED_INITIALIZER") 9586 continue; 9587 Results.EnterNewScope(); 9588 CodeCompletionBuilder Builder(Results.getAllocator(), 9589 Results.getCodeCompletionTUInfo()); 9590 Builder.AddTypedTextChunk( 9591 Builder.getAllocator().CopyString(M.first->getName())); 9592 Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro, 9593 CXCursor_MacroDefinition)); 9594 Results.ExitScope(); 9595 } 9596 } 9597 9598 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9599 Results.data(), Results.size()); 9600 } 9601 9602 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 9603 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9604 CodeCompleter->getCodeCompletionTUInfo(), 9605 CodeCompletionContext::CCC_PreprocessorDirective); 9606 Results.EnterNewScope(); 9607 9608 // #if <condition> 9609 CodeCompletionBuilder Builder(Results.getAllocator(), 9610 Results.getCodeCompletionTUInfo()); 9611 Builder.AddTypedTextChunk("if"); 9612 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9613 Builder.AddPlaceholderChunk("condition"); 9614 Results.AddResult(Builder.TakeString()); 9615 9616 // #ifdef <macro> 9617 Builder.AddTypedTextChunk("ifdef"); 9618 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9619 Builder.AddPlaceholderChunk("macro"); 9620 Results.AddResult(Builder.TakeString()); 9621 9622 // #ifndef <macro> 9623 Builder.AddTypedTextChunk("ifndef"); 9624 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9625 Builder.AddPlaceholderChunk("macro"); 9626 Results.AddResult(Builder.TakeString()); 9627 9628 if (InConditional) { 9629 // #elif <condition> 9630 Builder.AddTypedTextChunk("elif"); 9631 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9632 Builder.AddPlaceholderChunk("condition"); 9633 Results.AddResult(Builder.TakeString()); 9634 9635 // #elifdef <macro> 9636 Builder.AddTypedTextChunk("elifdef"); 9637 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9638 Builder.AddPlaceholderChunk("macro"); 9639 Results.AddResult(Builder.TakeString()); 9640 9641 // #elifndef <macro> 9642 Builder.AddTypedTextChunk("elifndef"); 9643 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9644 Builder.AddPlaceholderChunk("macro"); 9645 Results.AddResult(Builder.TakeString()); 9646 9647 // #else 9648 Builder.AddTypedTextChunk("else"); 9649 Results.AddResult(Builder.TakeString()); 9650 9651 // #endif 9652 Builder.AddTypedTextChunk("endif"); 9653 Results.AddResult(Builder.TakeString()); 9654 } 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 // #include <header> 9665 Builder.AddTypedTextChunk("include"); 9666 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9667 Builder.AddTextChunk("<"); 9668 Builder.AddPlaceholderChunk("header"); 9669 Builder.AddTextChunk(">"); 9670 Results.AddResult(Builder.TakeString()); 9671 9672 // #define <macro> 9673 Builder.AddTypedTextChunk("define"); 9674 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9675 Builder.AddPlaceholderChunk("macro"); 9676 Results.AddResult(Builder.TakeString()); 9677 9678 // #define <macro>(<args>) 9679 Builder.AddTypedTextChunk("define"); 9680 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9681 Builder.AddPlaceholderChunk("macro"); 9682 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9683 Builder.AddPlaceholderChunk("args"); 9684 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9685 Results.AddResult(Builder.TakeString()); 9686 9687 // #undef <macro> 9688 Builder.AddTypedTextChunk("undef"); 9689 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9690 Builder.AddPlaceholderChunk("macro"); 9691 Results.AddResult(Builder.TakeString()); 9692 9693 // #line <number> 9694 Builder.AddTypedTextChunk("line"); 9695 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9696 Builder.AddPlaceholderChunk("number"); 9697 Results.AddResult(Builder.TakeString()); 9698 9699 // #line <number> "filename" 9700 Builder.AddTypedTextChunk("line"); 9701 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9702 Builder.AddPlaceholderChunk("number"); 9703 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9704 Builder.AddTextChunk("\""); 9705 Builder.AddPlaceholderChunk("filename"); 9706 Builder.AddTextChunk("\""); 9707 Results.AddResult(Builder.TakeString()); 9708 9709 // #error <message> 9710 Builder.AddTypedTextChunk("error"); 9711 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9712 Builder.AddPlaceholderChunk("message"); 9713 Results.AddResult(Builder.TakeString()); 9714 9715 // #pragma <arguments> 9716 Builder.AddTypedTextChunk("pragma"); 9717 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9718 Builder.AddPlaceholderChunk("arguments"); 9719 Results.AddResult(Builder.TakeString()); 9720 9721 if (getLangOpts().ObjC) { 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 // #import <header> 9731 Builder.AddTypedTextChunk("import"); 9732 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9733 Builder.AddTextChunk("<"); 9734 Builder.AddPlaceholderChunk("header"); 9735 Builder.AddTextChunk(">"); 9736 Results.AddResult(Builder.TakeString()); 9737 } 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 // #include_next <header> 9748 Builder.AddTypedTextChunk("include_next"); 9749 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9750 Builder.AddTextChunk("<"); 9751 Builder.AddPlaceholderChunk("header"); 9752 Builder.AddTextChunk(">"); 9753 Results.AddResult(Builder.TakeString()); 9754 9755 // #warning <message> 9756 Builder.AddTypedTextChunk("warning"); 9757 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9758 Builder.AddPlaceholderChunk("message"); 9759 Results.AddResult(Builder.TakeString()); 9760 9761 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 9762 // completions for them. And __include_macros is a Clang-internal extension 9763 // that we don't want to encourage anyone to use. 9764 9765 // FIXME: we don't support #assert or #unassert, so don't suggest them. 9766 Results.ExitScope(); 9767 9768 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9769 Results.data(), Results.size()); 9770 } 9771 9772 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 9773 CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction 9774 : Sema::PCC_Namespace); 9775 } 9776 9777 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 9778 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9779 CodeCompleter->getCodeCompletionTUInfo(), 9780 IsDefinition ? CodeCompletionContext::CCC_MacroName 9781 : CodeCompletionContext::CCC_MacroNameUse); 9782 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 9783 // Add just the names of macros, not their arguments. 9784 CodeCompletionBuilder Builder(Results.getAllocator(), 9785 Results.getCodeCompletionTUInfo()); 9786 Results.EnterNewScope(); 9787 for (Preprocessor::macro_iterator M = PP.macro_begin(), 9788 MEnd = PP.macro_end(); 9789 M != MEnd; ++M) { 9790 Builder.AddTypedTextChunk( 9791 Builder.getAllocator().CopyString(M->first->getName())); 9792 Results.AddResult(CodeCompletionResult( 9793 Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition)); 9794 } 9795 Results.ExitScope(); 9796 } else if (IsDefinition) { 9797 // FIXME: Can we detect when the user just wrote an include guard above? 9798 } 9799 9800 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9801 Results.data(), Results.size()); 9802 } 9803 9804 void Sema::CodeCompletePreprocessorExpression() { 9805 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9806 CodeCompleter->getCodeCompletionTUInfo(), 9807 CodeCompletionContext::CCC_PreprocessorExpression); 9808 9809 if (!CodeCompleter || CodeCompleter->includeMacros()) 9810 AddMacroResults(PP, Results, 9811 !CodeCompleter || CodeCompleter->loadExternal(), true); 9812 9813 // defined (<macro>) 9814 Results.EnterNewScope(); 9815 CodeCompletionBuilder Builder(Results.getAllocator(), 9816 Results.getCodeCompletionTUInfo()); 9817 Builder.AddTypedTextChunk("defined"); 9818 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9819 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9820 Builder.AddPlaceholderChunk("macro"); 9821 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9822 Results.AddResult(Builder.TakeString()); 9823 Results.ExitScope(); 9824 9825 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9826 Results.data(), Results.size()); 9827 } 9828 9829 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 9830 IdentifierInfo *Macro, 9831 MacroInfo *MacroInfo, 9832 unsigned Argument) { 9833 // FIXME: In the future, we could provide "overload" results, much like we 9834 // do for function calls. 9835 9836 // Now just ignore this. There will be another code-completion callback 9837 // for the expanded tokens. 9838 } 9839 9840 // This handles completion inside an #include filename, e.g. #include <foo/ba 9841 // We look for the directory "foo" under each directory on the include path, 9842 // list its files, and reassemble the appropriate #include. 9843 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { 9844 // RelDir should use /, but unescaped \ is possible on windows! 9845 // Our completions will normalize to / for simplicity, this case is rare. 9846 std::string RelDir = llvm::sys::path::convert_to_slash(Dir); 9847 // We need the native slashes for the actual file system interactions. 9848 SmallString<128> NativeRelDir = StringRef(RelDir); 9849 llvm::sys::path::native(NativeRelDir); 9850 llvm::vfs::FileSystem &FS = 9851 getSourceManager().getFileManager().getVirtualFileSystem(); 9852 9853 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9854 CodeCompleter->getCodeCompletionTUInfo(), 9855 CodeCompletionContext::CCC_IncludedFile); 9856 llvm::DenseSet<StringRef> SeenResults; // To deduplicate results. 9857 9858 // Helper: adds one file or directory completion result. 9859 auto AddCompletion = [&](StringRef Filename, bool IsDirectory) { 9860 SmallString<64> TypedChunk = Filename; 9861 // Directory completion is up to the slash, e.g. <sys/ 9862 TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"'); 9863 auto R = SeenResults.insert(TypedChunk); 9864 if (R.second) { // New completion 9865 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk); 9866 *R.first = InternedTyped; // Avoid dangling StringRef. 9867 CodeCompletionBuilder Builder(CodeCompleter->getAllocator(), 9868 CodeCompleter->getCodeCompletionTUInfo()); 9869 Builder.AddTypedTextChunk(InternedTyped); 9870 // The result is a "Pattern", which is pretty opaque. 9871 // We may want to include the real filename to allow smart ranking. 9872 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 9873 } 9874 }; 9875 9876 // Helper: scans IncludeDir for nice files, and adds results for each. 9877 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir, 9878 bool IsSystem, 9879 DirectoryLookup::LookupType_t LookupType) { 9880 llvm::SmallString<128> Dir = IncludeDir; 9881 if (!NativeRelDir.empty()) { 9882 if (LookupType == DirectoryLookup::LT_Framework) { 9883 // For a framework dir, #include <Foo/Bar/> actually maps to 9884 // a path of Foo.framework/Headers/Bar/. 9885 auto Begin = llvm::sys::path::begin(NativeRelDir); 9886 auto End = llvm::sys::path::end(NativeRelDir); 9887 9888 llvm::sys::path::append(Dir, *Begin + ".framework", "Headers"); 9889 llvm::sys::path::append(Dir, ++Begin, End); 9890 } else { 9891 llvm::sys::path::append(Dir, NativeRelDir); 9892 } 9893 } 9894 9895 const StringRef &Dirname = llvm::sys::path::filename(Dir); 9896 const bool isQt = Dirname.startswith("Qt") || Dirname == "ActiveQt"; 9897 const bool ExtensionlessHeaders = 9898 IsSystem || isQt || Dir.endswith(".framework/Headers"); 9899 std::error_code EC; 9900 unsigned Count = 0; 9901 for (auto It = FS.dir_begin(Dir, EC); 9902 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) { 9903 if (++Count == 2500) // If we happen to hit a huge directory, 9904 break; // bail out early so we're not too slow. 9905 StringRef Filename = llvm::sys::path::filename(It->path()); 9906 9907 // To know whether a symlink should be treated as file or a directory, we 9908 // have to stat it. This should be cheap enough as there shouldn't be many 9909 // symlinks. 9910 llvm::sys::fs::file_type Type = It->type(); 9911 if (Type == llvm::sys::fs::file_type::symlink_file) { 9912 if (auto FileStatus = FS.status(It->path())) 9913 Type = FileStatus->getType(); 9914 } 9915 switch (Type) { 9916 case llvm::sys::fs::file_type::directory_file: 9917 // All entries in a framework directory must have a ".framework" suffix, 9918 // but the suffix does not appear in the source code's include/import. 9919 if (LookupType == DirectoryLookup::LT_Framework && 9920 NativeRelDir.empty() && !Filename.consume_back(".framework")) 9921 break; 9922 9923 AddCompletion(Filename, /*IsDirectory=*/true); 9924 break; 9925 case llvm::sys::fs::file_type::regular_file: { 9926 // Only files that really look like headers. (Except in special dirs). 9927 // Header extensions from Types.def, which we can't depend on here. 9928 const bool IsHeader = Filename.endswith_insensitive(".h") || 9929 Filename.endswith_insensitive(".hh") || 9930 Filename.endswith_insensitive(".hpp") || 9931 Filename.endswith_insensitive(".inc") || 9932 (ExtensionlessHeaders && !Filename.contains('.')); 9933 if (!IsHeader) 9934 break; 9935 AddCompletion(Filename, /*IsDirectory=*/false); 9936 break; 9937 } 9938 default: 9939 break; 9940 } 9941 } 9942 }; 9943 9944 // Helper: adds results relative to IncludeDir, if possible. 9945 auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir, 9946 bool IsSystem) { 9947 switch (IncludeDir.getLookupType()) { 9948 case DirectoryLookup::LT_HeaderMap: 9949 // header maps are not (currently) enumerable. 9950 break; 9951 case DirectoryLookup::LT_NormalDir: 9952 AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem, 9953 DirectoryLookup::LT_NormalDir); 9954 break; 9955 case DirectoryLookup::LT_Framework: 9956 AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem, 9957 DirectoryLookup::LT_Framework); 9958 break; 9959 } 9960 }; 9961 9962 // Finally with all our helpers, we can scan the include path. 9963 // Do this in standard order so deduplication keeps the right file. 9964 // (In case we decide to add more details to the results later). 9965 const auto &S = PP.getHeaderSearchInfo(); 9966 using llvm::make_range; 9967 if (!Angled) { 9968 // The current directory is on the include path for "quoted" includes. 9969 auto *CurFile = PP.getCurrentFileLexer()->getFileEntry(); 9970 if (CurFile && CurFile->getDir()) 9971 AddFilesFromIncludeDir(CurFile->getDir()->getName(), false, 9972 DirectoryLookup::LT_NormalDir); 9973 for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end())) 9974 AddFilesFromDirLookup(D, false); 9975 } 9976 for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end())) 9977 AddFilesFromDirLookup(D, false); 9978 for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end())) 9979 AddFilesFromDirLookup(D, true); 9980 9981 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9982 Results.data(), Results.size()); 9983 } 9984 9985 void Sema::CodeCompleteNaturalLanguage() { 9986 HandleCodeCompleteResults(this, CodeCompleter, 9987 CodeCompletionContext::CCC_NaturalLanguage, nullptr, 9988 0); 9989 } 9990 9991 void Sema::CodeCompleteAvailabilityPlatformName() { 9992 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9993 CodeCompleter->getCodeCompletionTUInfo(), 9994 CodeCompletionContext::CCC_Other); 9995 Results.EnterNewScope(); 9996 static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"}; 9997 for (const char *Platform : llvm::makeArrayRef(Platforms)) { 9998 Results.AddResult(CodeCompletionResult(Platform)); 9999 Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString( 10000 Twine(Platform) + "ApplicationExtension"))); 10001 } 10002 Results.ExitScope(); 10003 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 10004 Results.data(), Results.size()); 10005 } 10006 10007 void Sema::GatherGlobalCodeCompletions( 10008 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 10009 SmallVectorImpl<CodeCompletionResult> &Results) { 10010 ResultBuilder Builder(*this, Allocator, CCTUInfo, 10011 CodeCompletionContext::CCC_Recovery); 10012 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 10013 CodeCompletionDeclConsumer Consumer(Builder, 10014 Context.getTranslationUnitDecl()); 10015 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 10016 Consumer, 10017 !CodeCompleter || CodeCompleter->loadExternal()); 10018 } 10019 10020 if (!CodeCompleter || CodeCompleter->includeMacros()) 10021 AddMacroResults(PP, Builder, 10022 !CodeCompleter || CodeCompleter->loadExternal(), true); 10023 10024 Results.clear(); 10025 Results.insert(Results.end(), Builder.data(), 10026 Builder.data() + Builder.size()); 10027 } 10028