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