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