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