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