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