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