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