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