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