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