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 0; 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, const ParmVarDecl *Param, 2821 bool SuppressName = false, bool SuppressBlock = false, 2822 Optional<ArrayRef<QualType>> ObjCSubsts = None) { 2823 // Params are unavailable in FunctionTypeLoc if the FunctionType is invalid. 2824 // It would be better to pass in the param Type, which is usually available. 2825 // But this case is rare, so just pretend we fell back to int as elsewhere. 2826 if (!Param) 2827 return "int"; 2828 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->getDeclContext()); 2829 if (Param->getType()->isDependentType() || 2830 !Param->getType()->isBlockPointerType()) { 2831 // The argument for a dependent or non-block parameter is a placeholder 2832 // containing that parameter's type. 2833 std::string Result; 2834 2835 if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName) 2836 Result = std::string(Param->getIdentifier()->getName()); 2837 2838 QualType Type = Param->getType(); 2839 if (ObjCSubsts) 2840 Type = Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts, 2841 ObjCSubstitutionContext::Parameter); 2842 if (ObjCMethodParam) { 2843 Result = 2844 "(" + formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type); 2845 Result += Type.getAsString(Policy) + ")"; 2846 if (Param->getIdentifier() && !SuppressName) 2847 Result += Param->getIdentifier()->getName(); 2848 } else { 2849 Type.getAsStringInternal(Result, Policy); 2850 } 2851 return Result; 2852 } 2853 2854 // The argument for a block pointer parameter is a block literal with 2855 // the appropriate type. 2856 FunctionTypeLoc Block; 2857 FunctionProtoTypeLoc BlockProto; 2858 findTypeLocationForBlockDecl(Param->getTypeSourceInfo(), Block, BlockProto, 2859 SuppressBlock); 2860 // Try to retrieve the block type information from the property if this is a 2861 // parameter in a setter. 2862 if (!Block && ObjCMethodParam && 2863 cast<ObjCMethodDecl>(Param->getDeclContext())->isPropertyAccessor()) { 2864 if (const auto *PD = cast<ObjCMethodDecl>(Param->getDeclContext()) 2865 ->findPropertyDecl(/*CheckOverrides=*/false)) 2866 findTypeLocationForBlockDecl(PD->getTypeSourceInfo(), Block, BlockProto, 2867 SuppressBlock); 2868 } 2869 2870 if (!Block) { 2871 // We were unable to find a FunctionProtoTypeLoc with parameter names 2872 // for the block; just use the parameter type as a placeholder. 2873 std::string Result; 2874 if (!ObjCMethodParam && Param->getIdentifier()) 2875 Result = std::string(Param->getIdentifier()->getName()); 2876 2877 QualType Type = Param->getType().getUnqualifiedType(); 2878 2879 if (ObjCMethodParam) { 2880 Result = Type.getAsString(Policy); 2881 std::string Quals = 2882 formatObjCParamQualifiers(Param->getObjCDeclQualifier(), Type); 2883 if (!Quals.empty()) 2884 Result = "(" + Quals + " " + Result + ")"; 2885 if (Result.back() != ')') 2886 Result += " "; 2887 if (Param->getIdentifier()) 2888 Result += Param->getIdentifier()->getName(); 2889 } else { 2890 Type.getAsStringInternal(Result, Policy); 2891 } 2892 2893 return Result; 2894 } 2895 2896 // We have the function prototype behind the block pointer type, as it was 2897 // written in the source. 2898 return formatBlockPlaceholder(Policy, Param, Block, BlockProto, 2899 /*SuppressBlockName=*/false, SuppressBlock, 2900 ObjCSubsts); 2901 } 2902 2903 /// Returns a placeholder string that corresponds to an Objective-C block 2904 /// declaration. 2905 /// 2906 /// \param BlockDecl A declaration with an Objective-C block type. 2907 /// 2908 /// \param Block The most relevant type location for that block type. 2909 /// 2910 /// \param SuppressBlockName Determines whether or not the name of the block 2911 /// declaration is included in the resulting string. 2912 static std::string 2913 formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl, 2914 FunctionTypeLoc &Block, FunctionProtoTypeLoc &BlockProto, 2915 bool SuppressBlockName, bool SuppressBlock, 2916 Optional<ArrayRef<QualType>> ObjCSubsts) { 2917 std::string Result; 2918 QualType ResultType = Block.getTypePtr()->getReturnType(); 2919 if (ObjCSubsts) 2920 ResultType = 2921 ResultType.substObjCTypeArgs(BlockDecl->getASTContext(), *ObjCSubsts, 2922 ObjCSubstitutionContext::Result); 2923 if (!ResultType->isVoidType() || SuppressBlock) 2924 ResultType.getAsStringInternal(Result, Policy); 2925 2926 // Format the parameter list. 2927 std::string Params; 2928 if (!BlockProto || Block.getNumParams() == 0) { 2929 if (BlockProto && BlockProto.getTypePtr()->isVariadic()) 2930 Params = "(...)"; 2931 else 2932 Params = "(void)"; 2933 } else { 2934 Params += "("; 2935 for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) { 2936 if (I) 2937 Params += ", "; 2938 Params += FormatFunctionParameter(Policy, Block.getParam(I), 2939 /*SuppressName=*/false, 2940 /*SuppressBlock=*/true, ObjCSubsts); 2941 2942 if (I == N - 1 && BlockProto.getTypePtr()->isVariadic()) 2943 Params += ", ..."; 2944 } 2945 Params += ")"; 2946 } 2947 2948 if (SuppressBlock) { 2949 // Format as a parameter. 2950 Result = Result + " (^"; 2951 if (!SuppressBlockName && BlockDecl->getIdentifier()) 2952 Result += BlockDecl->getIdentifier()->getName(); 2953 Result += ")"; 2954 Result += Params; 2955 } else { 2956 // Format as a block literal argument. 2957 Result = '^' + Result; 2958 Result += Params; 2959 2960 if (!SuppressBlockName && BlockDecl->getIdentifier()) 2961 Result += BlockDecl->getIdentifier()->getName(); 2962 } 2963 2964 return Result; 2965 } 2966 2967 static std::string GetDefaultValueString(const ParmVarDecl *Param, 2968 const SourceManager &SM, 2969 const LangOptions &LangOpts) { 2970 const SourceRange SrcRange = Param->getDefaultArgRange(); 2971 CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange); 2972 bool Invalid = CharSrcRange.isInvalid(); 2973 if (Invalid) 2974 return ""; 2975 StringRef srcText = 2976 Lexer::getSourceText(CharSrcRange, SM, LangOpts, &Invalid); 2977 if (Invalid) 2978 return ""; 2979 2980 if (srcText.empty() || srcText == "=") { 2981 // Lexer can't determine the value. 2982 // This happens if the code is incorrect (for example class is forward 2983 // declared). 2984 return ""; 2985 } 2986 std::string DefValue(srcText.str()); 2987 // FIXME: remove this check if the Lexer::getSourceText value is fixed and 2988 // this value always has (or always does not have) '=' in front of it 2989 if (DefValue.at(0) != '=') { 2990 // If we don't have '=' in front of value. 2991 // Lexer returns built-in types values without '=' and user-defined types 2992 // values with it. 2993 return " = " + DefValue; 2994 } 2995 return " " + DefValue; 2996 } 2997 2998 /// Add function parameter chunks to the given code completion string. 2999 static void AddFunctionParameterChunks(Preprocessor &PP, 3000 const PrintingPolicy &Policy, 3001 const FunctionDecl *Function, 3002 CodeCompletionBuilder &Result, 3003 unsigned Start = 0, 3004 bool InOptional = false) { 3005 bool FirstParameter = true; 3006 3007 for (unsigned P = Start, N = Function->getNumParams(); P != N; ++P) { 3008 const ParmVarDecl *Param = Function->getParamDecl(P); 3009 3010 if (Param->hasDefaultArg() && !InOptional) { 3011 // When we see an optional default argument, put that argument and 3012 // the remaining default arguments into a new, optional string. 3013 CodeCompletionBuilder Opt(Result.getAllocator(), 3014 Result.getCodeCompletionTUInfo()); 3015 if (!FirstParameter) 3016 Opt.AddChunk(CodeCompletionString::CK_Comma); 3017 AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true); 3018 Result.AddOptionalChunk(Opt.TakeString()); 3019 break; 3020 } 3021 3022 if (FirstParameter) 3023 FirstParameter = false; 3024 else 3025 Result.AddChunk(CodeCompletionString::CK_Comma); 3026 3027 InOptional = false; 3028 3029 // Format the placeholder string. 3030 std::string PlaceholderStr = FormatFunctionParameter(Policy, Param); 3031 if (Param->hasDefaultArg()) 3032 PlaceholderStr += 3033 GetDefaultValueString(Param, PP.getSourceManager(), PP.getLangOpts()); 3034 3035 if (Function->isVariadic() && P == N - 1) 3036 PlaceholderStr += ", ..."; 3037 3038 // Add the placeholder string. 3039 Result.AddPlaceholderChunk( 3040 Result.getAllocator().CopyString(PlaceholderStr)); 3041 } 3042 3043 if (const auto *Proto = Function->getType()->getAs<FunctionProtoType>()) 3044 if (Proto->isVariadic()) { 3045 if (Proto->getNumParams() == 0) 3046 Result.AddPlaceholderChunk("..."); 3047 3048 MaybeAddSentinel(PP, Function, Result); 3049 } 3050 } 3051 3052 /// Add template parameter chunks to the given code completion string. 3053 static void AddTemplateParameterChunks( 3054 ASTContext &Context, const PrintingPolicy &Policy, 3055 const TemplateDecl *Template, CodeCompletionBuilder &Result, 3056 unsigned MaxParameters = 0, unsigned Start = 0, bool InDefaultArg = false) { 3057 bool FirstParameter = true; 3058 3059 // Prefer to take the template parameter names from the first declaration of 3060 // the template. 3061 Template = cast<TemplateDecl>(Template->getCanonicalDecl()); 3062 3063 TemplateParameterList *Params = Template->getTemplateParameters(); 3064 TemplateParameterList::iterator PEnd = Params->end(); 3065 if (MaxParameters) 3066 PEnd = Params->begin() + MaxParameters; 3067 for (TemplateParameterList::iterator P = Params->begin() + Start; P != PEnd; 3068 ++P) { 3069 bool HasDefaultArg = false; 3070 std::string PlaceholderStr; 3071 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 3072 if (TTP->wasDeclaredWithTypename()) 3073 PlaceholderStr = "typename"; 3074 else if (const auto *TC = TTP->getTypeConstraint()) { 3075 llvm::raw_string_ostream OS(PlaceholderStr); 3076 TC->print(OS, Policy); 3077 OS.flush(); 3078 } else 3079 PlaceholderStr = "class"; 3080 3081 if (TTP->getIdentifier()) { 3082 PlaceholderStr += ' '; 3083 PlaceholderStr += TTP->getIdentifier()->getName(); 3084 } 3085 3086 HasDefaultArg = TTP->hasDefaultArgument(); 3087 } else if (NonTypeTemplateParmDecl *NTTP = 3088 dyn_cast<NonTypeTemplateParmDecl>(*P)) { 3089 if (NTTP->getIdentifier()) 3090 PlaceholderStr = std::string(NTTP->getIdentifier()->getName()); 3091 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy); 3092 HasDefaultArg = NTTP->hasDefaultArgument(); 3093 } else { 3094 assert(isa<TemplateTemplateParmDecl>(*P)); 3095 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 3096 3097 // Since putting the template argument list into the placeholder would 3098 // be very, very long, we just use an abbreviation. 3099 PlaceholderStr = "template<...> class"; 3100 if (TTP->getIdentifier()) { 3101 PlaceholderStr += ' '; 3102 PlaceholderStr += TTP->getIdentifier()->getName(); 3103 } 3104 3105 HasDefaultArg = TTP->hasDefaultArgument(); 3106 } 3107 3108 if (HasDefaultArg && !InDefaultArg) { 3109 // When we see an optional default argument, put that argument and 3110 // the remaining default arguments into a new, optional string. 3111 CodeCompletionBuilder Opt(Result.getAllocator(), 3112 Result.getCodeCompletionTUInfo()); 3113 if (!FirstParameter) 3114 Opt.AddChunk(CodeCompletionString::CK_Comma); 3115 AddTemplateParameterChunks(Context, Policy, Template, Opt, MaxParameters, 3116 P - Params->begin(), true); 3117 Result.AddOptionalChunk(Opt.TakeString()); 3118 break; 3119 } 3120 3121 InDefaultArg = false; 3122 3123 if (FirstParameter) 3124 FirstParameter = false; 3125 else 3126 Result.AddChunk(CodeCompletionString::CK_Comma); 3127 3128 // Add the placeholder string. 3129 Result.AddPlaceholderChunk( 3130 Result.getAllocator().CopyString(PlaceholderStr)); 3131 } 3132 } 3133 3134 /// Add a qualifier to the given code-completion string, if the 3135 /// provided nested-name-specifier is non-NULL. 3136 static void AddQualifierToCompletionString(CodeCompletionBuilder &Result, 3137 NestedNameSpecifier *Qualifier, 3138 bool QualifierIsInformative, 3139 ASTContext &Context, 3140 const PrintingPolicy &Policy) { 3141 if (!Qualifier) 3142 return; 3143 3144 std::string PrintedNNS; 3145 { 3146 llvm::raw_string_ostream OS(PrintedNNS); 3147 Qualifier->print(OS, Policy); 3148 } 3149 if (QualifierIsInformative) 3150 Result.AddInformativeChunk(Result.getAllocator().CopyString(PrintedNNS)); 3151 else 3152 Result.AddTextChunk(Result.getAllocator().CopyString(PrintedNNS)); 3153 } 3154 3155 static void 3156 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, 3157 const FunctionDecl *Function) { 3158 const auto *Proto = Function->getType()->getAs<FunctionProtoType>(); 3159 if (!Proto || !Proto->getMethodQuals()) 3160 return; 3161 3162 // FIXME: Add ref-qualifier! 3163 3164 // Handle single qualifiers without copying 3165 if (Proto->getMethodQuals().hasOnlyConst()) { 3166 Result.AddInformativeChunk(" const"); 3167 return; 3168 } 3169 3170 if (Proto->getMethodQuals().hasOnlyVolatile()) { 3171 Result.AddInformativeChunk(" volatile"); 3172 return; 3173 } 3174 3175 if (Proto->getMethodQuals().hasOnlyRestrict()) { 3176 Result.AddInformativeChunk(" restrict"); 3177 return; 3178 } 3179 3180 // Handle multiple qualifiers. 3181 std::string QualsStr; 3182 if (Proto->isConst()) 3183 QualsStr += " const"; 3184 if (Proto->isVolatile()) 3185 QualsStr += " volatile"; 3186 if (Proto->isRestrict()) 3187 QualsStr += " restrict"; 3188 Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); 3189 } 3190 3191 /// Add the name of the given declaration 3192 static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, 3193 const NamedDecl *ND, 3194 CodeCompletionBuilder &Result) { 3195 DeclarationName Name = ND->getDeclName(); 3196 if (!Name) 3197 return; 3198 3199 switch (Name.getNameKind()) { 3200 case DeclarationName::CXXOperatorName: { 3201 const char *OperatorName = nullptr; 3202 switch (Name.getCXXOverloadedOperator()) { 3203 case OO_None: 3204 case OO_Conditional: 3205 case NUM_OVERLOADED_OPERATORS: 3206 OperatorName = "operator"; 3207 break; 3208 3209 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 3210 case OO_##Name: \ 3211 OperatorName = "operator" Spelling; \ 3212 break; 3213 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly) 3214 #include "clang/Basic/OperatorKinds.def" 3215 3216 case OO_New: 3217 OperatorName = "operator new"; 3218 break; 3219 case OO_Delete: 3220 OperatorName = "operator delete"; 3221 break; 3222 case OO_Array_New: 3223 OperatorName = "operator new[]"; 3224 break; 3225 case OO_Array_Delete: 3226 OperatorName = "operator delete[]"; 3227 break; 3228 case OO_Call: 3229 OperatorName = "operator()"; 3230 break; 3231 case OO_Subscript: 3232 OperatorName = "operator[]"; 3233 break; 3234 } 3235 Result.AddTypedTextChunk(OperatorName); 3236 break; 3237 } 3238 3239 case DeclarationName::Identifier: 3240 case DeclarationName::CXXConversionFunctionName: 3241 case DeclarationName::CXXDestructorName: 3242 case DeclarationName::CXXLiteralOperatorName: 3243 Result.AddTypedTextChunk( 3244 Result.getAllocator().CopyString(ND->getNameAsString())); 3245 break; 3246 3247 case DeclarationName::CXXDeductionGuideName: 3248 case DeclarationName::CXXUsingDirective: 3249 case DeclarationName::ObjCZeroArgSelector: 3250 case DeclarationName::ObjCOneArgSelector: 3251 case DeclarationName::ObjCMultiArgSelector: 3252 break; 3253 3254 case DeclarationName::CXXConstructorName: { 3255 CXXRecordDecl *Record = nullptr; 3256 QualType Ty = Name.getCXXNameType(); 3257 if (const auto *RecordTy = Ty->getAs<RecordType>()) 3258 Record = cast<CXXRecordDecl>(RecordTy->getDecl()); 3259 else if (const auto *InjectedTy = Ty->getAs<InjectedClassNameType>()) 3260 Record = InjectedTy->getDecl(); 3261 else { 3262 Result.AddTypedTextChunk( 3263 Result.getAllocator().CopyString(ND->getNameAsString())); 3264 break; 3265 } 3266 3267 Result.AddTypedTextChunk( 3268 Result.getAllocator().CopyString(Record->getNameAsString())); 3269 if (ClassTemplateDecl *Template = Record->getDescribedClassTemplate()) { 3270 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 3271 AddTemplateParameterChunks(Context, Policy, Template, Result); 3272 Result.AddChunk(CodeCompletionString::CK_RightAngle); 3273 } 3274 break; 3275 } 3276 } 3277 } 3278 3279 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString( 3280 Sema &S, const CodeCompletionContext &CCContext, 3281 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 3282 bool IncludeBriefComments) { 3283 return CreateCodeCompletionString(S.Context, S.PP, CCContext, Allocator, 3284 CCTUInfo, IncludeBriefComments); 3285 } 3286 3287 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionStringForMacro( 3288 Preprocessor &PP, CodeCompletionAllocator &Allocator, 3289 CodeCompletionTUInfo &CCTUInfo) { 3290 assert(Kind == RK_Macro); 3291 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 3292 const MacroInfo *MI = PP.getMacroInfo(Macro); 3293 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Macro->getName())); 3294 3295 if (!MI || !MI->isFunctionLike()) 3296 return Result.TakeString(); 3297 3298 // Format a function-like macro with placeholders for the arguments. 3299 Result.AddChunk(CodeCompletionString::CK_LeftParen); 3300 MacroInfo::param_iterator A = MI->param_begin(), AEnd = MI->param_end(); 3301 3302 // C99 variadic macros add __VA_ARGS__ at the end. Skip it. 3303 if (MI->isC99Varargs()) { 3304 --AEnd; 3305 3306 if (A == AEnd) { 3307 Result.AddPlaceholderChunk("..."); 3308 } 3309 } 3310 3311 for (MacroInfo::param_iterator A = MI->param_begin(); A != AEnd; ++A) { 3312 if (A != MI->param_begin()) 3313 Result.AddChunk(CodeCompletionString::CK_Comma); 3314 3315 if (MI->isVariadic() && (A + 1) == AEnd) { 3316 SmallString<32> Arg = (*A)->getName(); 3317 if (MI->isC99Varargs()) 3318 Arg += ", ..."; 3319 else 3320 Arg += "..."; 3321 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 3322 break; 3323 } 3324 3325 // Non-variadic macros are simple. 3326 Result.AddPlaceholderChunk( 3327 Result.getAllocator().CopyString((*A)->getName())); 3328 } 3329 Result.AddChunk(CodeCompletionString::CK_RightParen); 3330 return Result.TakeString(); 3331 } 3332 3333 /// If possible, create a new code completion string for the given 3334 /// result. 3335 /// 3336 /// \returns Either a new, heap-allocated code completion string describing 3337 /// how to use this result, or NULL to indicate that the string or name of the 3338 /// result is all that is needed. 3339 CodeCompletionString *CodeCompletionResult::CreateCodeCompletionString( 3340 ASTContext &Ctx, Preprocessor &PP, const CodeCompletionContext &CCContext, 3341 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 3342 bool IncludeBriefComments) { 3343 if (Kind == RK_Macro) 3344 return CreateCodeCompletionStringForMacro(PP, Allocator, CCTUInfo); 3345 3346 CodeCompletionBuilder Result(Allocator, CCTUInfo, Priority, Availability); 3347 3348 PrintingPolicy Policy = getCompletionPrintingPolicy(Ctx, PP); 3349 if (Kind == RK_Pattern) { 3350 Pattern->Priority = Priority; 3351 Pattern->Availability = Availability; 3352 3353 if (Declaration) { 3354 Result.addParentContext(Declaration->getDeclContext()); 3355 Pattern->ParentName = Result.getParentName(); 3356 if (const RawComment *RC = 3357 getPatternCompletionComment(Ctx, Declaration)) { 3358 Result.addBriefComment(RC->getBriefText(Ctx)); 3359 Pattern->BriefComment = Result.getBriefComment(); 3360 } 3361 } 3362 3363 return Pattern; 3364 } 3365 3366 if (Kind == RK_Keyword) { 3367 Result.AddTypedTextChunk(Keyword); 3368 return Result.TakeString(); 3369 } 3370 assert(Kind == RK_Declaration && "Missed a result kind?"); 3371 return createCodeCompletionStringForDecl( 3372 PP, Ctx, Result, IncludeBriefComments, CCContext, Policy); 3373 } 3374 3375 static void printOverrideString(const CodeCompletionString &CCS, 3376 std::string &BeforeName, 3377 std::string &NameAndSignature) { 3378 bool SeenTypedChunk = false; 3379 for (auto &Chunk : CCS) { 3380 if (Chunk.Kind == CodeCompletionString::CK_Optional) { 3381 assert(SeenTypedChunk && "optional parameter before name"); 3382 // Note that we put all chunks inside into NameAndSignature. 3383 printOverrideString(*Chunk.Optional, NameAndSignature, NameAndSignature); 3384 continue; 3385 } 3386 SeenTypedChunk |= Chunk.Kind == CodeCompletionString::CK_TypedText; 3387 if (SeenTypedChunk) 3388 NameAndSignature += Chunk.Text; 3389 else 3390 BeforeName += Chunk.Text; 3391 } 3392 } 3393 3394 CodeCompletionString * 3395 CodeCompletionResult::createCodeCompletionStringForOverride( 3396 Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result, 3397 bool IncludeBriefComments, const CodeCompletionContext &CCContext, 3398 PrintingPolicy &Policy) { 3399 auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result, 3400 /*IncludeBriefComments=*/false, 3401 CCContext, Policy); 3402 std::string BeforeName; 3403 std::string NameAndSignature; 3404 // For overrides all chunks go into the result, none are informative. 3405 printOverrideString(*CCS, BeforeName, NameAndSignature); 3406 NameAndSignature += " override"; 3407 3408 Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName)); 3409 Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3410 Result.AddTypedTextChunk(Result.getAllocator().CopyString(NameAndSignature)); 3411 return Result.TakeString(); 3412 } 3413 3414 // FIXME: Right now this works well with lambdas. Add support for other functor 3415 // types like std::function. 3416 static const NamedDecl *extractFunctorCallOperator(const NamedDecl *ND) { 3417 const auto *VD = dyn_cast<VarDecl>(ND); 3418 if (!VD) 3419 return nullptr; 3420 const auto *RecordDecl = VD->getType()->getAsCXXRecordDecl(); 3421 if (!RecordDecl || !RecordDecl->isLambda()) 3422 return nullptr; 3423 return RecordDecl->getLambdaCallOperator(); 3424 } 3425 3426 CodeCompletionString *CodeCompletionResult::createCodeCompletionStringForDecl( 3427 Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result, 3428 bool IncludeBriefComments, const CodeCompletionContext &CCContext, 3429 PrintingPolicy &Policy) { 3430 const NamedDecl *ND = Declaration; 3431 Result.addParentContext(ND->getDeclContext()); 3432 3433 if (IncludeBriefComments) { 3434 // Add documentation comment, if it exists. 3435 if (const RawComment *RC = getCompletionComment(Ctx, Declaration)) { 3436 Result.addBriefComment(RC->getBriefText(Ctx)); 3437 } 3438 } 3439 3440 if (StartsNestedNameSpecifier) { 3441 Result.AddTypedTextChunk( 3442 Result.getAllocator().CopyString(ND->getNameAsString())); 3443 Result.AddTextChunk("::"); 3444 return Result.TakeString(); 3445 } 3446 3447 for (const auto *I : ND->specific_attrs<AnnotateAttr>()) 3448 Result.AddAnnotation(Result.getAllocator().CopyString(I->getAnnotation())); 3449 3450 auto AddFunctionTypeAndResult = [&](const FunctionDecl *Function) { 3451 AddResultTypeChunk(Ctx, Policy, Function, CCContext.getBaseType(), Result); 3452 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 3453 Ctx, Policy); 3454 AddTypedNameChunk(Ctx, Policy, ND, Result); 3455 Result.AddChunk(CodeCompletionString::CK_LeftParen); 3456 AddFunctionParameterChunks(PP, Policy, Function, Result); 3457 Result.AddChunk(CodeCompletionString::CK_RightParen); 3458 AddFunctionTypeQualsToCompletionString(Result, Function); 3459 }; 3460 3461 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) { 3462 AddFunctionTypeAndResult(Function); 3463 return Result.TakeString(); 3464 } 3465 3466 if (const auto *CallOperator = 3467 dyn_cast_or_null<FunctionDecl>(extractFunctorCallOperator(ND))) { 3468 AddFunctionTypeAndResult(CallOperator); 3469 return Result.TakeString(); 3470 } 3471 3472 AddResultTypeChunk(Ctx, Policy, ND, CCContext.getBaseType(), Result); 3473 3474 if (const FunctionTemplateDecl *FunTmpl = 3475 dyn_cast<FunctionTemplateDecl>(ND)) { 3476 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 3477 Ctx, Policy); 3478 FunctionDecl *Function = FunTmpl->getTemplatedDecl(); 3479 AddTypedNameChunk(Ctx, Policy, Function, Result); 3480 3481 // Figure out which template parameters are deduced (or have default 3482 // arguments). 3483 llvm::SmallBitVector Deduced; 3484 Sema::MarkDeducedTemplateParameters(Ctx, FunTmpl, Deduced); 3485 unsigned LastDeducibleArgument; 3486 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0; 3487 --LastDeducibleArgument) { 3488 if (!Deduced[LastDeducibleArgument - 1]) { 3489 // C++0x: Figure out if the template argument has a default. If so, 3490 // the user doesn't need to type this argument. 3491 // FIXME: We need to abstract template parameters better! 3492 bool HasDefaultArg = false; 3493 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam( 3494 LastDeducibleArgument - 1); 3495 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 3496 HasDefaultArg = TTP->hasDefaultArgument(); 3497 else if (NonTypeTemplateParmDecl *NTTP = 3498 dyn_cast<NonTypeTemplateParmDecl>(Param)) 3499 HasDefaultArg = NTTP->hasDefaultArgument(); 3500 else { 3501 assert(isa<TemplateTemplateParmDecl>(Param)); 3502 HasDefaultArg = 3503 cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument(); 3504 } 3505 3506 if (!HasDefaultArg) 3507 break; 3508 } 3509 } 3510 3511 if (LastDeducibleArgument) { 3512 // Some of the function template arguments cannot be deduced from a 3513 // function call, so we introduce an explicit template argument list 3514 // containing all of the arguments up to the first deducible argument. 3515 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 3516 AddTemplateParameterChunks(Ctx, Policy, FunTmpl, Result, 3517 LastDeducibleArgument); 3518 Result.AddChunk(CodeCompletionString::CK_RightAngle); 3519 } 3520 3521 // Add the function parameters 3522 Result.AddChunk(CodeCompletionString::CK_LeftParen); 3523 AddFunctionParameterChunks(PP, Policy, Function, Result); 3524 Result.AddChunk(CodeCompletionString::CK_RightParen); 3525 AddFunctionTypeQualsToCompletionString(Result, Function); 3526 return Result.TakeString(); 3527 } 3528 3529 if (const auto *Template = dyn_cast<TemplateDecl>(ND)) { 3530 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 3531 Ctx, Policy); 3532 Result.AddTypedTextChunk( 3533 Result.getAllocator().CopyString(Template->getNameAsString())); 3534 Result.AddChunk(CodeCompletionString::CK_LeftAngle); 3535 AddTemplateParameterChunks(Ctx, Policy, Template, Result); 3536 Result.AddChunk(CodeCompletionString::CK_RightAngle); 3537 return Result.TakeString(); 3538 } 3539 3540 if (const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) { 3541 Selector Sel = Method->getSelector(); 3542 if (Sel.isUnarySelector()) { 3543 Result.AddTypedTextChunk( 3544 Result.getAllocator().CopyString(Sel.getNameForSlot(0))); 3545 return Result.TakeString(); 3546 } 3547 3548 std::string SelName = Sel.getNameForSlot(0).str(); 3549 SelName += ':'; 3550 if (StartParameter == 0) 3551 Result.AddTypedTextChunk(Result.getAllocator().CopyString(SelName)); 3552 else { 3553 Result.AddInformativeChunk(Result.getAllocator().CopyString(SelName)); 3554 3555 // If there is only one parameter, and we're past it, add an empty 3556 // typed-text chunk since there is nothing to type. 3557 if (Method->param_size() == 1) 3558 Result.AddTypedTextChunk(""); 3559 } 3560 unsigned Idx = 0; 3561 // The extra Idx < Sel.getNumArgs() check is needed due to legacy C-style 3562 // method parameters. 3563 for (ObjCMethodDecl::param_const_iterator P = Method->param_begin(), 3564 PEnd = Method->param_end(); 3565 P != PEnd && Idx < Sel.getNumArgs(); (void)++P, ++Idx) { 3566 if (Idx > 0) { 3567 std::string Keyword; 3568 if (Idx > StartParameter) 3569 Result.AddChunk(CodeCompletionString::CK_HorizontalSpace); 3570 if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(Idx)) 3571 Keyword += II->getName(); 3572 Keyword += ":"; 3573 if (Idx < StartParameter || AllParametersAreInformative) 3574 Result.AddInformativeChunk(Result.getAllocator().CopyString(Keyword)); 3575 else 3576 Result.AddTypedTextChunk(Result.getAllocator().CopyString(Keyword)); 3577 } 3578 3579 // If we're before the starting parameter, skip the placeholder. 3580 if (Idx < StartParameter) 3581 continue; 3582 3583 std::string Arg; 3584 QualType ParamType = (*P)->getType(); 3585 Optional<ArrayRef<QualType>> ObjCSubsts; 3586 if (!CCContext.getBaseType().isNull()) 3587 ObjCSubsts = CCContext.getBaseType()->getObjCSubstitutions(Method); 3588 3589 if (ParamType->isBlockPointerType() && !DeclaringEntity) 3590 Arg = FormatFunctionParameter(Policy, *P, true, 3591 /*SuppressBlock=*/false, ObjCSubsts); 3592 else { 3593 if (ObjCSubsts) 3594 ParamType = ParamType.substObjCTypeArgs( 3595 Ctx, *ObjCSubsts, ObjCSubstitutionContext::Parameter); 3596 Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier(), 3597 ParamType); 3598 Arg += ParamType.getAsString(Policy) + ")"; 3599 if (IdentifierInfo *II = (*P)->getIdentifier()) 3600 if (DeclaringEntity || AllParametersAreInformative) 3601 Arg += II->getName(); 3602 } 3603 3604 if (Method->isVariadic() && (P + 1) == PEnd) 3605 Arg += ", ..."; 3606 3607 if (DeclaringEntity) 3608 Result.AddTextChunk(Result.getAllocator().CopyString(Arg)); 3609 else if (AllParametersAreInformative) 3610 Result.AddInformativeChunk(Result.getAllocator().CopyString(Arg)); 3611 else 3612 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Arg)); 3613 } 3614 3615 if (Method->isVariadic()) { 3616 if (Method->param_size() == 0) { 3617 if (DeclaringEntity) 3618 Result.AddTextChunk(", ..."); 3619 else if (AllParametersAreInformative) 3620 Result.AddInformativeChunk(", ..."); 3621 else 3622 Result.AddPlaceholderChunk(", ..."); 3623 } 3624 3625 MaybeAddSentinel(PP, Method, Result); 3626 } 3627 3628 return Result.TakeString(); 3629 } 3630 3631 if (Qualifier) 3632 AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, 3633 Ctx, Policy); 3634 3635 Result.AddTypedTextChunk( 3636 Result.getAllocator().CopyString(ND->getNameAsString())); 3637 return Result.TakeString(); 3638 } 3639 3640 const RawComment *clang::getCompletionComment(const ASTContext &Ctx, 3641 const NamedDecl *ND) { 3642 if (!ND) 3643 return nullptr; 3644 if (auto *RC = Ctx.getRawCommentForAnyRedecl(ND)) 3645 return RC; 3646 3647 // Try to find comment from a property for ObjC methods. 3648 const auto *M = dyn_cast<ObjCMethodDecl>(ND); 3649 if (!M) 3650 return nullptr; 3651 const ObjCPropertyDecl *PDecl = M->findPropertyDecl(); 3652 if (!PDecl) 3653 return nullptr; 3654 3655 return Ctx.getRawCommentForAnyRedecl(PDecl); 3656 } 3657 3658 const RawComment *clang::getPatternCompletionComment(const ASTContext &Ctx, 3659 const NamedDecl *ND) { 3660 const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND); 3661 if (!M || !M->isPropertyAccessor()) 3662 return nullptr; 3663 3664 // Provide code completion comment for self.GetterName where 3665 // GetterName is the getter method for a property with name 3666 // different from the property name (declared via a property 3667 // getter attribute. 3668 const ObjCPropertyDecl *PDecl = M->findPropertyDecl(); 3669 if (!PDecl) 3670 return nullptr; 3671 if (PDecl->getGetterName() == M->getSelector() && 3672 PDecl->getIdentifier() != M->getIdentifier()) { 3673 if (auto *RC = Ctx.getRawCommentForAnyRedecl(M)) 3674 return RC; 3675 if (auto *RC = Ctx.getRawCommentForAnyRedecl(PDecl)) 3676 return RC; 3677 } 3678 return nullptr; 3679 } 3680 3681 const RawComment *clang::getParameterComment( 3682 const ASTContext &Ctx, 3683 const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex) { 3684 auto FDecl = Result.getFunction(); 3685 if (!FDecl) 3686 return nullptr; 3687 if (ArgIndex < FDecl->getNumParams()) 3688 return Ctx.getRawCommentForAnyRedecl(FDecl->getParamDecl(ArgIndex)); 3689 return nullptr; 3690 } 3691 3692 /// Add function overload parameter chunks to the given code completion 3693 /// string. 3694 static void AddOverloadParameterChunks(ASTContext &Context, 3695 const PrintingPolicy &Policy, 3696 const FunctionDecl *Function, 3697 const FunctionProtoType *Prototype, 3698 CodeCompletionBuilder &Result, 3699 unsigned CurrentArg, unsigned Start = 0, 3700 bool InOptional = false) { 3701 bool FirstParameter = true; 3702 unsigned NumParams = 3703 Function ? Function->getNumParams() : Prototype->getNumParams(); 3704 3705 for (unsigned P = Start; P != NumParams; ++P) { 3706 if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) { 3707 // When we see an optional default argument, put that argument and 3708 // the remaining default arguments into a new, optional string. 3709 CodeCompletionBuilder Opt(Result.getAllocator(), 3710 Result.getCodeCompletionTUInfo()); 3711 if (!FirstParameter) 3712 Opt.AddChunk(CodeCompletionString::CK_Comma); 3713 // Optional sections are nested. 3714 AddOverloadParameterChunks(Context, Policy, Function, Prototype, Opt, 3715 CurrentArg, P, /*InOptional=*/true); 3716 Result.AddOptionalChunk(Opt.TakeString()); 3717 return; 3718 } 3719 3720 if (FirstParameter) 3721 FirstParameter = false; 3722 else 3723 Result.AddChunk(CodeCompletionString::CK_Comma); 3724 3725 InOptional = false; 3726 3727 // Format the placeholder string. 3728 std::string Placeholder; 3729 if (Function) { 3730 const ParmVarDecl *Param = Function->getParamDecl(P); 3731 Placeholder = FormatFunctionParameter(Policy, Param); 3732 if (Param->hasDefaultArg()) 3733 Placeholder += GetDefaultValueString(Param, Context.getSourceManager(), 3734 Context.getLangOpts()); 3735 } else { 3736 Placeholder = Prototype->getParamType(P).getAsString(Policy); 3737 } 3738 3739 if (P == CurrentArg) 3740 Result.AddCurrentParameterChunk( 3741 Result.getAllocator().CopyString(Placeholder)); 3742 else 3743 Result.AddPlaceholderChunk(Result.getAllocator().CopyString(Placeholder)); 3744 } 3745 3746 if (Prototype && Prototype->isVariadic()) { 3747 CodeCompletionBuilder Opt(Result.getAllocator(), 3748 Result.getCodeCompletionTUInfo()); 3749 if (!FirstParameter) 3750 Opt.AddChunk(CodeCompletionString::CK_Comma); 3751 3752 if (CurrentArg < NumParams) 3753 Opt.AddPlaceholderChunk("..."); 3754 else 3755 Opt.AddCurrentParameterChunk("..."); 3756 3757 Result.AddOptionalChunk(Opt.TakeString()); 3758 } 3759 } 3760 3761 static std::string 3762 formatTemplateParameterPlaceholder(const NamedDecl *Param, bool &Optional, 3763 const PrintingPolicy &Policy) { 3764 if (const auto *Type = dyn_cast<TemplateTypeParmDecl>(Param)) { 3765 Optional = Type->hasDefaultArgument(); 3766 } else if (const auto *NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) { 3767 Optional = NonType->hasDefaultArgument(); 3768 } else if (const auto *Template = dyn_cast<TemplateTemplateParmDecl>(Param)) { 3769 Optional = Template->hasDefaultArgument(); 3770 } 3771 std::string Result; 3772 llvm::raw_string_ostream OS(Result); 3773 Param->print(OS, Policy); 3774 return Result; 3775 } 3776 3777 static std::string templateResultType(const TemplateDecl *TD, 3778 const PrintingPolicy &Policy) { 3779 if (const auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) 3780 return CTD->getTemplatedDecl()->getKindName().str(); 3781 if (const auto *VTD = dyn_cast<VarTemplateDecl>(TD)) 3782 return VTD->getTemplatedDecl()->getType().getAsString(Policy); 3783 if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD)) 3784 return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy); 3785 if (isa<TypeAliasTemplateDecl>(TD)) 3786 return "type"; 3787 if (isa<TemplateTemplateParmDecl>(TD)) 3788 return "class"; 3789 if (isa<ConceptDecl>(TD)) 3790 return "concept"; 3791 return ""; 3792 } 3793 3794 static CodeCompletionString *createTemplateSignatureString( 3795 const TemplateDecl *TD, CodeCompletionBuilder &Builder, unsigned CurrentArg, 3796 const PrintingPolicy &Policy) { 3797 llvm::ArrayRef<NamedDecl *> Params = TD->getTemplateParameters()->asArray(); 3798 CodeCompletionBuilder OptionalBuilder(Builder.getAllocator(), 3799 Builder.getCodeCompletionTUInfo()); 3800 std::string ResultType = templateResultType(TD, Policy); 3801 if (!ResultType.empty()) 3802 Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType)); 3803 Builder.AddTextChunk( 3804 Builder.getAllocator().CopyString(TD->getNameAsString())); 3805 Builder.AddChunk(CodeCompletionString::CK_LeftAngle); 3806 // Initially we're writing into the main string. Once we see an optional arg 3807 // (with default), we're writing into the nested optional chunk. 3808 CodeCompletionBuilder *Current = &Builder; 3809 for (unsigned I = 0; I < Params.size(); ++I) { 3810 bool Optional = false; 3811 std::string Placeholder = 3812 formatTemplateParameterPlaceholder(Params[I], Optional, Policy); 3813 if (Optional) 3814 Current = &OptionalBuilder; 3815 if (I > 0) 3816 Current->AddChunk(CodeCompletionString::CK_Comma); 3817 Current->AddChunk(I == CurrentArg 3818 ? CodeCompletionString::CK_CurrentParameter 3819 : CodeCompletionString::CK_Placeholder, 3820 Current->getAllocator().CopyString(Placeholder)); 3821 } 3822 // Add the optional chunk to the main string if we ever used it. 3823 if (Current == &OptionalBuilder) 3824 Builder.AddOptionalChunk(OptionalBuilder.TakeString()); 3825 Builder.AddChunk(CodeCompletionString::CK_RightAngle); 3826 // For function templates, ResultType was the function's return type. 3827 // Give some clue this is a function. (Don't show the possibly-bulky params). 3828 if (isa<FunctionTemplateDecl>(TD)) 3829 Builder.AddInformativeChunk("()"); 3830 return Builder.TakeString(); 3831 } 3832 3833 CodeCompletionString * 3834 CodeCompleteConsumer::OverloadCandidate::CreateSignatureString( 3835 unsigned CurrentArg, Sema &S, CodeCompletionAllocator &Allocator, 3836 CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments, 3837 bool Braced) const { 3838 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 3839 // Show signatures of constructors as they are declared: 3840 // vector(int n) rather than vector<string>(int n) 3841 // This is less noisy without being less clear, and avoids tricky cases. 3842 Policy.SuppressTemplateArgsInCXXConstructors = true; 3843 3844 // FIXME: Set priority, availability appropriately. 3845 CodeCompletionBuilder Result(Allocator, CCTUInfo, 1, 3846 CXAvailability_Available); 3847 3848 if (getKind() == CK_Template) 3849 return createTemplateSignatureString(getTemplate(), Result, CurrentArg, 3850 Policy); 3851 3852 FunctionDecl *FDecl = getFunction(); 3853 const FunctionProtoType *Proto = 3854 dyn_cast<FunctionProtoType>(getFunctionType()); 3855 if (!FDecl && !Proto) { 3856 // Function without a prototype. Just give the return type and a 3857 // highlighted ellipsis. 3858 const FunctionType *FT = getFunctionType(); 3859 Result.AddResultTypeChunk(Result.getAllocator().CopyString( 3860 FT->getReturnType().getAsString(Policy))); 3861 Result.AddChunk(Braced ? CodeCompletionString::CK_LeftBrace 3862 : CodeCompletionString::CK_LeftParen); 3863 Result.AddChunk(CodeCompletionString::CK_CurrentParameter, "..."); 3864 Result.AddChunk(Braced ? CodeCompletionString::CK_RightBrace 3865 : CodeCompletionString::CK_RightParen); 3866 return Result.TakeString(); 3867 } 3868 3869 if (FDecl) { 3870 if (IncludeBriefComments) { 3871 if (auto RC = getParameterComment(S.getASTContext(), *this, CurrentArg)) 3872 Result.addBriefComment(RC->getBriefText(S.getASTContext())); 3873 } 3874 AddResultTypeChunk(S.Context, Policy, FDecl, QualType(), Result); 3875 3876 std::string Name; 3877 llvm::raw_string_ostream OS(Name); 3878 FDecl->getDeclName().print(OS, Policy); 3879 Result.AddTextChunk(Result.getAllocator().CopyString(OS.str())); 3880 } else { 3881 Result.AddResultTypeChunk(Result.getAllocator().CopyString( 3882 Proto->getReturnType().getAsString(Policy))); 3883 } 3884 3885 Result.AddChunk(Braced ? CodeCompletionString::CK_LeftBrace 3886 : CodeCompletionString::CK_LeftParen); 3887 AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, Result, 3888 CurrentArg); 3889 Result.AddChunk(Braced ? CodeCompletionString::CK_RightBrace 3890 : CodeCompletionString::CK_RightParen); 3891 3892 return Result.TakeString(); 3893 } 3894 3895 unsigned clang::getMacroUsagePriority(StringRef MacroName, 3896 const LangOptions &LangOpts, 3897 bool PreferredTypeIsPointer) { 3898 unsigned Priority = CCP_Macro; 3899 3900 // Treat the "nil", "Nil" and "NULL" macros as null pointer constants. 3901 if (MacroName.equals("nil") || MacroName.equals("NULL") || 3902 MacroName.equals("Nil")) { 3903 Priority = CCP_Constant; 3904 if (PreferredTypeIsPointer) 3905 Priority = Priority / CCF_SimilarTypeMatch; 3906 } 3907 // Treat "YES", "NO", "true", and "false" as constants. 3908 else if (MacroName.equals("YES") || MacroName.equals("NO") || 3909 MacroName.equals("true") || MacroName.equals("false")) 3910 Priority = CCP_Constant; 3911 // Treat "bool" as a type. 3912 else if (MacroName.equals("bool")) 3913 Priority = CCP_Type + (LangOpts.ObjC ? CCD_bool_in_ObjC : 0); 3914 3915 return Priority; 3916 } 3917 3918 CXCursorKind clang::getCursorKindForDecl(const Decl *D) { 3919 if (!D) 3920 return CXCursor_UnexposedDecl; 3921 3922 switch (D->getKind()) { 3923 case Decl::Enum: 3924 return CXCursor_EnumDecl; 3925 case Decl::EnumConstant: 3926 return CXCursor_EnumConstantDecl; 3927 case Decl::Field: 3928 return CXCursor_FieldDecl; 3929 case Decl::Function: 3930 return CXCursor_FunctionDecl; 3931 case Decl::ObjCCategory: 3932 return CXCursor_ObjCCategoryDecl; 3933 case Decl::ObjCCategoryImpl: 3934 return CXCursor_ObjCCategoryImplDecl; 3935 case Decl::ObjCImplementation: 3936 return CXCursor_ObjCImplementationDecl; 3937 3938 case Decl::ObjCInterface: 3939 return CXCursor_ObjCInterfaceDecl; 3940 case Decl::ObjCIvar: 3941 return CXCursor_ObjCIvarDecl; 3942 case Decl::ObjCMethod: 3943 return cast<ObjCMethodDecl>(D)->isInstanceMethod() 3944 ? CXCursor_ObjCInstanceMethodDecl 3945 : CXCursor_ObjCClassMethodDecl; 3946 case Decl::CXXMethod: 3947 return CXCursor_CXXMethod; 3948 case Decl::CXXConstructor: 3949 return CXCursor_Constructor; 3950 case Decl::CXXDestructor: 3951 return CXCursor_Destructor; 3952 case Decl::CXXConversion: 3953 return CXCursor_ConversionFunction; 3954 case Decl::ObjCProperty: 3955 return CXCursor_ObjCPropertyDecl; 3956 case Decl::ObjCProtocol: 3957 return CXCursor_ObjCProtocolDecl; 3958 case Decl::ParmVar: 3959 return CXCursor_ParmDecl; 3960 case Decl::Typedef: 3961 return CXCursor_TypedefDecl; 3962 case Decl::TypeAlias: 3963 return CXCursor_TypeAliasDecl; 3964 case Decl::TypeAliasTemplate: 3965 return CXCursor_TypeAliasTemplateDecl; 3966 case Decl::Var: 3967 return CXCursor_VarDecl; 3968 case Decl::Namespace: 3969 return CXCursor_Namespace; 3970 case Decl::NamespaceAlias: 3971 return CXCursor_NamespaceAlias; 3972 case Decl::TemplateTypeParm: 3973 return CXCursor_TemplateTypeParameter; 3974 case Decl::NonTypeTemplateParm: 3975 return CXCursor_NonTypeTemplateParameter; 3976 case Decl::TemplateTemplateParm: 3977 return CXCursor_TemplateTemplateParameter; 3978 case Decl::FunctionTemplate: 3979 return CXCursor_FunctionTemplate; 3980 case Decl::ClassTemplate: 3981 return CXCursor_ClassTemplate; 3982 case Decl::AccessSpec: 3983 return CXCursor_CXXAccessSpecifier; 3984 case Decl::ClassTemplatePartialSpecialization: 3985 return CXCursor_ClassTemplatePartialSpecialization; 3986 case Decl::UsingDirective: 3987 return CXCursor_UsingDirective; 3988 case Decl::StaticAssert: 3989 return CXCursor_StaticAssert; 3990 case Decl::Friend: 3991 return CXCursor_FriendDecl; 3992 case Decl::TranslationUnit: 3993 return CXCursor_TranslationUnit; 3994 3995 case Decl::Using: 3996 case Decl::UnresolvedUsingValue: 3997 case Decl::UnresolvedUsingTypename: 3998 return CXCursor_UsingDeclaration; 3999 4000 case Decl::UsingEnum: 4001 return CXCursor_EnumDecl; 4002 4003 case Decl::ObjCPropertyImpl: 4004 switch (cast<ObjCPropertyImplDecl>(D)->getPropertyImplementation()) { 4005 case ObjCPropertyImplDecl::Dynamic: 4006 return CXCursor_ObjCDynamicDecl; 4007 4008 case ObjCPropertyImplDecl::Synthesize: 4009 return CXCursor_ObjCSynthesizeDecl; 4010 } 4011 llvm_unreachable("Unexpected Kind!"); 4012 4013 case Decl::Import: 4014 return CXCursor_ModuleImportDecl; 4015 4016 case Decl::ObjCTypeParam: 4017 return CXCursor_TemplateTypeParameter; 4018 4019 default: 4020 if (const auto *TD = dyn_cast<TagDecl>(D)) { 4021 switch (TD->getTagKind()) { 4022 case TTK_Interface: // fall through 4023 case TTK_Struct: 4024 return CXCursor_StructDecl; 4025 case TTK_Class: 4026 return CXCursor_ClassDecl; 4027 case TTK_Union: 4028 return CXCursor_UnionDecl; 4029 case TTK_Enum: 4030 return CXCursor_EnumDecl; 4031 } 4032 } 4033 } 4034 4035 return CXCursor_UnexposedDecl; 4036 } 4037 4038 static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results, 4039 bool LoadExternal, bool IncludeUndefined, 4040 bool TargetTypeIsPointer = false) { 4041 typedef CodeCompletionResult Result; 4042 4043 Results.EnterNewScope(); 4044 4045 for (Preprocessor::macro_iterator M = PP.macro_begin(LoadExternal), 4046 MEnd = PP.macro_end(LoadExternal); 4047 M != MEnd; ++M) { 4048 auto MD = PP.getMacroDefinition(M->first); 4049 if (IncludeUndefined || MD) { 4050 MacroInfo *MI = MD.getMacroInfo(); 4051 if (MI && MI->isUsedForHeaderGuard()) 4052 continue; 4053 4054 Results.AddResult( 4055 Result(M->first, MI, 4056 getMacroUsagePriority(M->first->getName(), PP.getLangOpts(), 4057 TargetTypeIsPointer))); 4058 } 4059 } 4060 4061 Results.ExitScope(); 4062 } 4063 4064 static void AddPrettyFunctionResults(const LangOptions &LangOpts, 4065 ResultBuilder &Results) { 4066 typedef CodeCompletionResult Result; 4067 4068 Results.EnterNewScope(); 4069 4070 Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant)); 4071 Results.AddResult(Result("__FUNCTION__", CCP_Constant)); 4072 if (LangOpts.C99 || LangOpts.CPlusPlus11) 4073 Results.AddResult(Result("__func__", CCP_Constant)); 4074 Results.ExitScope(); 4075 } 4076 4077 static void HandleCodeCompleteResults(Sema *S, 4078 CodeCompleteConsumer *CodeCompleter, 4079 CodeCompletionContext Context, 4080 CodeCompletionResult *Results, 4081 unsigned NumResults) { 4082 if (CodeCompleter) 4083 CodeCompleter->ProcessCodeCompleteResults(*S, Context, Results, NumResults); 4084 } 4085 4086 static CodeCompletionContext 4087 mapCodeCompletionContext(Sema &S, Sema::ParserCompletionContext PCC) { 4088 switch (PCC) { 4089 case Sema::PCC_Namespace: 4090 return CodeCompletionContext::CCC_TopLevel; 4091 4092 case Sema::PCC_Class: 4093 return CodeCompletionContext::CCC_ClassStructUnion; 4094 4095 case Sema::PCC_ObjCInterface: 4096 return CodeCompletionContext::CCC_ObjCInterface; 4097 4098 case Sema::PCC_ObjCImplementation: 4099 return CodeCompletionContext::CCC_ObjCImplementation; 4100 4101 case Sema::PCC_ObjCInstanceVariableList: 4102 return CodeCompletionContext::CCC_ObjCIvarList; 4103 4104 case Sema::PCC_Template: 4105 case Sema::PCC_MemberTemplate: 4106 if (S.CurContext->isFileContext()) 4107 return CodeCompletionContext::CCC_TopLevel; 4108 if (S.CurContext->isRecord()) 4109 return CodeCompletionContext::CCC_ClassStructUnion; 4110 return CodeCompletionContext::CCC_Other; 4111 4112 case Sema::PCC_RecoveryInFunction: 4113 return CodeCompletionContext::CCC_Recovery; 4114 4115 case Sema::PCC_ForInit: 4116 if (S.getLangOpts().CPlusPlus || S.getLangOpts().C99 || 4117 S.getLangOpts().ObjC) 4118 return CodeCompletionContext::CCC_ParenthesizedExpression; 4119 else 4120 return CodeCompletionContext::CCC_Expression; 4121 4122 case Sema::PCC_Expression: 4123 return CodeCompletionContext::CCC_Expression; 4124 case Sema::PCC_Condition: 4125 return CodeCompletionContext(CodeCompletionContext::CCC_Expression, 4126 S.getASTContext().BoolTy); 4127 4128 case Sema::PCC_Statement: 4129 return CodeCompletionContext::CCC_Statement; 4130 4131 case Sema::PCC_Type: 4132 return CodeCompletionContext::CCC_Type; 4133 4134 case Sema::PCC_ParenthesizedExpression: 4135 return CodeCompletionContext::CCC_ParenthesizedExpression; 4136 4137 case Sema::PCC_LocalDeclarationSpecifiers: 4138 return CodeCompletionContext::CCC_Type; 4139 } 4140 4141 llvm_unreachable("Invalid ParserCompletionContext!"); 4142 } 4143 4144 /// If we're in a C++ virtual member function, add completion results 4145 /// that invoke the functions we override, since it's common to invoke the 4146 /// overridden function as well as adding new functionality. 4147 /// 4148 /// \param S The semantic analysis object for which we are generating results. 4149 /// 4150 /// \param InContext This context in which the nested-name-specifier preceding 4151 /// the code-completion point 4152 static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, 4153 ResultBuilder &Results) { 4154 // Look through blocks. 4155 DeclContext *CurContext = S.CurContext; 4156 while (isa<BlockDecl>(CurContext)) 4157 CurContext = CurContext->getParent(); 4158 4159 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext); 4160 if (!Method || !Method->isVirtual()) 4161 return; 4162 4163 // We need to have names for all of the parameters, if we're going to 4164 // generate a forwarding call. 4165 for (auto P : Method->parameters()) 4166 if (!P->getDeclName()) 4167 return; 4168 4169 PrintingPolicy Policy = getCompletionPrintingPolicy(S); 4170 for (const CXXMethodDecl *Overridden : Method->overridden_methods()) { 4171 CodeCompletionBuilder Builder(Results.getAllocator(), 4172 Results.getCodeCompletionTUInfo()); 4173 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl()) 4174 continue; 4175 4176 // If we need a nested-name-specifier, add one now. 4177 if (!InContext) { 4178 NestedNameSpecifier *NNS = getRequiredQualification( 4179 S.Context, CurContext, Overridden->getDeclContext()); 4180 if (NNS) { 4181 std::string Str; 4182 llvm::raw_string_ostream OS(Str); 4183 NNS->print(OS, Policy); 4184 Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); 4185 } 4186 } else if (!InContext->Equals(Overridden->getDeclContext())) 4187 continue; 4188 4189 Builder.AddTypedTextChunk( 4190 Results.getAllocator().CopyString(Overridden->getNameAsString())); 4191 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4192 bool FirstParam = true; 4193 for (auto P : Method->parameters()) { 4194 if (FirstParam) 4195 FirstParam = false; 4196 else 4197 Builder.AddChunk(CodeCompletionString::CK_Comma); 4198 4199 Builder.AddPlaceholderChunk( 4200 Results.getAllocator().CopyString(P->getIdentifier()->getName())); 4201 } 4202 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4203 Results.AddResult(CodeCompletionResult( 4204 Builder.TakeString(), CCP_SuperCompletion, CXCursor_CXXMethod, 4205 CXAvailability_Available, Overridden)); 4206 Results.Ignore(Overridden); 4207 } 4208 } 4209 4210 void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc, 4211 ModuleIdPath Path) { 4212 typedef CodeCompletionResult Result; 4213 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4214 CodeCompleter->getCodeCompletionTUInfo(), 4215 CodeCompletionContext::CCC_Other); 4216 Results.EnterNewScope(); 4217 4218 CodeCompletionAllocator &Allocator = Results.getAllocator(); 4219 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 4220 typedef CodeCompletionResult Result; 4221 if (Path.empty()) { 4222 // Enumerate all top-level modules. 4223 SmallVector<Module *, 8> Modules; 4224 PP.getHeaderSearchInfo().collectAllModules(Modules); 4225 for (unsigned I = 0, N = Modules.size(); I != N; ++I) { 4226 Builder.AddTypedTextChunk( 4227 Builder.getAllocator().CopyString(Modules[I]->Name)); 4228 Results.AddResult(Result( 4229 Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl, 4230 Modules[I]->isAvailable() ? CXAvailability_Available 4231 : CXAvailability_NotAvailable)); 4232 } 4233 } else if (getLangOpts().Modules) { 4234 // Load the named module. 4235 Module *Mod = 4236 PP.getModuleLoader().loadModule(ImportLoc, Path, Module::AllVisible, 4237 /*IsInclusionDirective=*/false); 4238 // Enumerate submodules. 4239 if (Mod) { 4240 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 4241 SubEnd = Mod->submodule_end(); 4242 Sub != SubEnd; ++Sub) { 4243 4244 Builder.AddTypedTextChunk( 4245 Builder.getAllocator().CopyString((*Sub)->Name)); 4246 Results.AddResult(Result( 4247 Builder.TakeString(), CCP_Declaration, CXCursor_ModuleImportDecl, 4248 (*Sub)->isAvailable() ? CXAvailability_Available 4249 : CXAvailability_NotAvailable)); 4250 } 4251 } 4252 } 4253 Results.ExitScope(); 4254 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4255 Results.data(), Results.size()); 4256 } 4257 4258 void Sema::CodeCompleteOrdinaryName(Scope *S, 4259 ParserCompletionContext CompletionContext) { 4260 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4261 CodeCompleter->getCodeCompletionTUInfo(), 4262 mapCodeCompletionContext(*this, CompletionContext)); 4263 Results.EnterNewScope(); 4264 4265 // Determine how to filter results, e.g., so that the names of 4266 // values (functions, enumerators, function templates, etc.) are 4267 // only allowed where we can have an expression. 4268 switch (CompletionContext) { 4269 case PCC_Namespace: 4270 case PCC_Class: 4271 case PCC_ObjCInterface: 4272 case PCC_ObjCImplementation: 4273 case PCC_ObjCInstanceVariableList: 4274 case PCC_Template: 4275 case PCC_MemberTemplate: 4276 case PCC_Type: 4277 case PCC_LocalDeclarationSpecifiers: 4278 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 4279 break; 4280 4281 case PCC_Statement: 4282 case PCC_ParenthesizedExpression: 4283 case PCC_Expression: 4284 case PCC_ForInit: 4285 case PCC_Condition: 4286 if (WantTypesInContext(CompletionContext, getLangOpts())) 4287 Results.setFilter(&ResultBuilder::IsOrdinaryName); 4288 else 4289 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 4290 4291 if (getLangOpts().CPlusPlus) 4292 MaybeAddOverrideCalls(*this, /*InContext=*/nullptr, Results); 4293 break; 4294 4295 case PCC_RecoveryInFunction: 4296 // Unfiltered 4297 break; 4298 } 4299 4300 // If we are in a C++ non-static member function, check the qualifiers on 4301 // the member function to filter/prioritize the results list. 4302 auto ThisType = getCurrentThisType(); 4303 if (!ThisType.isNull()) 4304 Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(), 4305 VK_LValue); 4306 4307 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4308 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4309 CodeCompleter->includeGlobals(), 4310 CodeCompleter->loadExternal()); 4311 4312 AddOrdinaryNameResults(CompletionContext, S, *this, Results); 4313 Results.ExitScope(); 4314 4315 switch (CompletionContext) { 4316 case PCC_ParenthesizedExpression: 4317 case PCC_Expression: 4318 case PCC_Statement: 4319 case PCC_RecoveryInFunction: 4320 if (S->getFnParent()) 4321 AddPrettyFunctionResults(getLangOpts(), Results); 4322 break; 4323 4324 case PCC_Namespace: 4325 case PCC_Class: 4326 case PCC_ObjCInterface: 4327 case PCC_ObjCImplementation: 4328 case PCC_ObjCInstanceVariableList: 4329 case PCC_Template: 4330 case PCC_MemberTemplate: 4331 case PCC_ForInit: 4332 case PCC_Condition: 4333 case PCC_Type: 4334 case PCC_LocalDeclarationSpecifiers: 4335 break; 4336 } 4337 4338 if (CodeCompleter->includeMacros()) 4339 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 4340 4341 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4342 Results.data(), Results.size()); 4343 } 4344 4345 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 4346 ParsedType Receiver, 4347 ArrayRef<IdentifierInfo *> SelIdents, 4348 bool AtArgumentExpression, bool IsSuper, 4349 ResultBuilder &Results); 4350 4351 void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS, 4352 bool AllowNonIdentifiers, 4353 bool AllowNestedNameSpecifiers) { 4354 typedef CodeCompletionResult Result; 4355 ResultBuilder Results( 4356 *this, CodeCompleter->getAllocator(), 4357 CodeCompleter->getCodeCompletionTUInfo(), 4358 AllowNestedNameSpecifiers 4359 // FIXME: Try to separate codepath leading here to deduce whether we 4360 // need an existing symbol or a new one. 4361 ? CodeCompletionContext::CCC_SymbolOrNewName 4362 : CodeCompletionContext::CCC_NewName); 4363 Results.EnterNewScope(); 4364 4365 // Type qualifiers can come after names. 4366 Results.AddResult(Result("const")); 4367 Results.AddResult(Result("volatile")); 4368 if (getLangOpts().C99) 4369 Results.AddResult(Result("restrict")); 4370 4371 if (getLangOpts().CPlusPlus) { 4372 if (getLangOpts().CPlusPlus11 && 4373 (DS.getTypeSpecType() == DeclSpec::TST_class || 4374 DS.getTypeSpecType() == DeclSpec::TST_struct)) 4375 Results.AddResult("final"); 4376 4377 if (AllowNonIdentifiers) { 4378 Results.AddResult(Result("operator")); 4379 } 4380 4381 // Add nested-name-specifiers. 4382 if (AllowNestedNameSpecifiers) { 4383 Results.allowNestedNameSpecifiers(); 4384 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy); 4385 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4386 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 4387 CodeCompleter->includeGlobals(), 4388 CodeCompleter->loadExternal()); 4389 Results.setFilter(nullptr); 4390 } 4391 } 4392 Results.ExitScope(); 4393 4394 // If we're in a context where we might have an expression (rather than a 4395 // declaration), and what we've seen so far is an Objective-C type that could 4396 // be a receiver of a class message, this may be a class message send with 4397 // the initial opening bracket '[' missing. Add appropriate completions. 4398 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers && 4399 DS.getParsedSpecifiers() == DeclSpec::PQ_TypeSpecifier && 4400 DS.getTypeSpecType() == DeclSpec::TST_typename && 4401 DS.getTypeSpecComplex() == DeclSpec::TSC_unspecified && 4402 DS.getTypeSpecSign() == TypeSpecifierSign::Unspecified && 4403 !DS.isTypeAltiVecVector() && S && 4404 (S->getFlags() & Scope::DeclScope) != 0 && 4405 (S->getFlags() & (Scope::ClassScope | Scope::TemplateParamScope | 4406 Scope::FunctionPrototypeScope | Scope::AtCatchScope)) == 4407 0) { 4408 ParsedType T = DS.getRepAsType(); 4409 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) 4410 AddClassMessageCompletions(*this, S, T, None, false, false, Results); 4411 } 4412 4413 // Note that we intentionally suppress macro results here, since we do not 4414 // encourage using macros to produce the names of entities. 4415 4416 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4417 Results.data(), Results.size()); 4418 } 4419 4420 static const char *underscoreAttrScope(llvm::StringRef Scope) { 4421 if (Scope == "clang") 4422 return "_Clang"; 4423 if (Scope == "gnu") 4424 return "__gnu__"; 4425 return nullptr; 4426 } 4427 4428 static const char *noUnderscoreAttrScope(llvm::StringRef Scope) { 4429 if (Scope == "_Clang") 4430 return "clang"; 4431 if (Scope == "__gnu__") 4432 return "gnu"; 4433 return nullptr; 4434 } 4435 4436 void Sema::CodeCompleteAttribute(AttributeCommonInfo::Syntax Syntax, 4437 AttributeCompletion Completion, 4438 const IdentifierInfo *InScope) { 4439 if (Completion == AttributeCompletion::None) 4440 return; 4441 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 4442 CodeCompleter->getCodeCompletionTUInfo(), 4443 CodeCompletionContext::CCC_Attribute); 4444 4445 // We're going to iterate over the normalized spellings of the attribute. 4446 // These don't include "underscore guarding": the normalized spelling is 4447 // clang::foo but you can also write _Clang::__foo__. 4448 // 4449 // (Clang supports a mix like clang::__foo__ but we won't suggest it: either 4450 // you care about clashing with macros or you don't). 4451 // 4452 // So if we're already in a scope, we determine its canonical spellings 4453 // (for comparison with normalized attr spelling) and remember whether it was 4454 // underscore-guarded (so we know how to spell contained attributes). 4455 llvm::StringRef InScopeName; 4456 bool InScopeUnderscore = false; 4457 if (InScope) { 4458 InScopeName = InScope->getName(); 4459 if (const char *NoUnderscore = noUnderscoreAttrScope(InScopeName)) { 4460 InScopeName = NoUnderscore; 4461 InScopeUnderscore = true; 4462 } 4463 } 4464 bool SyntaxSupportsGuards = Syntax == AttributeCommonInfo::AS_GNU || 4465 Syntax == AttributeCommonInfo::AS_CXX11 || 4466 Syntax == AttributeCommonInfo::AS_C2x; 4467 4468 llvm::DenseSet<llvm::StringRef> FoundScopes; 4469 auto AddCompletions = [&](const ParsedAttrInfo &A) { 4470 if (A.IsTargetSpecific && !A.existsInTarget(Context.getTargetInfo())) 4471 return; 4472 if (!A.acceptsLangOpts(getLangOpts())) 4473 return; 4474 for (const auto &S : A.Spellings) { 4475 if (S.Syntax != Syntax) 4476 continue; 4477 llvm::StringRef Name = S.NormalizedFullName; 4478 llvm::StringRef Scope; 4479 if ((Syntax == AttributeCommonInfo::AS_CXX11 || 4480 Syntax == AttributeCommonInfo::AS_C2x)) { 4481 std::tie(Scope, Name) = Name.split("::"); 4482 if (Name.empty()) // oops, unscoped 4483 std::swap(Name, Scope); 4484 } 4485 4486 // Do we just want a list of scopes rather than attributes? 4487 if (Completion == AttributeCompletion::Scope) { 4488 // Make sure to emit each scope only once. 4489 if (!Scope.empty() && FoundScopes.insert(Scope).second) { 4490 Results.AddResult( 4491 CodeCompletionResult(Results.getAllocator().CopyString(Scope))); 4492 // Include alternate form (__gnu__ instead of gnu). 4493 if (const char *Scope2 = underscoreAttrScope(Scope)) 4494 Results.AddResult(CodeCompletionResult(Scope2)); 4495 } 4496 continue; 4497 } 4498 4499 // If a scope was specified, it must match but we don't need to print it. 4500 if (!InScopeName.empty()) { 4501 if (Scope != InScopeName) 4502 continue; 4503 Scope = ""; 4504 } 4505 4506 auto Add = [&](llvm::StringRef Scope, llvm::StringRef Name, 4507 bool Underscores) { 4508 CodeCompletionBuilder Builder(Results.getAllocator(), 4509 Results.getCodeCompletionTUInfo()); 4510 llvm::SmallString<32> Text; 4511 if (!Scope.empty()) { 4512 Text.append(Scope); 4513 Text.append("::"); 4514 } 4515 if (Underscores) 4516 Text.append("__"); 4517 Text.append(Name); 4518 if (Underscores) 4519 Text.append("__"); 4520 Builder.AddTypedTextChunk(Results.getAllocator().CopyString(Text)); 4521 4522 if (!A.ArgNames.empty()) { 4523 Builder.AddChunk(CodeCompletionString::CK_LeftParen, "("); 4524 bool First = true; 4525 for (const char *Arg : A.ArgNames) { 4526 if (!First) 4527 Builder.AddChunk(CodeCompletionString::CK_Comma, ", "); 4528 First = false; 4529 Builder.AddPlaceholderChunk(Arg); 4530 } 4531 Builder.AddChunk(CodeCompletionString::CK_RightParen, ")"); 4532 } 4533 4534 Results.AddResult(Builder.TakeString()); 4535 }; 4536 4537 // Generate the non-underscore-guarded result. 4538 // Note this is (a suffix of) the NormalizedFullName, no need to copy. 4539 // If an underscore-guarded scope was specified, only the 4540 // underscore-guarded attribute name is relevant. 4541 if (!InScopeUnderscore) 4542 Add(Scope, Name, /*Underscores=*/false); 4543 4544 // Generate the underscore-guarded version, for syntaxes that support it. 4545 // We skip this if the scope was already spelled and not guarded, or 4546 // we must spell it and can't guard it. 4547 if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) { 4548 llvm::SmallString<32> Guarded; 4549 if (Scope.empty()) { 4550 Add(Scope, Name, /*Underscores=*/true); 4551 } else { 4552 const char *GuardedScope = underscoreAttrScope(Scope); 4553 if (!GuardedScope) 4554 continue; 4555 Add(GuardedScope, Name, /*Underscores=*/true); 4556 } 4557 } 4558 4559 // It may be nice to include the Kind so we can look up the docs later. 4560 } 4561 }; 4562 4563 for (const auto *A : ParsedAttrInfo::getAllBuiltin()) 4564 AddCompletions(*A); 4565 for (const auto &Entry : ParsedAttrInfoRegistry::entries()) 4566 AddCompletions(*Entry.instantiate()); 4567 4568 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4569 Results.data(), Results.size()); 4570 } 4571 4572 struct Sema::CodeCompleteExpressionData { 4573 CodeCompleteExpressionData(QualType PreferredType = QualType(), 4574 bool IsParenthesized = false) 4575 : PreferredType(PreferredType), IntegralConstantExpression(false), 4576 ObjCCollection(false), IsParenthesized(IsParenthesized) {} 4577 4578 QualType PreferredType; 4579 bool IntegralConstantExpression; 4580 bool ObjCCollection; 4581 bool IsParenthesized; 4582 SmallVector<Decl *, 4> IgnoreDecls; 4583 }; 4584 4585 namespace { 4586 /// Information that allows to avoid completing redundant enumerators. 4587 struct CoveredEnumerators { 4588 llvm::SmallPtrSet<EnumConstantDecl *, 8> Seen; 4589 NestedNameSpecifier *SuggestedQualifier = nullptr; 4590 }; 4591 } // namespace 4592 4593 static void AddEnumerators(ResultBuilder &Results, ASTContext &Context, 4594 EnumDecl *Enum, DeclContext *CurContext, 4595 const CoveredEnumerators &Enumerators) { 4596 NestedNameSpecifier *Qualifier = Enumerators.SuggestedQualifier; 4597 if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) { 4598 // If there are no prior enumerators in C++, check whether we have to 4599 // qualify the names of the enumerators that we suggest, because they 4600 // may not be visible in this scope. 4601 Qualifier = getRequiredQualification(Context, CurContext, Enum); 4602 } 4603 4604 Results.EnterNewScope(); 4605 for (auto *E : Enum->enumerators()) { 4606 if (Enumerators.Seen.count(E)) 4607 continue; 4608 4609 CodeCompletionResult R(E, CCP_EnumInCase, Qualifier); 4610 Results.AddResult(R, CurContext, nullptr, false); 4611 } 4612 Results.ExitScope(); 4613 } 4614 4615 /// Try to find a corresponding FunctionProtoType for function-like types (e.g. 4616 /// function pointers, std::function, etc). 4617 static const FunctionProtoType *TryDeconstructFunctionLike(QualType T) { 4618 assert(!T.isNull()); 4619 // Try to extract first template argument from std::function<> and similar. 4620 // Note we only handle the sugared types, they closely match what users wrote. 4621 // We explicitly choose to not handle ClassTemplateSpecializationDecl. 4622 if (auto *Specialization = T->getAs<TemplateSpecializationType>()) { 4623 if (Specialization->getNumArgs() != 1) 4624 return nullptr; 4625 const TemplateArgument &Argument = Specialization->getArg(0); 4626 if (Argument.getKind() != TemplateArgument::Type) 4627 return nullptr; 4628 return Argument.getAsType()->getAs<FunctionProtoType>(); 4629 } 4630 // Handle other cases. 4631 if (T->isPointerType()) 4632 T = T->getPointeeType(); 4633 return T->getAs<FunctionProtoType>(); 4634 } 4635 4636 /// Adds a pattern completion for a lambda expression with the specified 4637 /// parameter types and placeholders for parameter names. 4638 static void AddLambdaCompletion(ResultBuilder &Results, 4639 llvm::ArrayRef<QualType> Parameters, 4640 const LangOptions &LangOpts) { 4641 if (!Results.includeCodePatterns()) 4642 return; 4643 CodeCompletionBuilder Completion(Results.getAllocator(), 4644 Results.getCodeCompletionTUInfo()); 4645 // [](<parameters>) {} 4646 Completion.AddChunk(CodeCompletionString::CK_LeftBracket); 4647 Completion.AddPlaceholderChunk("="); 4648 Completion.AddChunk(CodeCompletionString::CK_RightBracket); 4649 if (!Parameters.empty()) { 4650 Completion.AddChunk(CodeCompletionString::CK_LeftParen); 4651 bool First = true; 4652 for (auto Parameter : Parameters) { 4653 if (!First) 4654 Completion.AddChunk(CodeCompletionString::ChunkKind::CK_Comma); 4655 else 4656 First = false; 4657 4658 constexpr llvm::StringLiteral NamePlaceholder = "!#!NAME_GOES_HERE!#!"; 4659 std::string Type = std::string(NamePlaceholder); 4660 Parameter.getAsStringInternal(Type, PrintingPolicy(LangOpts)); 4661 llvm::StringRef Prefix, Suffix; 4662 std::tie(Prefix, Suffix) = llvm::StringRef(Type).split(NamePlaceholder); 4663 Prefix = Prefix.rtrim(); 4664 Suffix = Suffix.ltrim(); 4665 4666 Completion.AddTextChunk(Completion.getAllocator().CopyString(Prefix)); 4667 Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4668 Completion.AddPlaceholderChunk("parameter"); 4669 Completion.AddTextChunk(Completion.getAllocator().CopyString(Suffix)); 4670 }; 4671 Completion.AddChunk(CodeCompletionString::CK_RightParen); 4672 } 4673 Completion.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace); 4674 Completion.AddChunk(CodeCompletionString::CK_LeftBrace); 4675 Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4676 Completion.AddPlaceholderChunk("body"); 4677 Completion.AddChunk(CodeCompletionString::CK_HorizontalSpace); 4678 Completion.AddChunk(CodeCompletionString::CK_RightBrace); 4679 4680 Results.AddResult(Completion.TakeString()); 4681 } 4682 4683 /// Perform code-completion in an expression context when we know what 4684 /// type we're looking for. 4685 void Sema::CodeCompleteExpression(Scope *S, 4686 const CodeCompleteExpressionData &Data) { 4687 ResultBuilder Results( 4688 *this, CodeCompleter->getAllocator(), 4689 CodeCompleter->getCodeCompletionTUInfo(), 4690 CodeCompletionContext( 4691 Data.IsParenthesized 4692 ? CodeCompletionContext::CCC_ParenthesizedExpression 4693 : CodeCompletionContext::CCC_Expression, 4694 Data.PreferredType)); 4695 auto PCC = 4696 Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression; 4697 if (Data.ObjCCollection) 4698 Results.setFilter(&ResultBuilder::IsObjCCollection); 4699 else if (Data.IntegralConstantExpression) 4700 Results.setFilter(&ResultBuilder::IsIntegralConstantValue); 4701 else if (WantTypesInContext(PCC, getLangOpts())) 4702 Results.setFilter(&ResultBuilder::IsOrdinaryName); 4703 else 4704 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName); 4705 4706 if (!Data.PreferredType.isNull()) 4707 Results.setPreferredType(Data.PreferredType.getNonReferenceType()); 4708 4709 // Ignore any declarations that we were told that we don't care about. 4710 for (unsigned I = 0, N = Data.IgnoreDecls.size(); I != N; ++I) 4711 Results.Ignore(Data.IgnoreDecls[I]); 4712 4713 CodeCompletionDeclConsumer Consumer(Results, CurContext); 4714 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 4715 CodeCompleter->includeGlobals(), 4716 CodeCompleter->loadExternal()); 4717 4718 Results.EnterNewScope(); 4719 AddOrdinaryNameResults(PCC, S, *this, Results); 4720 Results.ExitScope(); 4721 4722 bool PreferredTypeIsPointer = false; 4723 if (!Data.PreferredType.isNull()) { 4724 PreferredTypeIsPointer = Data.PreferredType->isAnyPointerType() || 4725 Data.PreferredType->isMemberPointerType() || 4726 Data.PreferredType->isBlockPointerType(); 4727 if (Data.PreferredType->isEnumeralType()) { 4728 EnumDecl *Enum = Data.PreferredType->castAs<EnumType>()->getDecl(); 4729 if (auto *Def = Enum->getDefinition()) 4730 Enum = Def; 4731 // FIXME: collect covered enumerators in cases like: 4732 // if (x == my_enum::one) { ... } else if (x == ^) {} 4733 AddEnumerators(Results, Context, Enum, CurContext, CoveredEnumerators()); 4734 } 4735 } 4736 4737 if (S->getFnParent() && !Data.ObjCCollection && 4738 !Data.IntegralConstantExpression) 4739 AddPrettyFunctionResults(getLangOpts(), Results); 4740 4741 if (CodeCompleter->includeMacros()) 4742 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false, 4743 PreferredTypeIsPointer); 4744 4745 // Complete a lambda expression when preferred type is a function. 4746 if (!Data.PreferredType.isNull() && getLangOpts().CPlusPlus11) { 4747 if (const FunctionProtoType *F = 4748 TryDeconstructFunctionLike(Data.PreferredType)) 4749 AddLambdaCompletion(Results, F->getParamTypes(), getLangOpts()); 4750 } 4751 4752 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 4753 Results.data(), Results.size()); 4754 } 4755 4756 void Sema::CodeCompleteExpression(Scope *S, QualType PreferredType, 4757 bool IsParenthesized) { 4758 return CodeCompleteExpression( 4759 S, CodeCompleteExpressionData(PreferredType, IsParenthesized)); 4760 } 4761 4762 void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E, 4763 QualType PreferredType) { 4764 if (E.isInvalid()) 4765 CodeCompleteExpression(S, PreferredType); 4766 else if (getLangOpts().ObjC) 4767 CodeCompleteObjCInstanceMessage(S, E.get(), None, false); 4768 } 4769 4770 /// The set of properties that have already been added, referenced by 4771 /// property name. 4772 typedef llvm::SmallPtrSet<IdentifierInfo *, 16> AddedPropertiesSet; 4773 4774 /// Retrieve the container definition, if any? 4775 static ObjCContainerDecl *getContainerDef(ObjCContainerDecl *Container) { 4776 if (ObjCInterfaceDecl *Interface = dyn_cast<ObjCInterfaceDecl>(Container)) { 4777 if (Interface->hasDefinition()) 4778 return Interface->getDefinition(); 4779 4780 return Interface; 4781 } 4782 4783 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4784 if (Protocol->hasDefinition()) 4785 return Protocol->getDefinition(); 4786 4787 return Protocol; 4788 } 4789 return Container; 4790 } 4791 4792 /// Adds a block invocation code completion result for the given block 4793 /// declaration \p BD. 4794 static void AddObjCBlockCall(ASTContext &Context, const PrintingPolicy &Policy, 4795 CodeCompletionBuilder &Builder, 4796 const NamedDecl *BD, 4797 const FunctionTypeLoc &BlockLoc, 4798 const FunctionProtoTypeLoc &BlockProtoLoc) { 4799 Builder.AddResultTypeChunk( 4800 GetCompletionTypeString(BlockLoc.getReturnLoc().getType(), Context, 4801 Policy, Builder.getAllocator())); 4802 4803 AddTypedNameChunk(Context, Policy, BD, Builder); 4804 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 4805 4806 if (BlockProtoLoc && BlockProtoLoc.getTypePtr()->isVariadic()) { 4807 Builder.AddPlaceholderChunk("..."); 4808 } else { 4809 for (unsigned I = 0, N = BlockLoc.getNumParams(); I != N; ++I) { 4810 if (I) 4811 Builder.AddChunk(CodeCompletionString::CK_Comma); 4812 4813 // Format the placeholder string. 4814 std::string PlaceholderStr = 4815 FormatFunctionParameter(Policy, BlockLoc.getParam(I)); 4816 4817 if (I == N - 1 && BlockProtoLoc && 4818 BlockProtoLoc.getTypePtr()->isVariadic()) 4819 PlaceholderStr += ", ..."; 4820 4821 // Add the placeholder string. 4822 Builder.AddPlaceholderChunk( 4823 Builder.getAllocator().CopyString(PlaceholderStr)); 4824 } 4825 } 4826 4827 Builder.AddChunk(CodeCompletionString::CK_RightParen); 4828 } 4829 4830 static void 4831 AddObjCProperties(const CodeCompletionContext &CCContext, 4832 ObjCContainerDecl *Container, bool AllowCategories, 4833 bool AllowNullaryMethods, DeclContext *CurContext, 4834 AddedPropertiesSet &AddedProperties, ResultBuilder &Results, 4835 bool IsBaseExprStatement = false, 4836 bool IsClassProperty = false, bool InOriginalClass = true) { 4837 typedef CodeCompletionResult Result; 4838 4839 // Retrieve the definition. 4840 Container = getContainerDef(Container); 4841 4842 // Add properties in this container. 4843 const auto AddProperty = [&](const ObjCPropertyDecl *P) { 4844 if (!AddedProperties.insert(P->getIdentifier()).second) 4845 return; 4846 4847 // FIXME: Provide block invocation completion for non-statement 4848 // expressions. 4849 if (!P->getType().getTypePtr()->isBlockPointerType() || 4850 !IsBaseExprStatement) { 4851 Result R = Result(P, Results.getBasePriority(P), nullptr); 4852 if (!InOriginalClass) 4853 setInBaseClass(R); 4854 Results.MaybeAddResult(R, CurContext); 4855 return; 4856 } 4857 4858 // Block setter and invocation completion is provided only when we are able 4859 // to find the FunctionProtoTypeLoc with parameter names for the block. 4860 FunctionTypeLoc BlockLoc; 4861 FunctionProtoTypeLoc BlockProtoLoc; 4862 findTypeLocationForBlockDecl(P->getTypeSourceInfo(), BlockLoc, 4863 BlockProtoLoc); 4864 if (!BlockLoc) { 4865 Result R = Result(P, Results.getBasePriority(P), nullptr); 4866 if (!InOriginalClass) 4867 setInBaseClass(R); 4868 Results.MaybeAddResult(R, CurContext); 4869 return; 4870 } 4871 4872 // The default completion result for block properties should be the block 4873 // invocation completion when the base expression is a statement. 4874 CodeCompletionBuilder Builder(Results.getAllocator(), 4875 Results.getCodeCompletionTUInfo()); 4876 AddObjCBlockCall(Container->getASTContext(), 4877 getCompletionPrintingPolicy(Results.getSema()), Builder, P, 4878 BlockLoc, BlockProtoLoc); 4879 Result R = Result(Builder.TakeString(), P, Results.getBasePriority(P)); 4880 if (!InOriginalClass) 4881 setInBaseClass(R); 4882 Results.MaybeAddResult(R, CurContext); 4883 4884 // Provide additional block setter completion iff the base expression is a 4885 // statement and the block property is mutable. 4886 if (!P->isReadOnly()) { 4887 CodeCompletionBuilder Builder(Results.getAllocator(), 4888 Results.getCodeCompletionTUInfo()); 4889 AddResultTypeChunk(Container->getASTContext(), 4890 getCompletionPrintingPolicy(Results.getSema()), P, 4891 CCContext.getBaseType(), Builder); 4892 Builder.AddTypedTextChunk( 4893 Results.getAllocator().CopyString(P->getName())); 4894 Builder.AddChunk(CodeCompletionString::CK_Equal); 4895 4896 std::string PlaceholderStr = formatBlockPlaceholder( 4897 getCompletionPrintingPolicy(Results.getSema()), P, BlockLoc, 4898 BlockProtoLoc, /*SuppressBlockName=*/true); 4899 // Add the placeholder string. 4900 Builder.AddPlaceholderChunk( 4901 Builder.getAllocator().CopyString(PlaceholderStr)); 4902 4903 // When completing blocks properties that return void the default 4904 // property completion result should show up before the setter, 4905 // otherwise the setter completion should show up before the default 4906 // property completion, as we normally want to use the result of the 4907 // call. 4908 Result R = 4909 Result(Builder.TakeString(), P, 4910 Results.getBasePriority(P) + 4911 (BlockLoc.getTypePtr()->getReturnType()->isVoidType() 4912 ? CCD_BlockPropertySetter 4913 : -CCD_BlockPropertySetter)); 4914 if (!InOriginalClass) 4915 setInBaseClass(R); 4916 Results.MaybeAddResult(R, CurContext); 4917 } 4918 }; 4919 4920 if (IsClassProperty) { 4921 for (const auto *P : Container->class_properties()) 4922 AddProperty(P); 4923 } else { 4924 for (const auto *P : Container->instance_properties()) 4925 AddProperty(P); 4926 } 4927 4928 // Add nullary methods or implicit class properties 4929 if (AllowNullaryMethods) { 4930 ASTContext &Context = Container->getASTContext(); 4931 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 4932 // Adds a method result 4933 const auto AddMethod = [&](const ObjCMethodDecl *M) { 4934 IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0); 4935 if (!Name) 4936 return; 4937 if (!AddedProperties.insert(Name).second) 4938 return; 4939 CodeCompletionBuilder Builder(Results.getAllocator(), 4940 Results.getCodeCompletionTUInfo()); 4941 AddResultTypeChunk(Context, Policy, M, CCContext.getBaseType(), Builder); 4942 Builder.AddTypedTextChunk( 4943 Results.getAllocator().CopyString(Name->getName())); 4944 Result R = Result(Builder.TakeString(), M, 4945 CCP_MemberDeclaration + CCD_MethodAsProperty); 4946 if (!InOriginalClass) 4947 setInBaseClass(R); 4948 Results.MaybeAddResult(R, CurContext); 4949 }; 4950 4951 if (IsClassProperty) { 4952 for (const auto *M : Container->methods()) { 4953 // Gather the class method that can be used as implicit property 4954 // getters. Methods with arguments or methods that return void aren't 4955 // added to the results as they can't be used as a getter. 4956 if (!M->getSelector().isUnarySelector() || 4957 M->getReturnType()->isVoidType() || M->isInstanceMethod()) 4958 continue; 4959 AddMethod(M); 4960 } 4961 } else { 4962 for (auto *M : Container->methods()) { 4963 if (M->getSelector().isUnarySelector()) 4964 AddMethod(M); 4965 } 4966 } 4967 } 4968 4969 // Add properties in referenced protocols. 4970 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 4971 for (auto *P : Protocol->protocols()) 4972 AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods, 4973 CurContext, AddedProperties, Results, 4974 IsBaseExprStatement, IsClassProperty, 4975 /*InOriginalClass*/ false); 4976 } else if (ObjCInterfaceDecl *IFace = 4977 dyn_cast<ObjCInterfaceDecl>(Container)) { 4978 if (AllowCategories) { 4979 // Look through categories. 4980 for (auto *Cat : IFace->known_categories()) 4981 AddObjCProperties(CCContext, Cat, AllowCategories, AllowNullaryMethods, 4982 CurContext, AddedProperties, Results, 4983 IsBaseExprStatement, IsClassProperty, 4984 InOriginalClass); 4985 } 4986 4987 // Look through protocols. 4988 for (auto *I : IFace->all_referenced_protocols()) 4989 AddObjCProperties(CCContext, I, AllowCategories, AllowNullaryMethods, 4990 CurContext, AddedProperties, Results, 4991 IsBaseExprStatement, IsClassProperty, 4992 /*InOriginalClass*/ false); 4993 4994 // Look in the superclass. 4995 if (IFace->getSuperClass()) 4996 AddObjCProperties(CCContext, IFace->getSuperClass(), AllowCategories, 4997 AllowNullaryMethods, CurContext, AddedProperties, 4998 Results, IsBaseExprStatement, IsClassProperty, 4999 /*InOriginalClass*/ false); 5000 } else if (const auto *Category = 5001 dyn_cast<ObjCCategoryDecl>(Container)) { 5002 // Look through protocols. 5003 for (auto *P : Category->protocols()) 5004 AddObjCProperties(CCContext, P, AllowCategories, AllowNullaryMethods, 5005 CurContext, AddedProperties, Results, 5006 IsBaseExprStatement, IsClassProperty, 5007 /*InOriginalClass*/ false); 5008 } 5009 } 5010 5011 static void AddRecordMembersCompletionResults( 5012 Sema &SemaRef, ResultBuilder &Results, Scope *S, QualType BaseType, 5013 ExprValueKind BaseKind, RecordDecl *RD, Optional<FixItHint> AccessOpFixIt) { 5014 // Indicate that we are performing a member access, and the cv-qualifiers 5015 // for the base object type. 5016 Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind); 5017 5018 // Access to a C/C++ class, struct, or union. 5019 Results.allowNestedNameSpecifiers(); 5020 std::vector<FixItHint> FixIts; 5021 if (AccessOpFixIt) 5022 FixIts.emplace_back(AccessOpFixIt.getValue()); 5023 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts)); 5024 SemaRef.LookupVisibleDecls(RD, Sema::LookupMemberName, Consumer, 5025 SemaRef.CodeCompleter->includeGlobals(), 5026 /*IncludeDependentBases=*/true, 5027 SemaRef.CodeCompleter->loadExternal()); 5028 5029 if (SemaRef.getLangOpts().CPlusPlus) { 5030 if (!Results.empty()) { 5031 // The "template" keyword can follow "->" or "." in the grammar. 5032 // However, we only want to suggest the template keyword if something 5033 // is dependent. 5034 bool IsDependent = BaseType->isDependentType(); 5035 if (!IsDependent) { 5036 for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) 5037 if (DeclContext *Ctx = DepScope->getEntity()) { 5038 IsDependent = Ctx->isDependentContext(); 5039 break; 5040 } 5041 } 5042 5043 if (IsDependent) 5044 Results.AddResult(CodeCompletionResult("template")); 5045 } 5046 } 5047 } 5048 5049 // Returns the RecordDecl inside the BaseType, falling back to primary template 5050 // in case of specializations. Since we might not have a decl for the 5051 // instantiation/specialization yet, e.g. dependent code. 5052 static RecordDecl *getAsRecordDecl(const QualType BaseType) { 5053 if (auto *RD = BaseType->getAsRecordDecl()) { 5054 if (const auto *CTSD = 5055 llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 5056 // Template might not be instantiated yet, fall back to primary template 5057 // in such cases. 5058 if (CTSD->getTemplateSpecializationKind() == TSK_Undeclared) 5059 RD = CTSD->getSpecializedTemplate()->getTemplatedDecl(); 5060 } 5061 return RD; 5062 } 5063 5064 if (const auto *TST = BaseType->getAs<TemplateSpecializationType>()) { 5065 if (const auto *TD = dyn_cast_or_null<ClassTemplateDecl>( 5066 TST->getTemplateName().getAsTemplateDecl())) { 5067 return TD->getTemplatedDecl(); 5068 } 5069 } 5070 5071 return nullptr; 5072 } 5073 5074 namespace { 5075 // Collects completion-relevant information about a concept-constrainted type T. 5076 // In particular, examines the constraint expressions to find members of T. 5077 // 5078 // The design is very simple: we walk down each constraint looking for 5079 // expressions of the form T.foo(). 5080 // If we're extra lucky, the return type is specified. 5081 // We don't do any clever handling of && or || in constraint expressions, we 5082 // take members from both branches. 5083 // 5084 // For example, given: 5085 // template <class T> concept X = requires (T t, string& s) { t.print(s); }; 5086 // template <X U> void foo(U u) { u.^ } 5087 // We want to suggest the inferred member function 'print(string)'. 5088 // We see that u has type U, so X<U> holds. 5089 // X<U> requires t.print(s) to be valid, where t has type U (substituted for T). 5090 // By looking at the CallExpr we find the signature of print(). 5091 // 5092 // While we tend to know in advance which kind of members (access via . -> ::) 5093 // we want, it's simpler just to gather them all and post-filter. 5094 // 5095 // FIXME: some of this machinery could be used for non-concept type-parms too, 5096 // enabling completion for type parameters based on other uses of that param. 5097 // 5098 // FIXME: there are other cases where a type can be constrained by a concept, 5099 // e.g. inside `if constexpr(ConceptSpecializationExpr) { ... }` 5100 class ConceptInfo { 5101 public: 5102 // Describes a likely member of a type, inferred by concept constraints. 5103 // Offered as a code completion for T. T-> and T:: contexts. 5104 struct Member { 5105 // Always non-null: we only handle members with ordinary identifier names. 5106 const IdentifierInfo *Name = nullptr; 5107 // Set for functions we've seen called. 5108 // We don't have the declared parameter types, only the actual types of 5109 // arguments we've seen. These are still valuable, as it's hard to render 5110 // a useful function completion with neither parameter types nor names! 5111 llvm::Optional<SmallVector<QualType, 1>> ArgTypes; 5112 // Whether this is accessed as T.member, T->member, or T::member. 5113 enum AccessOperator { 5114 Colons, 5115 Arrow, 5116 Dot, 5117 } Operator = Dot; 5118 // What's known about the type of a variable or return type of a function. 5119 const TypeConstraint *ResultType = nullptr; 5120 // FIXME: also track: 5121 // - kind of entity (function/variable/type), to expose structured results 5122 // - template args kinds/types, as a proxy for template params 5123 5124 // For now we simply return these results as "pattern" strings. 5125 CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc, 5126 CodeCompletionTUInfo &Info) const { 5127 CodeCompletionBuilder B(Alloc, Info); 5128 // Result type 5129 if (ResultType) { 5130 std::string AsString; 5131 { 5132 llvm::raw_string_ostream OS(AsString); 5133 QualType ExactType = deduceType(*ResultType); 5134 if (!ExactType.isNull()) 5135 ExactType.print(OS, getCompletionPrintingPolicy(S)); 5136 else 5137 ResultType->print(OS, getCompletionPrintingPolicy(S)); 5138 } 5139 B.AddResultTypeChunk(Alloc.CopyString(AsString)); 5140 } 5141 // Member name 5142 B.AddTypedTextChunk(Alloc.CopyString(Name->getName())); 5143 // Function argument list 5144 if (ArgTypes) { 5145 B.AddChunk(clang::CodeCompletionString::CK_LeftParen); 5146 bool First = true; 5147 for (QualType Arg : *ArgTypes) { 5148 if (First) 5149 First = false; 5150 else { 5151 B.AddChunk(clang::CodeCompletionString::CK_Comma); 5152 B.AddChunk(clang::CodeCompletionString::CK_HorizontalSpace); 5153 } 5154 B.AddPlaceholderChunk(Alloc.CopyString( 5155 Arg.getAsString(getCompletionPrintingPolicy(S)))); 5156 } 5157 B.AddChunk(clang::CodeCompletionString::CK_RightParen); 5158 } 5159 return B.TakeString(); 5160 } 5161 }; 5162 5163 // BaseType is the type parameter T to infer members from. 5164 // T must be accessible within S, as we use it to find the template entity 5165 // that T is attached to in order to gather the relevant constraints. 5166 ConceptInfo(const TemplateTypeParmType &BaseType, Scope *S) { 5167 auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S); 5168 for (const Expr *E : constraintsForTemplatedEntity(TemplatedEntity)) 5169 believe(E, &BaseType); 5170 } 5171 5172 std::vector<Member> members() { 5173 std::vector<Member> Results; 5174 for (const auto &E : this->Results) 5175 Results.push_back(E.second); 5176 llvm::sort(Results, [](const Member &L, const Member &R) { 5177 return L.Name->getName() < R.Name->getName(); 5178 }); 5179 return Results; 5180 } 5181 5182 private: 5183 // Infer members of T, given that the expression E (dependent on T) is true. 5184 void believe(const Expr *E, const TemplateTypeParmType *T) { 5185 if (!E || !T) 5186 return; 5187 if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) { 5188 // If the concept is 5189 // template <class A, class B> concept CD = f<A, B>(); 5190 // And the concept specialization is 5191 // CD<int, T> 5192 // Then we're substituting T for B, so we want to make f<A, B>() true 5193 // by adding members to B - i.e. believe(f<A, B>(), B); 5194 // 5195 // For simplicity: 5196 // - we don't attempt to substitute int for A 5197 // - when T is used in other ways (like CD<T*>) we ignore it 5198 ConceptDecl *CD = CSE->getNamedConcept(); 5199 TemplateParameterList *Params = CD->getTemplateParameters(); 5200 unsigned Index = 0; 5201 for (const auto &Arg : CSE->getTemplateArguments()) { 5202 if (Index >= Params->size()) 5203 break; // Won't happen in valid code. 5204 if (isApprox(Arg, T)) { 5205 auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->getParam(Index)); 5206 if (!TTPD) 5207 continue; 5208 // T was used as an argument, and bound to the parameter TT. 5209 auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl()); 5210 // So now we know the constraint as a function of TT is true. 5211 believe(CD->getConstraintExpr(), TT); 5212 // (concepts themselves have no associated constraints to require) 5213 } 5214 5215 ++Index; 5216 } 5217 } else if (auto *BO = dyn_cast<BinaryOperator>(E)) { 5218 // For A && B, we can infer members from both branches. 5219 // For A || B, the union is still more useful than the intersection. 5220 if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) { 5221 believe(BO->getLHS(), T); 5222 believe(BO->getRHS(), T); 5223 } 5224 } else if (auto *RE = dyn_cast<RequiresExpr>(E)) { 5225 // A requires(){...} lets us infer members from each requirement. 5226 for (const concepts::Requirement *Req : RE->getRequirements()) { 5227 if (!Req->isDependent()) 5228 continue; // Can't tell us anything about T. 5229 // Now Req cannot a substitution-error: those aren't dependent. 5230 5231 if (auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) { 5232 // Do a full traversal so we get `foo` from `typename T::foo::bar`. 5233 QualType AssertedType = TR->getType()->getType(); 5234 ValidVisitor(this, T).TraverseType(AssertedType); 5235 } else if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 5236 ValidVisitor Visitor(this, T); 5237 // If we have a type constraint on the value of the expression, 5238 // AND the whole outer expression describes a member, then we'll 5239 // be able to use the constraint to provide the return type. 5240 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 5241 Visitor.OuterType = 5242 ER->getReturnTypeRequirement().getTypeConstraint(); 5243 Visitor.OuterExpr = ER->getExpr(); 5244 } 5245 Visitor.TraverseStmt(ER->getExpr()); 5246 } else if (auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) { 5247 believe(NR->getConstraintExpr(), T); 5248 } 5249 } 5250 } 5251 } 5252 5253 // This visitor infers members of T based on traversing expressions/types 5254 // that involve T. It is invoked with code known to be valid for T. 5255 class ValidVisitor : public RecursiveASTVisitor<ValidVisitor> { 5256 ConceptInfo *Outer; 5257 const TemplateTypeParmType *T; 5258 5259 CallExpr *Caller = nullptr; 5260 Expr *Callee = nullptr; 5261 5262 public: 5263 // If set, OuterExpr is constrained by OuterType. 5264 Expr *OuterExpr = nullptr; 5265 const TypeConstraint *OuterType = nullptr; 5266 5267 ValidVisitor(ConceptInfo *Outer, const TemplateTypeParmType *T) 5268 : Outer(Outer), T(T) { 5269 assert(T); 5270 } 5271 5272 // In T.foo or T->foo, `foo` is a member function/variable. 5273 bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) { 5274 const Type *Base = E->getBaseType().getTypePtr(); 5275 bool IsArrow = E->isArrow(); 5276 if (Base->isPointerType() && IsArrow) { 5277 IsArrow = false; 5278 Base = Base->getPointeeType().getTypePtr(); 5279 } 5280 if (isApprox(Base, T)) 5281 addValue(E, E->getMember(), IsArrow ? Member::Arrow : Member::Dot); 5282 return true; 5283 } 5284 5285 // In T::foo, `foo` is a static member function/variable. 5286 bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 5287 if (E->getQualifier() && isApprox(E->getQualifier()->getAsType(), T)) 5288 addValue(E, E->getDeclName(), Member::Colons); 5289 return true; 5290 } 5291 5292 // In T::typename foo, `foo` is a type. 5293 bool VisitDependentNameType(DependentNameType *DNT) { 5294 const auto *Q = DNT->getQualifier(); 5295 if (Q && isApprox(Q->getAsType(), T)) 5296 addType(DNT->getIdentifier()); 5297 return true; 5298 } 5299 5300 // In T::foo::bar, `foo` must be a type. 5301 // VisitNNS() doesn't exist, and TraverseNNS isn't always called :-( 5302 bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSL) { 5303 if (NNSL) { 5304 NestedNameSpecifier *NNS = NNSL.getNestedNameSpecifier(); 5305 const auto *Q = NNS->getPrefix(); 5306 if (Q && isApprox(Q->getAsType(), T)) 5307 addType(NNS->getAsIdentifier()); 5308 } 5309 // FIXME: also handle T::foo<X>::bar 5310 return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(NNSL); 5311 } 5312 5313 // FIXME also handle T::foo<X> 5314 5315 // Track the innermost caller/callee relationship so we can tell if a 5316 // nested expr is being called as a function. 5317 bool VisitCallExpr(CallExpr *CE) { 5318 Caller = CE; 5319 Callee = CE->getCallee(); 5320 return true; 5321 } 5322 5323 private: 5324 void addResult(Member &&M) { 5325 auto R = Outer->Results.try_emplace(M.Name); 5326 Member &O = R.first->second; 5327 // Overwrite existing if the new member has more info. 5328 // The preference of . vs :: vs -> is fairly arbitrary. 5329 if (/*Inserted*/ R.second || 5330 std::make_tuple(M.ArgTypes.hasValue(), M.ResultType != nullptr, 5331 M.Operator) > std::make_tuple(O.ArgTypes.hasValue(), 5332 O.ResultType != nullptr, 5333 O.Operator)) 5334 O = std::move(M); 5335 } 5336 5337 void addType(const IdentifierInfo *Name) { 5338 if (!Name) 5339 return; 5340 Member M; 5341 M.Name = Name; 5342 M.Operator = Member::Colons; 5343 addResult(std::move(M)); 5344 } 5345 5346 void addValue(Expr *E, DeclarationName Name, 5347 Member::AccessOperator Operator) { 5348 if (!Name.isIdentifier()) 5349 return; 5350 Member Result; 5351 Result.Name = Name.getAsIdentifierInfo(); 5352 Result.Operator = Operator; 5353 // If this is the callee of an immediately-enclosing CallExpr, then 5354 // treat it as a method, otherwise it's a variable. 5355 if (Caller != nullptr && Callee == E) { 5356 Result.ArgTypes.emplace(); 5357 for (const auto *Arg : Caller->arguments()) 5358 Result.ArgTypes->push_back(Arg->getType()); 5359 if (Caller == OuterExpr) { 5360 Result.ResultType = OuterType; 5361 } 5362 } else { 5363 if (E == OuterExpr) 5364 Result.ResultType = OuterType; 5365 } 5366 addResult(std::move(Result)); 5367 } 5368 }; 5369 5370 static bool isApprox(const TemplateArgument &Arg, const Type *T) { 5371 return Arg.getKind() == TemplateArgument::Type && 5372 isApprox(Arg.getAsType().getTypePtr(), T); 5373 } 5374 5375 static bool isApprox(const Type *T1, const Type *T2) { 5376 return T1 && T2 && 5377 T1->getCanonicalTypeUnqualified() == 5378 T2->getCanonicalTypeUnqualified(); 5379 } 5380 5381 // Returns the DeclContext immediately enclosed by the template parameter 5382 // scope. For primary templates, this is the templated (e.g.) CXXRecordDecl. 5383 // For specializations, this is e.g. ClassTemplatePartialSpecializationDecl. 5384 static DeclContext *getTemplatedEntity(const TemplateTypeParmDecl *D, 5385 Scope *S) { 5386 if (D == nullptr) 5387 return nullptr; 5388 Scope *Inner = nullptr; 5389 while (S) { 5390 if (S->isTemplateParamScope() && S->isDeclScope(D)) 5391 return Inner ? Inner->getEntity() : nullptr; 5392 Inner = S; 5393 S = S->getParent(); 5394 } 5395 return nullptr; 5396 } 5397 5398 // Gets all the type constraint expressions that might apply to the type 5399 // variables associated with DC (as returned by getTemplatedEntity()). 5400 static SmallVector<const Expr *, 1> 5401 constraintsForTemplatedEntity(DeclContext *DC) { 5402 SmallVector<const Expr *, 1> Result; 5403 if (DC == nullptr) 5404 return Result; 5405 // Primary templates can have constraints. 5406 if (const auto *TD = cast<Decl>(DC)->getDescribedTemplate()) 5407 TD->getAssociatedConstraints(Result); 5408 // Partial specializations may have constraints. 5409 if (const auto *CTPSD = 5410 dyn_cast<ClassTemplatePartialSpecializationDecl>(DC)) 5411 CTPSD->getAssociatedConstraints(Result); 5412 if (const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC)) 5413 VTPSD->getAssociatedConstraints(Result); 5414 return Result; 5415 } 5416 5417 // Attempt to find the unique type satisfying a constraint. 5418 // This lets us show e.g. `int` instead of `std::same_as<int>`. 5419 static QualType deduceType(const TypeConstraint &T) { 5420 // Assume a same_as<T> return type constraint is std::same_as or equivalent. 5421 // In this case the return type is T. 5422 DeclarationName DN = T.getNamedConcept()->getDeclName(); 5423 if (DN.isIdentifier() && DN.getAsIdentifierInfo()->isStr("same_as")) 5424 if (const auto *Args = T.getTemplateArgsAsWritten()) 5425 if (Args->getNumTemplateArgs() == 1) { 5426 const auto &Arg = Args->arguments().front().getArgument(); 5427 if (Arg.getKind() == TemplateArgument::Type) 5428 return Arg.getAsType(); 5429 } 5430 return {}; 5431 } 5432 5433 llvm::DenseMap<const IdentifierInfo *, Member> Results; 5434 }; 5435 5436 // Returns a type for E that yields acceptable member completions. 5437 // In particular, when E->getType() is DependentTy, try to guess a likely type. 5438 // We accept some lossiness (like dropping parameters). 5439 // We only try to handle common expressions on the LHS of MemberExpr. 5440 QualType getApproximateType(const Expr *E) { 5441 QualType Unresolved = E->getType(); 5442 if (Unresolved.isNull() || 5443 !Unresolved->isSpecificBuiltinType(BuiltinType::Dependent)) 5444 return Unresolved; 5445 E = E->IgnoreParens(); 5446 // A call: approximate-resolve callee to a function type, get its return type 5447 if (const CallExpr *CE = llvm::dyn_cast<CallExpr>(E)) { 5448 QualType Callee = getApproximateType(CE->getCallee()); 5449 if (Callee.isNull() || 5450 Callee->isSpecificPlaceholderType(BuiltinType::BoundMember)) 5451 Callee = Expr::findBoundMemberType(CE->getCallee()); 5452 if (Callee.isNull()) 5453 return Unresolved; 5454 5455 if (const auto *FnTypePtr = Callee->getAs<PointerType>()) { 5456 Callee = FnTypePtr->getPointeeType(); 5457 } else if (const auto *BPT = Callee->getAs<BlockPointerType>()) { 5458 Callee = BPT->getPointeeType(); 5459 } 5460 if (const FunctionType *FnType = Callee->getAs<FunctionType>()) 5461 return FnType->getReturnType().getNonReferenceType(); 5462 5463 // Unresolved call: try to guess the return type. 5464 if (const auto *OE = llvm::dyn_cast<OverloadExpr>(CE->getCallee())) { 5465 // If all candidates have the same approximate return type, use it. 5466 // Discard references and const to allow more to be "the same". 5467 // (In particular, if there's one candidate + ADL, resolve it). 5468 const Type *Common = nullptr; 5469 for (const auto *D : OE->decls()) { 5470 QualType ReturnType; 5471 if (const auto *FD = llvm::dyn_cast<FunctionDecl>(D)) 5472 ReturnType = FD->getReturnType(); 5473 else if (const auto *FTD = llvm::dyn_cast<FunctionTemplateDecl>(D)) 5474 ReturnType = FTD->getTemplatedDecl()->getReturnType(); 5475 if (ReturnType.isNull()) 5476 continue; 5477 const Type *Candidate = 5478 ReturnType.getNonReferenceType().getCanonicalType().getTypePtr(); 5479 if (Common && Common != Candidate) 5480 return Unresolved; // Multiple candidates. 5481 Common = Candidate; 5482 } 5483 if (Common != nullptr) 5484 return QualType(Common, 0); 5485 } 5486 } 5487 // A dependent member: approximate-resolve the base, then lookup. 5488 if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) { 5489 QualType Base = CDSME->isImplicitAccess() 5490 ? CDSME->getBaseType() 5491 : getApproximateType(CDSME->getBase()); 5492 if (CDSME->isArrow() && !Base.isNull()) 5493 Base = Base->getPointeeType(); // could handle unique_ptr etc here? 5494 RecordDecl *RD = Base.isNull() ? nullptr : getAsRecordDecl(Base); 5495 if (RD && RD->isCompleteDefinition()) { 5496 for (const auto *Member : RD->lookup(CDSME->getMember())) 5497 if (const ValueDecl *VD = llvm::dyn_cast<ValueDecl>(Member)) 5498 return VD->getType().getNonReferenceType(); 5499 } 5500 } 5501 return Unresolved; 5502 } 5503 5504 // If \p Base is ParenListExpr, assume a chain of comma operators and pick the 5505 // last expr. We expect other ParenListExprs to be resolved to e.g. constructor 5506 // calls before here. (So the ParenListExpr should be nonempty, but check just 5507 // in case) 5508 Expr *unwrapParenList(Expr *Base) { 5509 if (auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) { 5510 if (PLE->getNumExprs() == 0) 5511 return nullptr; 5512 Base = PLE->getExpr(PLE->getNumExprs() - 1); 5513 } 5514 return Base; 5515 } 5516 5517 } // namespace 5518 5519 void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, 5520 Expr *OtherOpBase, 5521 SourceLocation OpLoc, bool IsArrow, 5522 bool IsBaseExprStatement, 5523 QualType PreferredType) { 5524 Base = unwrapParenList(Base); 5525 OtherOpBase = unwrapParenList(OtherOpBase); 5526 if (!Base || !CodeCompleter) 5527 return; 5528 5529 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 5530 if (ConvertedBase.isInvalid()) 5531 return; 5532 QualType ConvertedBaseType = getApproximateType(ConvertedBase.get()); 5533 5534 enum CodeCompletionContext::Kind contextKind; 5535 5536 if (IsArrow) { 5537 if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>()) 5538 ConvertedBaseType = Ptr->getPointeeType(); 5539 } 5540 5541 if (IsArrow) { 5542 contextKind = CodeCompletionContext::CCC_ArrowMemberAccess; 5543 } else { 5544 if (ConvertedBaseType->isObjCObjectPointerType() || 5545 ConvertedBaseType->isObjCObjectOrInterfaceType()) { 5546 contextKind = CodeCompletionContext::CCC_ObjCPropertyAccess; 5547 } else { 5548 contextKind = CodeCompletionContext::CCC_DotMemberAccess; 5549 } 5550 } 5551 5552 CodeCompletionContext CCContext(contextKind, ConvertedBaseType); 5553 CCContext.setPreferredType(PreferredType); 5554 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5555 CodeCompleter->getCodeCompletionTUInfo(), CCContext, 5556 &ResultBuilder::IsMember); 5557 5558 auto DoCompletion = [&](Expr *Base, bool IsArrow, 5559 Optional<FixItHint> AccessOpFixIt) -> bool { 5560 if (!Base) 5561 return false; 5562 5563 ExprResult ConvertedBase = PerformMemberExprBaseConversion(Base, IsArrow); 5564 if (ConvertedBase.isInvalid()) 5565 return false; 5566 Base = ConvertedBase.get(); 5567 5568 QualType BaseType = getApproximateType(Base); 5569 if (BaseType.isNull()) 5570 return false; 5571 ExprValueKind BaseKind = Base->getValueKind(); 5572 5573 if (IsArrow) { 5574 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) { 5575 BaseType = Ptr->getPointeeType(); 5576 BaseKind = VK_LValue; 5577 } else if (BaseType->isObjCObjectPointerType() || 5578 BaseType->isTemplateTypeParmType()) { 5579 // Both cases (dot/arrow) handled below. 5580 } else { 5581 return false; 5582 } 5583 } 5584 5585 if (RecordDecl *RD = getAsRecordDecl(BaseType)) { 5586 AddRecordMembersCompletionResults(*this, Results, S, BaseType, BaseKind, 5587 RD, std::move(AccessOpFixIt)); 5588 } else if (const auto *TTPT = 5589 dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) { 5590 auto Operator = 5591 IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot; 5592 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 5593 if (R.Operator != Operator) 5594 continue; 5595 CodeCompletionResult Result( 5596 R.render(*this, CodeCompleter->getAllocator(), 5597 CodeCompleter->getCodeCompletionTUInfo())); 5598 if (AccessOpFixIt) 5599 Result.FixIts.push_back(*AccessOpFixIt); 5600 Results.AddResult(std::move(Result)); 5601 } 5602 } else if (!IsArrow && BaseType->isObjCObjectPointerType()) { 5603 // Objective-C property reference. Bail if we're performing fix-it code 5604 // completion since Objective-C properties are normally backed by ivars, 5605 // most Objective-C fix-its here would have little value. 5606 if (AccessOpFixIt.hasValue()) { 5607 return false; 5608 } 5609 AddedPropertiesSet AddedProperties; 5610 5611 if (const ObjCObjectPointerType *ObjCPtr = 5612 BaseType->getAsObjCInterfacePointerType()) { 5613 // Add property results based on our interface. 5614 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 5615 AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true, 5616 /*AllowNullaryMethods=*/true, CurContext, 5617 AddedProperties, Results, IsBaseExprStatement); 5618 } 5619 5620 // Add properties from the protocols in a qualified interface. 5621 for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals()) 5622 AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true, 5623 CurContext, AddedProperties, Results, 5624 IsBaseExprStatement, /*IsClassProperty*/ false, 5625 /*InOriginalClass*/ false); 5626 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 5627 (!IsArrow && BaseType->isObjCObjectType())) { 5628 // Objective-C instance variable access. Bail if we're performing fix-it 5629 // code completion since Objective-C properties are normally backed by 5630 // ivars, most Objective-C fix-its here would have little value. 5631 if (AccessOpFixIt.hasValue()) { 5632 return false; 5633 } 5634 ObjCInterfaceDecl *Class = nullptr; 5635 if (const ObjCObjectPointerType *ObjCPtr = 5636 BaseType->getAs<ObjCObjectPointerType>()) 5637 Class = ObjCPtr->getInterfaceDecl(); 5638 else 5639 Class = BaseType->castAs<ObjCObjectType>()->getInterface(); 5640 5641 // Add all ivars from this class and its superclasses. 5642 if (Class) { 5643 CodeCompletionDeclConsumer Consumer(Results, Class, BaseType); 5644 Results.setFilter(&ResultBuilder::IsObjCIvar); 5645 LookupVisibleDecls( 5646 Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(), 5647 /*IncludeDependentBases=*/false, CodeCompleter->loadExternal()); 5648 } 5649 } 5650 5651 // FIXME: How do we cope with isa? 5652 return true; 5653 }; 5654 5655 Results.EnterNewScope(); 5656 5657 bool CompletionSucceded = DoCompletion(Base, IsArrow, None); 5658 if (CodeCompleter->includeFixIts()) { 5659 const CharSourceRange OpRange = 5660 CharSourceRange::getTokenRange(OpLoc, OpLoc); 5661 CompletionSucceded |= DoCompletion( 5662 OtherOpBase, !IsArrow, 5663 FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->")); 5664 } 5665 5666 Results.ExitScope(); 5667 5668 if (!CompletionSucceded) 5669 return; 5670 5671 // Hand off the results found for code completion. 5672 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5673 Results.data(), Results.size()); 5674 } 5675 5676 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S, 5677 IdentifierInfo &ClassName, 5678 SourceLocation ClassNameLoc, 5679 bool IsBaseExprStatement) { 5680 IdentifierInfo *ClassNamePtr = &ClassName; 5681 ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc); 5682 if (!IFace) 5683 return; 5684 CodeCompletionContext CCContext( 5685 CodeCompletionContext::CCC_ObjCPropertyAccess); 5686 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5687 CodeCompleter->getCodeCompletionTUInfo(), CCContext, 5688 &ResultBuilder::IsMember); 5689 Results.EnterNewScope(); 5690 AddedPropertiesSet AddedProperties; 5691 AddObjCProperties(CCContext, IFace, true, 5692 /*AllowNullaryMethods=*/true, CurContext, AddedProperties, 5693 Results, IsBaseExprStatement, 5694 /*IsClassProperty=*/true); 5695 Results.ExitScope(); 5696 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5697 Results.data(), Results.size()); 5698 } 5699 5700 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 5701 if (!CodeCompleter) 5702 return; 5703 5704 ResultBuilder::LookupFilter Filter = nullptr; 5705 enum CodeCompletionContext::Kind ContextKind = 5706 CodeCompletionContext::CCC_Other; 5707 switch ((DeclSpec::TST)TagSpec) { 5708 case DeclSpec::TST_enum: 5709 Filter = &ResultBuilder::IsEnum; 5710 ContextKind = CodeCompletionContext::CCC_EnumTag; 5711 break; 5712 5713 case DeclSpec::TST_union: 5714 Filter = &ResultBuilder::IsUnion; 5715 ContextKind = CodeCompletionContext::CCC_UnionTag; 5716 break; 5717 5718 case DeclSpec::TST_struct: 5719 case DeclSpec::TST_class: 5720 case DeclSpec::TST_interface: 5721 Filter = &ResultBuilder::IsClassOrStruct; 5722 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 5723 break; 5724 5725 default: 5726 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 5727 } 5728 5729 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5730 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 5731 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5732 5733 // First pass: look for tags. 5734 Results.setFilter(Filter); 5735 LookupVisibleDecls(S, LookupTagName, Consumer, 5736 CodeCompleter->includeGlobals(), 5737 CodeCompleter->loadExternal()); 5738 5739 if (CodeCompleter->includeGlobals()) { 5740 // Second pass: look for nested name specifiers. 5741 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 5742 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 5743 CodeCompleter->includeGlobals(), 5744 CodeCompleter->loadExternal()); 5745 } 5746 5747 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5748 Results.data(), Results.size()); 5749 } 5750 5751 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results, 5752 const LangOptions &LangOpts) { 5753 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 5754 Results.AddResult("const"); 5755 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 5756 Results.AddResult("volatile"); 5757 if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 5758 Results.AddResult("restrict"); 5759 if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic)) 5760 Results.AddResult("_Atomic"); 5761 if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)) 5762 Results.AddResult("__unaligned"); 5763 } 5764 5765 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 5766 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5767 CodeCompleter->getCodeCompletionTUInfo(), 5768 CodeCompletionContext::CCC_TypeQualifiers); 5769 Results.EnterNewScope(); 5770 AddTypeQualifierResults(DS, Results, LangOpts); 5771 Results.ExitScope(); 5772 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5773 Results.data(), Results.size()); 5774 } 5775 5776 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D, 5777 const VirtSpecifiers *VS) { 5778 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5779 CodeCompleter->getCodeCompletionTUInfo(), 5780 CodeCompletionContext::CCC_TypeQualifiers); 5781 Results.EnterNewScope(); 5782 AddTypeQualifierResults(DS, Results, LangOpts); 5783 if (LangOpts.CPlusPlus11) { 5784 Results.AddResult("noexcept"); 5785 if (D.getContext() == DeclaratorContext::Member && !D.isCtorOrDtor() && 5786 !D.isStaticMember()) { 5787 if (!VS || !VS->isFinalSpecified()) 5788 Results.AddResult("final"); 5789 if (!VS || !VS->isOverrideSpecified()) 5790 Results.AddResult("override"); 5791 } 5792 } 5793 Results.ExitScope(); 5794 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5795 Results.data(), Results.size()); 5796 } 5797 5798 void Sema::CodeCompleteBracketDeclarator(Scope *S) { 5799 CodeCompleteExpression(S, QualType(getASTContext().getSizeType())); 5800 } 5801 5802 void Sema::CodeCompleteCase(Scope *S) { 5803 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 5804 return; 5805 5806 SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer(); 5807 // Condition expression might be invalid, do not continue in this case. 5808 if (!Switch->getCond()) 5809 return; 5810 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 5811 if (!type->isEnumeralType()) { 5812 CodeCompleteExpressionData Data(type); 5813 Data.IntegralConstantExpression = true; 5814 CodeCompleteExpression(S, Data); 5815 return; 5816 } 5817 5818 // Code-complete the cases of a switch statement over an enumeration type 5819 // by providing the list of 5820 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 5821 if (EnumDecl *Def = Enum->getDefinition()) 5822 Enum = Def; 5823 5824 // Determine which enumerators we have already seen in the switch statement. 5825 // FIXME: Ideally, we would also be able to look *past* the code-completion 5826 // token, in case we are code-completing in the middle of the switch and not 5827 // at the end. However, we aren't able to do so at the moment. 5828 CoveredEnumerators Enumerators; 5829 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 5830 SC = SC->getNextSwitchCase()) { 5831 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 5832 if (!Case) 5833 continue; 5834 5835 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 5836 if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 5837 if (auto *Enumerator = 5838 dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 5839 // We look into the AST of the case statement to determine which 5840 // enumerator was named. Alternatively, we could compute the value of 5841 // the integral constant expression, then compare it against the 5842 // values of each enumerator. However, value-based approach would not 5843 // work as well with C++ templates where enumerators declared within a 5844 // template are type- and value-dependent. 5845 Enumerators.Seen.insert(Enumerator); 5846 5847 // If this is a qualified-id, keep track of the nested-name-specifier 5848 // so that we can reproduce it as part of code completion, e.g., 5849 // 5850 // switch (TagD.getKind()) { 5851 // case TagDecl::TK_enum: 5852 // break; 5853 // case XXX 5854 // 5855 // At the XXX, our completions are TagDecl::TK_union, 5856 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 5857 // TK_struct, and TK_class. 5858 Enumerators.SuggestedQualifier = DRE->getQualifier(); 5859 } 5860 } 5861 5862 // Add any enumerators that have not yet been mentioned. 5863 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5864 CodeCompleter->getCodeCompletionTUInfo(), 5865 CodeCompletionContext::CCC_Expression); 5866 AddEnumerators(Results, Context, Enum, CurContext, Enumerators); 5867 5868 if (CodeCompleter->includeMacros()) { 5869 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 5870 } 5871 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5872 Results.data(), Results.size()); 5873 } 5874 5875 static bool anyNullArguments(ArrayRef<Expr *> Args) { 5876 if (Args.size() && !Args.data()) 5877 return true; 5878 5879 for (unsigned I = 0; I != Args.size(); ++I) 5880 if (!Args[I]) 5881 return true; 5882 5883 return false; 5884 } 5885 5886 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 5887 5888 static void mergeCandidatesWithResults( 5889 Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results, 5890 OverloadCandidateSet &CandidateSet, SourceLocation Loc, size_t ArgSize) { 5891 // Sort the overload candidate set by placing the best overloads first. 5892 llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X, 5893 const OverloadCandidate &Y) { 5894 return isBetterOverloadCandidate(SemaRef, X, Y, Loc, 5895 CandidateSet.getKind()); 5896 }); 5897 5898 // Add the remaining viable overload candidates as code-completion results. 5899 for (OverloadCandidate &Candidate : CandidateSet) { 5900 if (Candidate.Function) { 5901 if (Candidate.Function->isDeleted()) 5902 continue; 5903 if (shouldEnforceArgLimit(/*PartialOverloading=*/true, 5904 Candidate.Function) && 5905 Candidate.Function->getNumParams() <= ArgSize && 5906 // Having zero args is annoying, normally we don't surface a function 5907 // with 2 params, if you already have 2 params, because you are 5908 // inserting the 3rd now. But with zero, it helps the user to figure 5909 // out there are no overloads that take any arguments. Hence we are 5910 // keeping the overload. 5911 ArgSize > 0) 5912 continue; 5913 } 5914 if (Candidate.Viable) 5915 Results.push_back(ResultCandidate(Candidate.Function)); 5916 } 5917 } 5918 5919 /// Get the type of the Nth parameter from a given set of overload 5920 /// candidates. 5921 static QualType getParamType(Sema &SemaRef, 5922 ArrayRef<ResultCandidate> Candidates, unsigned N) { 5923 5924 // Given the overloads 'Candidates' for a function call matching all arguments 5925 // up to N, return the type of the Nth parameter if it is the same for all 5926 // overload candidates. 5927 QualType ParamType; 5928 for (auto &Candidate : Candidates) { 5929 // FIXME: handle non-type-template-parameters by merging with D116326 5930 if (const auto *FType = Candidate.getFunctionType()) 5931 if (const auto *Proto = dyn_cast<FunctionProtoType>(FType)) 5932 if (N < Proto->getNumParams()) { 5933 if (ParamType.isNull()) 5934 ParamType = Proto->getParamType(N); 5935 else if (!SemaRef.Context.hasSameUnqualifiedType( 5936 ParamType.getNonReferenceType(), 5937 Proto->getParamType(N).getNonReferenceType())) 5938 // Otherwise return a default-constructed QualType. 5939 return QualType(); 5940 } 5941 } 5942 5943 return ParamType; 5944 } 5945 5946 static QualType 5947 ProduceSignatureHelp(Sema &SemaRef, MutableArrayRef<ResultCandidate> Candidates, 5948 unsigned CurrentArg, SourceLocation OpenParLoc, 5949 bool Braced) { 5950 if (Candidates.empty()) 5951 return QualType(); 5952 if (SemaRef.getPreprocessor().isCodeCompletionReached()) 5953 SemaRef.CodeCompleter->ProcessOverloadCandidates( 5954 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc, 5955 Braced); 5956 return getParamType(SemaRef, Candidates, CurrentArg); 5957 } 5958 5959 QualType Sema::ProduceCallSignatureHelp(Expr *Fn, ArrayRef<Expr *> Args, 5960 SourceLocation OpenParLoc) { 5961 Fn = unwrapParenList(Fn); 5962 if (!CodeCompleter || !Fn) 5963 return QualType(); 5964 5965 // FIXME: Provide support for variadic template functions. 5966 // Ignore type-dependent call expressions entirely. 5967 if (Fn->isTypeDependent() || anyNullArguments(Args)) 5968 return QualType(); 5969 // In presence of dependent args we surface all possible signatures using the 5970 // non-dependent args in the prefix. Afterwards we do a post filtering to make 5971 // sure provided candidates satisfy parameter count restrictions. 5972 auto ArgsWithoutDependentTypes = 5973 Args.take_while([](Expr *Arg) { return !Arg->isTypeDependent(); }); 5974 5975 SmallVector<ResultCandidate, 8> Results; 5976 5977 Expr *NakedFn = Fn->IgnoreParenCasts(); 5978 // Build an overload candidate set based on the functions we find. 5979 SourceLocation Loc = Fn->getExprLoc(); 5980 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 5981 5982 if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) { 5983 AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes, CandidateSet, 5984 /*PartialOverloading=*/true); 5985 } else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) { 5986 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; 5987 if (UME->hasExplicitTemplateArgs()) { 5988 UME->copyTemplateArgumentsInto(TemplateArgsBuffer); 5989 TemplateArgs = &TemplateArgsBuffer; 5990 } 5991 5992 // Add the base as first argument (use a nullptr if the base is implicit). 5993 SmallVector<Expr *, 12> ArgExprs( 5994 1, UME->isImplicitAccess() ? nullptr : UME->getBase()); 5995 ArgExprs.append(ArgsWithoutDependentTypes.begin(), 5996 ArgsWithoutDependentTypes.end()); 5997 UnresolvedSet<8> Decls; 5998 Decls.append(UME->decls_begin(), UME->decls_end()); 5999 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase(); 6000 AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs, 6001 /*SuppressUserConversions=*/false, 6002 /*PartialOverloading=*/true, FirstArgumentIsBase); 6003 } else { 6004 FunctionDecl *FD = nullptr; 6005 if (auto *MCE = dyn_cast<MemberExpr>(NakedFn)) 6006 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl()); 6007 else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) 6008 FD = dyn_cast<FunctionDecl>(DRE->getDecl()); 6009 if (FD) { // We check whether it's a resolved function declaration. 6010 if (!getLangOpts().CPlusPlus || 6011 !FD->getType()->getAs<FunctionProtoType>()) 6012 Results.push_back(ResultCandidate(FD)); 6013 else 6014 AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()), 6015 ArgsWithoutDependentTypes, CandidateSet, 6016 /*SuppressUserConversions=*/false, 6017 /*PartialOverloading=*/true); 6018 6019 } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) { 6020 // If expression's type is CXXRecordDecl, it may overload the function 6021 // call operator, so we check if it does and add them as candidates. 6022 // A complete type is needed to lookup for member function call operators. 6023 if (isCompleteType(Loc, NakedFn->getType())) { 6024 DeclarationName OpName = 6025 Context.DeclarationNames.getCXXOperatorName(OO_Call); 6026 LookupResult R(*this, OpName, Loc, LookupOrdinaryName); 6027 LookupQualifiedName(R, DC); 6028 R.suppressDiagnostics(); 6029 SmallVector<Expr *, 12> ArgExprs(1, NakedFn); 6030 ArgExprs.append(ArgsWithoutDependentTypes.begin(), 6031 ArgsWithoutDependentTypes.end()); 6032 AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet, 6033 /*ExplicitArgs=*/nullptr, 6034 /*SuppressUserConversions=*/false, 6035 /*PartialOverloading=*/true); 6036 } 6037 } else { 6038 // Lastly we check whether expression's type is function pointer or 6039 // function. 6040 QualType T = NakedFn->getType(); 6041 if (!T->getPointeeType().isNull()) 6042 T = T->getPointeeType(); 6043 6044 if (auto FP = T->getAs<FunctionProtoType>()) { 6045 if (!TooManyArguments(FP->getNumParams(), 6046 ArgsWithoutDependentTypes.size(), 6047 /*PartialOverloading=*/true) || 6048 FP->isVariadic()) 6049 Results.push_back(ResultCandidate(FP)); 6050 } else if (auto FT = T->getAs<FunctionType>()) 6051 // No prototype and declaration, it may be a K & R style function. 6052 Results.push_back(ResultCandidate(FT)); 6053 } 6054 } 6055 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size()); 6056 QualType ParamType = ProduceSignatureHelp(*this, Results, Args.size(), 6057 OpenParLoc, /*Braced=*/false); 6058 return !CandidateSet.empty() ? ParamType : QualType(); 6059 } 6060 6061 QualType Sema::ProduceConstructorSignatureHelp(QualType Type, 6062 SourceLocation Loc, 6063 ArrayRef<Expr *> Args, 6064 SourceLocation OpenParLoc, 6065 bool Braced) { 6066 if (!CodeCompleter) 6067 return QualType(); 6068 6069 // A complete type is needed to lookup for constructors. 6070 CXXRecordDecl *RD = 6071 isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr; 6072 if (!RD) 6073 return Type; 6074 // FIXME: we don't support signature help for aggregate initialization, so 6075 // don't offer a confusing partial list (e.g. the copy constructor). 6076 if (Braced && RD->isAggregate()) 6077 return Type; 6078 6079 // FIXME: Provide support for member initializers. 6080 // FIXME: Provide support for variadic template constructors. 6081 6082 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 6083 6084 for (NamedDecl *C : LookupConstructors(RD)) { 6085 if (auto *FD = dyn_cast<FunctionDecl>(C)) { 6086 // FIXME: we can't yet provide correct signature help for initializer 6087 // list constructors, so skip them entirely. 6088 if (Braced && LangOpts.CPlusPlus && isInitListConstructor(FD)) 6089 continue; 6090 AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args, 6091 CandidateSet, 6092 /*SuppressUserConversions=*/false, 6093 /*PartialOverloading=*/true, 6094 /*AllowExplicit*/ true); 6095 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) { 6096 if (Braced && LangOpts.CPlusPlus && 6097 isInitListConstructor(FTD->getTemplatedDecl())) 6098 continue; 6099 6100 AddTemplateOverloadCandidate( 6101 FTD, DeclAccessPair::make(FTD, C->getAccess()), 6102 /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet, 6103 /*SuppressUserConversions=*/false, 6104 /*PartialOverloading=*/true); 6105 } 6106 } 6107 6108 SmallVector<ResultCandidate, 8> Results; 6109 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc, Args.size()); 6110 return ProduceSignatureHelp(*this, Results, Args.size(), OpenParLoc, Braced); 6111 } 6112 6113 QualType Sema::ProduceCtorInitMemberSignatureHelp( 6114 Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy, 6115 ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc, 6116 bool Braced) { 6117 if (!CodeCompleter) 6118 return QualType(); 6119 6120 CXXConstructorDecl *Constructor = 6121 dyn_cast<CXXConstructorDecl>(ConstructorDecl); 6122 if (!Constructor) 6123 return QualType(); 6124 // FIXME: Add support for Base class constructors as well. 6125 if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl( 6126 Constructor->getParent(), SS, TemplateTypeTy, II)) 6127 return ProduceConstructorSignatureHelp(MemberDecl->getType(), 6128 MemberDecl->getLocation(), ArgExprs, 6129 OpenParLoc, Braced); 6130 return QualType(); 6131 } 6132 6133 static bool argMatchesTemplateParams(const ParsedTemplateArgument &Arg, 6134 unsigned Index, 6135 const TemplateParameterList &Params) { 6136 const NamedDecl *Param; 6137 if (Index < Params.size()) 6138 Param = Params.getParam(Index); 6139 else if (Params.hasParameterPack()) 6140 Param = Params.asArray().back(); 6141 else 6142 return false; // too many args 6143 6144 switch (Arg.getKind()) { 6145 case ParsedTemplateArgument::Type: 6146 return llvm::isa<TemplateTypeParmDecl>(Param); // constraints not checked 6147 case ParsedTemplateArgument::NonType: 6148 return llvm::isa<NonTypeTemplateParmDecl>(Param); // type not checked 6149 case ParsedTemplateArgument::Template: 6150 return llvm::isa<TemplateTemplateParmDecl>(Param); // signature not checked 6151 } 6152 llvm_unreachable("Unhandled switch case"); 6153 } 6154 6155 QualType Sema::ProduceTemplateArgumentSignatureHelp( 6156 TemplateTy ParsedTemplate, ArrayRef<ParsedTemplateArgument> Args, 6157 SourceLocation LAngleLoc) { 6158 if (!CodeCompleter || !ParsedTemplate) 6159 return QualType(); 6160 6161 SmallVector<ResultCandidate, 8> Results; 6162 auto Consider = [&](const TemplateDecl *TD) { 6163 // Only add if the existing args are compatible with the template. 6164 bool Matches = true; 6165 for (unsigned I = 0; I < Args.size(); ++I) { 6166 if (!argMatchesTemplateParams(Args[I], I, *TD->getTemplateParameters())) { 6167 Matches = false; 6168 break; 6169 } 6170 } 6171 if (Matches) 6172 Results.emplace_back(TD); 6173 }; 6174 6175 TemplateName Template = ParsedTemplate.get(); 6176 if (const auto *TD = Template.getAsTemplateDecl()) { 6177 Consider(TD); 6178 } else if (const auto *OTS = Template.getAsOverloadedTemplate()) { 6179 for (const NamedDecl *ND : *OTS) 6180 if (const auto *TD = llvm::dyn_cast<TemplateDecl>(ND)) 6181 Consider(TD); 6182 } 6183 return ProduceSignatureHelp(*this, Results, Args.size(), LAngleLoc, 6184 /*Braced=*/false); 6185 } 6186 6187 static QualType getDesignatedType(QualType BaseType, const Designation &Desig) { 6188 for (unsigned I = 0; I < Desig.getNumDesignators(); ++I) { 6189 if (BaseType.isNull()) 6190 break; 6191 QualType NextType; 6192 const auto &D = Desig.getDesignator(I); 6193 if (D.isArrayDesignator() || D.isArrayRangeDesignator()) { 6194 if (BaseType->isArrayType()) 6195 NextType = BaseType->getAsArrayTypeUnsafe()->getElementType(); 6196 } else { 6197 assert(D.isFieldDesignator()); 6198 auto *RD = getAsRecordDecl(BaseType); 6199 if (RD && RD->isCompleteDefinition()) { 6200 for (const auto *Member : RD->lookup(D.getField())) 6201 if (const FieldDecl *FD = llvm::dyn_cast<FieldDecl>(Member)) { 6202 NextType = FD->getType(); 6203 break; 6204 } 6205 } 6206 } 6207 BaseType = NextType; 6208 } 6209 return BaseType; 6210 } 6211 6212 void Sema::CodeCompleteDesignator(QualType BaseType, 6213 llvm::ArrayRef<Expr *> InitExprs, 6214 const Designation &D) { 6215 BaseType = getDesignatedType(BaseType, D); 6216 if (BaseType.isNull()) 6217 return; 6218 const auto *RD = getAsRecordDecl(BaseType); 6219 if (!RD || RD->fields().empty()) 6220 return; 6221 6222 CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess, 6223 BaseType); 6224 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6225 CodeCompleter->getCodeCompletionTUInfo(), CCC); 6226 6227 Results.EnterNewScope(); 6228 for (const auto *FD : RD->fields()) { 6229 // FIXME: Make use of previous designators to mark any fields before those 6230 // inaccessible, and also compute the next initializer priority. 6231 ResultBuilder::Result Result(FD, Results.getBasePriority(FD)); 6232 Results.AddResult(Result, CurContext, /*Hiding=*/nullptr); 6233 } 6234 Results.ExitScope(); 6235 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6236 Results.data(), Results.size()); 6237 } 6238 6239 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 6240 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 6241 if (!VD) { 6242 CodeCompleteOrdinaryName(S, PCC_Expression); 6243 return; 6244 } 6245 6246 CodeCompleteExpressionData Data; 6247 Data.PreferredType = VD->getType(); 6248 // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'. 6249 Data.IgnoreDecls.push_back(VD); 6250 6251 CodeCompleteExpression(S, Data); 6252 } 6253 6254 void Sema::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) { 6255 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6256 CodeCompleter->getCodeCompletionTUInfo(), 6257 mapCodeCompletionContext(*this, PCC_Statement)); 6258 Results.setFilter(&ResultBuilder::IsOrdinaryName); 6259 Results.EnterNewScope(); 6260 6261 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6262 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6263 CodeCompleter->includeGlobals(), 6264 CodeCompleter->loadExternal()); 6265 6266 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 6267 6268 // "else" block 6269 CodeCompletionBuilder Builder(Results.getAllocator(), 6270 Results.getCodeCompletionTUInfo()); 6271 6272 auto AddElseBodyPattern = [&] { 6273 if (IsBracedThen) { 6274 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6275 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6276 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6277 Builder.AddPlaceholderChunk("statements"); 6278 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6279 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6280 } else { 6281 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 6282 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6283 Builder.AddPlaceholderChunk("statement"); 6284 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 6285 } 6286 }; 6287 Builder.AddTypedTextChunk("else"); 6288 if (Results.includeCodePatterns()) 6289 AddElseBodyPattern(); 6290 Results.AddResult(Builder.TakeString()); 6291 6292 // "else if" block 6293 Builder.AddTypedTextChunk("else if"); 6294 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6295 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6296 if (getLangOpts().CPlusPlus) 6297 Builder.AddPlaceholderChunk("condition"); 6298 else 6299 Builder.AddPlaceholderChunk("expression"); 6300 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6301 if (Results.includeCodePatterns()) { 6302 AddElseBodyPattern(); 6303 } 6304 Results.AddResult(Builder.TakeString()); 6305 6306 Results.ExitScope(); 6307 6308 if (S->getFnParent()) 6309 AddPrettyFunctionResults(getLangOpts(), Results); 6310 6311 if (CodeCompleter->includeMacros()) 6312 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 6313 6314 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6315 Results.data(), Results.size()); 6316 } 6317 6318 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 6319 bool EnteringContext, 6320 bool IsUsingDeclaration, QualType BaseType, 6321 QualType PreferredType) { 6322 if (SS.isEmpty() || !CodeCompleter) 6323 return; 6324 6325 CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType); 6326 CC.setIsUsingDeclaration(IsUsingDeclaration); 6327 CC.setCXXScopeSpecifier(SS); 6328 6329 // We want to keep the scope specifier even if it's invalid (e.g. the scope 6330 // "a::b::" is not corresponding to any context/namespace in the AST), since 6331 // it can be useful for global code completion which have information about 6332 // contexts/symbols that are not in the AST. 6333 if (SS.isInvalid()) { 6334 // As SS is invalid, we try to collect accessible contexts from the current 6335 // scope with a dummy lookup so that the completion consumer can try to 6336 // guess what the specified scope is. 6337 ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(), 6338 CodeCompleter->getCodeCompletionTUInfo(), CC); 6339 if (!PreferredType.isNull()) 6340 DummyResults.setPreferredType(PreferredType); 6341 if (S->getEntity()) { 6342 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(), 6343 BaseType); 6344 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6345 /*IncludeGlobalScope=*/false, 6346 /*LoadExternal=*/false); 6347 } 6348 HandleCodeCompleteResults(this, CodeCompleter, 6349 DummyResults.getCompletionContext(), nullptr, 0); 6350 return; 6351 } 6352 // Always pretend to enter a context to ensure that a dependent type 6353 // resolves to a dependent record. 6354 DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true); 6355 6356 // Try to instantiate any non-dependent declaration contexts before 6357 // we look in them. Bail out if we fail. 6358 NestedNameSpecifier *NNS = SS.getScopeRep(); 6359 if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) { 6360 if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx)) 6361 return; 6362 } 6363 6364 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6365 CodeCompleter->getCodeCompletionTUInfo(), CC); 6366 if (!PreferredType.isNull()) 6367 Results.setPreferredType(PreferredType); 6368 Results.EnterNewScope(); 6369 6370 // The "template" keyword can follow "::" in the grammar, but only 6371 // put it into the grammar if the nested-name-specifier is dependent. 6372 // FIXME: results is always empty, this appears to be dead. 6373 if (!Results.empty() && NNS->isDependent()) 6374 Results.AddResult("template"); 6375 6376 // If the scope is a concept-constrained type parameter, infer nested 6377 // members based on the constraints. 6378 if (const auto *TTPT = 6379 dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) { 6380 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 6381 if (R.Operator != ConceptInfo::Member::Colons) 6382 continue; 6383 Results.AddResult(CodeCompletionResult( 6384 R.render(*this, CodeCompleter->getAllocator(), 6385 CodeCompleter->getCodeCompletionTUInfo()))); 6386 } 6387 } 6388 6389 // Add calls to overridden virtual functions, if there are any. 6390 // 6391 // FIXME: This isn't wonderful, because we don't know whether we're actually 6392 // in a context that permits expressions. This is a general issue with 6393 // qualified-id completions. 6394 if (Ctx && !EnteringContext) 6395 MaybeAddOverrideCalls(*this, Ctx, Results); 6396 Results.ExitScope(); 6397 6398 if (Ctx && 6399 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) { 6400 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType); 6401 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer, 6402 /*IncludeGlobalScope=*/true, 6403 /*IncludeDependentBases=*/true, 6404 CodeCompleter->loadExternal()); 6405 } 6406 6407 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6408 Results.data(), Results.size()); 6409 } 6410 6411 void Sema::CodeCompleteUsing(Scope *S) { 6412 if (!CodeCompleter) 6413 return; 6414 6415 // This can be both a using alias or using declaration, in the former we 6416 // expect a new name and a symbol in the latter case. 6417 CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName); 6418 Context.setIsUsingDeclaration(true); 6419 6420 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6421 CodeCompleter->getCodeCompletionTUInfo(), Context, 6422 &ResultBuilder::IsNestedNameSpecifier); 6423 Results.EnterNewScope(); 6424 6425 // If we aren't in class scope, we could see the "namespace" keyword. 6426 if (!S->isClassScope()) 6427 Results.AddResult(CodeCompletionResult("namespace")); 6428 6429 // After "using", we can see anything that would start a 6430 // nested-name-specifier. 6431 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6432 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6433 CodeCompleter->includeGlobals(), 6434 CodeCompleter->loadExternal()); 6435 Results.ExitScope(); 6436 6437 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6438 Results.data(), Results.size()); 6439 } 6440 6441 void Sema::CodeCompleteUsingDirective(Scope *S) { 6442 if (!CodeCompleter) 6443 return; 6444 6445 // After "using namespace", we expect to see a namespace name or namespace 6446 // alias. 6447 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6448 CodeCompleter->getCodeCompletionTUInfo(), 6449 CodeCompletionContext::CCC_Namespace, 6450 &ResultBuilder::IsNamespaceOrAlias); 6451 Results.EnterNewScope(); 6452 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6453 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6454 CodeCompleter->includeGlobals(), 6455 CodeCompleter->loadExternal()); 6456 Results.ExitScope(); 6457 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6458 Results.data(), Results.size()); 6459 } 6460 6461 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 6462 if (!CodeCompleter) 6463 return; 6464 6465 DeclContext *Ctx = S->getEntity(); 6466 if (!S->getParent()) 6467 Ctx = Context.getTranslationUnitDecl(); 6468 6469 bool SuppressedGlobalResults = 6470 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 6471 6472 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6473 CodeCompleter->getCodeCompletionTUInfo(), 6474 SuppressedGlobalResults 6475 ? CodeCompletionContext::CCC_Namespace 6476 : CodeCompletionContext::CCC_Other, 6477 &ResultBuilder::IsNamespace); 6478 6479 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 6480 // We only want to see those namespaces that have already been defined 6481 // within this scope, because its likely that the user is creating an 6482 // extended namespace declaration. Keep track of the most recent 6483 // definition of each namespace. 6484 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 6485 for (DeclContext::specific_decl_iterator<NamespaceDecl> 6486 NS(Ctx->decls_begin()), 6487 NSEnd(Ctx->decls_end()); 6488 NS != NSEnd; ++NS) 6489 OrigToLatest[NS->getOriginalNamespace()] = *NS; 6490 6491 // Add the most recent definition (or extended definition) of each 6492 // namespace to the list of results. 6493 Results.EnterNewScope(); 6494 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 6495 NS = OrigToLatest.begin(), 6496 NSEnd = OrigToLatest.end(); 6497 NS != NSEnd; ++NS) 6498 Results.AddResult( 6499 CodeCompletionResult(NS->second, Results.getBasePriority(NS->second), 6500 nullptr), 6501 CurContext, nullptr, false); 6502 Results.ExitScope(); 6503 } 6504 6505 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6506 Results.data(), Results.size()); 6507 } 6508 6509 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 6510 if (!CodeCompleter) 6511 return; 6512 6513 // After "namespace", we expect to see a namespace or alias. 6514 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6515 CodeCompleter->getCodeCompletionTUInfo(), 6516 CodeCompletionContext::CCC_Namespace, 6517 &ResultBuilder::IsNamespaceOrAlias); 6518 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6519 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6520 CodeCompleter->includeGlobals(), 6521 CodeCompleter->loadExternal()); 6522 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6523 Results.data(), Results.size()); 6524 } 6525 6526 void Sema::CodeCompleteOperatorName(Scope *S) { 6527 if (!CodeCompleter) 6528 return; 6529 6530 typedef CodeCompletionResult Result; 6531 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6532 CodeCompleter->getCodeCompletionTUInfo(), 6533 CodeCompletionContext::CCC_Type, 6534 &ResultBuilder::IsType); 6535 Results.EnterNewScope(); 6536 6537 // Add the names of overloadable operators. Note that OO_Conditional is not 6538 // actually overloadable. 6539 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 6540 if (OO_##Name != OO_Conditional) \ 6541 Results.AddResult(Result(Spelling)); 6542 #include "clang/Basic/OperatorKinds.def" 6543 6544 // Add any type names visible from the current scope 6545 Results.allowNestedNameSpecifiers(); 6546 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6547 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6548 CodeCompleter->includeGlobals(), 6549 CodeCompleter->loadExternal()); 6550 6551 // Add any type specifiers 6552 AddTypeSpecifierResults(getLangOpts(), Results); 6553 Results.ExitScope(); 6554 6555 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6556 Results.data(), Results.size()); 6557 } 6558 6559 void Sema::CodeCompleteConstructorInitializer( 6560 Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) { 6561 if (!ConstructorD) 6562 return; 6563 6564 AdjustDeclIfTemplate(ConstructorD); 6565 6566 auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD); 6567 if (!Constructor) 6568 return; 6569 6570 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6571 CodeCompleter->getCodeCompletionTUInfo(), 6572 CodeCompletionContext::CCC_Symbol); 6573 Results.EnterNewScope(); 6574 6575 // Fill in any already-initialized fields or base classes. 6576 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 6577 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 6578 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) { 6579 if (Initializers[I]->isBaseInitializer()) 6580 InitializedBases.insert(Context.getCanonicalType( 6581 QualType(Initializers[I]->getBaseClass(), 0))); 6582 else 6583 InitializedFields.insert( 6584 cast<FieldDecl>(Initializers[I]->getAnyMember())); 6585 } 6586 6587 // Add completions for base classes. 6588 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6589 bool SawLastInitializer = Initializers.empty(); 6590 CXXRecordDecl *ClassDecl = Constructor->getParent(); 6591 6592 auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) { 6593 CodeCompletionBuilder Builder(Results.getAllocator(), 6594 Results.getCodeCompletionTUInfo()); 6595 Builder.AddTypedTextChunk(Name); 6596 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6597 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) 6598 AddFunctionParameterChunks(PP, Policy, Function, Builder); 6599 else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND)) 6600 AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(), 6601 Builder); 6602 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6603 return Builder.TakeString(); 6604 }; 6605 auto AddDefaultCtorInit = [&](const char *Name, const char *Type, 6606 const NamedDecl *ND) { 6607 CodeCompletionBuilder Builder(Results.getAllocator(), 6608 Results.getCodeCompletionTUInfo()); 6609 Builder.AddTypedTextChunk(Name); 6610 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6611 Builder.AddPlaceholderChunk(Type); 6612 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6613 if (ND) { 6614 auto CCR = CodeCompletionResult( 6615 Builder.TakeString(), ND, 6616 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration); 6617 if (isa<FieldDecl>(ND)) 6618 CCR.CursorKind = CXCursor_MemberRef; 6619 return Results.AddResult(CCR); 6620 } 6621 return Results.AddResult(CodeCompletionResult( 6622 Builder.TakeString(), 6623 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration)); 6624 }; 6625 auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority, 6626 const char *Name, const FieldDecl *FD) { 6627 if (!RD) 6628 return AddDefaultCtorInit(Name, 6629 FD ? Results.getAllocator().CopyString( 6630 FD->getType().getAsString(Policy)) 6631 : Name, 6632 FD); 6633 auto Ctors = getConstructors(Context, RD); 6634 if (Ctors.begin() == Ctors.end()) 6635 return AddDefaultCtorInit(Name, Name, RD); 6636 for (const NamedDecl *Ctor : Ctors) { 6637 auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority); 6638 CCR.CursorKind = getCursorKindForDecl(Ctor); 6639 Results.AddResult(CCR); 6640 } 6641 }; 6642 auto AddBase = [&](const CXXBaseSpecifier &Base) { 6643 const char *BaseName = 6644 Results.getAllocator().CopyString(Base.getType().getAsString(Policy)); 6645 const auto *RD = Base.getType()->getAsCXXRecordDecl(); 6646 AddCtorsWithName( 6647 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6648 BaseName, nullptr); 6649 }; 6650 auto AddField = [&](const FieldDecl *FD) { 6651 const char *FieldName = 6652 Results.getAllocator().CopyString(FD->getIdentifier()->getName()); 6653 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl(); 6654 AddCtorsWithName( 6655 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6656 FieldName, FD); 6657 }; 6658 6659 for (const auto &Base : ClassDecl->bases()) { 6660 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6661 .second) { 6662 SawLastInitializer = 6663 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6664 Context.hasSameUnqualifiedType( 6665 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6666 continue; 6667 } 6668 6669 AddBase(Base); 6670 SawLastInitializer = false; 6671 } 6672 6673 // Add completions for virtual base classes. 6674 for (const auto &Base : ClassDecl->vbases()) { 6675 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6676 .second) { 6677 SawLastInitializer = 6678 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6679 Context.hasSameUnqualifiedType( 6680 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6681 continue; 6682 } 6683 6684 AddBase(Base); 6685 SawLastInitializer = false; 6686 } 6687 6688 // Add completions for members. 6689 for (auto *Field : ClassDecl->fields()) { 6690 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl())) 6691 .second) { 6692 SawLastInitializer = !Initializers.empty() && 6693 Initializers.back()->isAnyMemberInitializer() && 6694 Initializers.back()->getAnyMember() == Field; 6695 continue; 6696 } 6697 6698 if (!Field->getDeclName()) 6699 continue; 6700 6701 AddField(Field); 6702 SawLastInitializer = false; 6703 } 6704 Results.ExitScope(); 6705 6706 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6707 Results.data(), Results.size()); 6708 } 6709 6710 /// Determine whether this scope denotes a namespace. 6711 static bool isNamespaceScope(Scope *S) { 6712 DeclContext *DC = S->getEntity(); 6713 if (!DC) 6714 return false; 6715 6716 return DC->isFileContext(); 6717 } 6718 6719 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 6720 bool AfterAmpersand) { 6721 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6722 CodeCompleter->getCodeCompletionTUInfo(), 6723 CodeCompletionContext::CCC_Other); 6724 Results.EnterNewScope(); 6725 6726 // Note what has already been captured. 6727 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 6728 bool IncludedThis = false; 6729 for (const auto &C : Intro.Captures) { 6730 if (C.Kind == LCK_This) { 6731 IncludedThis = true; 6732 continue; 6733 } 6734 6735 Known.insert(C.Id); 6736 } 6737 6738 // Look for other capturable variables. 6739 for (; S && !isNamespaceScope(S); S = S->getParent()) { 6740 for (const auto *D : S->decls()) { 6741 const auto *Var = dyn_cast<VarDecl>(D); 6742 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>()) 6743 continue; 6744 6745 if (Known.insert(Var->getIdentifier()).second) 6746 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 6747 CurContext, nullptr, false); 6748 } 6749 } 6750 6751 // Add 'this', if it would be valid. 6752 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 6753 addThisCompletion(*this, Results); 6754 6755 Results.ExitScope(); 6756 6757 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6758 Results.data(), Results.size()); 6759 } 6760 6761 void Sema::CodeCompleteAfterFunctionEquals(Declarator &D) { 6762 if (!LangOpts.CPlusPlus11) 6763 return; 6764 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6765 CodeCompleter->getCodeCompletionTUInfo(), 6766 CodeCompletionContext::CCC_Other); 6767 auto ShouldAddDefault = [&D, this]() { 6768 if (!D.isFunctionDeclarator()) 6769 return false; 6770 auto &Id = D.getName(); 6771 if (Id.getKind() == UnqualifiedIdKind::IK_DestructorName) 6772 return true; 6773 // FIXME(liuhui): Ideally, we should check the constructor parameter list to 6774 // verify that it is the default, copy or move constructor? 6775 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName && 6776 D.getFunctionTypeInfo().NumParams <= 1) 6777 return true; 6778 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) { 6779 auto Op = Id.OperatorFunctionId.Operator; 6780 // FIXME(liuhui): Ideally, we should check the function parameter list to 6781 // verify that it is the copy or move assignment? 6782 if (Op == OverloadedOperatorKind::OO_Equal) 6783 return true; 6784 if (LangOpts.CPlusPlus20 && 6785 (Op == OverloadedOperatorKind::OO_EqualEqual || 6786 Op == OverloadedOperatorKind::OO_ExclaimEqual || 6787 Op == OverloadedOperatorKind::OO_Less || 6788 Op == OverloadedOperatorKind::OO_LessEqual || 6789 Op == OverloadedOperatorKind::OO_Greater || 6790 Op == OverloadedOperatorKind::OO_GreaterEqual || 6791 Op == OverloadedOperatorKind::OO_Spaceship)) 6792 return true; 6793 } 6794 return false; 6795 }; 6796 6797 Results.EnterNewScope(); 6798 if (ShouldAddDefault()) 6799 Results.AddResult("default"); 6800 // FIXME(liuhui): Ideally, we should only provide `delete` completion for the 6801 // first function declaration. 6802 Results.AddResult("delete"); 6803 Results.ExitScope(); 6804 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6805 Results.data(), Results.size()); 6806 } 6807 6808 /// Macro that optionally prepends an "@" to the string literal passed in via 6809 /// Keyword, depending on whether NeedAt is true or false. 6810 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword) 6811 6812 static void AddObjCImplementationResults(const LangOptions &LangOpts, 6813 ResultBuilder &Results, bool NeedAt) { 6814 typedef CodeCompletionResult Result; 6815 // Since we have an implementation, we can end it. 6816 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6817 6818 CodeCompletionBuilder Builder(Results.getAllocator(), 6819 Results.getCodeCompletionTUInfo()); 6820 if (LangOpts.ObjC) { 6821 // @dynamic 6822 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic")); 6823 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6824 Builder.AddPlaceholderChunk("property"); 6825 Results.AddResult(Result(Builder.TakeString())); 6826 6827 // @synthesize 6828 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize")); 6829 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6830 Builder.AddPlaceholderChunk("property"); 6831 Results.AddResult(Result(Builder.TakeString())); 6832 } 6833 } 6834 6835 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 6836 ResultBuilder &Results, bool NeedAt) { 6837 typedef CodeCompletionResult Result; 6838 6839 // Since we have an interface or protocol, we can end it. 6840 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6841 6842 if (LangOpts.ObjC) { 6843 // @property 6844 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property"))); 6845 6846 // @required 6847 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required"))); 6848 6849 // @optional 6850 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional"))); 6851 } 6852 } 6853 6854 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 6855 typedef CodeCompletionResult Result; 6856 CodeCompletionBuilder Builder(Results.getAllocator(), 6857 Results.getCodeCompletionTUInfo()); 6858 6859 // @class name ; 6860 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class")); 6861 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6862 Builder.AddPlaceholderChunk("name"); 6863 Results.AddResult(Result(Builder.TakeString())); 6864 6865 if (Results.includeCodePatterns()) { 6866 // @interface name 6867 // FIXME: Could introduce the whole pattern, including superclasses and 6868 // such. 6869 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface")); 6870 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6871 Builder.AddPlaceholderChunk("class"); 6872 Results.AddResult(Result(Builder.TakeString())); 6873 6874 // @protocol name 6875 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 6876 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6877 Builder.AddPlaceholderChunk("protocol"); 6878 Results.AddResult(Result(Builder.TakeString())); 6879 6880 // @implementation name 6881 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation")); 6882 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6883 Builder.AddPlaceholderChunk("class"); 6884 Results.AddResult(Result(Builder.TakeString())); 6885 } 6886 6887 // @compatibility_alias name 6888 Builder.AddTypedTextChunk( 6889 OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias")); 6890 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6891 Builder.AddPlaceholderChunk("alias"); 6892 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6893 Builder.AddPlaceholderChunk("class"); 6894 Results.AddResult(Result(Builder.TakeString())); 6895 6896 if (Results.getSema().getLangOpts().Modules) { 6897 // @import name 6898 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 6899 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6900 Builder.AddPlaceholderChunk("module"); 6901 Results.AddResult(Result(Builder.TakeString())); 6902 } 6903 } 6904 6905 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 6906 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6907 CodeCompleter->getCodeCompletionTUInfo(), 6908 CodeCompletionContext::CCC_Other); 6909 Results.EnterNewScope(); 6910 if (isa<ObjCImplDecl>(CurContext)) 6911 AddObjCImplementationResults(getLangOpts(), Results, false); 6912 else if (CurContext->isObjCContainer()) 6913 AddObjCInterfaceResults(getLangOpts(), Results, false); 6914 else 6915 AddObjCTopLevelResults(Results, false); 6916 Results.ExitScope(); 6917 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6918 Results.data(), Results.size()); 6919 } 6920 6921 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 6922 typedef CodeCompletionResult Result; 6923 CodeCompletionBuilder Builder(Results.getAllocator(), 6924 Results.getCodeCompletionTUInfo()); 6925 6926 // @encode ( type-name ) 6927 const char *EncodeType = "char[]"; 6928 if (Results.getSema().getLangOpts().CPlusPlus || 6929 Results.getSema().getLangOpts().ConstStrings) 6930 EncodeType = "const char[]"; 6931 Builder.AddResultTypeChunk(EncodeType); 6932 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode")); 6933 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6934 Builder.AddPlaceholderChunk("type-name"); 6935 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6936 Results.AddResult(Result(Builder.TakeString())); 6937 6938 // @protocol ( protocol-name ) 6939 Builder.AddResultTypeChunk("Protocol *"); 6940 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 6941 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6942 Builder.AddPlaceholderChunk("protocol-name"); 6943 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6944 Results.AddResult(Result(Builder.TakeString())); 6945 6946 // @selector ( selector ) 6947 Builder.AddResultTypeChunk("SEL"); 6948 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector")); 6949 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6950 Builder.AddPlaceholderChunk("selector"); 6951 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6952 Results.AddResult(Result(Builder.TakeString())); 6953 6954 // @"string" 6955 Builder.AddResultTypeChunk("NSString *"); 6956 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\"")); 6957 Builder.AddPlaceholderChunk("string"); 6958 Builder.AddTextChunk("\""); 6959 Results.AddResult(Result(Builder.TakeString())); 6960 6961 // @[objects, ...] 6962 Builder.AddResultTypeChunk("NSArray *"); 6963 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "[")); 6964 Builder.AddPlaceholderChunk("objects, ..."); 6965 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 6966 Results.AddResult(Result(Builder.TakeString())); 6967 6968 // @{key : object, ...} 6969 Builder.AddResultTypeChunk("NSDictionary *"); 6970 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{")); 6971 Builder.AddPlaceholderChunk("key"); 6972 Builder.AddChunk(CodeCompletionString::CK_Colon); 6973 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6974 Builder.AddPlaceholderChunk("object, ..."); 6975 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6976 Results.AddResult(Result(Builder.TakeString())); 6977 6978 // @(expression) 6979 Builder.AddResultTypeChunk("id"); 6980 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 6981 Builder.AddPlaceholderChunk("expression"); 6982 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6983 Results.AddResult(Result(Builder.TakeString())); 6984 } 6985 6986 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 6987 typedef CodeCompletionResult Result; 6988 CodeCompletionBuilder Builder(Results.getAllocator(), 6989 Results.getCodeCompletionTUInfo()); 6990 6991 if (Results.includeCodePatterns()) { 6992 // @try { statements } @catch ( declaration ) { statements } @finally 6993 // { statements } 6994 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try")); 6995 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6996 Builder.AddPlaceholderChunk("statements"); 6997 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6998 Builder.AddTextChunk("@catch"); 6999 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7000 Builder.AddPlaceholderChunk("parameter"); 7001 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7002 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7003 Builder.AddPlaceholderChunk("statements"); 7004 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7005 Builder.AddTextChunk("@finally"); 7006 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7007 Builder.AddPlaceholderChunk("statements"); 7008 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7009 Results.AddResult(Result(Builder.TakeString())); 7010 } 7011 7012 // @throw 7013 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw")); 7014 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7015 Builder.AddPlaceholderChunk("expression"); 7016 Results.AddResult(Result(Builder.TakeString())); 7017 7018 if (Results.includeCodePatterns()) { 7019 // @synchronized ( expression ) { statements } 7020 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized")); 7021 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7022 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7023 Builder.AddPlaceholderChunk("expression"); 7024 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7025 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 7026 Builder.AddPlaceholderChunk("statements"); 7027 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 7028 Results.AddResult(Result(Builder.TakeString())); 7029 } 7030 } 7031 7032 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 7033 ResultBuilder &Results, bool NeedAt) { 7034 typedef CodeCompletionResult Result; 7035 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private"))); 7036 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected"))); 7037 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public"))); 7038 if (LangOpts.ObjC) 7039 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package"))); 7040 } 7041 7042 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 7043 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7044 CodeCompleter->getCodeCompletionTUInfo(), 7045 CodeCompletionContext::CCC_Other); 7046 Results.EnterNewScope(); 7047 AddObjCVisibilityResults(getLangOpts(), Results, false); 7048 Results.ExitScope(); 7049 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7050 Results.data(), Results.size()); 7051 } 7052 7053 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 7054 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7055 CodeCompleter->getCodeCompletionTUInfo(), 7056 CodeCompletionContext::CCC_Other); 7057 Results.EnterNewScope(); 7058 AddObjCStatementResults(Results, false); 7059 AddObjCExpressionResults(Results, false); 7060 Results.ExitScope(); 7061 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7062 Results.data(), Results.size()); 7063 } 7064 7065 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 7066 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7067 CodeCompleter->getCodeCompletionTUInfo(), 7068 CodeCompletionContext::CCC_Other); 7069 Results.EnterNewScope(); 7070 AddObjCExpressionResults(Results, false); 7071 Results.ExitScope(); 7072 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7073 Results.data(), Results.size()); 7074 } 7075 7076 /// Determine whether the addition of the given flag to an Objective-C 7077 /// property's attributes will cause a conflict. 7078 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 7079 // Check if we've already added this flag. 7080 if (Attributes & NewFlag) 7081 return true; 7082 7083 Attributes |= NewFlag; 7084 7085 // Check for collisions with "readonly". 7086 if ((Attributes & ObjCPropertyAttribute::kind_readonly) && 7087 (Attributes & ObjCPropertyAttribute::kind_readwrite)) 7088 return true; 7089 7090 // Check for more than one of { assign, copy, retain, strong, weak }. 7091 unsigned AssignCopyRetMask = 7092 Attributes & 7093 (ObjCPropertyAttribute::kind_assign | 7094 ObjCPropertyAttribute::kind_unsafe_unretained | 7095 ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain | 7096 ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak); 7097 if (AssignCopyRetMask && 7098 AssignCopyRetMask != ObjCPropertyAttribute::kind_assign && 7099 AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained && 7100 AssignCopyRetMask != ObjCPropertyAttribute::kind_copy && 7101 AssignCopyRetMask != ObjCPropertyAttribute::kind_retain && 7102 AssignCopyRetMask != ObjCPropertyAttribute::kind_strong && 7103 AssignCopyRetMask != ObjCPropertyAttribute::kind_weak) 7104 return true; 7105 7106 return false; 7107 } 7108 7109 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 7110 if (!CodeCompleter) 7111 return; 7112 7113 unsigned Attributes = ODS.getPropertyAttributes(); 7114 7115 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7116 CodeCompleter->getCodeCompletionTUInfo(), 7117 CodeCompletionContext::CCC_Other); 7118 Results.EnterNewScope(); 7119 if (!ObjCPropertyFlagConflicts(Attributes, 7120 ObjCPropertyAttribute::kind_readonly)) 7121 Results.AddResult(CodeCompletionResult("readonly")); 7122 if (!ObjCPropertyFlagConflicts(Attributes, 7123 ObjCPropertyAttribute::kind_assign)) 7124 Results.AddResult(CodeCompletionResult("assign")); 7125 if (!ObjCPropertyFlagConflicts(Attributes, 7126 ObjCPropertyAttribute::kind_unsafe_unretained)) 7127 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 7128 if (!ObjCPropertyFlagConflicts(Attributes, 7129 ObjCPropertyAttribute::kind_readwrite)) 7130 Results.AddResult(CodeCompletionResult("readwrite")); 7131 if (!ObjCPropertyFlagConflicts(Attributes, 7132 ObjCPropertyAttribute::kind_retain)) 7133 Results.AddResult(CodeCompletionResult("retain")); 7134 if (!ObjCPropertyFlagConflicts(Attributes, 7135 ObjCPropertyAttribute::kind_strong)) 7136 Results.AddResult(CodeCompletionResult("strong")); 7137 if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy)) 7138 Results.AddResult(CodeCompletionResult("copy")); 7139 if (!ObjCPropertyFlagConflicts(Attributes, 7140 ObjCPropertyAttribute::kind_nonatomic)) 7141 Results.AddResult(CodeCompletionResult("nonatomic")); 7142 if (!ObjCPropertyFlagConflicts(Attributes, 7143 ObjCPropertyAttribute::kind_atomic)) 7144 Results.AddResult(CodeCompletionResult("atomic")); 7145 7146 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 7147 if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC) 7148 if (!ObjCPropertyFlagConflicts(Attributes, 7149 ObjCPropertyAttribute::kind_weak)) 7150 Results.AddResult(CodeCompletionResult("weak")); 7151 7152 if (!ObjCPropertyFlagConflicts(Attributes, 7153 ObjCPropertyAttribute::kind_setter)) { 7154 CodeCompletionBuilder Setter(Results.getAllocator(), 7155 Results.getCodeCompletionTUInfo()); 7156 Setter.AddTypedTextChunk("setter"); 7157 Setter.AddTextChunk("="); 7158 Setter.AddPlaceholderChunk("method"); 7159 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 7160 } 7161 if (!ObjCPropertyFlagConflicts(Attributes, 7162 ObjCPropertyAttribute::kind_getter)) { 7163 CodeCompletionBuilder Getter(Results.getAllocator(), 7164 Results.getCodeCompletionTUInfo()); 7165 Getter.AddTypedTextChunk("getter"); 7166 Getter.AddTextChunk("="); 7167 Getter.AddPlaceholderChunk("method"); 7168 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 7169 } 7170 if (!ObjCPropertyFlagConflicts(Attributes, 7171 ObjCPropertyAttribute::kind_nullability)) { 7172 Results.AddResult(CodeCompletionResult("nonnull")); 7173 Results.AddResult(CodeCompletionResult("nullable")); 7174 Results.AddResult(CodeCompletionResult("null_unspecified")); 7175 Results.AddResult(CodeCompletionResult("null_resettable")); 7176 } 7177 Results.ExitScope(); 7178 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7179 Results.data(), Results.size()); 7180 } 7181 7182 /// Describes the kind of Objective-C method that we want to find 7183 /// via code completion. 7184 enum ObjCMethodKind { 7185 MK_Any, ///< Any kind of method, provided it means other specified criteria. 7186 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 7187 MK_OneArgSelector ///< One-argument selector. 7188 }; 7189 7190 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind, 7191 ArrayRef<IdentifierInfo *> SelIdents, 7192 bool AllowSameLength = true) { 7193 unsigned NumSelIdents = SelIdents.size(); 7194 if (NumSelIdents > Sel.getNumArgs()) 7195 return false; 7196 7197 switch (WantKind) { 7198 case MK_Any: 7199 break; 7200 case MK_ZeroArgSelector: 7201 return Sel.isUnarySelector(); 7202 case MK_OneArgSelector: 7203 return Sel.getNumArgs() == 1; 7204 } 7205 7206 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 7207 return false; 7208 7209 for (unsigned I = 0; I != NumSelIdents; ++I) 7210 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 7211 return false; 7212 7213 return true; 7214 } 7215 7216 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 7217 ObjCMethodKind WantKind, 7218 ArrayRef<IdentifierInfo *> SelIdents, 7219 bool AllowSameLength = true) { 7220 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 7221 AllowSameLength); 7222 } 7223 7224 /// A set of selectors, which is used to avoid introducing multiple 7225 /// completions with the same selector into the result set. 7226 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 7227 7228 /// Add all of the Objective-C methods in the given Objective-C 7229 /// container to the set of results. 7230 /// 7231 /// The container will be a class, protocol, category, or implementation of 7232 /// any of the above. This mether will recurse to include methods from 7233 /// the superclasses of classes along with their categories, protocols, and 7234 /// implementations. 7235 /// 7236 /// \param Container the container in which we'll look to find methods. 7237 /// 7238 /// \param WantInstanceMethods Whether to add instance methods (only); if 7239 /// false, this routine will add factory methods (only). 7240 /// 7241 /// \param CurContext the context in which we're performing the lookup that 7242 /// finds methods. 7243 /// 7244 /// \param AllowSameLength Whether we allow a method to be added to the list 7245 /// when it has the same number of parameters as we have selector identifiers. 7246 /// 7247 /// \param Results the structure into which we'll add results. 7248 static void AddObjCMethods(ObjCContainerDecl *Container, 7249 bool WantInstanceMethods, ObjCMethodKind WantKind, 7250 ArrayRef<IdentifierInfo *> SelIdents, 7251 DeclContext *CurContext, 7252 VisitedSelectorSet &Selectors, bool AllowSameLength, 7253 ResultBuilder &Results, bool InOriginalClass = true, 7254 bool IsRootClass = false) { 7255 typedef CodeCompletionResult Result; 7256 Container = getContainerDef(Container); 7257 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 7258 IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass()); 7259 for (ObjCMethodDecl *M : Container->methods()) { 7260 // The instance methods on the root class can be messaged via the 7261 // metaclass. 7262 if (M->isInstanceMethod() == WantInstanceMethods || 7263 (IsRootClass && !WantInstanceMethods)) { 7264 // Check whether the selector identifiers we've been given are a 7265 // subset of the identifiers for this particular method. 7266 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength)) 7267 continue; 7268 7269 if (!Selectors.insert(M->getSelector()).second) 7270 continue; 7271 7272 Result R = Result(M, Results.getBasePriority(M), nullptr); 7273 R.StartParameter = SelIdents.size(); 7274 R.AllParametersAreInformative = (WantKind != MK_Any); 7275 if (!InOriginalClass) 7276 setInBaseClass(R); 7277 Results.MaybeAddResult(R, CurContext); 7278 } 7279 } 7280 7281 // Visit the protocols of protocols. 7282 if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 7283 if (Protocol->hasDefinition()) { 7284 const ObjCList<ObjCProtocolDecl> &Protocols = 7285 Protocol->getReferencedProtocols(); 7286 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7287 E = Protocols.end(); 7288 I != E; ++I) 7289 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7290 Selectors, AllowSameLength, Results, false, IsRootClass); 7291 } 7292 } 7293 7294 if (!IFace || !IFace->hasDefinition()) 7295 return; 7296 7297 // Add methods in protocols. 7298 for (ObjCProtocolDecl *I : IFace->protocols()) 7299 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7300 Selectors, AllowSameLength, Results, false, IsRootClass); 7301 7302 // Add methods in categories. 7303 for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) { 7304 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 7305 CurContext, Selectors, AllowSameLength, Results, 7306 InOriginalClass, IsRootClass); 7307 7308 // Add a categories protocol methods. 7309 const ObjCList<ObjCProtocolDecl> &Protocols = 7310 CatDecl->getReferencedProtocols(); 7311 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7312 E = Protocols.end(); 7313 I != E; ++I) 7314 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 7315 Selectors, AllowSameLength, Results, false, IsRootClass); 7316 7317 // Add methods in category implementations. 7318 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 7319 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7320 Selectors, AllowSameLength, Results, InOriginalClass, 7321 IsRootClass); 7322 } 7323 7324 // Add methods in superclass. 7325 // Avoid passing in IsRootClass since root classes won't have super classes. 7326 if (IFace->getSuperClass()) 7327 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 7328 SelIdents, CurContext, Selectors, AllowSameLength, Results, 7329 /*IsRootClass=*/false); 7330 7331 // Add methods in our implementation, if any. 7332 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 7333 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 7334 Selectors, AllowSameLength, Results, InOriginalClass, 7335 IsRootClass); 7336 } 7337 7338 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 7339 // Try to find the interface where getters might live. 7340 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7341 if (!Class) { 7342 if (ObjCCategoryDecl *Category = 7343 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7344 Class = Category->getClassInterface(); 7345 7346 if (!Class) 7347 return; 7348 } 7349 7350 // Find all of the potential getters. 7351 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7352 CodeCompleter->getCodeCompletionTUInfo(), 7353 CodeCompletionContext::CCC_Other); 7354 Results.EnterNewScope(); 7355 7356 VisitedSelectorSet Selectors; 7357 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 7358 /*AllowSameLength=*/true, Results); 7359 Results.ExitScope(); 7360 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7361 Results.data(), Results.size()); 7362 } 7363 7364 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 7365 // Try to find the interface where setters might live. 7366 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 7367 if (!Class) { 7368 if (ObjCCategoryDecl *Category = 7369 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 7370 Class = Category->getClassInterface(); 7371 7372 if (!Class) 7373 return; 7374 } 7375 7376 // Find all of the potential getters. 7377 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7378 CodeCompleter->getCodeCompletionTUInfo(), 7379 CodeCompletionContext::CCC_Other); 7380 Results.EnterNewScope(); 7381 7382 VisitedSelectorSet Selectors; 7383 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors, 7384 /*AllowSameLength=*/true, Results); 7385 7386 Results.ExitScope(); 7387 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7388 Results.data(), Results.size()); 7389 } 7390 7391 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 7392 bool IsParameter) { 7393 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7394 CodeCompleter->getCodeCompletionTUInfo(), 7395 CodeCompletionContext::CCC_Type); 7396 Results.EnterNewScope(); 7397 7398 // Add context-sensitive, Objective-C parameter-passing keywords. 7399 bool AddedInOut = false; 7400 if ((DS.getObjCDeclQualifier() & 7401 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 7402 Results.AddResult("in"); 7403 Results.AddResult("inout"); 7404 AddedInOut = true; 7405 } 7406 if ((DS.getObjCDeclQualifier() & 7407 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 7408 Results.AddResult("out"); 7409 if (!AddedInOut) 7410 Results.AddResult("inout"); 7411 } 7412 if ((DS.getObjCDeclQualifier() & 7413 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 7414 ObjCDeclSpec::DQ_Oneway)) == 0) { 7415 Results.AddResult("bycopy"); 7416 Results.AddResult("byref"); 7417 Results.AddResult("oneway"); 7418 } 7419 if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) { 7420 Results.AddResult("nonnull"); 7421 Results.AddResult("nullable"); 7422 Results.AddResult("null_unspecified"); 7423 } 7424 7425 // If we're completing the return type of an Objective-C method and the 7426 // identifier IBAction refers to a macro, provide a completion item for 7427 // an action, e.g., 7428 // IBAction)<#selector#>:(id)sender 7429 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 7430 PP.isMacroDefined("IBAction")) { 7431 CodeCompletionBuilder Builder(Results.getAllocator(), 7432 Results.getCodeCompletionTUInfo(), 7433 CCP_CodePattern, CXAvailability_Available); 7434 Builder.AddTypedTextChunk("IBAction"); 7435 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7436 Builder.AddPlaceholderChunk("selector"); 7437 Builder.AddChunk(CodeCompletionString::CK_Colon); 7438 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 7439 Builder.AddTextChunk("id"); 7440 Builder.AddChunk(CodeCompletionString::CK_RightParen); 7441 Builder.AddTextChunk("sender"); 7442 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 7443 } 7444 7445 // If we're completing the return type, provide 'instancetype'. 7446 if (!IsParameter) { 7447 Results.AddResult(CodeCompletionResult("instancetype")); 7448 } 7449 7450 // Add various builtin type names and specifiers. 7451 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 7452 Results.ExitScope(); 7453 7454 // Add the various type names 7455 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 7456 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7457 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7458 CodeCompleter->includeGlobals(), 7459 CodeCompleter->loadExternal()); 7460 7461 if (CodeCompleter->includeMacros()) 7462 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7463 7464 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7465 Results.data(), Results.size()); 7466 } 7467 7468 /// When we have an expression with type "id", we may assume 7469 /// that it has some more-specific class type based on knowledge of 7470 /// common uses of Objective-C. This routine returns that class type, 7471 /// or NULL if no better result could be determined. 7472 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 7473 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 7474 if (!Msg) 7475 return nullptr; 7476 7477 Selector Sel = Msg->getSelector(); 7478 if (Sel.isNull()) 7479 return nullptr; 7480 7481 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 7482 if (!Id) 7483 return nullptr; 7484 7485 ObjCMethodDecl *Method = Msg->getMethodDecl(); 7486 if (!Method) 7487 return nullptr; 7488 7489 // Determine the class that we're sending the message to. 7490 ObjCInterfaceDecl *IFace = nullptr; 7491 switch (Msg->getReceiverKind()) { 7492 case ObjCMessageExpr::Class: 7493 if (const ObjCObjectType *ObjType = 7494 Msg->getClassReceiver()->getAs<ObjCObjectType>()) 7495 IFace = ObjType->getInterface(); 7496 break; 7497 7498 case ObjCMessageExpr::Instance: { 7499 QualType T = Msg->getInstanceReceiver()->getType(); 7500 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 7501 IFace = Ptr->getInterfaceDecl(); 7502 break; 7503 } 7504 7505 case ObjCMessageExpr::SuperInstance: 7506 case ObjCMessageExpr::SuperClass: 7507 break; 7508 } 7509 7510 if (!IFace) 7511 return nullptr; 7512 7513 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 7514 if (Method->isInstanceMethod()) 7515 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7516 .Case("retain", IFace) 7517 .Case("strong", IFace) 7518 .Case("autorelease", IFace) 7519 .Case("copy", IFace) 7520 .Case("copyWithZone", IFace) 7521 .Case("mutableCopy", IFace) 7522 .Case("mutableCopyWithZone", IFace) 7523 .Case("awakeFromCoder", IFace) 7524 .Case("replacementObjectFromCoder", IFace) 7525 .Case("class", IFace) 7526 .Case("classForCoder", IFace) 7527 .Case("superclass", Super) 7528 .Default(nullptr); 7529 7530 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 7531 .Case("new", IFace) 7532 .Case("alloc", IFace) 7533 .Case("allocWithZone", IFace) 7534 .Case("class", IFace) 7535 .Case("superclass", Super) 7536 .Default(nullptr); 7537 } 7538 7539 // Add a special completion for a message send to "super", which fills in the 7540 // most likely case of forwarding all of our arguments to the superclass 7541 // function. 7542 /// 7543 /// \param S The semantic analysis object. 7544 /// 7545 /// \param NeedSuperKeyword Whether we need to prefix this completion with 7546 /// the "super" keyword. Otherwise, we just need to provide the arguments. 7547 /// 7548 /// \param SelIdents The identifiers in the selector that have already been 7549 /// provided as arguments for a send to "super". 7550 /// 7551 /// \param Results The set of results to augment. 7552 /// 7553 /// \returns the Objective-C method declaration that would be invoked by 7554 /// this "super" completion. If NULL, no completion was added. 7555 static ObjCMethodDecl * 7556 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 7557 ArrayRef<IdentifierInfo *> SelIdents, 7558 ResultBuilder &Results) { 7559 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 7560 if (!CurMethod) 7561 return nullptr; 7562 7563 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 7564 if (!Class) 7565 return nullptr; 7566 7567 // Try to find a superclass method with the same selector. 7568 ObjCMethodDecl *SuperMethod = nullptr; 7569 while ((Class = Class->getSuperClass()) && !SuperMethod) { 7570 // Check in the class 7571 SuperMethod = Class->getMethod(CurMethod->getSelector(), 7572 CurMethod->isInstanceMethod()); 7573 7574 // Check in categories or class extensions. 7575 if (!SuperMethod) { 7576 for (const auto *Cat : Class->known_categories()) { 7577 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 7578 CurMethod->isInstanceMethod()))) 7579 break; 7580 } 7581 } 7582 } 7583 7584 if (!SuperMethod) 7585 return nullptr; 7586 7587 // Check whether the superclass method has the same signature. 7588 if (CurMethod->param_size() != SuperMethod->param_size() || 7589 CurMethod->isVariadic() != SuperMethod->isVariadic()) 7590 return nullptr; 7591 7592 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 7593 CurPEnd = CurMethod->param_end(), 7594 SuperP = SuperMethod->param_begin(); 7595 CurP != CurPEnd; ++CurP, ++SuperP) { 7596 // Make sure the parameter types are compatible. 7597 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 7598 (*SuperP)->getType())) 7599 return nullptr; 7600 7601 // Make sure we have a parameter name to forward! 7602 if (!(*CurP)->getIdentifier()) 7603 return nullptr; 7604 } 7605 7606 // We have a superclass method. Now, form the send-to-super completion. 7607 CodeCompletionBuilder Builder(Results.getAllocator(), 7608 Results.getCodeCompletionTUInfo()); 7609 7610 // Give this completion a return type. 7611 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 7612 Results.getCompletionContext().getBaseType(), Builder); 7613 7614 // If we need the "super" keyword, add it (plus some spacing). 7615 if (NeedSuperKeyword) { 7616 Builder.AddTypedTextChunk("super"); 7617 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7618 } 7619 7620 Selector Sel = CurMethod->getSelector(); 7621 if (Sel.isUnarySelector()) { 7622 if (NeedSuperKeyword) 7623 Builder.AddTextChunk( 7624 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7625 else 7626 Builder.AddTypedTextChunk( 7627 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7628 } else { 7629 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 7630 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 7631 if (I > SelIdents.size()) 7632 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7633 7634 if (I < SelIdents.size()) 7635 Builder.AddInformativeChunk( 7636 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7637 else if (NeedSuperKeyword || I > SelIdents.size()) { 7638 Builder.AddTextChunk( 7639 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7640 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7641 (*CurP)->getIdentifier()->getName())); 7642 } else { 7643 Builder.AddTypedTextChunk( 7644 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7645 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7646 (*CurP)->getIdentifier()->getName())); 7647 } 7648 } 7649 } 7650 7651 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 7652 CCP_SuperCompletion)); 7653 return SuperMethod; 7654 } 7655 7656 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 7657 typedef CodeCompletionResult Result; 7658 ResultBuilder Results( 7659 *this, CodeCompleter->getAllocator(), 7660 CodeCompleter->getCodeCompletionTUInfo(), 7661 CodeCompletionContext::CCC_ObjCMessageReceiver, 7662 getLangOpts().CPlusPlus11 7663 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 7664 : &ResultBuilder::IsObjCMessageReceiver); 7665 7666 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7667 Results.EnterNewScope(); 7668 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7669 CodeCompleter->includeGlobals(), 7670 CodeCompleter->loadExternal()); 7671 7672 // If we are in an Objective-C method inside a class that has a superclass, 7673 // add "super" as an option. 7674 if (ObjCMethodDecl *Method = getCurMethodDecl()) 7675 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 7676 if (Iface->getSuperClass()) { 7677 Results.AddResult(Result("super")); 7678 7679 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 7680 } 7681 7682 if (getLangOpts().CPlusPlus11) 7683 addThisCompletion(*this, Results); 7684 7685 Results.ExitScope(); 7686 7687 if (CodeCompleter->includeMacros()) 7688 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7689 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7690 Results.data(), Results.size()); 7691 } 7692 7693 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 7694 ArrayRef<IdentifierInfo *> SelIdents, 7695 bool AtArgumentExpression) { 7696 ObjCInterfaceDecl *CDecl = nullptr; 7697 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7698 // Figure out which interface we're in. 7699 CDecl = CurMethod->getClassInterface(); 7700 if (!CDecl) 7701 return; 7702 7703 // Find the superclass of this class. 7704 CDecl = CDecl->getSuperClass(); 7705 if (!CDecl) 7706 return; 7707 7708 if (CurMethod->isInstanceMethod()) { 7709 // We are inside an instance method, which means that the message 7710 // send [super ...] is actually calling an instance method on the 7711 // current object. 7712 return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents, 7713 AtArgumentExpression, CDecl); 7714 } 7715 7716 // Fall through to send to the superclass in CDecl. 7717 } else { 7718 // "super" may be the name of a type or variable. Figure out which 7719 // it is. 7720 IdentifierInfo *Super = getSuperIdentifier(); 7721 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName); 7722 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 7723 // "super" names an interface. Use it. 7724 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 7725 if (const ObjCObjectType *Iface = 7726 Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 7727 CDecl = Iface->getInterface(); 7728 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 7729 // "super" names an unresolved type; we can't be more specific. 7730 } else { 7731 // Assume that "super" names some kind of value and parse that way. 7732 CXXScopeSpec SS; 7733 SourceLocation TemplateKWLoc; 7734 UnqualifiedId id; 7735 id.setIdentifier(Super, SuperLoc); 7736 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 7737 /*HasTrailingLParen=*/false, 7738 /*IsAddressOfOperand=*/false); 7739 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 7740 SelIdents, AtArgumentExpression); 7741 } 7742 7743 // Fall through 7744 } 7745 7746 ParsedType Receiver; 7747 if (CDecl) 7748 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 7749 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 7750 AtArgumentExpression, 7751 /*IsSuper=*/true); 7752 } 7753 7754 /// Given a set of code-completion results for the argument of a message 7755 /// send, determine the preferred type (if any) for that argument expression. 7756 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 7757 unsigned NumSelIdents) { 7758 typedef CodeCompletionResult Result; 7759 ASTContext &Context = Results.getSema().Context; 7760 7761 QualType PreferredType; 7762 unsigned BestPriority = CCP_Unlikely * 2; 7763 Result *ResultsData = Results.data(); 7764 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 7765 Result &R = ResultsData[I]; 7766 if (R.Kind == Result::RK_Declaration && 7767 isa<ObjCMethodDecl>(R.Declaration)) { 7768 if (R.Priority <= BestPriority) { 7769 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 7770 if (NumSelIdents <= Method->param_size()) { 7771 QualType MyPreferredType = 7772 Method->parameters()[NumSelIdents - 1]->getType(); 7773 if (R.Priority < BestPriority || PreferredType.isNull()) { 7774 BestPriority = R.Priority; 7775 PreferredType = MyPreferredType; 7776 } else if (!Context.hasSameUnqualifiedType(PreferredType, 7777 MyPreferredType)) { 7778 PreferredType = QualType(); 7779 } 7780 } 7781 } 7782 } 7783 } 7784 7785 return PreferredType; 7786 } 7787 7788 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 7789 ParsedType Receiver, 7790 ArrayRef<IdentifierInfo *> SelIdents, 7791 bool AtArgumentExpression, bool IsSuper, 7792 ResultBuilder &Results) { 7793 typedef CodeCompletionResult Result; 7794 ObjCInterfaceDecl *CDecl = nullptr; 7795 7796 // If the given name refers to an interface type, retrieve the 7797 // corresponding declaration. 7798 if (Receiver) { 7799 QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr); 7800 if (!T.isNull()) 7801 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 7802 CDecl = Interface->getInterface(); 7803 } 7804 7805 // Add all of the factory methods in this Objective-C class, its protocols, 7806 // superclasses, categories, implementation, etc. 7807 Results.EnterNewScope(); 7808 7809 // If this is a send-to-super, try to add the special "super" send 7810 // completion. 7811 if (IsSuper) { 7812 if (ObjCMethodDecl *SuperMethod = 7813 AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 7814 Results.Ignore(SuperMethod); 7815 } 7816 7817 // If we're inside an Objective-C method definition, prefer its selector to 7818 // others. 7819 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 7820 Results.setPreferredSelector(CurMethod->getSelector()); 7821 7822 VisitedSelectorSet Selectors; 7823 if (CDecl) 7824 AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext, 7825 Selectors, AtArgumentExpression, Results); 7826 else { 7827 // We're messaging "id" as a type; provide all class/factory methods. 7828 7829 // If we have an external source, load the entire class method 7830 // pool from the AST file. 7831 if (SemaRef.getExternalSource()) { 7832 for (uint32_t I = 0, 7833 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 7834 I != N; ++I) { 7835 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 7836 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 7837 continue; 7838 7839 SemaRef.ReadMethodPool(Sel); 7840 } 7841 } 7842 7843 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 7844 MEnd = SemaRef.MethodPool.end(); 7845 M != MEnd; ++M) { 7846 for (ObjCMethodList *MethList = &M->second.second; 7847 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 7848 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 7849 continue; 7850 7851 Result R(MethList->getMethod(), 7852 Results.getBasePriority(MethList->getMethod()), nullptr); 7853 R.StartParameter = SelIdents.size(); 7854 R.AllParametersAreInformative = false; 7855 Results.MaybeAddResult(R, SemaRef.CurContext); 7856 } 7857 } 7858 } 7859 7860 Results.ExitScope(); 7861 } 7862 7863 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 7864 ArrayRef<IdentifierInfo *> SelIdents, 7865 bool AtArgumentExpression, 7866 bool IsSuper) { 7867 7868 QualType T = this->GetTypeFromParser(Receiver); 7869 7870 ResultBuilder Results( 7871 *this, CodeCompleter->getAllocator(), 7872 CodeCompleter->getCodeCompletionTUInfo(), 7873 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T, 7874 SelIdents)); 7875 7876 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 7877 AtArgumentExpression, IsSuper, Results); 7878 7879 // If we're actually at the argument expression (rather than prior to the 7880 // selector), we're actually performing code completion for an expression. 7881 // Determine whether we have a single, best method. If so, we can 7882 // code-complete the expression using the corresponding parameter type as 7883 // our preferred type, improving completion results. 7884 if (AtArgumentExpression) { 7885 QualType PreferredType = 7886 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 7887 if (PreferredType.isNull()) 7888 CodeCompleteOrdinaryName(S, PCC_Expression); 7889 else 7890 CodeCompleteExpression(S, PreferredType); 7891 return; 7892 } 7893 7894 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7895 Results.data(), Results.size()); 7896 } 7897 7898 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 7899 ArrayRef<IdentifierInfo *> SelIdents, 7900 bool AtArgumentExpression, 7901 ObjCInterfaceDecl *Super) { 7902 typedef CodeCompletionResult Result; 7903 7904 Expr *RecExpr = static_cast<Expr *>(Receiver); 7905 7906 // If necessary, apply function/array conversion to the receiver. 7907 // C99 6.7.5.3p[7,8]. 7908 if (RecExpr) { 7909 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 7910 if (Conv.isInvalid()) // conversion failed. bail. 7911 return; 7912 RecExpr = Conv.get(); 7913 } 7914 QualType ReceiverType = RecExpr 7915 ? RecExpr->getType() 7916 : Super ? Context.getObjCObjectPointerType( 7917 Context.getObjCInterfaceType(Super)) 7918 : Context.getObjCIdType(); 7919 7920 // If we're messaging an expression with type "id" or "Class", check 7921 // whether we know something special about the receiver that allows 7922 // us to assume a more-specific receiver type. 7923 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 7924 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 7925 if (ReceiverType->isObjCClassType()) 7926 return CodeCompleteObjCClassMessage( 7927 S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents, 7928 AtArgumentExpression, Super); 7929 7930 ReceiverType = 7931 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace)); 7932 } 7933 } else if (RecExpr && getLangOpts().CPlusPlus) { 7934 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 7935 if (Conv.isUsable()) { 7936 RecExpr = Conv.get(); 7937 ReceiverType = RecExpr->getType(); 7938 } 7939 } 7940 7941 // Build the set of methods we can see. 7942 ResultBuilder Results( 7943 *this, CodeCompleter->getAllocator(), 7944 CodeCompleter->getCodeCompletionTUInfo(), 7945 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 7946 ReceiverType, SelIdents)); 7947 7948 Results.EnterNewScope(); 7949 7950 // If this is a send-to-super, try to add the special "super" send 7951 // completion. 7952 if (Super) { 7953 if (ObjCMethodDecl *SuperMethod = 7954 AddSuperSendCompletion(*this, false, SelIdents, Results)) 7955 Results.Ignore(SuperMethod); 7956 } 7957 7958 // If we're inside an Objective-C method definition, prefer its selector to 7959 // others. 7960 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 7961 Results.setPreferredSelector(CurMethod->getSelector()); 7962 7963 // Keep track of the selectors we've already added. 7964 VisitedSelectorSet Selectors; 7965 7966 // Handle messages to Class. This really isn't a message to an instance 7967 // method, so we treat it the same way we would treat a message send to a 7968 // class method. 7969 if (ReceiverType->isObjCClassType() || 7970 ReceiverType->isObjCQualifiedClassType()) { 7971 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7972 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 7973 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext, 7974 Selectors, AtArgumentExpression, Results); 7975 } 7976 } 7977 // Handle messages to a qualified ID ("id<foo>"). 7978 else if (const ObjCObjectPointerType *QualID = 7979 ReceiverType->getAsObjCQualifiedIdType()) { 7980 // Search protocols for instance methods. 7981 for (auto *I : QualID->quals()) 7982 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 7983 AtArgumentExpression, Results); 7984 } 7985 // Handle messages to a pointer to interface type. 7986 else if (const ObjCObjectPointerType *IFacePtr = 7987 ReceiverType->getAsObjCInterfacePointerType()) { 7988 // Search the class, its superclasses, etc., for instance methods. 7989 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 7990 CurContext, Selectors, AtArgumentExpression, Results); 7991 7992 // Search protocols for instance methods. 7993 for (auto *I : IFacePtr->quals()) 7994 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 7995 AtArgumentExpression, Results); 7996 } 7997 // Handle messages to "id". 7998 else if (ReceiverType->isObjCIdType()) { 7999 // We're messaging "id", so provide all instance methods we know 8000 // about as code-completion results. 8001 8002 // If we have an external source, load the entire class method 8003 // pool from the AST file. 8004 if (ExternalSource) { 8005 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 8006 I != N; ++I) { 8007 Selector Sel = ExternalSource->GetExternalSelector(I); 8008 if (Sel.isNull() || MethodPool.count(Sel)) 8009 continue; 8010 8011 ReadMethodPool(Sel); 8012 } 8013 } 8014 8015 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8016 MEnd = MethodPool.end(); 8017 M != MEnd; ++M) { 8018 for (ObjCMethodList *MethList = &M->second.first; 8019 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 8020 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 8021 continue; 8022 8023 if (!Selectors.insert(MethList->getMethod()->getSelector()).second) 8024 continue; 8025 8026 Result R(MethList->getMethod(), 8027 Results.getBasePriority(MethList->getMethod()), nullptr); 8028 R.StartParameter = SelIdents.size(); 8029 R.AllParametersAreInformative = false; 8030 Results.MaybeAddResult(R, CurContext); 8031 } 8032 } 8033 } 8034 Results.ExitScope(); 8035 8036 // If we're actually at the argument expression (rather than prior to the 8037 // selector), we're actually performing code completion for an expression. 8038 // Determine whether we have a single, best method. If so, we can 8039 // code-complete the expression using the corresponding parameter type as 8040 // our preferred type, improving completion results. 8041 if (AtArgumentExpression) { 8042 QualType PreferredType = 8043 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 8044 if (PreferredType.isNull()) 8045 CodeCompleteOrdinaryName(S, PCC_Expression); 8046 else 8047 CodeCompleteExpression(S, PreferredType); 8048 return; 8049 } 8050 8051 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8052 Results.data(), Results.size()); 8053 } 8054 8055 void Sema::CodeCompleteObjCForCollection(Scope *S, 8056 DeclGroupPtrTy IterationVar) { 8057 CodeCompleteExpressionData Data; 8058 Data.ObjCCollection = true; 8059 8060 if (IterationVar.getAsOpaquePtr()) { 8061 DeclGroupRef DG = IterationVar.get(); 8062 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 8063 if (*I) 8064 Data.IgnoreDecls.push_back(*I); 8065 } 8066 } 8067 8068 CodeCompleteExpression(S, Data); 8069 } 8070 8071 void Sema::CodeCompleteObjCSelector(Scope *S, 8072 ArrayRef<IdentifierInfo *> SelIdents) { 8073 // If we have an external source, load the entire class method 8074 // pool from the AST file. 8075 if (ExternalSource) { 8076 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 8077 ++I) { 8078 Selector Sel = ExternalSource->GetExternalSelector(I); 8079 if (Sel.isNull() || MethodPool.count(Sel)) 8080 continue; 8081 8082 ReadMethodPool(Sel); 8083 } 8084 } 8085 8086 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8087 CodeCompleter->getCodeCompletionTUInfo(), 8088 CodeCompletionContext::CCC_SelectorName); 8089 Results.EnterNewScope(); 8090 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8091 MEnd = MethodPool.end(); 8092 M != MEnd; ++M) { 8093 8094 Selector Sel = M->first; 8095 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 8096 continue; 8097 8098 CodeCompletionBuilder Builder(Results.getAllocator(), 8099 Results.getCodeCompletionTUInfo()); 8100 if (Sel.isUnarySelector()) { 8101 Builder.AddTypedTextChunk( 8102 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 8103 Results.AddResult(Builder.TakeString()); 8104 continue; 8105 } 8106 8107 std::string Accumulator; 8108 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 8109 if (I == SelIdents.size()) { 8110 if (!Accumulator.empty()) { 8111 Builder.AddInformativeChunk( 8112 Builder.getAllocator().CopyString(Accumulator)); 8113 Accumulator.clear(); 8114 } 8115 } 8116 8117 Accumulator += Sel.getNameForSlot(I); 8118 Accumulator += ':'; 8119 } 8120 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator)); 8121 Results.AddResult(Builder.TakeString()); 8122 } 8123 Results.ExitScope(); 8124 8125 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8126 Results.data(), Results.size()); 8127 } 8128 8129 /// Add all of the protocol declarations that we find in the given 8130 /// (translation unit) context. 8131 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 8132 bool OnlyForwardDeclarations, 8133 ResultBuilder &Results) { 8134 typedef CodeCompletionResult Result; 8135 8136 for (const auto *D : Ctx->decls()) { 8137 // Record any protocols we find. 8138 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 8139 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 8140 Results.AddResult( 8141 Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext, 8142 nullptr, false); 8143 } 8144 } 8145 8146 void Sema::CodeCompleteObjCProtocolReferences( 8147 ArrayRef<IdentifierLocPair> Protocols) { 8148 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8149 CodeCompleter->getCodeCompletionTUInfo(), 8150 CodeCompletionContext::CCC_ObjCProtocolName); 8151 8152 if (CodeCompleter->includeGlobals()) { 8153 Results.EnterNewScope(); 8154 8155 // Tell the result set to ignore all of the protocols we have 8156 // already seen. 8157 // FIXME: This doesn't work when caching code-completion results. 8158 for (const IdentifierLocPair &Pair : Protocols) 8159 if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second)) 8160 Results.Ignore(Protocol); 8161 8162 // Add all protocols. 8163 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 8164 Results); 8165 8166 Results.ExitScope(); 8167 } 8168 8169 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8170 Results.data(), Results.size()); 8171 } 8172 8173 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 8174 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8175 CodeCompleter->getCodeCompletionTUInfo(), 8176 CodeCompletionContext::CCC_ObjCProtocolName); 8177 8178 if (CodeCompleter->includeGlobals()) { 8179 Results.EnterNewScope(); 8180 8181 // Add all protocols. 8182 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 8183 Results); 8184 8185 Results.ExitScope(); 8186 } 8187 8188 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8189 Results.data(), Results.size()); 8190 } 8191 8192 /// Add all of the Objective-C interface declarations that we find in 8193 /// the given (translation unit) context. 8194 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 8195 bool OnlyForwardDeclarations, 8196 bool OnlyUnimplemented, 8197 ResultBuilder &Results) { 8198 typedef CodeCompletionResult Result; 8199 8200 for (const auto *D : Ctx->decls()) { 8201 // Record any interfaces we find. 8202 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 8203 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 8204 (!OnlyUnimplemented || !Class->getImplementation())) 8205 Results.AddResult( 8206 Result(Class, Results.getBasePriority(Class), nullptr), CurContext, 8207 nullptr, false); 8208 } 8209 } 8210 8211 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 8212 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8213 CodeCompleter->getCodeCompletionTUInfo(), 8214 CodeCompletionContext::CCC_ObjCInterfaceName); 8215 Results.EnterNewScope(); 8216 8217 if (CodeCompleter->includeGlobals()) { 8218 // Add all classes. 8219 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8220 false, Results); 8221 } 8222 8223 Results.ExitScope(); 8224 8225 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8226 Results.data(), Results.size()); 8227 } 8228 8229 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 8230 SourceLocation ClassNameLoc) { 8231 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8232 CodeCompleter->getCodeCompletionTUInfo(), 8233 CodeCompletionContext::CCC_ObjCInterfaceName); 8234 Results.EnterNewScope(); 8235 8236 // Make sure that we ignore the class we're currently defining. 8237 NamedDecl *CurClass = 8238 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8239 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 8240 Results.Ignore(CurClass); 8241 8242 if (CodeCompleter->includeGlobals()) { 8243 // Add all classes. 8244 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8245 false, Results); 8246 } 8247 8248 Results.ExitScope(); 8249 8250 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8251 Results.data(), Results.size()); 8252 } 8253 8254 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 8255 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8256 CodeCompleter->getCodeCompletionTUInfo(), 8257 CodeCompletionContext::CCC_ObjCImplementation); 8258 Results.EnterNewScope(); 8259 8260 if (CodeCompleter->includeGlobals()) { 8261 // Add all unimplemented classes. 8262 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 8263 true, Results); 8264 } 8265 8266 Results.ExitScope(); 8267 8268 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8269 Results.data(), Results.size()); 8270 } 8271 8272 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 8273 IdentifierInfo *ClassName, 8274 SourceLocation ClassNameLoc) { 8275 typedef CodeCompletionResult Result; 8276 8277 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8278 CodeCompleter->getCodeCompletionTUInfo(), 8279 CodeCompletionContext::CCC_ObjCCategoryName); 8280 8281 // Ignore any categories we find that have already been implemented by this 8282 // interface. 8283 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8284 NamedDecl *CurClass = 8285 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8286 if (ObjCInterfaceDecl *Class = 8287 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) { 8288 for (const auto *Cat : Class->visible_categories()) 8289 CategoryNames.insert(Cat->getIdentifier()); 8290 } 8291 8292 // Add all of the categories we know about. 8293 Results.EnterNewScope(); 8294 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 8295 for (const auto *D : TU->decls()) 8296 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 8297 if (CategoryNames.insert(Category->getIdentifier()).second) 8298 Results.AddResult( 8299 Result(Category, Results.getBasePriority(Category), nullptr), 8300 CurContext, nullptr, false); 8301 Results.ExitScope(); 8302 8303 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8304 Results.data(), Results.size()); 8305 } 8306 8307 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 8308 IdentifierInfo *ClassName, 8309 SourceLocation ClassNameLoc) { 8310 typedef CodeCompletionResult Result; 8311 8312 // Find the corresponding interface. If we couldn't find the interface, the 8313 // program itself is ill-formed. However, we'll try to be helpful still by 8314 // providing the list of all of the categories we know about. 8315 NamedDecl *CurClass = 8316 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 8317 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 8318 if (!Class) 8319 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 8320 8321 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8322 CodeCompleter->getCodeCompletionTUInfo(), 8323 CodeCompletionContext::CCC_ObjCCategoryName); 8324 8325 // Add all of the categories that have have corresponding interface 8326 // declarations in this class and any of its superclasses, except for 8327 // already-implemented categories in the class itself. 8328 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 8329 Results.EnterNewScope(); 8330 bool IgnoreImplemented = true; 8331 while (Class) { 8332 for (const auto *Cat : Class->visible_categories()) { 8333 if ((!IgnoreImplemented || !Cat->getImplementation()) && 8334 CategoryNames.insert(Cat->getIdentifier()).second) 8335 Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr), 8336 CurContext, nullptr, false); 8337 } 8338 8339 Class = Class->getSuperClass(); 8340 IgnoreImplemented = false; 8341 } 8342 Results.ExitScope(); 8343 8344 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8345 Results.data(), Results.size()); 8346 } 8347 8348 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 8349 CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other); 8350 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8351 CodeCompleter->getCodeCompletionTUInfo(), CCContext); 8352 8353 // Figure out where this @synthesize lives. 8354 ObjCContainerDecl *Container = 8355 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8356 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8357 !isa<ObjCCategoryImplDecl>(Container))) 8358 return; 8359 8360 // Ignore any properties that have already been implemented. 8361 Container = getContainerDef(Container); 8362 for (const auto *D : Container->decls()) 8363 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 8364 Results.Ignore(PropertyImpl->getPropertyDecl()); 8365 8366 // Add any properties that we find. 8367 AddedPropertiesSet AddedProperties; 8368 Results.EnterNewScope(); 8369 if (ObjCImplementationDecl *ClassImpl = 8370 dyn_cast<ObjCImplementationDecl>(Container)) 8371 AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false, 8372 /*AllowNullaryMethods=*/false, CurContext, 8373 AddedProperties, Results); 8374 else 8375 AddObjCProperties(CCContext, 8376 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 8377 false, /*AllowNullaryMethods=*/false, CurContext, 8378 AddedProperties, Results); 8379 Results.ExitScope(); 8380 8381 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8382 Results.data(), Results.size()); 8383 } 8384 8385 void Sema::CodeCompleteObjCPropertySynthesizeIvar( 8386 Scope *S, IdentifierInfo *PropertyName) { 8387 typedef CodeCompletionResult Result; 8388 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8389 CodeCompleter->getCodeCompletionTUInfo(), 8390 CodeCompletionContext::CCC_Other); 8391 8392 // Figure out where this @synthesize lives. 8393 ObjCContainerDecl *Container = 8394 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 8395 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 8396 !isa<ObjCCategoryImplDecl>(Container))) 8397 return; 8398 8399 // Figure out which interface we're looking into. 8400 ObjCInterfaceDecl *Class = nullptr; 8401 if (ObjCImplementationDecl *ClassImpl = 8402 dyn_cast<ObjCImplementationDecl>(Container)) 8403 Class = ClassImpl->getClassInterface(); 8404 else 8405 Class = cast<ObjCCategoryImplDecl>(Container) 8406 ->getCategoryDecl() 8407 ->getClassInterface(); 8408 8409 // Determine the type of the property we're synthesizing. 8410 QualType PropertyType = Context.getObjCIdType(); 8411 if (Class) { 8412 if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration( 8413 PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) { 8414 PropertyType = 8415 Property->getType().getNonReferenceType().getUnqualifiedType(); 8416 8417 // Give preference to ivars 8418 Results.setPreferredType(PropertyType); 8419 } 8420 } 8421 8422 // Add all of the instance variables in this class and its superclasses. 8423 Results.EnterNewScope(); 8424 bool SawSimilarlyNamedIvar = false; 8425 std::string NameWithPrefix; 8426 NameWithPrefix += '_'; 8427 NameWithPrefix += PropertyName->getName(); 8428 std::string NameWithSuffix = PropertyName->getName().str(); 8429 NameWithSuffix += '_'; 8430 for (; Class; Class = Class->getSuperClass()) { 8431 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 8432 Ivar = Ivar->getNextIvar()) { 8433 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr), 8434 CurContext, nullptr, false); 8435 8436 // Determine whether we've seen an ivar with a name similar to the 8437 // property. 8438 if ((PropertyName == Ivar->getIdentifier() || 8439 NameWithPrefix == Ivar->getName() || 8440 NameWithSuffix == Ivar->getName())) { 8441 SawSimilarlyNamedIvar = true; 8442 8443 // Reduce the priority of this result by one, to give it a slight 8444 // advantage over other results whose names don't match so closely. 8445 if (Results.size() && 8446 Results.data()[Results.size() - 1].Kind == 8447 CodeCompletionResult::RK_Declaration && 8448 Results.data()[Results.size() - 1].Declaration == Ivar) 8449 Results.data()[Results.size() - 1].Priority--; 8450 } 8451 } 8452 } 8453 8454 if (!SawSimilarlyNamedIvar) { 8455 // Create ivar result _propName, that the user can use to synthesize 8456 // an ivar of the appropriate type. 8457 unsigned Priority = CCP_MemberDeclaration + 1; 8458 typedef CodeCompletionResult Result; 8459 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8460 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 8461 Priority, CXAvailability_Available); 8462 8463 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 8464 Builder.AddResultTypeChunk( 8465 GetCompletionTypeString(PropertyType, Context, Policy, Allocator)); 8466 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 8467 Results.AddResult( 8468 Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl)); 8469 } 8470 8471 Results.ExitScope(); 8472 8473 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8474 Results.data(), Results.size()); 8475 } 8476 8477 // Mapping from selectors to the methods that implement that selector, along 8478 // with the "in original class" flag. 8479 typedef llvm::DenseMap<Selector, 8480 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>> 8481 KnownMethodsMap; 8482 8483 /// Find all of the methods that reside in the given container 8484 /// (and its superclasses, protocols, etc.) that meet the given 8485 /// criteria. Insert those methods into the map of known methods, 8486 /// indexed by selector so they can be easily found. 8487 static void FindImplementableMethods(ASTContext &Context, 8488 ObjCContainerDecl *Container, 8489 Optional<bool> WantInstanceMethods, 8490 QualType ReturnType, 8491 KnownMethodsMap &KnownMethods, 8492 bool InOriginalClass = true) { 8493 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 8494 // Make sure we have a definition; that's what we'll walk. 8495 if (!IFace->hasDefinition()) 8496 return; 8497 8498 IFace = IFace->getDefinition(); 8499 Container = IFace; 8500 8501 const ObjCList<ObjCProtocolDecl> &Protocols = 8502 IFace->getReferencedProtocols(); 8503 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8504 E = Protocols.end(); 8505 I != E; ++I) 8506 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8507 KnownMethods, InOriginalClass); 8508 8509 // Add methods from any class extensions and categories. 8510 for (auto *Cat : IFace->visible_categories()) { 8511 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType, 8512 KnownMethods, false); 8513 } 8514 8515 // Visit the superclass. 8516 if (IFace->getSuperClass()) 8517 FindImplementableMethods(Context, IFace->getSuperClass(), 8518 WantInstanceMethods, ReturnType, KnownMethods, 8519 false); 8520 } 8521 8522 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 8523 // Recurse into protocols. 8524 const ObjCList<ObjCProtocolDecl> &Protocols = 8525 Category->getReferencedProtocols(); 8526 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8527 E = Protocols.end(); 8528 I != E; ++I) 8529 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8530 KnownMethods, InOriginalClass); 8531 8532 // If this category is the original class, jump to the interface. 8533 if (InOriginalClass && Category->getClassInterface()) 8534 FindImplementableMethods(Context, Category->getClassInterface(), 8535 WantInstanceMethods, ReturnType, KnownMethods, 8536 false); 8537 } 8538 8539 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 8540 // Make sure we have a definition; that's what we'll walk. 8541 if (!Protocol->hasDefinition()) 8542 return; 8543 Protocol = Protocol->getDefinition(); 8544 Container = Protocol; 8545 8546 // Recurse into protocols. 8547 const ObjCList<ObjCProtocolDecl> &Protocols = 8548 Protocol->getReferencedProtocols(); 8549 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 8550 E = Protocols.end(); 8551 I != E; ++I) 8552 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 8553 KnownMethods, false); 8554 } 8555 8556 // Add methods in this container. This operation occurs last because 8557 // we want the methods from this container to override any methods 8558 // we've previously seen with the same selector. 8559 for (auto *M : Container->methods()) { 8560 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) { 8561 if (!ReturnType.isNull() && 8562 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 8563 continue; 8564 8565 KnownMethods[M->getSelector()] = 8566 KnownMethodsMap::mapped_type(M, InOriginalClass); 8567 } 8568 } 8569 } 8570 8571 /// Add the parenthesized return or parameter type chunk to a code 8572 /// completion string. 8573 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals, 8574 ASTContext &Context, 8575 const PrintingPolicy &Policy, 8576 CodeCompletionBuilder &Builder) { 8577 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8578 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type); 8579 if (!Quals.empty()) 8580 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 8581 Builder.AddTextChunk( 8582 GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator())); 8583 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8584 } 8585 8586 /// Determine whether the given class is or inherits from a class by 8587 /// the given name. 8588 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) { 8589 if (!Class) 8590 return false; 8591 8592 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 8593 return true; 8594 8595 return InheritsFromClassNamed(Class->getSuperClass(), Name); 8596 } 8597 8598 /// Add code completions for Objective-C Key-Value Coding (KVC) and 8599 /// Key-Value Observing (KVO). 8600 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 8601 bool IsInstanceMethod, 8602 QualType ReturnType, ASTContext &Context, 8603 VisitedSelectorSet &KnownSelectors, 8604 ResultBuilder &Results) { 8605 IdentifierInfo *PropName = Property->getIdentifier(); 8606 if (!PropName || PropName->getLength() == 0) 8607 return; 8608 8609 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 8610 8611 // Builder that will create each code completion. 8612 typedef CodeCompletionResult Result; 8613 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8614 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 8615 8616 // The selector table. 8617 SelectorTable &Selectors = Context.Selectors; 8618 8619 // The property name, copied into the code completion allocation region 8620 // on demand. 8621 struct KeyHolder { 8622 CodeCompletionAllocator &Allocator; 8623 StringRef Key; 8624 const char *CopiedKey; 8625 8626 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 8627 : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {} 8628 8629 operator const char *() { 8630 if (CopiedKey) 8631 return CopiedKey; 8632 8633 return CopiedKey = Allocator.CopyString(Key); 8634 } 8635 } Key(Allocator, PropName->getName()); 8636 8637 // The uppercased name of the property name. 8638 std::string UpperKey = std::string(PropName->getName()); 8639 if (!UpperKey.empty()) 8640 UpperKey[0] = toUppercase(UpperKey[0]); 8641 8642 bool ReturnTypeMatchesProperty = 8643 ReturnType.isNull() || 8644 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 8645 Property->getType()); 8646 bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType(); 8647 8648 // Add the normal accessor -(type)key. 8649 if (IsInstanceMethod && 8650 KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second && 8651 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 8652 if (ReturnType.isNull()) 8653 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8654 Builder); 8655 8656 Builder.AddTypedTextChunk(Key); 8657 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8658 CXCursor_ObjCInstanceMethodDecl)); 8659 } 8660 8661 // If we have an integral or boolean property (or the user has provided 8662 // an integral or boolean return type), add the accessor -(type)isKey. 8663 if (IsInstanceMethod && 8664 ((!ReturnType.isNull() && 8665 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 8666 (ReturnType.isNull() && (Property->getType()->isIntegerType() || 8667 Property->getType()->isBooleanType())))) { 8668 std::string SelectorName = (Twine("is") + UpperKey).str(); 8669 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8670 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8671 .second) { 8672 if (ReturnType.isNull()) { 8673 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8674 Builder.AddTextChunk("BOOL"); 8675 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8676 } 8677 8678 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8679 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8680 CXCursor_ObjCInstanceMethodDecl)); 8681 } 8682 } 8683 8684 // Add the normal mutator. 8685 if (IsInstanceMethod && ReturnTypeMatchesVoid && 8686 !Property->getSetterMethodDecl()) { 8687 std::string SelectorName = (Twine("set") + UpperKey).str(); 8688 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8689 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8690 if (ReturnType.isNull()) { 8691 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8692 Builder.AddTextChunk("void"); 8693 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8694 } 8695 8696 Builder.AddTypedTextChunk( 8697 Allocator.CopyString(SelectorId->getName() + ":")); 8698 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8699 Builder); 8700 Builder.AddTextChunk(Key); 8701 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8702 CXCursor_ObjCInstanceMethodDecl)); 8703 } 8704 } 8705 8706 // Indexed and unordered accessors 8707 unsigned IndexedGetterPriority = CCP_CodePattern; 8708 unsigned IndexedSetterPriority = CCP_CodePattern; 8709 unsigned UnorderedGetterPriority = CCP_CodePattern; 8710 unsigned UnorderedSetterPriority = CCP_CodePattern; 8711 if (const auto *ObjCPointer = 8712 Property->getType()->getAs<ObjCObjectPointerType>()) { 8713 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 8714 // If this interface type is not provably derived from a known 8715 // collection, penalize the corresponding completions. 8716 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 8717 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8718 if (!InheritsFromClassNamed(IFace, "NSArray")) 8719 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8720 } 8721 8722 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 8723 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8724 if (!InheritsFromClassNamed(IFace, "NSSet")) 8725 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8726 } 8727 } 8728 } else { 8729 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8730 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8731 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8732 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8733 } 8734 8735 // Add -(NSUInteger)countOf<key> 8736 if (IsInstanceMethod && 8737 (ReturnType.isNull() || ReturnType->isIntegerType())) { 8738 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 8739 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8740 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8741 .second) { 8742 if (ReturnType.isNull()) { 8743 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8744 Builder.AddTextChunk("NSUInteger"); 8745 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8746 } 8747 8748 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8749 Results.AddResult( 8750 Result(Builder.TakeString(), 8751 std::min(IndexedGetterPriority, UnorderedGetterPriority), 8752 CXCursor_ObjCInstanceMethodDecl)); 8753 } 8754 } 8755 8756 // Indexed getters 8757 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 8758 if (IsInstanceMethod && 8759 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 8760 std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str(); 8761 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8762 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8763 if (ReturnType.isNull()) { 8764 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8765 Builder.AddTextChunk("id"); 8766 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8767 } 8768 8769 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8770 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8771 Builder.AddTextChunk("NSUInteger"); 8772 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8773 Builder.AddTextChunk("index"); 8774 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8775 CXCursor_ObjCInstanceMethodDecl)); 8776 } 8777 } 8778 8779 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 8780 if (IsInstanceMethod && 8781 (ReturnType.isNull() || 8782 (ReturnType->isObjCObjectPointerType() && 8783 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8784 ReturnType->castAs<ObjCObjectPointerType>() 8785 ->getInterfaceDecl() 8786 ->getName() == "NSArray"))) { 8787 std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str(); 8788 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8789 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8790 if (ReturnType.isNull()) { 8791 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8792 Builder.AddTextChunk("NSArray *"); 8793 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8794 } 8795 8796 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8797 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8798 Builder.AddTextChunk("NSIndexSet *"); 8799 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8800 Builder.AddTextChunk("indexes"); 8801 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8802 CXCursor_ObjCInstanceMethodDecl)); 8803 } 8804 } 8805 8806 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 8807 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8808 std::string SelectorName = (Twine("get") + UpperKey).str(); 8809 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8810 &Context.Idents.get("range")}; 8811 8812 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8813 if (ReturnType.isNull()) { 8814 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8815 Builder.AddTextChunk("void"); 8816 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8817 } 8818 8819 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8820 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8821 Builder.AddPlaceholderChunk("object-type"); 8822 Builder.AddTextChunk(" **"); 8823 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8824 Builder.AddTextChunk("buffer"); 8825 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8826 Builder.AddTypedTextChunk("range:"); 8827 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8828 Builder.AddTextChunk("NSRange"); 8829 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8830 Builder.AddTextChunk("inRange"); 8831 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8832 CXCursor_ObjCInstanceMethodDecl)); 8833 } 8834 } 8835 8836 // Mutable indexed accessors 8837 8838 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 8839 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8840 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 8841 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"), 8842 &Context.Idents.get(SelectorName)}; 8843 8844 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8845 if (ReturnType.isNull()) { 8846 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8847 Builder.AddTextChunk("void"); 8848 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8849 } 8850 8851 Builder.AddTypedTextChunk("insertObject:"); 8852 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8853 Builder.AddPlaceholderChunk("object-type"); 8854 Builder.AddTextChunk(" *"); 8855 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8856 Builder.AddTextChunk("object"); 8857 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8858 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8859 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8860 Builder.AddPlaceholderChunk("NSUInteger"); 8861 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8862 Builder.AddTextChunk("index"); 8863 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8864 CXCursor_ObjCInstanceMethodDecl)); 8865 } 8866 } 8867 8868 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 8869 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8870 std::string SelectorName = (Twine("insert") + UpperKey).str(); 8871 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8872 &Context.Idents.get("atIndexes")}; 8873 8874 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8875 if (ReturnType.isNull()) { 8876 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8877 Builder.AddTextChunk("void"); 8878 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8879 } 8880 8881 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8882 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8883 Builder.AddTextChunk("NSArray *"); 8884 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8885 Builder.AddTextChunk("array"); 8886 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8887 Builder.AddTypedTextChunk("atIndexes:"); 8888 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8889 Builder.AddPlaceholderChunk("NSIndexSet *"); 8890 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8891 Builder.AddTextChunk("indexes"); 8892 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8893 CXCursor_ObjCInstanceMethodDecl)); 8894 } 8895 } 8896 8897 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 8898 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8899 std::string SelectorName = 8900 (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 8901 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8902 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8903 if (ReturnType.isNull()) { 8904 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8905 Builder.AddTextChunk("void"); 8906 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8907 } 8908 8909 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8910 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8911 Builder.AddTextChunk("NSUInteger"); 8912 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8913 Builder.AddTextChunk("index"); 8914 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8915 CXCursor_ObjCInstanceMethodDecl)); 8916 } 8917 } 8918 8919 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 8920 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8921 std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str(); 8922 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8923 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8924 if (ReturnType.isNull()) { 8925 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8926 Builder.AddTextChunk("void"); 8927 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8928 } 8929 8930 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8931 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8932 Builder.AddTextChunk("NSIndexSet *"); 8933 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8934 Builder.AddTextChunk("indexes"); 8935 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8936 CXCursor_ObjCInstanceMethodDecl)); 8937 } 8938 } 8939 8940 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 8941 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8942 std::string SelectorName = 8943 (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 8944 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8945 &Context.Idents.get("withObject")}; 8946 8947 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8948 if (ReturnType.isNull()) { 8949 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8950 Builder.AddTextChunk("void"); 8951 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8952 } 8953 8954 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8955 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8956 Builder.AddPlaceholderChunk("NSUInteger"); 8957 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8958 Builder.AddTextChunk("index"); 8959 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8960 Builder.AddTypedTextChunk("withObject:"); 8961 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8962 Builder.AddTextChunk("id"); 8963 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8964 Builder.AddTextChunk("object"); 8965 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8966 CXCursor_ObjCInstanceMethodDecl)); 8967 } 8968 } 8969 8970 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 8971 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8972 std::string SelectorName1 = 8973 (Twine("replace") + UpperKey + "AtIndexes").str(); 8974 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 8975 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1), 8976 &Context.Idents.get(SelectorName2)}; 8977 8978 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8979 if (ReturnType.isNull()) { 8980 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8981 Builder.AddTextChunk("void"); 8982 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8983 } 8984 8985 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 8986 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8987 Builder.AddPlaceholderChunk("NSIndexSet *"); 8988 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8989 Builder.AddTextChunk("indexes"); 8990 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8991 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 8992 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8993 Builder.AddTextChunk("NSArray *"); 8994 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8995 Builder.AddTextChunk("array"); 8996 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8997 CXCursor_ObjCInstanceMethodDecl)); 8998 } 8999 } 9000 9001 // Unordered getters 9002 // - (NSEnumerator *)enumeratorOfKey 9003 if (IsInstanceMethod && 9004 (ReturnType.isNull() || 9005 (ReturnType->isObjCObjectPointerType() && 9006 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9007 ReturnType->getAs<ObjCObjectPointerType>() 9008 ->getInterfaceDecl() 9009 ->getName() == "NSEnumerator"))) { 9010 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 9011 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9012 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9013 .second) { 9014 if (ReturnType.isNull()) { 9015 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9016 Builder.AddTextChunk("NSEnumerator *"); 9017 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9018 } 9019 9020 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9021 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9022 CXCursor_ObjCInstanceMethodDecl)); 9023 } 9024 } 9025 9026 // - (type *)memberOfKey:(type *)object 9027 if (IsInstanceMethod && 9028 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 9029 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 9030 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9031 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9032 if (ReturnType.isNull()) { 9033 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9034 Builder.AddPlaceholderChunk("object-type"); 9035 Builder.AddTextChunk(" *"); 9036 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9037 } 9038 9039 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9040 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9041 if (ReturnType.isNull()) { 9042 Builder.AddPlaceholderChunk("object-type"); 9043 Builder.AddTextChunk(" *"); 9044 } else { 9045 Builder.AddTextChunk(GetCompletionTypeString( 9046 ReturnType, Context, Policy, Builder.getAllocator())); 9047 } 9048 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9049 Builder.AddTextChunk("object"); 9050 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 9051 CXCursor_ObjCInstanceMethodDecl)); 9052 } 9053 } 9054 9055 // Mutable unordered accessors 9056 // - (void)addKeyObject:(type *)object 9057 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9058 std::string SelectorName = 9059 (Twine("add") + UpperKey + Twine("Object")).str(); 9060 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9061 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9062 if (ReturnType.isNull()) { 9063 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9064 Builder.AddTextChunk("void"); 9065 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9066 } 9067 9068 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9069 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9070 Builder.AddPlaceholderChunk("object-type"); 9071 Builder.AddTextChunk(" *"); 9072 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9073 Builder.AddTextChunk("object"); 9074 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9075 CXCursor_ObjCInstanceMethodDecl)); 9076 } 9077 } 9078 9079 // - (void)addKey:(NSSet *)objects 9080 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9081 std::string SelectorName = (Twine("add") + UpperKey).str(); 9082 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9083 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9084 if (ReturnType.isNull()) { 9085 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9086 Builder.AddTextChunk("void"); 9087 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9088 } 9089 9090 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9091 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9092 Builder.AddTextChunk("NSSet *"); 9093 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9094 Builder.AddTextChunk("objects"); 9095 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9096 CXCursor_ObjCInstanceMethodDecl)); 9097 } 9098 } 9099 9100 // - (void)removeKeyObject:(type *)object 9101 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9102 std::string SelectorName = 9103 (Twine("remove") + UpperKey + Twine("Object")).str(); 9104 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9105 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).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(SelectorName + ":")); 9113 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9114 Builder.AddPlaceholderChunk("object-type"); 9115 Builder.AddTextChunk(" *"); 9116 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9117 Builder.AddTextChunk("object"); 9118 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9119 CXCursor_ObjCInstanceMethodDecl)); 9120 } 9121 } 9122 9123 // - (void)removeKey:(NSSet *)objects 9124 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9125 std::string SelectorName = (Twine("remove") + UpperKey).str(); 9126 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9127 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9128 if (ReturnType.isNull()) { 9129 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9130 Builder.AddTextChunk("void"); 9131 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9132 } 9133 9134 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9135 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9136 Builder.AddTextChunk("NSSet *"); 9137 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9138 Builder.AddTextChunk("objects"); 9139 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9140 CXCursor_ObjCInstanceMethodDecl)); 9141 } 9142 } 9143 9144 // - (void)intersectKey:(NSSet *)objects 9145 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 9146 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 9147 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9148 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 9149 if (ReturnType.isNull()) { 9150 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9151 Builder.AddTextChunk("void"); 9152 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9153 } 9154 9155 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 9156 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9157 Builder.AddTextChunk("NSSet *"); 9158 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9159 Builder.AddTextChunk("objects"); 9160 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 9161 CXCursor_ObjCInstanceMethodDecl)); 9162 } 9163 } 9164 9165 // Key-Value Observing 9166 // + (NSSet *)keyPathsForValuesAffectingKey 9167 if (!IsInstanceMethod && 9168 (ReturnType.isNull() || 9169 (ReturnType->isObjCObjectPointerType() && 9170 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 9171 ReturnType->castAs<ObjCObjectPointerType>() 9172 ->getInterfaceDecl() 9173 ->getName() == "NSSet"))) { 9174 std::string SelectorName = 9175 (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 9176 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9177 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9178 .second) { 9179 if (ReturnType.isNull()) { 9180 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9181 Builder.AddTextChunk("NSSet<NSString *> *"); 9182 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9183 } 9184 9185 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9186 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9187 CXCursor_ObjCClassMethodDecl)); 9188 } 9189 } 9190 9191 // + (BOOL)automaticallyNotifiesObserversForKey 9192 if (!IsInstanceMethod && 9193 (ReturnType.isNull() || ReturnType->isIntegerType() || 9194 ReturnType->isBooleanType())) { 9195 std::string SelectorName = 9196 (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 9197 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 9198 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 9199 .second) { 9200 if (ReturnType.isNull()) { 9201 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9202 Builder.AddTextChunk("BOOL"); 9203 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9204 } 9205 9206 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 9207 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 9208 CXCursor_ObjCClassMethodDecl)); 9209 } 9210 } 9211 } 9212 9213 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod, 9214 ParsedType ReturnTy) { 9215 // Determine the return type of the method we're declaring, if 9216 // provided. 9217 QualType ReturnType = GetTypeFromParser(ReturnTy); 9218 Decl *IDecl = nullptr; 9219 if (CurContext->isObjCContainer()) { 9220 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 9221 IDecl = OCD; 9222 } 9223 // Determine where we should start searching for methods. 9224 ObjCContainerDecl *SearchDecl = nullptr; 9225 bool IsInImplementation = false; 9226 if (Decl *D = IDecl) { 9227 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 9228 SearchDecl = Impl->getClassInterface(); 9229 IsInImplementation = true; 9230 } else if (ObjCCategoryImplDecl *CatImpl = 9231 dyn_cast<ObjCCategoryImplDecl>(D)) { 9232 SearchDecl = CatImpl->getCategoryDecl(); 9233 IsInImplementation = true; 9234 } else 9235 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 9236 } 9237 9238 if (!SearchDecl && S) { 9239 if (DeclContext *DC = S->getEntity()) 9240 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 9241 } 9242 9243 if (!SearchDecl) { 9244 HandleCodeCompleteResults(this, CodeCompleter, 9245 CodeCompletionContext::CCC_Other, nullptr, 0); 9246 return; 9247 } 9248 9249 // Find all of the methods that we could declare/implement here. 9250 KnownMethodsMap KnownMethods; 9251 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType, 9252 KnownMethods); 9253 9254 // Add declarations or definitions for each of the known methods. 9255 typedef CodeCompletionResult Result; 9256 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9257 CodeCompleter->getCodeCompletionTUInfo(), 9258 CodeCompletionContext::CCC_Other); 9259 Results.EnterNewScope(); 9260 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 9261 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9262 MEnd = KnownMethods.end(); 9263 M != MEnd; ++M) { 9264 ObjCMethodDecl *Method = M->second.getPointer(); 9265 CodeCompletionBuilder Builder(Results.getAllocator(), 9266 Results.getCodeCompletionTUInfo()); 9267 9268 // Add the '-'/'+' prefix if it wasn't provided yet. 9269 if (!IsInstanceMethod) { 9270 Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+"); 9271 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9272 } 9273 9274 // If the result type was not already provided, add it to the 9275 // pattern as (type). 9276 if (ReturnType.isNull()) { 9277 QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context); 9278 AttributedType::stripOuterNullability(ResTy); 9279 AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context, 9280 Policy, Builder); 9281 } 9282 9283 Selector Sel = Method->getSelector(); 9284 9285 if (Sel.isUnarySelector()) { 9286 // Unary selectors have no arguments. 9287 Builder.AddTypedTextChunk( 9288 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 9289 } else { 9290 // Add all parameters to the pattern. 9291 unsigned I = 0; 9292 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 9293 PEnd = Method->param_end(); 9294 P != PEnd; (void)++P, ++I) { 9295 // Add the part of the selector name. 9296 if (I == 0) 9297 Builder.AddTypedTextChunk( 9298 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9299 else if (I < Sel.getNumArgs()) { 9300 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9301 Builder.AddTypedTextChunk( 9302 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 9303 } else 9304 break; 9305 9306 // Add the parameter type. 9307 QualType ParamType; 9308 if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability) 9309 ParamType = (*P)->getType(); 9310 else 9311 ParamType = (*P)->getOriginalType(); 9312 ParamType = ParamType.substObjCTypeArgs( 9313 Context, {}, ObjCSubstitutionContext::Parameter); 9314 AttributedType::stripOuterNullability(ParamType); 9315 AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), 9316 Context, Policy, Builder); 9317 9318 if (IdentifierInfo *Id = (*P)->getIdentifier()) 9319 Builder.AddTextChunk( 9320 Builder.getAllocator().CopyString(Id->getName())); 9321 } 9322 } 9323 9324 if (Method->isVariadic()) { 9325 if (Method->param_size() > 0) 9326 Builder.AddChunk(CodeCompletionString::CK_Comma); 9327 Builder.AddTextChunk("..."); 9328 } 9329 9330 if (IsInImplementation && Results.includeCodePatterns()) { 9331 // We will be defining the method here, so add a compound statement. 9332 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9333 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 9334 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9335 if (!Method->getReturnType()->isVoidType()) { 9336 // If the result type is not void, add a return clause. 9337 Builder.AddTextChunk("return"); 9338 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9339 Builder.AddPlaceholderChunk("expression"); 9340 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 9341 } else 9342 Builder.AddPlaceholderChunk("statements"); 9343 9344 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 9345 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 9346 } 9347 9348 unsigned Priority = CCP_CodePattern; 9349 auto R = Result(Builder.TakeString(), Method, Priority); 9350 if (!M->second.getInt()) 9351 setInBaseClass(R); 9352 Results.AddResult(std::move(R)); 9353 } 9354 9355 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 9356 // the properties in this class and its categories. 9357 if (Context.getLangOpts().ObjC) { 9358 SmallVector<ObjCContainerDecl *, 4> Containers; 9359 Containers.push_back(SearchDecl); 9360 9361 VisitedSelectorSet KnownSelectors; 9362 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 9363 MEnd = KnownMethods.end(); 9364 M != MEnd; ++M) 9365 KnownSelectors.insert(M->first); 9366 9367 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 9368 if (!IFace) 9369 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 9370 IFace = Category->getClassInterface(); 9371 9372 if (IFace) 9373 for (auto *Cat : IFace->visible_categories()) 9374 Containers.push_back(Cat); 9375 9376 if (IsInstanceMethod) { 9377 for (unsigned I = 0, N = Containers.size(); I != N; ++I) 9378 for (auto *P : Containers[I]->instance_properties()) 9379 AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context, 9380 KnownSelectors, Results); 9381 } 9382 } 9383 9384 Results.ExitScope(); 9385 9386 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9387 Results.data(), Results.size()); 9388 } 9389 9390 void Sema::CodeCompleteObjCMethodDeclSelector( 9391 Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy, 9392 ArrayRef<IdentifierInfo *> SelIdents) { 9393 // If we have an external source, load the entire class method 9394 // pool from the AST file. 9395 if (ExternalSource) { 9396 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 9397 ++I) { 9398 Selector Sel = ExternalSource->GetExternalSelector(I); 9399 if (Sel.isNull() || MethodPool.count(Sel)) 9400 continue; 9401 9402 ReadMethodPool(Sel); 9403 } 9404 } 9405 9406 // Build the set of methods we can see. 9407 typedef CodeCompletionResult Result; 9408 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9409 CodeCompleter->getCodeCompletionTUInfo(), 9410 CodeCompletionContext::CCC_Other); 9411 9412 if (ReturnTy) 9413 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 9414 9415 Results.EnterNewScope(); 9416 for (GlobalMethodPool::iterator M = MethodPool.begin(), 9417 MEnd = MethodPool.end(); 9418 M != MEnd; ++M) { 9419 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first 9420 : &M->second.second; 9421 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 9422 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 9423 continue; 9424 9425 if (AtParameterName) { 9426 // Suggest parameter names we've seen before. 9427 unsigned NumSelIdents = SelIdents.size(); 9428 if (NumSelIdents && 9429 NumSelIdents <= MethList->getMethod()->param_size()) { 9430 ParmVarDecl *Param = 9431 MethList->getMethod()->parameters()[NumSelIdents - 1]; 9432 if (Param->getIdentifier()) { 9433 CodeCompletionBuilder Builder(Results.getAllocator(), 9434 Results.getCodeCompletionTUInfo()); 9435 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 9436 Param->getIdentifier()->getName())); 9437 Results.AddResult(Builder.TakeString()); 9438 } 9439 } 9440 9441 continue; 9442 } 9443 9444 Result R(MethList->getMethod(), 9445 Results.getBasePriority(MethList->getMethod()), nullptr); 9446 R.StartParameter = SelIdents.size(); 9447 R.AllParametersAreInformative = false; 9448 R.DeclaringEntity = true; 9449 Results.MaybeAddResult(R, CurContext); 9450 } 9451 } 9452 9453 Results.ExitScope(); 9454 9455 if (!AtParameterName && !SelIdents.empty() && 9456 SelIdents.front()->getName().startswith("init")) { 9457 for (const auto &M : PP.macros()) { 9458 if (M.first->getName() != "NS_DESIGNATED_INITIALIZER") 9459 continue; 9460 Results.EnterNewScope(); 9461 CodeCompletionBuilder Builder(Results.getAllocator(), 9462 Results.getCodeCompletionTUInfo()); 9463 Builder.AddTypedTextChunk( 9464 Builder.getAllocator().CopyString(M.first->getName())); 9465 Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro, 9466 CXCursor_MacroDefinition)); 9467 Results.ExitScope(); 9468 } 9469 } 9470 9471 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9472 Results.data(), Results.size()); 9473 } 9474 9475 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 9476 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9477 CodeCompleter->getCodeCompletionTUInfo(), 9478 CodeCompletionContext::CCC_PreprocessorDirective); 9479 Results.EnterNewScope(); 9480 9481 // #if <condition> 9482 CodeCompletionBuilder Builder(Results.getAllocator(), 9483 Results.getCodeCompletionTUInfo()); 9484 Builder.AddTypedTextChunk("if"); 9485 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9486 Builder.AddPlaceholderChunk("condition"); 9487 Results.AddResult(Builder.TakeString()); 9488 9489 // #ifdef <macro> 9490 Builder.AddTypedTextChunk("ifdef"); 9491 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9492 Builder.AddPlaceholderChunk("macro"); 9493 Results.AddResult(Builder.TakeString()); 9494 9495 // #ifndef <macro> 9496 Builder.AddTypedTextChunk("ifndef"); 9497 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9498 Builder.AddPlaceholderChunk("macro"); 9499 Results.AddResult(Builder.TakeString()); 9500 9501 if (InConditional) { 9502 // #elif <condition> 9503 Builder.AddTypedTextChunk("elif"); 9504 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9505 Builder.AddPlaceholderChunk("condition"); 9506 Results.AddResult(Builder.TakeString()); 9507 9508 // #elifdef <macro> 9509 Builder.AddTypedTextChunk("elifdef"); 9510 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9511 Builder.AddPlaceholderChunk("macro"); 9512 Results.AddResult(Builder.TakeString()); 9513 9514 // #elifndef <macro> 9515 Builder.AddTypedTextChunk("elifndef"); 9516 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9517 Builder.AddPlaceholderChunk("macro"); 9518 Results.AddResult(Builder.TakeString()); 9519 9520 // #else 9521 Builder.AddTypedTextChunk("else"); 9522 Results.AddResult(Builder.TakeString()); 9523 9524 // #endif 9525 Builder.AddTypedTextChunk("endif"); 9526 Results.AddResult(Builder.TakeString()); 9527 } 9528 9529 // #include "header" 9530 Builder.AddTypedTextChunk("include"); 9531 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9532 Builder.AddTextChunk("\""); 9533 Builder.AddPlaceholderChunk("header"); 9534 Builder.AddTextChunk("\""); 9535 Results.AddResult(Builder.TakeString()); 9536 9537 // #include <header> 9538 Builder.AddTypedTextChunk("include"); 9539 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9540 Builder.AddTextChunk("<"); 9541 Builder.AddPlaceholderChunk("header"); 9542 Builder.AddTextChunk(">"); 9543 Results.AddResult(Builder.TakeString()); 9544 9545 // #define <macro> 9546 Builder.AddTypedTextChunk("define"); 9547 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9548 Builder.AddPlaceholderChunk("macro"); 9549 Results.AddResult(Builder.TakeString()); 9550 9551 // #define <macro>(<args>) 9552 Builder.AddTypedTextChunk("define"); 9553 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9554 Builder.AddPlaceholderChunk("macro"); 9555 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9556 Builder.AddPlaceholderChunk("args"); 9557 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9558 Results.AddResult(Builder.TakeString()); 9559 9560 // #undef <macro> 9561 Builder.AddTypedTextChunk("undef"); 9562 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9563 Builder.AddPlaceholderChunk("macro"); 9564 Results.AddResult(Builder.TakeString()); 9565 9566 // #line <number> 9567 Builder.AddTypedTextChunk("line"); 9568 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9569 Builder.AddPlaceholderChunk("number"); 9570 Results.AddResult(Builder.TakeString()); 9571 9572 // #line <number> "filename" 9573 Builder.AddTypedTextChunk("line"); 9574 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9575 Builder.AddPlaceholderChunk("number"); 9576 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9577 Builder.AddTextChunk("\""); 9578 Builder.AddPlaceholderChunk("filename"); 9579 Builder.AddTextChunk("\""); 9580 Results.AddResult(Builder.TakeString()); 9581 9582 // #error <message> 9583 Builder.AddTypedTextChunk("error"); 9584 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9585 Builder.AddPlaceholderChunk("message"); 9586 Results.AddResult(Builder.TakeString()); 9587 9588 // #pragma <arguments> 9589 Builder.AddTypedTextChunk("pragma"); 9590 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9591 Builder.AddPlaceholderChunk("arguments"); 9592 Results.AddResult(Builder.TakeString()); 9593 9594 if (getLangOpts().ObjC) { 9595 // #import "header" 9596 Builder.AddTypedTextChunk("import"); 9597 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9598 Builder.AddTextChunk("\""); 9599 Builder.AddPlaceholderChunk("header"); 9600 Builder.AddTextChunk("\""); 9601 Results.AddResult(Builder.TakeString()); 9602 9603 // #import <header> 9604 Builder.AddTypedTextChunk("import"); 9605 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9606 Builder.AddTextChunk("<"); 9607 Builder.AddPlaceholderChunk("header"); 9608 Builder.AddTextChunk(">"); 9609 Results.AddResult(Builder.TakeString()); 9610 } 9611 9612 // #include_next "header" 9613 Builder.AddTypedTextChunk("include_next"); 9614 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9615 Builder.AddTextChunk("\""); 9616 Builder.AddPlaceholderChunk("header"); 9617 Builder.AddTextChunk("\""); 9618 Results.AddResult(Builder.TakeString()); 9619 9620 // #include_next <header> 9621 Builder.AddTypedTextChunk("include_next"); 9622 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9623 Builder.AddTextChunk("<"); 9624 Builder.AddPlaceholderChunk("header"); 9625 Builder.AddTextChunk(">"); 9626 Results.AddResult(Builder.TakeString()); 9627 9628 // #warning <message> 9629 Builder.AddTypedTextChunk("warning"); 9630 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9631 Builder.AddPlaceholderChunk("message"); 9632 Results.AddResult(Builder.TakeString()); 9633 9634 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 9635 // completions for them. And __include_macros is a Clang-internal extension 9636 // that we don't want to encourage anyone to use. 9637 9638 // FIXME: we don't support #assert or #unassert, so don't suggest them. 9639 Results.ExitScope(); 9640 9641 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9642 Results.data(), Results.size()); 9643 } 9644 9645 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 9646 CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction 9647 : Sema::PCC_Namespace); 9648 } 9649 9650 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 9651 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9652 CodeCompleter->getCodeCompletionTUInfo(), 9653 IsDefinition ? CodeCompletionContext::CCC_MacroName 9654 : CodeCompletionContext::CCC_MacroNameUse); 9655 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 9656 // Add just the names of macros, not their arguments. 9657 CodeCompletionBuilder Builder(Results.getAllocator(), 9658 Results.getCodeCompletionTUInfo()); 9659 Results.EnterNewScope(); 9660 for (Preprocessor::macro_iterator M = PP.macro_begin(), 9661 MEnd = PP.macro_end(); 9662 M != MEnd; ++M) { 9663 Builder.AddTypedTextChunk( 9664 Builder.getAllocator().CopyString(M->first->getName())); 9665 Results.AddResult(CodeCompletionResult( 9666 Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition)); 9667 } 9668 Results.ExitScope(); 9669 } else if (IsDefinition) { 9670 // FIXME: Can we detect when the user just wrote an include guard above? 9671 } 9672 9673 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9674 Results.data(), Results.size()); 9675 } 9676 9677 void Sema::CodeCompletePreprocessorExpression() { 9678 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9679 CodeCompleter->getCodeCompletionTUInfo(), 9680 CodeCompletionContext::CCC_PreprocessorExpression); 9681 9682 if (!CodeCompleter || CodeCompleter->includeMacros()) 9683 AddMacroResults(PP, Results, 9684 !CodeCompleter || CodeCompleter->loadExternal(), true); 9685 9686 // defined (<macro>) 9687 Results.EnterNewScope(); 9688 CodeCompletionBuilder Builder(Results.getAllocator(), 9689 Results.getCodeCompletionTUInfo()); 9690 Builder.AddTypedTextChunk("defined"); 9691 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9692 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9693 Builder.AddPlaceholderChunk("macro"); 9694 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9695 Results.AddResult(Builder.TakeString()); 9696 Results.ExitScope(); 9697 9698 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9699 Results.data(), Results.size()); 9700 } 9701 9702 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 9703 IdentifierInfo *Macro, 9704 MacroInfo *MacroInfo, 9705 unsigned Argument) { 9706 // FIXME: In the future, we could provide "overload" results, much like we 9707 // do for function calls. 9708 9709 // Now just ignore this. There will be another code-completion callback 9710 // for the expanded tokens. 9711 } 9712 9713 // This handles completion inside an #include filename, e.g. #include <foo/ba 9714 // We look for the directory "foo" under each directory on the include path, 9715 // list its files, and reassemble the appropriate #include. 9716 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { 9717 // RelDir should use /, but unescaped \ is possible on windows! 9718 // Our completions will normalize to / for simplicity, this case is rare. 9719 std::string RelDir = llvm::sys::path::convert_to_slash(Dir); 9720 // We need the native slashes for the actual file system interactions. 9721 SmallString<128> NativeRelDir = StringRef(RelDir); 9722 llvm::sys::path::native(NativeRelDir); 9723 llvm::vfs::FileSystem &FS = 9724 getSourceManager().getFileManager().getVirtualFileSystem(); 9725 9726 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9727 CodeCompleter->getCodeCompletionTUInfo(), 9728 CodeCompletionContext::CCC_IncludedFile); 9729 llvm::DenseSet<StringRef> SeenResults; // To deduplicate results. 9730 9731 // Helper: adds one file or directory completion result. 9732 auto AddCompletion = [&](StringRef Filename, bool IsDirectory) { 9733 SmallString<64> TypedChunk = Filename; 9734 // Directory completion is up to the slash, e.g. <sys/ 9735 TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"'); 9736 auto R = SeenResults.insert(TypedChunk); 9737 if (R.second) { // New completion 9738 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk); 9739 *R.first = InternedTyped; // Avoid dangling StringRef. 9740 CodeCompletionBuilder Builder(CodeCompleter->getAllocator(), 9741 CodeCompleter->getCodeCompletionTUInfo()); 9742 Builder.AddTypedTextChunk(InternedTyped); 9743 // The result is a "Pattern", which is pretty opaque. 9744 // We may want to include the real filename to allow smart ranking. 9745 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 9746 } 9747 }; 9748 9749 // Helper: scans IncludeDir for nice files, and adds results for each. 9750 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir, 9751 bool IsSystem, 9752 DirectoryLookup::LookupType_t LookupType) { 9753 llvm::SmallString<128> Dir = IncludeDir; 9754 if (!NativeRelDir.empty()) { 9755 if (LookupType == DirectoryLookup::LT_Framework) { 9756 // For a framework dir, #include <Foo/Bar/> actually maps to 9757 // a path of Foo.framework/Headers/Bar/. 9758 auto Begin = llvm::sys::path::begin(NativeRelDir); 9759 auto End = llvm::sys::path::end(NativeRelDir); 9760 9761 llvm::sys::path::append(Dir, *Begin + ".framework", "Headers"); 9762 llvm::sys::path::append(Dir, ++Begin, End); 9763 } else { 9764 llvm::sys::path::append(Dir, NativeRelDir); 9765 } 9766 } 9767 9768 const StringRef &Dirname = llvm::sys::path::filename(Dir); 9769 const bool isQt = Dirname.startswith("Qt") || Dirname == "ActiveQt"; 9770 const bool ExtensionlessHeaders = 9771 IsSystem || isQt || Dir.endswith(".framework/Headers"); 9772 std::error_code EC; 9773 unsigned Count = 0; 9774 for (auto It = FS.dir_begin(Dir, EC); 9775 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) { 9776 if (++Count == 2500) // If we happen to hit a huge directory, 9777 break; // bail out early so we're not too slow. 9778 StringRef Filename = llvm::sys::path::filename(It->path()); 9779 9780 // To know whether a symlink should be treated as file or a directory, we 9781 // have to stat it. This should be cheap enough as there shouldn't be many 9782 // symlinks. 9783 llvm::sys::fs::file_type Type = It->type(); 9784 if (Type == llvm::sys::fs::file_type::symlink_file) { 9785 if (auto FileStatus = FS.status(It->path())) 9786 Type = FileStatus->getType(); 9787 } 9788 switch (Type) { 9789 case llvm::sys::fs::file_type::directory_file: 9790 // All entries in a framework directory must have a ".framework" suffix, 9791 // but the suffix does not appear in the source code's include/import. 9792 if (LookupType == DirectoryLookup::LT_Framework && 9793 NativeRelDir.empty() && !Filename.consume_back(".framework")) 9794 break; 9795 9796 AddCompletion(Filename, /*IsDirectory=*/true); 9797 break; 9798 case llvm::sys::fs::file_type::regular_file: { 9799 // Only files that really look like headers. (Except in special dirs). 9800 // Header extensions from Types.def, which we can't depend on here. 9801 const bool IsHeader = Filename.endswith_insensitive(".h") || 9802 Filename.endswith_insensitive(".hh") || 9803 Filename.endswith_insensitive(".hpp") || 9804 Filename.endswith_insensitive(".inc") || 9805 (ExtensionlessHeaders && !Filename.contains('.')); 9806 if (!IsHeader) 9807 break; 9808 AddCompletion(Filename, /*IsDirectory=*/false); 9809 break; 9810 } 9811 default: 9812 break; 9813 } 9814 } 9815 }; 9816 9817 // Helper: adds results relative to IncludeDir, if possible. 9818 auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir, 9819 bool IsSystem) { 9820 switch (IncludeDir.getLookupType()) { 9821 case DirectoryLookup::LT_HeaderMap: 9822 // header maps are not (currently) enumerable. 9823 break; 9824 case DirectoryLookup::LT_NormalDir: 9825 AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem, 9826 DirectoryLookup::LT_NormalDir); 9827 break; 9828 case DirectoryLookup::LT_Framework: 9829 AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem, 9830 DirectoryLookup::LT_Framework); 9831 break; 9832 } 9833 }; 9834 9835 // Finally with all our helpers, we can scan the include path. 9836 // Do this in standard order so deduplication keeps the right file. 9837 // (In case we decide to add more details to the results later). 9838 const auto &S = PP.getHeaderSearchInfo(); 9839 using llvm::make_range; 9840 if (!Angled) { 9841 // The current directory is on the include path for "quoted" includes. 9842 auto *CurFile = PP.getCurrentFileLexer()->getFileEntry(); 9843 if (CurFile && CurFile->getDir()) 9844 AddFilesFromIncludeDir(CurFile->getDir()->getName(), false, 9845 DirectoryLookup::LT_NormalDir); 9846 for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end())) 9847 AddFilesFromDirLookup(D, false); 9848 } 9849 for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end())) 9850 AddFilesFromDirLookup(D, false); 9851 for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end())) 9852 AddFilesFromDirLookup(D, true); 9853 9854 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9855 Results.data(), Results.size()); 9856 } 9857 9858 void Sema::CodeCompleteNaturalLanguage() { 9859 HandleCodeCompleteResults(this, CodeCompleter, 9860 CodeCompletionContext::CCC_NaturalLanguage, nullptr, 9861 0); 9862 } 9863 9864 void Sema::CodeCompleteAvailabilityPlatformName() { 9865 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9866 CodeCompleter->getCodeCompletionTUInfo(), 9867 CodeCompletionContext::CCC_Other); 9868 Results.EnterNewScope(); 9869 static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"}; 9870 for (const char *Platform : llvm::makeArrayRef(Platforms)) { 9871 Results.AddResult(CodeCompletionResult(Platform)); 9872 Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString( 9873 Twine(Platform) + "ApplicationExtension"))); 9874 } 9875 Results.ExitScope(); 9876 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9877 Results.data(), Results.size()); 9878 } 9879 9880 void Sema::GatherGlobalCodeCompletions( 9881 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 9882 SmallVectorImpl<CodeCompletionResult> &Results) { 9883 ResultBuilder Builder(*this, Allocator, CCTUInfo, 9884 CodeCompletionContext::CCC_Recovery); 9885 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 9886 CodeCompletionDeclConsumer Consumer(Builder, 9887 Context.getTranslationUnitDecl()); 9888 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 9889 Consumer, 9890 !CodeCompleter || CodeCompleter->loadExternal()); 9891 } 9892 9893 if (!CodeCompleter || CodeCompleter->includeMacros()) 9894 AddMacroResults(PP, Builder, 9895 !CodeCompleter || CodeCompleter->loadExternal(), true); 9896 9897 Results.clear(); 9898 Results.insert(Results.end(), Builder.data(), 9899 Builder.data() + Builder.size()); 9900 } 9901