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. 5199 AddedPropertiesSet AddedProperties; 5200 5201 if (const ObjCObjectPointerType *ObjCPtr = 5202 BaseType->getAsObjCInterfacePointerType()) { 5203 // Add property results based on our interface. 5204 assert(ObjCPtr && "Non-NULL pointer guaranteed above!"); 5205 AddObjCProperties(CCContext, ObjCPtr->getInterfaceDecl(), true, 5206 /*AllowNullaryMethods=*/true, CurContext, 5207 AddedProperties, Results, IsBaseExprStatement); 5208 } 5209 5210 // Add properties from the protocols in a qualified interface. 5211 for (auto *I : BaseType->castAs<ObjCObjectPointerType>()->quals()) 5212 AddObjCProperties(CCContext, I, true, /*AllowNullaryMethods=*/true, 5213 CurContext, AddedProperties, Results, 5214 IsBaseExprStatement, /*IsClassProperty*/ false, 5215 /*InOriginalClass*/ false); 5216 } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || 5217 (!IsArrow && BaseType->isObjCObjectType())) { 5218 // Objective-C instance variable access. 5219 ObjCInterfaceDecl *Class = nullptr; 5220 if (const ObjCObjectPointerType *ObjCPtr = 5221 BaseType->getAs<ObjCObjectPointerType>()) 5222 Class = ObjCPtr->getInterfaceDecl(); 5223 else 5224 Class = BaseType->castAs<ObjCObjectType>()->getInterface(); 5225 5226 // Add all ivars from this class and its superclasses. 5227 if (Class) { 5228 CodeCompletionDeclConsumer Consumer(Results, Class, BaseType); 5229 Results.setFilter(&ResultBuilder::IsObjCIvar); 5230 LookupVisibleDecls( 5231 Class, LookupMemberName, Consumer, CodeCompleter->includeGlobals(), 5232 /*IncludeDependentBases=*/false, CodeCompleter->loadExternal()); 5233 } 5234 } 5235 5236 // FIXME: How do we cope with isa? 5237 return true; 5238 }; 5239 5240 Results.EnterNewScope(); 5241 5242 bool CompletionSucceded = DoCompletion(Base, IsArrow, None); 5243 if (CodeCompleter->includeFixIts()) { 5244 const CharSourceRange OpRange = 5245 CharSourceRange::getTokenRange(OpLoc, OpLoc); 5246 CompletionSucceded |= DoCompletion( 5247 OtherOpBase, !IsArrow, 5248 FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->")); 5249 } 5250 5251 Results.ExitScope(); 5252 5253 if (!CompletionSucceded) 5254 return; 5255 5256 // Hand off the results found for code completion. 5257 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5258 Results.data(), Results.size()); 5259 } 5260 5261 void Sema::CodeCompleteObjCClassPropertyRefExpr(Scope *S, 5262 IdentifierInfo &ClassName, 5263 SourceLocation ClassNameLoc, 5264 bool IsBaseExprStatement) { 5265 IdentifierInfo *ClassNamePtr = &ClassName; 5266 ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc); 5267 if (!IFace) 5268 return; 5269 CodeCompletionContext CCContext( 5270 CodeCompletionContext::CCC_ObjCPropertyAccess); 5271 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5272 CodeCompleter->getCodeCompletionTUInfo(), CCContext, 5273 &ResultBuilder::IsMember); 5274 Results.EnterNewScope(); 5275 AddedPropertiesSet AddedProperties; 5276 AddObjCProperties(CCContext, IFace, true, 5277 /*AllowNullaryMethods=*/true, CurContext, AddedProperties, 5278 Results, IsBaseExprStatement, 5279 /*IsClassProperty=*/true); 5280 Results.ExitScope(); 5281 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5282 Results.data(), Results.size()); 5283 } 5284 5285 void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 5286 if (!CodeCompleter) 5287 return; 5288 5289 ResultBuilder::LookupFilter Filter = nullptr; 5290 enum CodeCompletionContext::Kind ContextKind = 5291 CodeCompletionContext::CCC_Other; 5292 switch ((DeclSpec::TST)TagSpec) { 5293 case DeclSpec::TST_enum: 5294 Filter = &ResultBuilder::IsEnum; 5295 ContextKind = CodeCompletionContext::CCC_EnumTag; 5296 break; 5297 5298 case DeclSpec::TST_union: 5299 Filter = &ResultBuilder::IsUnion; 5300 ContextKind = CodeCompletionContext::CCC_UnionTag; 5301 break; 5302 5303 case DeclSpec::TST_struct: 5304 case DeclSpec::TST_class: 5305 case DeclSpec::TST_interface: 5306 Filter = &ResultBuilder::IsClassOrStruct; 5307 ContextKind = CodeCompletionContext::CCC_ClassOrStructTag; 5308 break; 5309 5310 default: 5311 llvm_unreachable("Unknown type specifier kind in CodeCompleteTag"); 5312 } 5313 5314 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5315 CodeCompleter->getCodeCompletionTUInfo(), ContextKind); 5316 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5317 5318 // First pass: look for tags. 5319 Results.setFilter(Filter); 5320 LookupVisibleDecls(S, LookupTagName, Consumer, 5321 CodeCompleter->includeGlobals(), 5322 CodeCompleter->loadExternal()); 5323 5324 if (CodeCompleter->includeGlobals()) { 5325 // Second pass: look for nested name specifiers. 5326 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier); 5327 LookupVisibleDecls(S, LookupNestedNameSpecifierName, Consumer, 5328 CodeCompleter->includeGlobals(), 5329 CodeCompleter->loadExternal()); 5330 } 5331 5332 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5333 Results.data(), Results.size()); 5334 } 5335 5336 static void AddTypeQualifierResults(DeclSpec &DS, ResultBuilder &Results, 5337 const LangOptions &LangOpts) { 5338 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const)) 5339 Results.AddResult("const"); 5340 if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile)) 5341 Results.AddResult("volatile"); 5342 if (LangOpts.C99 && !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict)) 5343 Results.AddResult("restrict"); 5344 if (LangOpts.C11 && !(DS.getTypeQualifiers() & DeclSpec::TQ_atomic)) 5345 Results.AddResult("_Atomic"); 5346 if (LangOpts.MSVCCompat && !(DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)) 5347 Results.AddResult("__unaligned"); 5348 } 5349 5350 void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) { 5351 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5352 CodeCompleter->getCodeCompletionTUInfo(), 5353 CodeCompletionContext::CCC_TypeQualifiers); 5354 Results.EnterNewScope(); 5355 AddTypeQualifierResults(DS, Results, LangOpts); 5356 Results.ExitScope(); 5357 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5358 Results.data(), Results.size()); 5359 } 5360 5361 void Sema::CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D, 5362 const VirtSpecifiers *VS) { 5363 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5364 CodeCompleter->getCodeCompletionTUInfo(), 5365 CodeCompletionContext::CCC_TypeQualifiers); 5366 Results.EnterNewScope(); 5367 AddTypeQualifierResults(DS, Results, LangOpts); 5368 if (LangOpts.CPlusPlus11) { 5369 Results.AddResult("noexcept"); 5370 if (D.getContext() == DeclaratorContext::MemberContext && 5371 !D.isCtorOrDtor() && !D.isStaticMember()) { 5372 if (!VS || !VS->isFinalSpecified()) 5373 Results.AddResult("final"); 5374 if (!VS || !VS->isOverrideSpecified()) 5375 Results.AddResult("override"); 5376 } 5377 } 5378 Results.ExitScope(); 5379 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5380 Results.data(), Results.size()); 5381 } 5382 5383 void Sema::CodeCompleteBracketDeclarator(Scope *S) { 5384 CodeCompleteExpression(S, QualType(getASTContext().getSizeType())); 5385 } 5386 5387 void Sema::CodeCompleteCase(Scope *S) { 5388 if (getCurFunction()->SwitchStack.empty() || !CodeCompleter) 5389 return; 5390 5391 SwitchStmt *Switch = getCurFunction()->SwitchStack.back().getPointer(); 5392 // Condition expression might be invalid, do not continue in this case. 5393 if (!Switch->getCond()) 5394 return; 5395 QualType type = Switch->getCond()->IgnoreImplicit()->getType(); 5396 if (!type->isEnumeralType()) { 5397 CodeCompleteExpressionData Data(type); 5398 Data.IntegralConstantExpression = true; 5399 CodeCompleteExpression(S, Data); 5400 return; 5401 } 5402 5403 // Code-complete the cases of a switch statement over an enumeration type 5404 // by providing the list of 5405 EnumDecl *Enum = type->castAs<EnumType>()->getDecl(); 5406 if (EnumDecl *Def = Enum->getDefinition()) 5407 Enum = Def; 5408 5409 // Determine which enumerators we have already seen in the switch statement. 5410 // FIXME: Ideally, we would also be able to look *past* the code-completion 5411 // token, in case we are code-completing in the middle of the switch and not 5412 // at the end. However, we aren't able to do so at the moment. 5413 CoveredEnumerators Enumerators; 5414 for (SwitchCase *SC = Switch->getSwitchCaseList(); SC; 5415 SC = SC->getNextSwitchCase()) { 5416 CaseStmt *Case = dyn_cast<CaseStmt>(SC); 5417 if (!Case) 5418 continue; 5419 5420 Expr *CaseVal = Case->getLHS()->IgnoreParenCasts(); 5421 if (auto *DRE = dyn_cast<DeclRefExpr>(CaseVal)) 5422 if (auto *Enumerator = 5423 dyn_cast<EnumConstantDecl>(DRE->getDecl())) { 5424 // We look into the AST of the case statement to determine which 5425 // enumerator was named. Alternatively, we could compute the value of 5426 // the integral constant expression, then compare it against the 5427 // values of each enumerator. However, value-based approach would not 5428 // work as well with C++ templates where enumerators declared within a 5429 // template are type- and value-dependent. 5430 Enumerators.Seen.insert(Enumerator); 5431 5432 // If this is a qualified-id, keep track of the nested-name-specifier 5433 // so that we can reproduce it as part of code completion, e.g., 5434 // 5435 // switch (TagD.getKind()) { 5436 // case TagDecl::TK_enum: 5437 // break; 5438 // case XXX 5439 // 5440 // At the XXX, our completions are TagDecl::TK_union, 5441 // TagDecl::TK_struct, and TagDecl::TK_class, rather than TK_union, 5442 // TK_struct, and TK_class. 5443 Enumerators.SuggestedQualifier = DRE->getQualifier(); 5444 } 5445 } 5446 5447 // Add any enumerators that have not yet been mentioned. 5448 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5449 CodeCompleter->getCodeCompletionTUInfo(), 5450 CodeCompletionContext::CCC_Expression); 5451 AddEnumerators(Results, Context, Enum, CurContext, Enumerators); 5452 5453 if (CodeCompleter->includeMacros()) { 5454 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 5455 } 5456 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5457 Results.data(), Results.size()); 5458 } 5459 5460 static bool anyNullArguments(ArrayRef<Expr *> Args) { 5461 if (Args.size() && !Args.data()) 5462 return true; 5463 5464 for (unsigned I = 0; I != Args.size(); ++I) 5465 if (!Args[I]) 5466 return true; 5467 5468 return false; 5469 } 5470 5471 typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate; 5472 5473 static void mergeCandidatesWithResults( 5474 Sema &SemaRef, SmallVectorImpl<ResultCandidate> &Results, 5475 OverloadCandidateSet &CandidateSet, SourceLocation Loc) { 5476 // Sort the overload candidate set by placing the best overloads first. 5477 llvm::stable_sort(CandidateSet, [&](const OverloadCandidate &X, 5478 const OverloadCandidate &Y) { 5479 return isBetterOverloadCandidate(SemaRef, X, Y, Loc, 5480 CandidateSet.getKind()); 5481 }); 5482 5483 // Add the remaining viable overload candidates as code-completion results. 5484 for (OverloadCandidate &Candidate : CandidateSet) { 5485 if (Candidate.Function && Candidate.Function->isDeleted()) 5486 continue; 5487 if (Candidate.Viable) 5488 Results.push_back(ResultCandidate(Candidate.Function)); 5489 } 5490 } 5491 5492 /// Get the type of the Nth parameter from a given set of overload 5493 /// candidates. 5494 static QualType getParamType(Sema &SemaRef, 5495 ArrayRef<ResultCandidate> Candidates, unsigned N) { 5496 5497 // Given the overloads 'Candidates' for a function call matching all arguments 5498 // up to N, return the type of the Nth parameter if it is the same for all 5499 // overload candidates. 5500 QualType ParamType; 5501 for (auto &Candidate : Candidates) { 5502 if (const auto *FType = Candidate.getFunctionType()) 5503 if (const auto *Proto = dyn_cast<FunctionProtoType>(FType)) 5504 if (N < Proto->getNumParams()) { 5505 if (ParamType.isNull()) 5506 ParamType = Proto->getParamType(N); 5507 else if (!SemaRef.Context.hasSameUnqualifiedType( 5508 ParamType.getNonReferenceType(), 5509 Proto->getParamType(N).getNonReferenceType())) 5510 // Otherwise return a default-constructed QualType. 5511 return QualType(); 5512 } 5513 } 5514 5515 return ParamType; 5516 } 5517 5518 static QualType 5519 ProduceSignatureHelp(Sema &SemaRef, Scope *S, 5520 MutableArrayRef<ResultCandidate> Candidates, 5521 unsigned CurrentArg, SourceLocation OpenParLoc) { 5522 if (Candidates.empty()) 5523 return QualType(); 5524 SemaRef.CodeCompleter->ProcessOverloadCandidates( 5525 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc); 5526 return getParamType(SemaRef, Candidates, CurrentArg); 5527 } 5528 5529 QualType Sema::ProduceCallSignatureHelp(Scope *S, Expr *Fn, 5530 ArrayRef<Expr *> Args, 5531 SourceLocation OpenParLoc) { 5532 if (!CodeCompleter) 5533 return QualType(); 5534 5535 // FIXME: Provide support for variadic template functions. 5536 // Ignore type-dependent call expressions entirely. 5537 if (!Fn || Fn->isTypeDependent() || anyNullArguments(Args) || 5538 Expr::hasAnyTypeDependentArguments(Args)) { 5539 return QualType(); 5540 } 5541 5542 // Build an overload candidate set based on the functions we find. 5543 SourceLocation Loc = Fn->getExprLoc(); 5544 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 5545 5546 SmallVector<ResultCandidate, 8> Results; 5547 5548 Expr *NakedFn = Fn->IgnoreParenCasts(); 5549 if (auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) 5550 AddOverloadedCallCandidates(ULE, Args, CandidateSet, 5551 /*PartialOverloading=*/true); 5552 else if (auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) { 5553 TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr; 5554 if (UME->hasExplicitTemplateArgs()) { 5555 UME->copyTemplateArgumentsInto(TemplateArgsBuffer); 5556 TemplateArgs = &TemplateArgsBuffer; 5557 } 5558 5559 // Add the base as first argument (use a nullptr if the base is implicit). 5560 SmallVector<Expr *, 12> ArgExprs( 5561 1, UME->isImplicitAccess() ? nullptr : UME->getBase()); 5562 ArgExprs.append(Args.begin(), Args.end()); 5563 UnresolvedSet<8> Decls; 5564 Decls.append(UME->decls_begin(), UME->decls_end()); 5565 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase(); 5566 AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs, 5567 /*SuppressUserConversions=*/false, 5568 /*PartialOverloading=*/true, FirstArgumentIsBase); 5569 } else { 5570 FunctionDecl *FD = nullptr; 5571 if (auto *MCE = dyn_cast<MemberExpr>(NakedFn)) 5572 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl()); 5573 else if (auto *DRE = dyn_cast<DeclRefExpr>(NakedFn)) 5574 FD = dyn_cast<FunctionDecl>(DRE->getDecl()); 5575 if (FD) { // We check whether it's a resolved function declaration. 5576 if (!getLangOpts().CPlusPlus || 5577 !FD->getType()->getAs<FunctionProtoType>()) 5578 Results.push_back(ResultCandidate(FD)); 5579 else 5580 AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()), 5581 Args, CandidateSet, 5582 /*SuppressUserConversions=*/false, 5583 /*PartialOverloading=*/true); 5584 5585 } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) { 5586 // If expression's type is CXXRecordDecl, it may overload the function 5587 // call operator, so we check if it does and add them as candidates. 5588 // A complete type is needed to lookup for member function call operators. 5589 if (isCompleteType(Loc, NakedFn->getType())) { 5590 DeclarationName OpName = 5591 Context.DeclarationNames.getCXXOperatorName(OO_Call); 5592 LookupResult R(*this, OpName, Loc, LookupOrdinaryName); 5593 LookupQualifiedName(R, DC); 5594 R.suppressDiagnostics(); 5595 SmallVector<Expr *, 12> ArgExprs(1, NakedFn); 5596 ArgExprs.append(Args.begin(), Args.end()); 5597 AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet, 5598 /*ExplicitArgs=*/nullptr, 5599 /*SuppressUserConversions=*/false, 5600 /*PartialOverloading=*/true); 5601 } 5602 } else { 5603 // Lastly we check whether expression's type is function pointer or 5604 // function. 5605 QualType T = NakedFn->getType(); 5606 if (!T->getPointeeType().isNull()) 5607 T = T->getPointeeType(); 5608 5609 if (auto FP = T->getAs<FunctionProtoType>()) { 5610 if (!TooManyArguments(FP->getNumParams(), Args.size(), 5611 /*PartialOverloading=*/true) || 5612 FP->isVariadic()) 5613 Results.push_back(ResultCandidate(FP)); 5614 } else if (auto FT = T->getAs<FunctionType>()) 5615 // No prototype and declaration, it may be a K & R style function. 5616 Results.push_back(ResultCandidate(FT)); 5617 } 5618 } 5619 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc); 5620 QualType ParamType = 5621 ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc); 5622 return !CandidateSet.empty() ? ParamType : QualType(); 5623 } 5624 5625 QualType Sema::ProduceConstructorSignatureHelp(Scope *S, QualType Type, 5626 SourceLocation Loc, 5627 ArrayRef<Expr *> Args, 5628 SourceLocation OpenParLoc) { 5629 if (!CodeCompleter) 5630 return QualType(); 5631 5632 // A complete type is needed to lookup for constructors. 5633 CXXRecordDecl *RD = 5634 isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr; 5635 if (!RD) 5636 return Type; 5637 5638 // FIXME: Provide support for member initializers. 5639 // FIXME: Provide support for variadic template constructors. 5640 5641 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal); 5642 5643 for (NamedDecl *C : LookupConstructors(RD)) { 5644 if (auto *FD = dyn_cast<FunctionDecl>(C)) { 5645 AddOverloadCandidate(FD, DeclAccessPair::make(FD, C->getAccess()), Args, 5646 CandidateSet, 5647 /*SuppressUserConversions=*/false, 5648 /*PartialOverloading=*/true, 5649 /*AllowExplicit*/ true); 5650 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(C)) { 5651 AddTemplateOverloadCandidate( 5652 FTD, DeclAccessPair::make(FTD, C->getAccess()), 5653 /*ExplicitTemplateArgs=*/nullptr, Args, CandidateSet, 5654 /*SuppressUserConversions=*/false, 5655 /*PartialOverloading=*/true); 5656 } 5657 } 5658 5659 SmallVector<ResultCandidate, 8> Results; 5660 mergeCandidatesWithResults(*this, Results, CandidateSet, Loc); 5661 return ProduceSignatureHelp(*this, S, Results, Args.size(), OpenParLoc); 5662 } 5663 5664 QualType Sema::ProduceCtorInitMemberSignatureHelp( 5665 Scope *S, Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy, 5666 ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc) { 5667 if (!CodeCompleter) 5668 return QualType(); 5669 5670 CXXConstructorDecl *Constructor = 5671 dyn_cast<CXXConstructorDecl>(ConstructorDecl); 5672 if (!Constructor) 5673 return QualType(); 5674 // FIXME: Add support for Base class constructors as well. 5675 if (ValueDecl *MemberDecl = tryLookupCtorInitMemberDecl( 5676 Constructor->getParent(), SS, TemplateTypeTy, II)) 5677 return ProduceConstructorSignatureHelp(getCurScope(), MemberDecl->getType(), 5678 MemberDecl->getLocation(), ArgExprs, 5679 OpenParLoc); 5680 return QualType(); 5681 } 5682 5683 void Sema::CodeCompleteDesignator(const QualType BaseType, 5684 llvm::ArrayRef<Expr *> InitExprs, 5685 const Designation &D) { 5686 if (BaseType.isNull()) 5687 return; 5688 // FIXME: Handle nested designations, e.g. : .x.^ 5689 if (!D.empty()) 5690 return; 5691 5692 const auto *RD = getAsRecordDecl(BaseType); 5693 if (!RD) 5694 return; 5695 if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 5696 // Template might not be instantiated yet, fall back to primary template in 5697 // such cases. 5698 if (CTSD->getTemplateSpecializationKind() == TSK_Undeclared) 5699 RD = CTSD->getSpecializedTemplate()->getTemplatedDecl(); 5700 } 5701 if (RD->fields().empty()) 5702 return; 5703 5704 CodeCompletionContext CCC(CodeCompletionContext::CCC_DotMemberAccess, 5705 BaseType); 5706 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5707 CodeCompleter->getCodeCompletionTUInfo(), CCC); 5708 5709 Results.EnterNewScope(); 5710 for (const auto *FD : RD->fields()) { 5711 // FIXME: Make use of previous designators to mark any fields before those 5712 // inaccessible, and also compute the next initializer priority. 5713 ResultBuilder::Result Result(FD, Results.getBasePriority(FD)); 5714 Results.AddResult(Result, CurContext, /*Hiding=*/nullptr); 5715 } 5716 Results.ExitScope(); 5717 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5718 Results.data(), Results.size()); 5719 } 5720 5721 void Sema::CodeCompleteInitializer(Scope *S, Decl *D) { 5722 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D); 5723 if (!VD) { 5724 CodeCompleteOrdinaryName(S, PCC_Expression); 5725 return; 5726 } 5727 5728 CodeCompleteExpressionData Data; 5729 Data.PreferredType = VD->getType(); 5730 // Ignore VD to avoid completing the variable itself, e.g. in 'int foo = ^'. 5731 Data.IgnoreDecls.push_back(VD); 5732 5733 CodeCompleteExpression(S, Data); 5734 } 5735 5736 void Sema::CodeCompleteAfterIf(Scope *S) { 5737 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5738 CodeCompleter->getCodeCompletionTUInfo(), 5739 mapCodeCompletionContext(*this, PCC_Statement)); 5740 Results.setFilter(&ResultBuilder::IsOrdinaryName); 5741 Results.EnterNewScope(); 5742 5743 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5744 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5745 CodeCompleter->includeGlobals(), 5746 CodeCompleter->loadExternal()); 5747 5748 AddOrdinaryNameResults(PCC_Statement, S, *this, Results); 5749 5750 // "else" block 5751 CodeCompletionBuilder Builder(Results.getAllocator(), 5752 Results.getCodeCompletionTUInfo()); 5753 Builder.AddTypedTextChunk("else"); 5754 if (Results.includeCodePatterns()) { 5755 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5756 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 5757 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 5758 Builder.AddPlaceholderChunk("statements"); 5759 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 5760 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 5761 } 5762 Results.AddResult(Builder.TakeString()); 5763 5764 // "else if" block 5765 Builder.AddTypedTextChunk("else if"); 5766 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5767 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 5768 if (getLangOpts().CPlusPlus) 5769 Builder.AddPlaceholderChunk("condition"); 5770 else 5771 Builder.AddPlaceholderChunk("expression"); 5772 Builder.AddChunk(CodeCompletionString::CK_RightParen); 5773 if (Results.includeCodePatterns()) { 5774 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 5775 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 5776 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 5777 Builder.AddPlaceholderChunk("statements"); 5778 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 5779 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 5780 } 5781 Results.AddResult(Builder.TakeString()); 5782 5783 Results.ExitScope(); 5784 5785 if (S->getFnParent()) 5786 AddPrettyFunctionResults(getLangOpts(), Results); 5787 5788 if (CodeCompleter->includeMacros()) 5789 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 5790 5791 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5792 Results.data(), Results.size()); 5793 } 5794 5795 void Sema::CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, 5796 bool EnteringContext, 5797 bool IsUsingDeclaration, QualType BaseType, 5798 QualType PreferredType) { 5799 if (SS.isEmpty() || !CodeCompleter) 5800 return; 5801 5802 CodeCompletionContext CC(CodeCompletionContext::CCC_Symbol, PreferredType); 5803 CC.setIsUsingDeclaration(IsUsingDeclaration); 5804 CC.setCXXScopeSpecifier(SS); 5805 5806 // We want to keep the scope specifier even if it's invalid (e.g. the scope 5807 // "a::b::" is not corresponding to any context/namespace in the AST), since 5808 // it can be useful for global code completion which have information about 5809 // contexts/symbols that are not in the AST. 5810 if (SS.isInvalid()) { 5811 // As SS is invalid, we try to collect accessible contexts from the current 5812 // scope with a dummy lookup so that the completion consumer can try to 5813 // guess what the specified scope is. 5814 ResultBuilder DummyResults(*this, CodeCompleter->getAllocator(), 5815 CodeCompleter->getCodeCompletionTUInfo(), CC); 5816 if (!PreferredType.isNull()) 5817 DummyResults.setPreferredType(PreferredType); 5818 if (S->getEntity()) { 5819 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(), 5820 BaseType); 5821 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5822 /*IncludeGlobalScope=*/false, 5823 /*LoadExternal=*/false); 5824 } 5825 HandleCodeCompleteResults(this, CodeCompleter, 5826 DummyResults.getCompletionContext(), nullptr, 0); 5827 return; 5828 } 5829 // Always pretend to enter a context to ensure that a dependent type 5830 // resolves to a dependent record. 5831 DeclContext *Ctx = computeDeclContext(SS, /*EnteringContext=*/true); 5832 5833 // Try to instantiate any non-dependent declaration contexts before 5834 // we look in them. Bail out if we fail. 5835 NestedNameSpecifier *NNS = SS.getScopeRep(); 5836 if (NNS != nullptr && SS.isValid() && !NNS->isDependent()) { 5837 if (Ctx == nullptr || RequireCompleteDeclContext(SS, Ctx)) 5838 return; 5839 } 5840 5841 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5842 CodeCompleter->getCodeCompletionTUInfo(), CC); 5843 if (!PreferredType.isNull()) 5844 Results.setPreferredType(PreferredType); 5845 Results.EnterNewScope(); 5846 5847 // The "template" keyword can follow "::" in the grammar, but only 5848 // put it into the grammar if the nested-name-specifier is dependent. 5849 // FIXME: results is always empty, this appears to be dead. 5850 if (!Results.empty() && NNS->isDependent()) 5851 Results.AddResult("template"); 5852 5853 // If the scope is a concept-constrained type parameter, infer nested 5854 // members based on the constraints. 5855 if (const auto *TTPT = 5856 dyn_cast_or_null<TemplateTypeParmType>(NNS->getAsType())) { 5857 for (const auto &R : ConceptInfo(*TTPT, S).members()) { 5858 if (R.Operator != ConceptInfo::Member::Colons) 5859 continue; 5860 Results.AddResult(CodeCompletionResult( 5861 R.render(*this, CodeCompleter->getAllocator(), 5862 CodeCompleter->getCodeCompletionTUInfo()))); 5863 } 5864 } 5865 5866 // Add calls to overridden virtual functions, if there are any. 5867 // 5868 // FIXME: This isn't wonderful, because we don't know whether we're actually 5869 // in a context that permits expressions. This is a general issue with 5870 // qualified-id completions. 5871 if (Ctx && !EnteringContext) 5872 MaybeAddOverrideCalls(*this, Ctx, Results); 5873 Results.ExitScope(); 5874 5875 if (Ctx && 5876 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) { 5877 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType); 5878 LookupVisibleDecls(Ctx, LookupOrdinaryName, Consumer, 5879 /*IncludeGlobalScope=*/true, 5880 /*IncludeDependentBases=*/true, 5881 CodeCompleter->loadExternal()); 5882 } 5883 5884 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5885 Results.data(), Results.size()); 5886 } 5887 5888 void Sema::CodeCompleteUsing(Scope *S) { 5889 if (!CodeCompleter) 5890 return; 5891 5892 // This can be both a using alias or using declaration, in the former we 5893 // expect a new name and a symbol in the latter case. 5894 CodeCompletionContext Context(CodeCompletionContext::CCC_SymbolOrNewName); 5895 Context.setIsUsingDeclaration(true); 5896 5897 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5898 CodeCompleter->getCodeCompletionTUInfo(), Context, 5899 &ResultBuilder::IsNestedNameSpecifier); 5900 Results.EnterNewScope(); 5901 5902 // If we aren't in class scope, we could see the "namespace" keyword. 5903 if (!S->isClassScope()) 5904 Results.AddResult(CodeCompletionResult("namespace")); 5905 5906 // After "using", we can see anything that would start a 5907 // nested-name-specifier. 5908 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5909 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5910 CodeCompleter->includeGlobals(), 5911 CodeCompleter->loadExternal()); 5912 Results.ExitScope(); 5913 5914 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5915 Results.data(), Results.size()); 5916 } 5917 5918 void Sema::CodeCompleteUsingDirective(Scope *S) { 5919 if (!CodeCompleter) 5920 return; 5921 5922 // After "using namespace", we expect to see a namespace name or namespace 5923 // alias. 5924 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5925 CodeCompleter->getCodeCompletionTUInfo(), 5926 CodeCompletionContext::CCC_Namespace, 5927 &ResultBuilder::IsNamespaceOrAlias); 5928 Results.EnterNewScope(); 5929 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5930 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5931 CodeCompleter->includeGlobals(), 5932 CodeCompleter->loadExternal()); 5933 Results.ExitScope(); 5934 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5935 Results.data(), Results.size()); 5936 } 5937 5938 void Sema::CodeCompleteNamespaceDecl(Scope *S) { 5939 if (!CodeCompleter) 5940 return; 5941 5942 DeclContext *Ctx = S->getEntity(); 5943 if (!S->getParent()) 5944 Ctx = Context.getTranslationUnitDecl(); 5945 5946 bool SuppressedGlobalResults = 5947 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx); 5948 5949 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5950 CodeCompleter->getCodeCompletionTUInfo(), 5951 SuppressedGlobalResults 5952 ? CodeCompletionContext::CCC_Namespace 5953 : CodeCompletionContext::CCC_Other, 5954 &ResultBuilder::IsNamespace); 5955 5956 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) { 5957 // We only want to see those namespaces that have already been defined 5958 // within this scope, because its likely that the user is creating an 5959 // extended namespace declaration. Keep track of the most recent 5960 // definition of each namespace. 5961 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest; 5962 for (DeclContext::specific_decl_iterator<NamespaceDecl> 5963 NS(Ctx->decls_begin()), 5964 NSEnd(Ctx->decls_end()); 5965 NS != NSEnd; ++NS) 5966 OrigToLatest[NS->getOriginalNamespace()] = *NS; 5967 5968 // Add the most recent definition (or extended definition) of each 5969 // namespace to the list of results. 5970 Results.EnterNewScope(); 5971 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator 5972 NS = OrigToLatest.begin(), 5973 NSEnd = OrigToLatest.end(); 5974 NS != NSEnd; ++NS) 5975 Results.AddResult( 5976 CodeCompletionResult(NS->second, Results.getBasePriority(NS->second), 5977 nullptr), 5978 CurContext, nullptr, false); 5979 Results.ExitScope(); 5980 } 5981 5982 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 5983 Results.data(), Results.size()); 5984 } 5985 5986 void Sema::CodeCompleteNamespaceAliasDecl(Scope *S) { 5987 if (!CodeCompleter) 5988 return; 5989 5990 // After "namespace", we expect to see a namespace or alias. 5991 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 5992 CodeCompleter->getCodeCompletionTUInfo(), 5993 CodeCompletionContext::CCC_Namespace, 5994 &ResultBuilder::IsNamespaceOrAlias); 5995 CodeCompletionDeclConsumer Consumer(Results, CurContext); 5996 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 5997 CodeCompleter->includeGlobals(), 5998 CodeCompleter->loadExternal()); 5999 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6000 Results.data(), Results.size()); 6001 } 6002 6003 void Sema::CodeCompleteOperatorName(Scope *S) { 6004 if (!CodeCompleter) 6005 return; 6006 6007 typedef CodeCompletionResult Result; 6008 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6009 CodeCompleter->getCodeCompletionTUInfo(), 6010 CodeCompletionContext::CCC_Type, 6011 &ResultBuilder::IsType); 6012 Results.EnterNewScope(); 6013 6014 // Add the names of overloadable operators. Note that OO_Conditional is not 6015 // actually overloadable. 6016 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 6017 if (OO_##Name != OO_Conditional) \ 6018 Results.AddResult(Result(Spelling)); 6019 #include "clang/Basic/OperatorKinds.def" 6020 6021 // Add any type names visible from the current scope 6022 Results.allowNestedNameSpecifiers(); 6023 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6024 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6025 CodeCompleter->includeGlobals(), 6026 CodeCompleter->loadExternal()); 6027 6028 // Add any type specifiers 6029 AddTypeSpecifierResults(getLangOpts(), Results); 6030 Results.ExitScope(); 6031 6032 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6033 Results.data(), Results.size()); 6034 } 6035 6036 void Sema::CodeCompleteConstructorInitializer( 6037 Decl *ConstructorD, ArrayRef<CXXCtorInitializer *> Initializers) { 6038 if (!ConstructorD) 6039 return; 6040 6041 AdjustDeclIfTemplate(ConstructorD); 6042 6043 auto *Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD); 6044 if (!Constructor) 6045 return; 6046 6047 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6048 CodeCompleter->getCodeCompletionTUInfo(), 6049 CodeCompletionContext::CCC_Symbol); 6050 Results.EnterNewScope(); 6051 6052 // Fill in any already-initialized fields or base classes. 6053 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields; 6054 llvm::SmallPtrSet<CanQualType, 4> InitializedBases; 6055 for (unsigned I = 0, E = Initializers.size(); I != E; ++I) { 6056 if (Initializers[I]->isBaseInitializer()) 6057 InitializedBases.insert(Context.getCanonicalType( 6058 QualType(Initializers[I]->getBaseClass(), 0))); 6059 else 6060 InitializedFields.insert( 6061 cast<FieldDecl>(Initializers[I]->getAnyMember())); 6062 } 6063 6064 // Add completions for base classes. 6065 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 6066 bool SawLastInitializer = Initializers.empty(); 6067 CXXRecordDecl *ClassDecl = Constructor->getParent(); 6068 6069 auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) { 6070 CodeCompletionBuilder Builder(Results.getAllocator(), 6071 Results.getCodeCompletionTUInfo()); 6072 Builder.AddTypedTextChunk(Name); 6073 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6074 if (const auto *Function = dyn_cast<FunctionDecl>(ND)) 6075 AddFunctionParameterChunks(PP, Policy, Function, Builder); 6076 else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND)) 6077 AddFunctionParameterChunks(PP, Policy, FunTemplDecl->getTemplatedDecl(), 6078 Builder); 6079 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6080 return Builder.TakeString(); 6081 }; 6082 auto AddDefaultCtorInit = [&](const char *Name, const char *Type, 6083 const NamedDecl *ND) { 6084 CodeCompletionBuilder Builder(Results.getAllocator(), 6085 Results.getCodeCompletionTUInfo()); 6086 Builder.AddTypedTextChunk(Name); 6087 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6088 Builder.AddPlaceholderChunk(Type); 6089 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6090 if (ND) { 6091 auto CCR = CodeCompletionResult( 6092 Builder.TakeString(), ND, 6093 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration); 6094 if (isa<FieldDecl>(ND)) 6095 CCR.CursorKind = CXCursor_MemberRef; 6096 return Results.AddResult(CCR); 6097 } 6098 return Results.AddResult(CodeCompletionResult( 6099 Builder.TakeString(), 6100 SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration)); 6101 }; 6102 auto AddCtorsWithName = [&](const CXXRecordDecl *RD, unsigned int Priority, 6103 const char *Name, const FieldDecl *FD) { 6104 if (!RD) 6105 return AddDefaultCtorInit(Name, 6106 FD ? Results.getAllocator().CopyString( 6107 FD->getType().getAsString(Policy)) 6108 : Name, 6109 FD); 6110 auto Ctors = getConstructors(Context, RD); 6111 if (Ctors.begin() == Ctors.end()) 6112 return AddDefaultCtorInit(Name, Name, RD); 6113 for (const NamedDecl *Ctor : Ctors) { 6114 auto CCR = CodeCompletionResult(GenerateCCS(Ctor, Name), RD, Priority); 6115 CCR.CursorKind = getCursorKindForDecl(Ctor); 6116 Results.AddResult(CCR); 6117 } 6118 }; 6119 auto AddBase = [&](const CXXBaseSpecifier &Base) { 6120 const char *BaseName = 6121 Results.getAllocator().CopyString(Base.getType().getAsString(Policy)); 6122 const auto *RD = Base.getType()->getAsCXXRecordDecl(); 6123 AddCtorsWithName( 6124 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6125 BaseName, nullptr); 6126 }; 6127 auto AddField = [&](const FieldDecl *FD) { 6128 const char *FieldName = 6129 Results.getAllocator().CopyString(FD->getIdentifier()->getName()); 6130 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl(); 6131 AddCtorsWithName( 6132 RD, SawLastInitializer ? CCP_NextInitializer : CCP_MemberDeclaration, 6133 FieldName, FD); 6134 }; 6135 6136 for (const auto &Base : ClassDecl->bases()) { 6137 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6138 .second) { 6139 SawLastInitializer = 6140 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6141 Context.hasSameUnqualifiedType( 6142 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6143 continue; 6144 } 6145 6146 AddBase(Base); 6147 SawLastInitializer = false; 6148 } 6149 6150 // Add completions for virtual base classes. 6151 for (const auto &Base : ClassDecl->vbases()) { 6152 if (!InitializedBases.insert(Context.getCanonicalType(Base.getType())) 6153 .second) { 6154 SawLastInitializer = 6155 !Initializers.empty() && Initializers.back()->isBaseInitializer() && 6156 Context.hasSameUnqualifiedType( 6157 Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); 6158 continue; 6159 } 6160 6161 AddBase(Base); 6162 SawLastInitializer = false; 6163 } 6164 6165 // Add completions for members. 6166 for (auto *Field : ClassDecl->fields()) { 6167 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl())) 6168 .second) { 6169 SawLastInitializer = !Initializers.empty() && 6170 Initializers.back()->isAnyMemberInitializer() && 6171 Initializers.back()->getAnyMember() == Field; 6172 continue; 6173 } 6174 6175 if (!Field->getDeclName()) 6176 continue; 6177 6178 AddField(Field); 6179 SawLastInitializer = false; 6180 } 6181 Results.ExitScope(); 6182 6183 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6184 Results.data(), Results.size()); 6185 } 6186 6187 /// Determine whether this scope denotes a namespace. 6188 static bool isNamespaceScope(Scope *S) { 6189 DeclContext *DC = S->getEntity(); 6190 if (!DC) 6191 return false; 6192 6193 return DC->isFileContext(); 6194 } 6195 6196 void Sema::CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro, 6197 bool AfterAmpersand) { 6198 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6199 CodeCompleter->getCodeCompletionTUInfo(), 6200 CodeCompletionContext::CCC_Other); 6201 Results.EnterNewScope(); 6202 6203 // Note what has already been captured. 6204 llvm::SmallPtrSet<IdentifierInfo *, 4> Known; 6205 bool IncludedThis = false; 6206 for (const auto &C : Intro.Captures) { 6207 if (C.Kind == LCK_This) { 6208 IncludedThis = true; 6209 continue; 6210 } 6211 6212 Known.insert(C.Id); 6213 } 6214 6215 // Look for other capturable variables. 6216 for (; S && !isNamespaceScope(S); S = S->getParent()) { 6217 for (const auto *D : S->decls()) { 6218 const auto *Var = dyn_cast<VarDecl>(D); 6219 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>()) 6220 continue; 6221 6222 if (Known.insert(Var->getIdentifier()).second) 6223 Results.AddResult(CodeCompletionResult(Var, CCP_LocalDeclaration), 6224 CurContext, nullptr, false); 6225 } 6226 } 6227 6228 // Add 'this', if it would be valid. 6229 if (!IncludedThis && !AfterAmpersand && Intro.Default != LCD_ByCopy) 6230 addThisCompletion(*this, Results); 6231 6232 Results.ExitScope(); 6233 6234 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6235 Results.data(), Results.size()); 6236 } 6237 6238 /// Macro that optionally prepends an "@" to the string literal passed in via 6239 /// Keyword, depending on whether NeedAt is true or false. 6240 #define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword) 6241 6242 static void AddObjCImplementationResults(const LangOptions &LangOpts, 6243 ResultBuilder &Results, bool NeedAt) { 6244 typedef CodeCompletionResult Result; 6245 // Since we have an implementation, we can end it. 6246 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6247 6248 CodeCompletionBuilder Builder(Results.getAllocator(), 6249 Results.getCodeCompletionTUInfo()); 6250 if (LangOpts.ObjC) { 6251 // @dynamic 6252 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "dynamic")); 6253 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6254 Builder.AddPlaceholderChunk("property"); 6255 Results.AddResult(Result(Builder.TakeString())); 6256 6257 // @synthesize 6258 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synthesize")); 6259 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6260 Builder.AddPlaceholderChunk("property"); 6261 Results.AddResult(Result(Builder.TakeString())); 6262 } 6263 } 6264 6265 static void AddObjCInterfaceResults(const LangOptions &LangOpts, 6266 ResultBuilder &Results, bool NeedAt) { 6267 typedef CodeCompletionResult Result; 6268 6269 // Since we have an interface or protocol, we can end it. 6270 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "end"))); 6271 6272 if (LangOpts.ObjC) { 6273 // @property 6274 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "property"))); 6275 6276 // @required 6277 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "required"))); 6278 6279 // @optional 6280 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "optional"))); 6281 } 6282 } 6283 6284 static void AddObjCTopLevelResults(ResultBuilder &Results, bool NeedAt) { 6285 typedef CodeCompletionResult Result; 6286 CodeCompletionBuilder Builder(Results.getAllocator(), 6287 Results.getCodeCompletionTUInfo()); 6288 6289 // @class name ; 6290 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "class")); 6291 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6292 Builder.AddPlaceholderChunk("name"); 6293 Results.AddResult(Result(Builder.TakeString())); 6294 6295 if (Results.includeCodePatterns()) { 6296 // @interface name 6297 // FIXME: Could introduce the whole pattern, including superclasses and 6298 // such. 6299 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "interface")); 6300 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6301 Builder.AddPlaceholderChunk("class"); 6302 Results.AddResult(Result(Builder.TakeString())); 6303 6304 // @protocol name 6305 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 6306 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6307 Builder.AddPlaceholderChunk("protocol"); 6308 Results.AddResult(Result(Builder.TakeString())); 6309 6310 // @implementation name 6311 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "implementation")); 6312 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6313 Builder.AddPlaceholderChunk("class"); 6314 Results.AddResult(Result(Builder.TakeString())); 6315 } 6316 6317 // @compatibility_alias name 6318 Builder.AddTypedTextChunk( 6319 OBJC_AT_KEYWORD_NAME(NeedAt, "compatibility_alias")); 6320 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6321 Builder.AddPlaceholderChunk("alias"); 6322 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6323 Builder.AddPlaceholderChunk("class"); 6324 Results.AddResult(Result(Builder.TakeString())); 6325 6326 if (Results.getSema().getLangOpts().Modules) { 6327 // @import name 6328 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "import")); 6329 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6330 Builder.AddPlaceholderChunk("module"); 6331 Results.AddResult(Result(Builder.TakeString())); 6332 } 6333 } 6334 6335 void Sema::CodeCompleteObjCAtDirective(Scope *S) { 6336 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6337 CodeCompleter->getCodeCompletionTUInfo(), 6338 CodeCompletionContext::CCC_Other); 6339 Results.EnterNewScope(); 6340 if (isa<ObjCImplDecl>(CurContext)) 6341 AddObjCImplementationResults(getLangOpts(), Results, false); 6342 else if (CurContext->isObjCContainer()) 6343 AddObjCInterfaceResults(getLangOpts(), Results, false); 6344 else 6345 AddObjCTopLevelResults(Results, false); 6346 Results.ExitScope(); 6347 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6348 Results.data(), Results.size()); 6349 } 6350 6351 static void AddObjCExpressionResults(ResultBuilder &Results, bool NeedAt) { 6352 typedef CodeCompletionResult Result; 6353 CodeCompletionBuilder Builder(Results.getAllocator(), 6354 Results.getCodeCompletionTUInfo()); 6355 6356 // @encode ( type-name ) 6357 const char *EncodeType = "char[]"; 6358 if (Results.getSema().getLangOpts().CPlusPlus || 6359 Results.getSema().getLangOpts().ConstStrings) 6360 EncodeType = "const char[]"; 6361 Builder.AddResultTypeChunk(EncodeType); 6362 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "encode")); 6363 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6364 Builder.AddPlaceholderChunk("type-name"); 6365 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6366 Results.AddResult(Result(Builder.TakeString())); 6367 6368 // @protocol ( protocol-name ) 6369 Builder.AddResultTypeChunk("Protocol *"); 6370 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "protocol")); 6371 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6372 Builder.AddPlaceholderChunk("protocol-name"); 6373 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6374 Results.AddResult(Result(Builder.TakeString())); 6375 6376 // @selector ( selector ) 6377 Builder.AddResultTypeChunk("SEL"); 6378 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "selector")); 6379 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6380 Builder.AddPlaceholderChunk("selector"); 6381 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6382 Results.AddResult(Result(Builder.TakeString())); 6383 6384 // @"string" 6385 Builder.AddResultTypeChunk("NSString *"); 6386 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "\"")); 6387 Builder.AddPlaceholderChunk("string"); 6388 Builder.AddTextChunk("\""); 6389 Results.AddResult(Result(Builder.TakeString())); 6390 6391 // @[objects, ...] 6392 Builder.AddResultTypeChunk("NSArray *"); 6393 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "[")); 6394 Builder.AddPlaceholderChunk("objects, ..."); 6395 Builder.AddChunk(CodeCompletionString::CK_RightBracket); 6396 Results.AddResult(Result(Builder.TakeString())); 6397 6398 // @{key : object, ...} 6399 Builder.AddResultTypeChunk("NSDictionary *"); 6400 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "{")); 6401 Builder.AddPlaceholderChunk("key"); 6402 Builder.AddChunk(CodeCompletionString::CK_Colon); 6403 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6404 Builder.AddPlaceholderChunk("object, ..."); 6405 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6406 Results.AddResult(Result(Builder.TakeString())); 6407 6408 // @(expression) 6409 Builder.AddResultTypeChunk("id"); 6410 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "(")); 6411 Builder.AddPlaceholderChunk("expression"); 6412 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6413 Results.AddResult(Result(Builder.TakeString())); 6414 } 6415 6416 static void AddObjCStatementResults(ResultBuilder &Results, bool NeedAt) { 6417 typedef CodeCompletionResult Result; 6418 CodeCompletionBuilder Builder(Results.getAllocator(), 6419 Results.getCodeCompletionTUInfo()); 6420 6421 if (Results.includeCodePatterns()) { 6422 // @try { statements } @catch ( declaration ) { statements } @finally 6423 // { statements } 6424 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "try")); 6425 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6426 Builder.AddPlaceholderChunk("statements"); 6427 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6428 Builder.AddTextChunk("@catch"); 6429 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6430 Builder.AddPlaceholderChunk("parameter"); 6431 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6432 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6433 Builder.AddPlaceholderChunk("statements"); 6434 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6435 Builder.AddTextChunk("@finally"); 6436 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6437 Builder.AddPlaceholderChunk("statements"); 6438 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6439 Results.AddResult(Result(Builder.TakeString())); 6440 } 6441 6442 // @throw 6443 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "throw")); 6444 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6445 Builder.AddPlaceholderChunk("expression"); 6446 Results.AddResult(Result(Builder.TakeString())); 6447 6448 if (Results.includeCodePatterns()) { 6449 // @synchronized ( expression ) { statements } 6450 Builder.AddTypedTextChunk(OBJC_AT_KEYWORD_NAME(NeedAt, "synchronized")); 6451 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 6452 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6453 Builder.AddPlaceholderChunk("expression"); 6454 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6455 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 6456 Builder.AddPlaceholderChunk("statements"); 6457 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 6458 Results.AddResult(Result(Builder.TakeString())); 6459 } 6460 } 6461 6462 static void AddObjCVisibilityResults(const LangOptions &LangOpts, 6463 ResultBuilder &Results, bool NeedAt) { 6464 typedef CodeCompletionResult Result; 6465 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "private"))); 6466 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "protected"))); 6467 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "public"))); 6468 if (LangOpts.ObjC) 6469 Results.AddResult(Result(OBJC_AT_KEYWORD_NAME(NeedAt, "package"))); 6470 } 6471 6472 void Sema::CodeCompleteObjCAtVisibility(Scope *S) { 6473 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6474 CodeCompleter->getCodeCompletionTUInfo(), 6475 CodeCompletionContext::CCC_Other); 6476 Results.EnterNewScope(); 6477 AddObjCVisibilityResults(getLangOpts(), Results, false); 6478 Results.ExitScope(); 6479 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6480 Results.data(), Results.size()); 6481 } 6482 6483 void Sema::CodeCompleteObjCAtStatement(Scope *S) { 6484 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6485 CodeCompleter->getCodeCompletionTUInfo(), 6486 CodeCompletionContext::CCC_Other); 6487 Results.EnterNewScope(); 6488 AddObjCStatementResults(Results, false); 6489 AddObjCExpressionResults(Results, false); 6490 Results.ExitScope(); 6491 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6492 Results.data(), Results.size()); 6493 } 6494 6495 void Sema::CodeCompleteObjCAtExpression(Scope *S) { 6496 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6497 CodeCompleter->getCodeCompletionTUInfo(), 6498 CodeCompletionContext::CCC_Other); 6499 Results.EnterNewScope(); 6500 AddObjCExpressionResults(Results, false); 6501 Results.ExitScope(); 6502 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6503 Results.data(), Results.size()); 6504 } 6505 6506 /// Determine whether the addition of the given flag to an Objective-C 6507 /// property's attributes will cause a conflict. 6508 static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) { 6509 // Check if we've already added this flag. 6510 if (Attributes & NewFlag) 6511 return true; 6512 6513 Attributes |= NewFlag; 6514 6515 // Check for collisions with "readonly". 6516 if ((Attributes & ObjCPropertyAttribute::kind_readonly) && 6517 (Attributes & ObjCPropertyAttribute::kind_readwrite)) 6518 return true; 6519 6520 // Check for more than one of { assign, copy, retain, strong, weak }. 6521 unsigned AssignCopyRetMask = 6522 Attributes & 6523 (ObjCPropertyAttribute::kind_assign | 6524 ObjCPropertyAttribute::kind_unsafe_unretained | 6525 ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain | 6526 ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak); 6527 if (AssignCopyRetMask && 6528 AssignCopyRetMask != ObjCPropertyAttribute::kind_assign && 6529 AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained && 6530 AssignCopyRetMask != ObjCPropertyAttribute::kind_copy && 6531 AssignCopyRetMask != ObjCPropertyAttribute::kind_retain && 6532 AssignCopyRetMask != ObjCPropertyAttribute::kind_strong && 6533 AssignCopyRetMask != ObjCPropertyAttribute::kind_weak) 6534 return true; 6535 6536 return false; 6537 } 6538 6539 void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) { 6540 if (!CodeCompleter) 6541 return; 6542 6543 unsigned Attributes = ODS.getPropertyAttributes(); 6544 6545 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6546 CodeCompleter->getCodeCompletionTUInfo(), 6547 CodeCompletionContext::CCC_Other); 6548 Results.EnterNewScope(); 6549 if (!ObjCPropertyFlagConflicts(Attributes, 6550 ObjCPropertyAttribute::kind_readonly)) 6551 Results.AddResult(CodeCompletionResult("readonly")); 6552 if (!ObjCPropertyFlagConflicts(Attributes, 6553 ObjCPropertyAttribute::kind_assign)) 6554 Results.AddResult(CodeCompletionResult("assign")); 6555 if (!ObjCPropertyFlagConflicts(Attributes, 6556 ObjCPropertyAttribute::kind_unsafe_unretained)) 6557 Results.AddResult(CodeCompletionResult("unsafe_unretained")); 6558 if (!ObjCPropertyFlagConflicts(Attributes, 6559 ObjCPropertyAttribute::kind_readwrite)) 6560 Results.AddResult(CodeCompletionResult("readwrite")); 6561 if (!ObjCPropertyFlagConflicts(Attributes, 6562 ObjCPropertyAttribute::kind_retain)) 6563 Results.AddResult(CodeCompletionResult("retain")); 6564 if (!ObjCPropertyFlagConflicts(Attributes, 6565 ObjCPropertyAttribute::kind_strong)) 6566 Results.AddResult(CodeCompletionResult("strong")); 6567 if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy)) 6568 Results.AddResult(CodeCompletionResult("copy")); 6569 if (!ObjCPropertyFlagConflicts(Attributes, 6570 ObjCPropertyAttribute::kind_nonatomic)) 6571 Results.AddResult(CodeCompletionResult("nonatomic")); 6572 if (!ObjCPropertyFlagConflicts(Attributes, 6573 ObjCPropertyAttribute::kind_atomic)) 6574 Results.AddResult(CodeCompletionResult("atomic")); 6575 6576 // Only suggest "weak" if we're compiling for ARC-with-weak-references or GC. 6577 if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC) 6578 if (!ObjCPropertyFlagConflicts(Attributes, 6579 ObjCPropertyAttribute::kind_weak)) 6580 Results.AddResult(CodeCompletionResult("weak")); 6581 6582 if (!ObjCPropertyFlagConflicts(Attributes, 6583 ObjCPropertyAttribute::kind_setter)) { 6584 CodeCompletionBuilder Setter(Results.getAllocator(), 6585 Results.getCodeCompletionTUInfo()); 6586 Setter.AddTypedTextChunk("setter"); 6587 Setter.AddTextChunk("="); 6588 Setter.AddPlaceholderChunk("method"); 6589 Results.AddResult(CodeCompletionResult(Setter.TakeString())); 6590 } 6591 if (!ObjCPropertyFlagConflicts(Attributes, 6592 ObjCPropertyAttribute::kind_getter)) { 6593 CodeCompletionBuilder Getter(Results.getAllocator(), 6594 Results.getCodeCompletionTUInfo()); 6595 Getter.AddTypedTextChunk("getter"); 6596 Getter.AddTextChunk("="); 6597 Getter.AddPlaceholderChunk("method"); 6598 Results.AddResult(CodeCompletionResult(Getter.TakeString())); 6599 } 6600 if (!ObjCPropertyFlagConflicts(Attributes, 6601 ObjCPropertyAttribute::kind_nullability)) { 6602 Results.AddResult(CodeCompletionResult("nonnull")); 6603 Results.AddResult(CodeCompletionResult("nullable")); 6604 Results.AddResult(CodeCompletionResult("null_unspecified")); 6605 Results.AddResult(CodeCompletionResult("null_resettable")); 6606 } 6607 Results.ExitScope(); 6608 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6609 Results.data(), Results.size()); 6610 } 6611 6612 /// Describes the kind of Objective-C method that we want to find 6613 /// via code completion. 6614 enum ObjCMethodKind { 6615 MK_Any, ///< Any kind of method, provided it means other specified criteria. 6616 MK_ZeroArgSelector, ///< Zero-argument (unary) selector. 6617 MK_OneArgSelector ///< One-argument selector. 6618 }; 6619 6620 static bool isAcceptableObjCSelector(Selector Sel, ObjCMethodKind WantKind, 6621 ArrayRef<IdentifierInfo *> SelIdents, 6622 bool AllowSameLength = true) { 6623 unsigned NumSelIdents = SelIdents.size(); 6624 if (NumSelIdents > Sel.getNumArgs()) 6625 return false; 6626 6627 switch (WantKind) { 6628 case MK_Any: 6629 break; 6630 case MK_ZeroArgSelector: 6631 return Sel.isUnarySelector(); 6632 case MK_OneArgSelector: 6633 return Sel.getNumArgs() == 1; 6634 } 6635 6636 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.getNumArgs()) 6637 return false; 6638 6639 for (unsigned I = 0; I != NumSelIdents; ++I) 6640 if (SelIdents[I] != Sel.getIdentifierInfoForSlot(I)) 6641 return false; 6642 6643 return true; 6644 } 6645 6646 static bool isAcceptableObjCMethod(ObjCMethodDecl *Method, 6647 ObjCMethodKind WantKind, 6648 ArrayRef<IdentifierInfo *> SelIdents, 6649 bool AllowSameLength = true) { 6650 return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, 6651 AllowSameLength); 6652 } 6653 6654 /// A set of selectors, which is used to avoid introducing multiple 6655 /// completions with the same selector into the result set. 6656 typedef llvm::SmallPtrSet<Selector, 16> VisitedSelectorSet; 6657 6658 /// Add all of the Objective-C methods in the given Objective-C 6659 /// container to the set of results. 6660 /// 6661 /// The container will be a class, protocol, category, or implementation of 6662 /// any of the above. This mether will recurse to include methods from 6663 /// the superclasses of classes along with their categories, protocols, and 6664 /// implementations. 6665 /// 6666 /// \param Container the container in which we'll look to find methods. 6667 /// 6668 /// \param WantInstanceMethods Whether to add instance methods (only); if 6669 /// false, this routine will add factory methods (only). 6670 /// 6671 /// \param CurContext the context in which we're performing the lookup that 6672 /// finds methods. 6673 /// 6674 /// \param AllowSameLength Whether we allow a method to be added to the list 6675 /// when it has the same number of parameters as we have selector identifiers. 6676 /// 6677 /// \param Results the structure into which we'll add results. 6678 static void AddObjCMethods(ObjCContainerDecl *Container, 6679 bool WantInstanceMethods, ObjCMethodKind WantKind, 6680 ArrayRef<IdentifierInfo *> SelIdents, 6681 DeclContext *CurContext, 6682 VisitedSelectorSet &Selectors, bool AllowSameLength, 6683 ResultBuilder &Results, bool InOriginalClass = true, 6684 bool IsRootClass = false) { 6685 typedef CodeCompletionResult Result; 6686 Container = getContainerDef(Container); 6687 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container); 6688 IsRootClass = IsRootClass || (IFace && !IFace->getSuperClass()); 6689 for (ObjCMethodDecl *M : Container->methods()) { 6690 // The instance methods on the root class can be messaged via the 6691 // metaclass. 6692 if (M->isInstanceMethod() == WantInstanceMethods || 6693 (IsRootClass && !WantInstanceMethods)) { 6694 // Check whether the selector identifiers we've been given are a 6695 // subset of the identifiers for this particular method. 6696 if (!isAcceptableObjCMethod(M, WantKind, SelIdents, AllowSameLength)) 6697 continue; 6698 6699 if (!Selectors.insert(M->getSelector()).second) 6700 continue; 6701 6702 Result R = Result(M, Results.getBasePriority(M), nullptr); 6703 R.StartParameter = SelIdents.size(); 6704 R.AllParametersAreInformative = (WantKind != MK_Any); 6705 if (!InOriginalClass) 6706 setInBaseClass(R); 6707 Results.MaybeAddResult(R, CurContext); 6708 } 6709 } 6710 6711 // Visit the protocols of protocols. 6712 if (const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 6713 if (Protocol->hasDefinition()) { 6714 const ObjCList<ObjCProtocolDecl> &Protocols = 6715 Protocol->getReferencedProtocols(); 6716 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6717 E = Protocols.end(); 6718 I != E; ++I) 6719 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 6720 Selectors, AllowSameLength, Results, false, IsRootClass); 6721 } 6722 } 6723 6724 if (!IFace || !IFace->hasDefinition()) 6725 return; 6726 6727 // Add methods in protocols. 6728 for (ObjCProtocolDecl *I : IFace->protocols()) 6729 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext, 6730 Selectors, AllowSameLength, Results, false, IsRootClass); 6731 6732 // Add methods in categories. 6733 for (ObjCCategoryDecl *CatDecl : IFace->known_categories()) { 6734 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, 6735 CurContext, Selectors, AllowSameLength, Results, 6736 InOriginalClass, IsRootClass); 6737 6738 // Add a categories protocol methods. 6739 const ObjCList<ObjCProtocolDecl> &Protocols = 6740 CatDecl->getReferencedProtocols(); 6741 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 6742 E = Protocols.end(); 6743 I != E; ++I) 6744 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext, 6745 Selectors, AllowSameLength, Results, false, IsRootClass); 6746 6747 // Add methods in category implementations. 6748 if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation()) 6749 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 6750 Selectors, AllowSameLength, Results, InOriginalClass, 6751 IsRootClass); 6752 } 6753 6754 // Add methods in superclass. 6755 // Avoid passing in IsRootClass since root classes won't have super classes. 6756 if (IFace->getSuperClass()) 6757 AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind, 6758 SelIdents, CurContext, Selectors, AllowSameLength, Results, 6759 /*IsRootClass=*/false); 6760 6761 // Add methods in our implementation, if any. 6762 if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 6763 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext, 6764 Selectors, AllowSameLength, Results, InOriginalClass, 6765 IsRootClass); 6766 } 6767 6768 void Sema::CodeCompleteObjCPropertyGetter(Scope *S) { 6769 // Try to find the interface where getters might live. 6770 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 6771 if (!Class) { 6772 if (ObjCCategoryDecl *Category = 6773 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 6774 Class = Category->getClassInterface(); 6775 6776 if (!Class) 6777 return; 6778 } 6779 6780 // Find all of the potential getters. 6781 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6782 CodeCompleter->getCodeCompletionTUInfo(), 6783 CodeCompletionContext::CCC_Other); 6784 Results.EnterNewScope(); 6785 6786 VisitedSelectorSet Selectors; 6787 AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors, 6788 /*AllowSameLength=*/true, Results); 6789 Results.ExitScope(); 6790 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6791 Results.data(), Results.size()); 6792 } 6793 6794 void Sema::CodeCompleteObjCPropertySetter(Scope *S) { 6795 // Try to find the interface where setters might live. 6796 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurContext); 6797 if (!Class) { 6798 if (ObjCCategoryDecl *Category = 6799 dyn_cast_or_null<ObjCCategoryDecl>(CurContext)) 6800 Class = Category->getClassInterface(); 6801 6802 if (!Class) 6803 return; 6804 } 6805 6806 // Find all of the potential getters. 6807 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6808 CodeCompleter->getCodeCompletionTUInfo(), 6809 CodeCompletionContext::CCC_Other); 6810 Results.EnterNewScope(); 6811 6812 VisitedSelectorSet Selectors; 6813 AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext, Selectors, 6814 /*AllowSameLength=*/true, Results); 6815 6816 Results.ExitScope(); 6817 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6818 Results.data(), Results.size()); 6819 } 6820 6821 void Sema::CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS, 6822 bool IsParameter) { 6823 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 6824 CodeCompleter->getCodeCompletionTUInfo(), 6825 CodeCompletionContext::CCC_Type); 6826 Results.EnterNewScope(); 6827 6828 // Add context-sensitive, Objective-C parameter-passing keywords. 6829 bool AddedInOut = false; 6830 if ((DS.getObjCDeclQualifier() & 6831 (ObjCDeclSpec::DQ_In | ObjCDeclSpec::DQ_Inout)) == 0) { 6832 Results.AddResult("in"); 6833 Results.AddResult("inout"); 6834 AddedInOut = true; 6835 } 6836 if ((DS.getObjCDeclQualifier() & 6837 (ObjCDeclSpec::DQ_Out | ObjCDeclSpec::DQ_Inout)) == 0) { 6838 Results.AddResult("out"); 6839 if (!AddedInOut) 6840 Results.AddResult("inout"); 6841 } 6842 if ((DS.getObjCDeclQualifier() & 6843 (ObjCDeclSpec::DQ_Bycopy | ObjCDeclSpec::DQ_Byref | 6844 ObjCDeclSpec::DQ_Oneway)) == 0) { 6845 Results.AddResult("bycopy"); 6846 Results.AddResult("byref"); 6847 Results.AddResult("oneway"); 6848 } 6849 if ((DS.getObjCDeclQualifier() & ObjCDeclSpec::DQ_CSNullability) == 0) { 6850 Results.AddResult("nonnull"); 6851 Results.AddResult("nullable"); 6852 Results.AddResult("null_unspecified"); 6853 } 6854 6855 // If we're completing the return type of an Objective-C method and the 6856 // identifier IBAction refers to a macro, provide a completion item for 6857 // an action, e.g., 6858 // IBAction)<#selector#>:(id)sender 6859 if (DS.getObjCDeclQualifier() == 0 && !IsParameter && 6860 PP.isMacroDefined("IBAction")) { 6861 CodeCompletionBuilder Builder(Results.getAllocator(), 6862 Results.getCodeCompletionTUInfo(), 6863 CCP_CodePattern, CXAvailability_Available); 6864 Builder.AddTypedTextChunk("IBAction"); 6865 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6866 Builder.AddPlaceholderChunk("selector"); 6867 Builder.AddChunk(CodeCompletionString::CK_Colon); 6868 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 6869 Builder.AddTextChunk("id"); 6870 Builder.AddChunk(CodeCompletionString::CK_RightParen); 6871 Builder.AddTextChunk("sender"); 6872 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 6873 } 6874 6875 // If we're completing the return type, provide 'instancetype'. 6876 if (!IsParameter) { 6877 Results.AddResult(CodeCompletionResult("instancetype")); 6878 } 6879 6880 // Add various builtin type names and specifiers. 6881 AddOrdinaryNameResults(PCC_Type, S, *this, Results); 6882 Results.ExitScope(); 6883 6884 // Add the various type names 6885 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName); 6886 CodeCompletionDeclConsumer Consumer(Results, CurContext); 6887 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 6888 CodeCompleter->includeGlobals(), 6889 CodeCompleter->loadExternal()); 6890 6891 if (CodeCompleter->includeMacros()) 6892 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 6893 6894 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 6895 Results.data(), Results.size()); 6896 } 6897 6898 /// When we have an expression with type "id", we may assume 6899 /// that it has some more-specific class type based on knowledge of 6900 /// common uses of Objective-C. This routine returns that class type, 6901 /// or NULL if no better result could be determined. 6902 static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) { 6903 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E); 6904 if (!Msg) 6905 return nullptr; 6906 6907 Selector Sel = Msg->getSelector(); 6908 if (Sel.isNull()) 6909 return nullptr; 6910 6911 IdentifierInfo *Id = Sel.getIdentifierInfoForSlot(0); 6912 if (!Id) 6913 return nullptr; 6914 6915 ObjCMethodDecl *Method = Msg->getMethodDecl(); 6916 if (!Method) 6917 return nullptr; 6918 6919 // Determine the class that we're sending the message to. 6920 ObjCInterfaceDecl *IFace = nullptr; 6921 switch (Msg->getReceiverKind()) { 6922 case ObjCMessageExpr::Class: 6923 if (const ObjCObjectType *ObjType = 6924 Msg->getClassReceiver()->getAs<ObjCObjectType>()) 6925 IFace = ObjType->getInterface(); 6926 break; 6927 6928 case ObjCMessageExpr::Instance: { 6929 QualType T = Msg->getInstanceReceiver()->getType(); 6930 if (const ObjCObjectPointerType *Ptr = T->getAs<ObjCObjectPointerType>()) 6931 IFace = Ptr->getInterfaceDecl(); 6932 break; 6933 } 6934 6935 case ObjCMessageExpr::SuperInstance: 6936 case ObjCMessageExpr::SuperClass: 6937 break; 6938 } 6939 6940 if (!IFace) 6941 return nullptr; 6942 6943 ObjCInterfaceDecl *Super = IFace->getSuperClass(); 6944 if (Method->isInstanceMethod()) 6945 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 6946 .Case("retain", IFace) 6947 .Case("strong", IFace) 6948 .Case("autorelease", IFace) 6949 .Case("copy", IFace) 6950 .Case("copyWithZone", IFace) 6951 .Case("mutableCopy", IFace) 6952 .Case("mutableCopyWithZone", IFace) 6953 .Case("awakeFromCoder", IFace) 6954 .Case("replacementObjectFromCoder", IFace) 6955 .Case("class", IFace) 6956 .Case("classForCoder", IFace) 6957 .Case("superclass", Super) 6958 .Default(nullptr); 6959 6960 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->getName()) 6961 .Case("new", IFace) 6962 .Case("alloc", IFace) 6963 .Case("allocWithZone", IFace) 6964 .Case("class", IFace) 6965 .Case("superclass", Super) 6966 .Default(nullptr); 6967 } 6968 6969 // Add a special completion for a message send to "super", which fills in the 6970 // most likely case of forwarding all of our arguments to the superclass 6971 // function. 6972 /// 6973 /// \param S The semantic analysis object. 6974 /// 6975 /// \param NeedSuperKeyword Whether we need to prefix this completion with 6976 /// the "super" keyword. Otherwise, we just need to provide the arguments. 6977 /// 6978 /// \param SelIdents The identifiers in the selector that have already been 6979 /// provided as arguments for a send to "super". 6980 /// 6981 /// \param Results The set of results to augment. 6982 /// 6983 /// \returns the Objective-C method declaration that would be invoked by 6984 /// this "super" completion. If NULL, no completion was added. 6985 static ObjCMethodDecl * 6986 AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, 6987 ArrayRef<IdentifierInfo *> SelIdents, 6988 ResultBuilder &Results) { 6989 ObjCMethodDecl *CurMethod = S.getCurMethodDecl(); 6990 if (!CurMethod) 6991 return nullptr; 6992 6993 ObjCInterfaceDecl *Class = CurMethod->getClassInterface(); 6994 if (!Class) 6995 return nullptr; 6996 6997 // Try to find a superclass method with the same selector. 6998 ObjCMethodDecl *SuperMethod = nullptr; 6999 while ((Class = Class->getSuperClass()) && !SuperMethod) { 7000 // Check in the class 7001 SuperMethod = Class->getMethod(CurMethod->getSelector(), 7002 CurMethod->isInstanceMethod()); 7003 7004 // Check in categories or class extensions. 7005 if (!SuperMethod) { 7006 for (const auto *Cat : Class->known_categories()) { 7007 if ((SuperMethod = Cat->getMethod(CurMethod->getSelector(), 7008 CurMethod->isInstanceMethod()))) 7009 break; 7010 } 7011 } 7012 } 7013 7014 if (!SuperMethod) 7015 return nullptr; 7016 7017 // Check whether the superclass method has the same signature. 7018 if (CurMethod->param_size() != SuperMethod->param_size() || 7019 CurMethod->isVariadic() != SuperMethod->isVariadic()) 7020 return nullptr; 7021 7022 for (ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(), 7023 CurPEnd = CurMethod->param_end(), 7024 SuperP = SuperMethod->param_begin(); 7025 CurP != CurPEnd; ++CurP, ++SuperP) { 7026 // Make sure the parameter types are compatible. 7027 if (!S.Context.hasSameUnqualifiedType((*CurP)->getType(), 7028 (*SuperP)->getType())) 7029 return nullptr; 7030 7031 // Make sure we have a parameter name to forward! 7032 if (!(*CurP)->getIdentifier()) 7033 return nullptr; 7034 } 7035 7036 // We have a superclass method. Now, form the send-to-super completion. 7037 CodeCompletionBuilder Builder(Results.getAllocator(), 7038 Results.getCodeCompletionTUInfo()); 7039 7040 // Give this completion a return type. 7041 AddResultTypeChunk(S.Context, getCompletionPrintingPolicy(S), SuperMethod, 7042 Results.getCompletionContext().getBaseType(), Builder); 7043 7044 // If we need the "super" keyword, add it (plus some spacing). 7045 if (NeedSuperKeyword) { 7046 Builder.AddTypedTextChunk("super"); 7047 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7048 } 7049 7050 Selector Sel = CurMethod->getSelector(); 7051 if (Sel.isUnarySelector()) { 7052 if (NeedSuperKeyword) 7053 Builder.AddTextChunk( 7054 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7055 else 7056 Builder.AddTypedTextChunk( 7057 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7058 } else { 7059 ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin(); 7060 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { 7061 if (I > SelIdents.size()) 7062 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 7063 7064 if (I < SelIdents.size()) 7065 Builder.AddInformativeChunk( 7066 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7067 else if (NeedSuperKeyword || I > SelIdents.size()) { 7068 Builder.AddTextChunk( 7069 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7070 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7071 (*CurP)->getIdentifier()->getName())); 7072 } else { 7073 Builder.AddTypedTextChunk( 7074 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 7075 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString( 7076 (*CurP)->getIdentifier()->getName())); 7077 } 7078 } 7079 } 7080 7081 Results.AddResult(CodeCompletionResult(Builder.TakeString(), SuperMethod, 7082 CCP_SuperCompletion)); 7083 return SuperMethod; 7084 } 7085 7086 void Sema::CodeCompleteObjCMessageReceiver(Scope *S) { 7087 typedef CodeCompletionResult Result; 7088 ResultBuilder Results( 7089 *this, CodeCompleter->getAllocator(), 7090 CodeCompleter->getCodeCompletionTUInfo(), 7091 CodeCompletionContext::CCC_ObjCMessageReceiver, 7092 getLangOpts().CPlusPlus11 7093 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture 7094 : &ResultBuilder::IsObjCMessageReceiver); 7095 7096 CodeCompletionDeclConsumer Consumer(Results, CurContext); 7097 Results.EnterNewScope(); 7098 LookupVisibleDecls(S, LookupOrdinaryName, Consumer, 7099 CodeCompleter->includeGlobals(), 7100 CodeCompleter->loadExternal()); 7101 7102 // If we are in an Objective-C method inside a class that has a superclass, 7103 // add "super" as an option. 7104 if (ObjCMethodDecl *Method = getCurMethodDecl()) 7105 if (ObjCInterfaceDecl *Iface = Method->getClassInterface()) 7106 if (Iface->getSuperClass()) { 7107 Results.AddResult(Result("super")); 7108 7109 AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results); 7110 } 7111 7112 if (getLangOpts().CPlusPlus11) 7113 addThisCompletion(*this, Results); 7114 7115 Results.ExitScope(); 7116 7117 if (CodeCompleter->includeMacros()) 7118 AddMacroResults(PP, Results, CodeCompleter->loadExternal(), false); 7119 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7120 Results.data(), Results.size()); 7121 } 7122 7123 void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, 7124 ArrayRef<IdentifierInfo *> SelIdents, 7125 bool AtArgumentExpression) { 7126 ObjCInterfaceDecl *CDecl = nullptr; 7127 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7128 // Figure out which interface we're in. 7129 CDecl = CurMethod->getClassInterface(); 7130 if (!CDecl) 7131 return; 7132 7133 // Find the superclass of this class. 7134 CDecl = CDecl->getSuperClass(); 7135 if (!CDecl) 7136 return; 7137 7138 if (CurMethod->isInstanceMethod()) { 7139 // We are inside an instance method, which means that the message 7140 // send [super ...] is actually calling an instance method on the 7141 // current object. 7142 return CodeCompleteObjCInstanceMessage(S, nullptr, SelIdents, 7143 AtArgumentExpression, CDecl); 7144 } 7145 7146 // Fall through to send to the superclass in CDecl. 7147 } else { 7148 // "super" may be the name of a type or variable. Figure out which 7149 // it is. 7150 IdentifierInfo *Super = getSuperIdentifier(); 7151 NamedDecl *ND = LookupSingleName(S, Super, SuperLoc, LookupOrdinaryName); 7152 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) { 7153 // "super" names an interface. Use it. 7154 } else if (TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) { 7155 if (const ObjCObjectType *Iface = 7156 Context.getTypeDeclType(TD)->getAs<ObjCObjectType>()) 7157 CDecl = Iface->getInterface(); 7158 } else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) { 7159 // "super" names an unresolved type; we can't be more specific. 7160 } else { 7161 // Assume that "super" names some kind of value and parse that way. 7162 CXXScopeSpec SS; 7163 SourceLocation TemplateKWLoc; 7164 UnqualifiedId id; 7165 id.setIdentifier(Super, SuperLoc); 7166 ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id, 7167 /*HasTrailingLParen=*/false, 7168 /*IsAddressOfOperand=*/false); 7169 return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), 7170 SelIdents, AtArgumentExpression); 7171 } 7172 7173 // Fall through 7174 } 7175 7176 ParsedType Receiver; 7177 if (CDecl) 7178 Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl)); 7179 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents, 7180 AtArgumentExpression, 7181 /*IsSuper=*/true); 7182 } 7183 7184 /// Given a set of code-completion results for the argument of a message 7185 /// send, determine the preferred type (if any) for that argument expression. 7186 static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results, 7187 unsigned NumSelIdents) { 7188 typedef CodeCompletionResult Result; 7189 ASTContext &Context = Results.getSema().Context; 7190 7191 QualType PreferredType; 7192 unsigned BestPriority = CCP_Unlikely * 2; 7193 Result *ResultsData = Results.data(); 7194 for (unsigned I = 0, N = Results.size(); I != N; ++I) { 7195 Result &R = ResultsData[I]; 7196 if (R.Kind == Result::RK_Declaration && 7197 isa<ObjCMethodDecl>(R.Declaration)) { 7198 if (R.Priority <= BestPriority) { 7199 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(R.Declaration); 7200 if (NumSelIdents <= Method->param_size()) { 7201 QualType MyPreferredType = 7202 Method->parameters()[NumSelIdents - 1]->getType(); 7203 if (R.Priority < BestPriority || PreferredType.isNull()) { 7204 BestPriority = R.Priority; 7205 PreferredType = MyPreferredType; 7206 } else if (!Context.hasSameUnqualifiedType(PreferredType, 7207 MyPreferredType)) { 7208 PreferredType = QualType(); 7209 } 7210 } 7211 } 7212 } 7213 } 7214 7215 return PreferredType; 7216 } 7217 7218 static void AddClassMessageCompletions(Sema &SemaRef, Scope *S, 7219 ParsedType Receiver, 7220 ArrayRef<IdentifierInfo *> SelIdents, 7221 bool AtArgumentExpression, bool IsSuper, 7222 ResultBuilder &Results) { 7223 typedef CodeCompletionResult Result; 7224 ObjCInterfaceDecl *CDecl = nullptr; 7225 7226 // If the given name refers to an interface type, retrieve the 7227 // corresponding declaration. 7228 if (Receiver) { 7229 QualType T = SemaRef.GetTypeFromParser(Receiver, nullptr); 7230 if (!T.isNull()) 7231 if (const ObjCObjectType *Interface = T->getAs<ObjCObjectType>()) 7232 CDecl = Interface->getInterface(); 7233 } 7234 7235 // Add all of the factory methods in this Objective-C class, its protocols, 7236 // superclasses, categories, implementation, etc. 7237 Results.EnterNewScope(); 7238 7239 // If this is a send-to-super, try to add the special "super" send 7240 // completion. 7241 if (IsSuper) { 7242 if (ObjCMethodDecl *SuperMethod = 7243 AddSuperSendCompletion(SemaRef, false, SelIdents, Results)) 7244 Results.Ignore(SuperMethod); 7245 } 7246 7247 // If we're inside an Objective-C method definition, prefer its selector to 7248 // others. 7249 if (ObjCMethodDecl *CurMethod = SemaRef.getCurMethodDecl()) 7250 Results.setPreferredSelector(CurMethod->getSelector()); 7251 7252 VisitedSelectorSet Selectors; 7253 if (CDecl) 7254 AddObjCMethods(CDecl, false, MK_Any, SelIdents, SemaRef.CurContext, 7255 Selectors, AtArgumentExpression, Results); 7256 else { 7257 // We're messaging "id" as a type; provide all class/factory methods. 7258 7259 // If we have an external source, load the entire class method 7260 // pool from the AST file. 7261 if (SemaRef.getExternalSource()) { 7262 for (uint32_t I = 0, 7263 N = SemaRef.getExternalSource()->GetNumExternalSelectors(); 7264 I != N; ++I) { 7265 Selector Sel = SemaRef.getExternalSource()->GetExternalSelector(I); 7266 if (Sel.isNull() || SemaRef.MethodPool.count(Sel)) 7267 continue; 7268 7269 SemaRef.ReadMethodPool(Sel); 7270 } 7271 } 7272 7273 for (Sema::GlobalMethodPool::iterator M = SemaRef.MethodPool.begin(), 7274 MEnd = SemaRef.MethodPool.end(); 7275 M != MEnd; ++M) { 7276 for (ObjCMethodList *MethList = &M->second.second; 7277 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 7278 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 7279 continue; 7280 7281 Result R(MethList->getMethod(), 7282 Results.getBasePriority(MethList->getMethod()), nullptr); 7283 R.StartParameter = SelIdents.size(); 7284 R.AllParametersAreInformative = false; 7285 Results.MaybeAddResult(R, SemaRef.CurContext); 7286 } 7287 } 7288 } 7289 7290 Results.ExitScope(); 7291 } 7292 7293 void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, 7294 ArrayRef<IdentifierInfo *> SelIdents, 7295 bool AtArgumentExpression, 7296 bool IsSuper) { 7297 7298 QualType T = this->GetTypeFromParser(Receiver); 7299 7300 ResultBuilder Results( 7301 *this, CodeCompleter->getAllocator(), 7302 CodeCompleter->getCodeCompletionTUInfo(), 7303 CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, T, 7304 SelIdents)); 7305 7306 AddClassMessageCompletions(*this, S, Receiver, SelIdents, 7307 AtArgumentExpression, IsSuper, Results); 7308 7309 // If we're actually at the argument expression (rather than prior to the 7310 // selector), we're actually performing code completion for an expression. 7311 // Determine whether we have a single, best method. If so, we can 7312 // code-complete the expression using the corresponding parameter type as 7313 // our preferred type, improving completion results. 7314 if (AtArgumentExpression) { 7315 QualType PreferredType = 7316 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 7317 if (PreferredType.isNull()) 7318 CodeCompleteOrdinaryName(S, PCC_Expression); 7319 else 7320 CodeCompleteExpression(S, PreferredType); 7321 return; 7322 } 7323 7324 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7325 Results.data(), Results.size()); 7326 } 7327 7328 void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, 7329 ArrayRef<IdentifierInfo *> SelIdents, 7330 bool AtArgumentExpression, 7331 ObjCInterfaceDecl *Super) { 7332 typedef CodeCompletionResult Result; 7333 7334 Expr *RecExpr = static_cast<Expr *>(Receiver); 7335 7336 // If necessary, apply function/array conversion to the receiver. 7337 // C99 6.7.5.3p[7,8]. 7338 if (RecExpr) { 7339 ExprResult Conv = DefaultFunctionArrayLvalueConversion(RecExpr); 7340 if (Conv.isInvalid()) // conversion failed. bail. 7341 return; 7342 RecExpr = Conv.get(); 7343 } 7344 QualType ReceiverType = RecExpr 7345 ? RecExpr->getType() 7346 : Super ? Context.getObjCObjectPointerType( 7347 Context.getObjCInterfaceType(Super)) 7348 : Context.getObjCIdType(); 7349 7350 // If we're messaging an expression with type "id" or "Class", check 7351 // whether we know something special about the receiver that allows 7352 // us to assume a more-specific receiver type. 7353 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { 7354 if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { 7355 if (ReceiverType->isObjCClassType()) 7356 return CodeCompleteObjCClassMessage( 7357 S, ParsedType::make(Context.getObjCInterfaceType(IFace)), SelIdents, 7358 AtArgumentExpression, Super); 7359 7360 ReceiverType = 7361 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace)); 7362 } 7363 } else if (RecExpr && getLangOpts().CPlusPlus) { 7364 ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); 7365 if (Conv.isUsable()) { 7366 RecExpr = Conv.get(); 7367 ReceiverType = RecExpr->getType(); 7368 } 7369 } 7370 7371 // Build the set of methods we can see. 7372 ResultBuilder Results( 7373 *this, CodeCompleter->getAllocator(), 7374 CodeCompleter->getCodeCompletionTUInfo(), 7375 CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, 7376 ReceiverType, SelIdents)); 7377 7378 Results.EnterNewScope(); 7379 7380 // If this is a send-to-super, try to add the special "super" send 7381 // completion. 7382 if (Super) { 7383 if (ObjCMethodDecl *SuperMethod = 7384 AddSuperSendCompletion(*this, false, SelIdents, Results)) 7385 Results.Ignore(SuperMethod); 7386 } 7387 7388 // If we're inside an Objective-C method definition, prefer its selector to 7389 // others. 7390 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 7391 Results.setPreferredSelector(CurMethod->getSelector()); 7392 7393 // Keep track of the selectors we've already added. 7394 VisitedSelectorSet Selectors; 7395 7396 // Handle messages to Class. This really isn't a message to an instance 7397 // method, so we treat it the same way we would treat a message send to a 7398 // class method. 7399 if (ReceiverType->isObjCClassType() || 7400 ReceiverType->isObjCQualifiedClassType()) { 7401 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { 7402 if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) 7403 AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, CurContext, 7404 Selectors, AtArgumentExpression, Results); 7405 } 7406 } 7407 // Handle messages to a qualified ID ("id<foo>"). 7408 else if (const ObjCObjectPointerType *QualID = 7409 ReceiverType->getAsObjCQualifiedIdType()) { 7410 // Search protocols for instance methods. 7411 for (auto *I : QualID->quals()) 7412 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 7413 AtArgumentExpression, Results); 7414 } 7415 // Handle messages to a pointer to interface type. 7416 else if (const ObjCObjectPointerType *IFacePtr = 7417 ReceiverType->getAsObjCInterfacePointerType()) { 7418 // Search the class, its superclasses, etc., for instance methods. 7419 AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, 7420 CurContext, Selectors, AtArgumentExpression, Results); 7421 7422 // Search protocols for instance methods. 7423 for (auto *I : IFacePtr->quals()) 7424 AddObjCMethods(I, true, MK_Any, SelIdents, CurContext, Selectors, 7425 AtArgumentExpression, Results); 7426 } 7427 // Handle messages to "id". 7428 else if (ReceiverType->isObjCIdType()) { 7429 // We're messaging "id", so provide all instance methods we know 7430 // about as code-completion results. 7431 7432 // If we have an external source, load the entire class method 7433 // pool from the AST file. 7434 if (ExternalSource) { 7435 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); 7436 I != N; ++I) { 7437 Selector Sel = ExternalSource->GetExternalSelector(I); 7438 if (Sel.isNull() || MethodPool.count(Sel)) 7439 continue; 7440 7441 ReadMethodPool(Sel); 7442 } 7443 } 7444 7445 for (GlobalMethodPool::iterator M = MethodPool.begin(), 7446 MEnd = MethodPool.end(); 7447 M != MEnd; ++M) { 7448 for (ObjCMethodList *MethList = &M->second.first; 7449 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 7450 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 7451 continue; 7452 7453 if (!Selectors.insert(MethList->getMethod()->getSelector()).second) 7454 continue; 7455 7456 Result R(MethList->getMethod(), 7457 Results.getBasePriority(MethList->getMethod()), nullptr); 7458 R.StartParameter = SelIdents.size(); 7459 R.AllParametersAreInformative = false; 7460 Results.MaybeAddResult(R, CurContext); 7461 } 7462 } 7463 } 7464 Results.ExitScope(); 7465 7466 // If we're actually at the argument expression (rather than prior to the 7467 // selector), we're actually performing code completion for an expression. 7468 // Determine whether we have a single, best method. If so, we can 7469 // code-complete the expression using the corresponding parameter type as 7470 // our preferred type, improving completion results. 7471 if (AtArgumentExpression) { 7472 QualType PreferredType = 7473 getPreferredArgumentTypeForMessageSend(Results, SelIdents.size()); 7474 if (PreferredType.isNull()) 7475 CodeCompleteOrdinaryName(S, PCC_Expression); 7476 else 7477 CodeCompleteExpression(S, PreferredType); 7478 return; 7479 } 7480 7481 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7482 Results.data(), Results.size()); 7483 } 7484 7485 void Sema::CodeCompleteObjCForCollection(Scope *S, 7486 DeclGroupPtrTy IterationVar) { 7487 CodeCompleteExpressionData Data; 7488 Data.ObjCCollection = true; 7489 7490 if (IterationVar.getAsOpaquePtr()) { 7491 DeclGroupRef DG = IterationVar.get(); 7492 for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) { 7493 if (*I) 7494 Data.IgnoreDecls.push_back(*I); 7495 } 7496 } 7497 7498 CodeCompleteExpression(S, Data); 7499 } 7500 7501 void Sema::CodeCompleteObjCSelector(Scope *S, 7502 ArrayRef<IdentifierInfo *> SelIdents) { 7503 // If we have an external source, load the entire class method 7504 // pool from the AST file. 7505 if (ExternalSource) { 7506 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 7507 ++I) { 7508 Selector Sel = ExternalSource->GetExternalSelector(I); 7509 if (Sel.isNull() || MethodPool.count(Sel)) 7510 continue; 7511 7512 ReadMethodPool(Sel); 7513 } 7514 } 7515 7516 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7517 CodeCompleter->getCodeCompletionTUInfo(), 7518 CodeCompletionContext::CCC_SelectorName); 7519 Results.EnterNewScope(); 7520 for (GlobalMethodPool::iterator M = MethodPool.begin(), 7521 MEnd = MethodPool.end(); 7522 M != MEnd; ++M) { 7523 7524 Selector Sel = M->first; 7525 if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents)) 7526 continue; 7527 7528 CodeCompletionBuilder Builder(Results.getAllocator(), 7529 Results.getCodeCompletionTUInfo()); 7530 if (Sel.isUnarySelector()) { 7531 Builder.AddTypedTextChunk( 7532 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 7533 Results.AddResult(Builder.TakeString()); 7534 continue; 7535 } 7536 7537 std::string Accumulator; 7538 for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { 7539 if (I == SelIdents.size()) { 7540 if (!Accumulator.empty()) { 7541 Builder.AddInformativeChunk( 7542 Builder.getAllocator().CopyString(Accumulator)); 7543 Accumulator.clear(); 7544 } 7545 } 7546 7547 Accumulator += Sel.getNameForSlot(I); 7548 Accumulator += ':'; 7549 } 7550 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator)); 7551 Results.AddResult(Builder.TakeString()); 7552 } 7553 Results.ExitScope(); 7554 7555 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7556 Results.data(), Results.size()); 7557 } 7558 7559 /// Add all of the protocol declarations that we find in the given 7560 /// (translation unit) context. 7561 static void AddProtocolResults(DeclContext *Ctx, DeclContext *CurContext, 7562 bool OnlyForwardDeclarations, 7563 ResultBuilder &Results) { 7564 typedef CodeCompletionResult Result; 7565 7566 for (const auto *D : Ctx->decls()) { 7567 // Record any protocols we find. 7568 if (const auto *Proto = dyn_cast<ObjCProtocolDecl>(D)) 7569 if (!OnlyForwardDeclarations || !Proto->hasDefinition()) 7570 Results.AddResult( 7571 Result(Proto, Results.getBasePriority(Proto), nullptr), CurContext, 7572 nullptr, false); 7573 } 7574 } 7575 7576 void Sema::CodeCompleteObjCProtocolReferences( 7577 ArrayRef<IdentifierLocPair> Protocols) { 7578 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7579 CodeCompleter->getCodeCompletionTUInfo(), 7580 CodeCompletionContext::CCC_ObjCProtocolName); 7581 7582 if (CodeCompleter->includeGlobals()) { 7583 Results.EnterNewScope(); 7584 7585 // Tell the result set to ignore all of the protocols we have 7586 // already seen. 7587 // FIXME: This doesn't work when caching code-completion results. 7588 for (const IdentifierLocPair &Pair : Protocols) 7589 if (ObjCProtocolDecl *Protocol = LookupProtocol(Pair.first, Pair.second)) 7590 Results.Ignore(Protocol); 7591 7592 // Add all protocols. 7593 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, false, 7594 Results); 7595 7596 Results.ExitScope(); 7597 } 7598 7599 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7600 Results.data(), Results.size()); 7601 } 7602 7603 void Sema::CodeCompleteObjCProtocolDecl(Scope *) { 7604 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7605 CodeCompleter->getCodeCompletionTUInfo(), 7606 CodeCompletionContext::CCC_ObjCProtocolName); 7607 7608 if (CodeCompleter->includeGlobals()) { 7609 Results.EnterNewScope(); 7610 7611 // Add all protocols. 7612 AddProtocolResults(Context.getTranslationUnitDecl(), CurContext, true, 7613 Results); 7614 7615 Results.ExitScope(); 7616 } 7617 7618 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7619 Results.data(), Results.size()); 7620 } 7621 7622 /// Add all of the Objective-C interface declarations that we find in 7623 /// the given (translation unit) context. 7624 static void AddInterfaceResults(DeclContext *Ctx, DeclContext *CurContext, 7625 bool OnlyForwardDeclarations, 7626 bool OnlyUnimplemented, 7627 ResultBuilder &Results) { 7628 typedef CodeCompletionResult Result; 7629 7630 for (const auto *D : Ctx->decls()) { 7631 // Record any interfaces we find. 7632 if (const auto *Class = dyn_cast<ObjCInterfaceDecl>(D)) 7633 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) && 7634 (!OnlyUnimplemented || !Class->getImplementation())) 7635 Results.AddResult( 7636 Result(Class, Results.getBasePriority(Class), nullptr), CurContext, 7637 nullptr, false); 7638 } 7639 } 7640 7641 void Sema::CodeCompleteObjCInterfaceDecl(Scope *S) { 7642 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7643 CodeCompleter->getCodeCompletionTUInfo(), 7644 CodeCompletionContext::CCC_ObjCInterfaceName); 7645 Results.EnterNewScope(); 7646 7647 if (CodeCompleter->includeGlobals()) { 7648 // Add all classes. 7649 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 7650 false, Results); 7651 } 7652 7653 Results.ExitScope(); 7654 7655 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7656 Results.data(), Results.size()); 7657 } 7658 7659 void Sema::CodeCompleteObjCSuperclass(Scope *S, IdentifierInfo *ClassName, 7660 SourceLocation ClassNameLoc) { 7661 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7662 CodeCompleter->getCodeCompletionTUInfo(), 7663 CodeCompletionContext::CCC_ObjCInterfaceName); 7664 Results.EnterNewScope(); 7665 7666 // Make sure that we ignore the class we're currently defining. 7667 NamedDecl *CurClass = 7668 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 7669 if (CurClass && isa<ObjCInterfaceDecl>(CurClass)) 7670 Results.Ignore(CurClass); 7671 7672 if (CodeCompleter->includeGlobals()) { 7673 // Add all classes. 7674 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 7675 false, Results); 7676 } 7677 7678 Results.ExitScope(); 7679 7680 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7681 Results.data(), Results.size()); 7682 } 7683 7684 void Sema::CodeCompleteObjCImplementationDecl(Scope *S) { 7685 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7686 CodeCompleter->getCodeCompletionTUInfo(), 7687 CodeCompletionContext::CCC_ObjCImplementation); 7688 Results.EnterNewScope(); 7689 7690 if (CodeCompleter->includeGlobals()) { 7691 // Add all unimplemented classes. 7692 AddInterfaceResults(Context.getTranslationUnitDecl(), CurContext, false, 7693 true, Results); 7694 } 7695 7696 Results.ExitScope(); 7697 7698 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7699 Results.data(), Results.size()); 7700 } 7701 7702 void Sema::CodeCompleteObjCInterfaceCategory(Scope *S, 7703 IdentifierInfo *ClassName, 7704 SourceLocation ClassNameLoc) { 7705 typedef CodeCompletionResult Result; 7706 7707 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7708 CodeCompleter->getCodeCompletionTUInfo(), 7709 CodeCompletionContext::CCC_ObjCCategoryName); 7710 7711 // Ignore any categories we find that have already been implemented by this 7712 // interface. 7713 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 7714 NamedDecl *CurClass = 7715 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 7716 if (ObjCInterfaceDecl *Class = 7717 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) { 7718 for (const auto *Cat : Class->visible_categories()) 7719 CategoryNames.insert(Cat->getIdentifier()); 7720 } 7721 7722 // Add all of the categories we know about. 7723 Results.EnterNewScope(); 7724 TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 7725 for (const auto *D : TU->decls()) 7726 if (const auto *Category = dyn_cast<ObjCCategoryDecl>(D)) 7727 if (CategoryNames.insert(Category->getIdentifier()).second) 7728 Results.AddResult( 7729 Result(Category, Results.getBasePriority(Category), nullptr), 7730 CurContext, nullptr, false); 7731 Results.ExitScope(); 7732 7733 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7734 Results.data(), Results.size()); 7735 } 7736 7737 void Sema::CodeCompleteObjCImplementationCategory(Scope *S, 7738 IdentifierInfo *ClassName, 7739 SourceLocation ClassNameLoc) { 7740 typedef CodeCompletionResult Result; 7741 7742 // Find the corresponding interface. If we couldn't find the interface, the 7743 // program itself is ill-formed. However, we'll try to be helpful still by 7744 // providing the list of all of the categories we know about. 7745 NamedDecl *CurClass = 7746 LookupSingleName(TUScope, ClassName, ClassNameLoc, LookupOrdinaryName); 7747 ObjCInterfaceDecl *Class = dyn_cast_or_null<ObjCInterfaceDecl>(CurClass); 7748 if (!Class) 7749 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc); 7750 7751 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7752 CodeCompleter->getCodeCompletionTUInfo(), 7753 CodeCompletionContext::CCC_ObjCCategoryName); 7754 7755 // Add all of the categories that have have corresponding interface 7756 // declarations in this class and any of its superclasses, except for 7757 // already-implemented categories in the class itself. 7758 llvm::SmallPtrSet<IdentifierInfo *, 16> CategoryNames; 7759 Results.EnterNewScope(); 7760 bool IgnoreImplemented = true; 7761 while (Class) { 7762 for (const auto *Cat : Class->visible_categories()) { 7763 if ((!IgnoreImplemented || !Cat->getImplementation()) && 7764 CategoryNames.insert(Cat->getIdentifier()).second) 7765 Results.AddResult(Result(Cat, Results.getBasePriority(Cat), nullptr), 7766 CurContext, nullptr, false); 7767 } 7768 7769 Class = Class->getSuperClass(); 7770 IgnoreImplemented = false; 7771 } 7772 Results.ExitScope(); 7773 7774 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7775 Results.data(), Results.size()); 7776 } 7777 7778 void Sema::CodeCompleteObjCPropertyDefinition(Scope *S) { 7779 CodeCompletionContext CCContext(CodeCompletionContext::CCC_Other); 7780 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7781 CodeCompleter->getCodeCompletionTUInfo(), CCContext); 7782 7783 // Figure out where this @synthesize lives. 7784 ObjCContainerDecl *Container = 7785 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 7786 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 7787 !isa<ObjCCategoryImplDecl>(Container))) 7788 return; 7789 7790 // Ignore any properties that have already been implemented. 7791 Container = getContainerDef(Container); 7792 for (const auto *D : Container->decls()) 7793 if (const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D)) 7794 Results.Ignore(PropertyImpl->getPropertyDecl()); 7795 7796 // Add any properties that we find. 7797 AddedPropertiesSet AddedProperties; 7798 Results.EnterNewScope(); 7799 if (ObjCImplementationDecl *ClassImpl = 7800 dyn_cast<ObjCImplementationDecl>(Container)) 7801 AddObjCProperties(CCContext, ClassImpl->getClassInterface(), false, 7802 /*AllowNullaryMethods=*/false, CurContext, 7803 AddedProperties, Results); 7804 else 7805 AddObjCProperties(CCContext, 7806 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(), 7807 false, /*AllowNullaryMethods=*/false, CurContext, 7808 AddedProperties, Results); 7809 Results.ExitScope(); 7810 7811 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7812 Results.data(), Results.size()); 7813 } 7814 7815 void Sema::CodeCompleteObjCPropertySynthesizeIvar( 7816 Scope *S, IdentifierInfo *PropertyName) { 7817 typedef CodeCompletionResult Result; 7818 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 7819 CodeCompleter->getCodeCompletionTUInfo(), 7820 CodeCompletionContext::CCC_Other); 7821 7822 // Figure out where this @synthesize lives. 7823 ObjCContainerDecl *Container = 7824 dyn_cast_or_null<ObjCContainerDecl>(CurContext); 7825 if (!Container || (!isa<ObjCImplementationDecl>(Container) && 7826 !isa<ObjCCategoryImplDecl>(Container))) 7827 return; 7828 7829 // Figure out which interface we're looking into. 7830 ObjCInterfaceDecl *Class = nullptr; 7831 if (ObjCImplementationDecl *ClassImpl = 7832 dyn_cast<ObjCImplementationDecl>(Container)) 7833 Class = ClassImpl->getClassInterface(); 7834 else 7835 Class = cast<ObjCCategoryImplDecl>(Container) 7836 ->getCategoryDecl() 7837 ->getClassInterface(); 7838 7839 // Determine the type of the property we're synthesizing. 7840 QualType PropertyType = Context.getObjCIdType(); 7841 if (Class) { 7842 if (ObjCPropertyDecl *Property = Class->FindPropertyDeclaration( 7843 PropertyName, ObjCPropertyQueryKind::OBJC_PR_query_instance)) { 7844 PropertyType = 7845 Property->getType().getNonReferenceType().getUnqualifiedType(); 7846 7847 // Give preference to ivars 7848 Results.setPreferredType(PropertyType); 7849 } 7850 } 7851 7852 // Add all of the instance variables in this class and its superclasses. 7853 Results.EnterNewScope(); 7854 bool SawSimilarlyNamedIvar = false; 7855 std::string NameWithPrefix; 7856 NameWithPrefix += '_'; 7857 NameWithPrefix += PropertyName->getName(); 7858 std::string NameWithSuffix = PropertyName->getName().str(); 7859 NameWithSuffix += '_'; 7860 for (; Class; Class = Class->getSuperClass()) { 7861 for (ObjCIvarDecl *Ivar = Class->all_declared_ivar_begin(); Ivar; 7862 Ivar = Ivar->getNextIvar()) { 7863 Results.AddResult(Result(Ivar, Results.getBasePriority(Ivar), nullptr), 7864 CurContext, nullptr, false); 7865 7866 // Determine whether we've seen an ivar with a name similar to the 7867 // property. 7868 if ((PropertyName == Ivar->getIdentifier() || 7869 NameWithPrefix == Ivar->getName() || 7870 NameWithSuffix == Ivar->getName())) { 7871 SawSimilarlyNamedIvar = true; 7872 7873 // Reduce the priority of this result by one, to give it a slight 7874 // advantage over other results whose names don't match so closely. 7875 if (Results.size() && 7876 Results.data()[Results.size() - 1].Kind == 7877 CodeCompletionResult::RK_Declaration && 7878 Results.data()[Results.size() - 1].Declaration == Ivar) 7879 Results.data()[Results.size() - 1].Priority--; 7880 } 7881 } 7882 } 7883 7884 if (!SawSimilarlyNamedIvar) { 7885 // Create ivar result _propName, that the user can use to synthesize 7886 // an ivar of the appropriate type. 7887 unsigned Priority = CCP_MemberDeclaration + 1; 7888 typedef CodeCompletionResult Result; 7889 CodeCompletionAllocator &Allocator = Results.getAllocator(); 7890 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo(), 7891 Priority, CXAvailability_Available); 7892 7893 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 7894 Builder.AddResultTypeChunk( 7895 GetCompletionTypeString(PropertyType, Context, Policy, Allocator)); 7896 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix)); 7897 Results.AddResult( 7898 Result(Builder.TakeString(), Priority, CXCursor_ObjCIvarDecl)); 7899 } 7900 7901 Results.ExitScope(); 7902 7903 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 7904 Results.data(), Results.size()); 7905 } 7906 7907 // Mapping from selectors to the methods that implement that selector, along 7908 // with the "in original class" flag. 7909 typedef llvm::DenseMap<Selector, 7910 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>> 7911 KnownMethodsMap; 7912 7913 /// Find all of the methods that reside in the given container 7914 /// (and its superclasses, protocols, etc.) that meet the given 7915 /// criteria. Insert those methods into the map of known methods, 7916 /// indexed by selector so they can be easily found. 7917 static void FindImplementableMethods(ASTContext &Context, 7918 ObjCContainerDecl *Container, 7919 Optional<bool> WantInstanceMethods, 7920 QualType ReturnType, 7921 KnownMethodsMap &KnownMethods, 7922 bool InOriginalClass = true) { 7923 if (ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(Container)) { 7924 // Make sure we have a definition; that's what we'll walk. 7925 if (!IFace->hasDefinition()) 7926 return; 7927 7928 IFace = IFace->getDefinition(); 7929 Container = IFace; 7930 7931 const ObjCList<ObjCProtocolDecl> &Protocols = 7932 IFace->getReferencedProtocols(); 7933 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7934 E = Protocols.end(); 7935 I != E; ++I) 7936 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 7937 KnownMethods, InOriginalClass); 7938 7939 // Add methods from any class extensions and categories. 7940 for (auto *Cat : IFace->visible_categories()) { 7941 FindImplementableMethods(Context, Cat, WantInstanceMethods, ReturnType, 7942 KnownMethods, false); 7943 } 7944 7945 // Visit the superclass. 7946 if (IFace->getSuperClass()) 7947 FindImplementableMethods(Context, IFace->getSuperClass(), 7948 WantInstanceMethods, ReturnType, KnownMethods, 7949 false); 7950 } 7951 7952 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(Container)) { 7953 // Recurse into protocols. 7954 const ObjCList<ObjCProtocolDecl> &Protocols = 7955 Category->getReferencedProtocols(); 7956 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7957 E = Protocols.end(); 7958 I != E; ++I) 7959 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 7960 KnownMethods, InOriginalClass); 7961 7962 // If this category is the original class, jump to the interface. 7963 if (InOriginalClass && Category->getClassInterface()) 7964 FindImplementableMethods(Context, Category->getClassInterface(), 7965 WantInstanceMethods, ReturnType, KnownMethods, 7966 false); 7967 } 7968 7969 if (ObjCProtocolDecl *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) { 7970 // Make sure we have a definition; that's what we'll walk. 7971 if (!Protocol->hasDefinition()) 7972 return; 7973 Protocol = Protocol->getDefinition(); 7974 Container = Protocol; 7975 7976 // Recurse into protocols. 7977 const ObjCList<ObjCProtocolDecl> &Protocols = 7978 Protocol->getReferencedProtocols(); 7979 for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), 7980 E = Protocols.end(); 7981 I != E; ++I) 7982 FindImplementableMethods(Context, *I, WantInstanceMethods, ReturnType, 7983 KnownMethods, false); 7984 } 7985 7986 // Add methods in this container. This operation occurs last because 7987 // we want the methods from this container to override any methods 7988 // we've previously seen with the same selector. 7989 for (auto *M : Container->methods()) { 7990 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) { 7991 if (!ReturnType.isNull() && 7992 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType())) 7993 continue; 7994 7995 KnownMethods[M->getSelector()] = 7996 KnownMethodsMap::mapped_type(M, InOriginalClass); 7997 } 7998 } 7999 } 8000 8001 /// Add the parenthesized return or parameter type chunk to a code 8002 /// completion string. 8003 static void AddObjCPassingTypeChunk(QualType Type, unsigned ObjCDeclQuals, 8004 ASTContext &Context, 8005 const PrintingPolicy &Policy, 8006 CodeCompletionBuilder &Builder) { 8007 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8008 std::string Quals = formatObjCParamQualifiers(ObjCDeclQuals, Type); 8009 if (!Quals.empty()) 8010 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals)); 8011 Builder.AddTextChunk( 8012 GetCompletionTypeString(Type, Context, Policy, Builder.getAllocator())); 8013 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8014 } 8015 8016 /// Determine whether the given class is or inherits from a class by 8017 /// the given name. 8018 static bool InheritsFromClassNamed(ObjCInterfaceDecl *Class, StringRef Name) { 8019 if (!Class) 8020 return false; 8021 8022 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name) 8023 return true; 8024 8025 return InheritsFromClassNamed(Class->getSuperClass(), Name); 8026 } 8027 8028 /// Add code completions for Objective-C Key-Value Coding (KVC) and 8029 /// Key-Value Observing (KVO). 8030 static void AddObjCKeyValueCompletions(ObjCPropertyDecl *Property, 8031 bool IsInstanceMethod, 8032 QualType ReturnType, ASTContext &Context, 8033 VisitedSelectorSet &KnownSelectors, 8034 ResultBuilder &Results) { 8035 IdentifierInfo *PropName = Property->getIdentifier(); 8036 if (!PropName || PropName->getLength() == 0) 8037 return; 8038 8039 PrintingPolicy Policy = getCompletionPrintingPolicy(Results.getSema()); 8040 8041 // Builder that will create each code completion. 8042 typedef CodeCompletionResult Result; 8043 CodeCompletionAllocator &Allocator = Results.getAllocator(); 8044 CodeCompletionBuilder Builder(Allocator, Results.getCodeCompletionTUInfo()); 8045 8046 // The selector table. 8047 SelectorTable &Selectors = Context.Selectors; 8048 8049 // The property name, copied into the code completion allocation region 8050 // on demand. 8051 struct KeyHolder { 8052 CodeCompletionAllocator &Allocator; 8053 StringRef Key; 8054 const char *CopiedKey; 8055 8056 KeyHolder(CodeCompletionAllocator &Allocator, StringRef Key) 8057 : Allocator(Allocator), Key(Key), CopiedKey(nullptr) {} 8058 8059 operator const char *() { 8060 if (CopiedKey) 8061 return CopiedKey; 8062 8063 return CopiedKey = Allocator.CopyString(Key); 8064 } 8065 } Key(Allocator, PropName->getName()); 8066 8067 // The uppercased name of the property name. 8068 std::string UpperKey = std::string(PropName->getName()); 8069 if (!UpperKey.empty()) 8070 UpperKey[0] = toUppercase(UpperKey[0]); 8071 8072 bool ReturnTypeMatchesProperty = 8073 ReturnType.isNull() || 8074 Context.hasSameUnqualifiedType(ReturnType.getNonReferenceType(), 8075 Property->getType()); 8076 bool ReturnTypeMatchesVoid = ReturnType.isNull() || ReturnType->isVoidType(); 8077 8078 // Add the normal accessor -(type)key. 8079 if (IsInstanceMethod && 8080 KnownSelectors.insert(Selectors.getNullarySelector(PropName)).second && 8081 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) { 8082 if (ReturnType.isNull()) 8083 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8084 Builder); 8085 8086 Builder.AddTypedTextChunk(Key); 8087 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8088 CXCursor_ObjCInstanceMethodDecl)); 8089 } 8090 8091 // If we have an integral or boolean property (or the user has provided 8092 // an integral or boolean return type), add the accessor -(type)isKey. 8093 if (IsInstanceMethod && 8094 ((!ReturnType.isNull() && 8095 (ReturnType->isIntegerType() || ReturnType->isBooleanType())) || 8096 (ReturnType.isNull() && (Property->getType()->isIntegerType() || 8097 Property->getType()->isBooleanType())))) { 8098 std::string SelectorName = (Twine("is") + UpperKey).str(); 8099 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8100 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8101 .second) { 8102 if (ReturnType.isNull()) { 8103 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8104 Builder.AddTextChunk("BOOL"); 8105 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8106 } 8107 8108 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8109 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8110 CXCursor_ObjCInstanceMethodDecl)); 8111 } 8112 } 8113 8114 // Add the normal mutator. 8115 if (IsInstanceMethod && ReturnTypeMatchesVoid && 8116 !Property->getSetterMethodDecl()) { 8117 std::string SelectorName = (Twine("set") + UpperKey).str(); 8118 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8119 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8120 if (ReturnType.isNull()) { 8121 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8122 Builder.AddTextChunk("void"); 8123 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8124 } 8125 8126 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8127 Builder.AddTypedTextChunk(":"); 8128 AddObjCPassingTypeChunk(Property->getType(), /*Quals=*/0, Context, Policy, 8129 Builder); 8130 Builder.AddTextChunk(Key); 8131 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8132 CXCursor_ObjCInstanceMethodDecl)); 8133 } 8134 } 8135 8136 // Indexed and unordered accessors 8137 unsigned IndexedGetterPriority = CCP_CodePattern; 8138 unsigned IndexedSetterPriority = CCP_CodePattern; 8139 unsigned UnorderedGetterPriority = CCP_CodePattern; 8140 unsigned UnorderedSetterPriority = CCP_CodePattern; 8141 if (const auto *ObjCPointer = 8142 Property->getType()->getAs<ObjCObjectPointerType>()) { 8143 if (ObjCInterfaceDecl *IFace = ObjCPointer->getInterfaceDecl()) { 8144 // If this interface type is not provably derived from a known 8145 // collection, penalize the corresponding completions. 8146 if (!InheritsFromClassNamed(IFace, "NSMutableArray")) { 8147 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8148 if (!InheritsFromClassNamed(IFace, "NSArray")) 8149 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8150 } 8151 8152 if (!InheritsFromClassNamed(IFace, "NSMutableSet")) { 8153 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8154 if (!InheritsFromClassNamed(IFace, "NSSet")) 8155 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8156 } 8157 } 8158 } else { 8159 IndexedGetterPriority += CCD_ProbablyNotObjCCollection; 8160 IndexedSetterPriority += CCD_ProbablyNotObjCCollection; 8161 UnorderedGetterPriority += CCD_ProbablyNotObjCCollection; 8162 UnorderedSetterPriority += CCD_ProbablyNotObjCCollection; 8163 } 8164 8165 // Add -(NSUInteger)countOf<key> 8166 if (IsInstanceMethod && 8167 (ReturnType.isNull() || ReturnType->isIntegerType())) { 8168 std::string SelectorName = (Twine("countOf") + UpperKey).str(); 8169 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8170 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8171 .second) { 8172 if (ReturnType.isNull()) { 8173 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8174 Builder.AddTextChunk("NSUInteger"); 8175 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8176 } 8177 8178 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->getName())); 8179 Results.AddResult( 8180 Result(Builder.TakeString(), 8181 std::min(IndexedGetterPriority, UnorderedGetterPriority), 8182 CXCursor_ObjCInstanceMethodDecl)); 8183 } 8184 } 8185 8186 // Indexed getters 8187 // Add -(id)objectInKeyAtIndex:(NSUInteger)index 8188 if (IsInstanceMethod && 8189 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 8190 std::string SelectorName = (Twine("objectIn") + UpperKey + "AtIndex").str(); 8191 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8192 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8193 if (ReturnType.isNull()) { 8194 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8195 Builder.AddTextChunk("id"); 8196 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8197 } 8198 8199 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8200 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8201 Builder.AddTextChunk("NSUInteger"); 8202 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8203 Builder.AddTextChunk("index"); 8204 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8205 CXCursor_ObjCInstanceMethodDecl)); 8206 } 8207 } 8208 8209 // Add -(NSArray *)keyAtIndexes:(NSIndexSet *)indexes 8210 if (IsInstanceMethod && 8211 (ReturnType.isNull() || 8212 (ReturnType->isObjCObjectPointerType() && 8213 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8214 ReturnType->castAs<ObjCObjectPointerType>() 8215 ->getInterfaceDecl() 8216 ->getName() == "NSArray"))) { 8217 std::string SelectorName = (Twine(Property->getName()) + "AtIndexes").str(); 8218 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8219 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8220 if (ReturnType.isNull()) { 8221 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8222 Builder.AddTextChunk("NSArray *"); 8223 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8224 } 8225 8226 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8227 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8228 Builder.AddTextChunk("NSIndexSet *"); 8229 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8230 Builder.AddTextChunk("indexes"); 8231 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8232 CXCursor_ObjCInstanceMethodDecl)); 8233 } 8234 } 8235 8236 // Add -(void)getKey:(type **)buffer range:(NSRange)inRange 8237 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8238 std::string SelectorName = (Twine("get") + UpperKey).str(); 8239 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8240 &Context.Idents.get("range")}; 8241 8242 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8243 if (ReturnType.isNull()) { 8244 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8245 Builder.AddTextChunk("void"); 8246 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8247 } 8248 8249 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8250 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8251 Builder.AddPlaceholderChunk("object-type"); 8252 Builder.AddTextChunk(" **"); 8253 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8254 Builder.AddTextChunk("buffer"); 8255 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8256 Builder.AddTypedTextChunk("range:"); 8257 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8258 Builder.AddTextChunk("NSRange"); 8259 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8260 Builder.AddTextChunk("inRange"); 8261 Results.AddResult(Result(Builder.TakeString(), IndexedGetterPriority, 8262 CXCursor_ObjCInstanceMethodDecl)); 8263 } 8264 } 8265 8266 // Mutable indexed accessors 8267 8268 // - (void)insertObject:(type *)object inKeyAtIndex:(NSUInteger)index 8269 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8270 std::string SelectorName = (Twine("in") + UpperKey + "AtIndex").str(); 8271 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get("insertObject"), 8272 &Context.Idents.get(SelectorName)}; 8273 8274 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8275 if (ReturnType.isNull()) { 8276 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8277 Builder.AddTextChunk("void"); 8278 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8279 } 8280 8281 Builder.AddTypedTextChunk("insertObject:"); 8282 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8283 Builder.AddPlaceholderChunk("object-type"); 8284 Builder.AddTextChunk(" *"); 8285 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8286 Builder.AddTextChunk("object"); 8287 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8288 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8289 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8290 Builder.AddPlaceholderChunk("NSUInteger"); 8291 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8292 Builder.AddTextChunk("index"); 8293 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8294 CXCursor_ObjCInstanceMethodDecl)); 8295 } 8296 } 8297 8298 // - (void)insertKey:(NSArray *)array atIndexes:(NSIndexSet *)indexes 8299 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8300 std::string SelectorName = (Twine("insert") + UpperKey).str(); 8301 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8302 &Context.Idents.get("atIndexes")}; 8303 8304 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8305 if (ReturnType.isNull()) { 8306 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8307 Builder.AddTextChunk("void"); 8308 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8309 } 8310 8311 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8312 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8313 Builder.AddTextChunk("NSArray *"); 8314 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8315 Builder.AddTextChunk("array"); 8316 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8317 Builder.AddTypedTextChunk("atIndexes:"); 8318 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8319 Builder.AddPlaceholderChunk("NSIndexSet *"); 8320 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8321 Builder.AddTextChunk("indexes"); 8322 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8323 CXCursor_ObjCInstanceMethodDecl)); 8324 } 8325 } 8326 8327 // -(void)removeObjectFromKeyAtIndex:(NSUInteger)index 8328 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8329 std::string SelectorName = 8330 (Twine("removeObjectFrom") + UpperKey + "AtIndex").str(); 8331 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8332 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8333 if (ReturnType.isNull()) { 8334 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8335 Builder.AddTextChunk("void"); 8336 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8337 } 8338 8339 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8340 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8341 Builder.AddTextChunk("NSUInteger"); 8342 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8343 Builder.AddTextChunk("index"); 8344 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8345 CXCursor_ObjCInstanceMethodDecl)); 8346 } 8347 } 8348 8349 // -(void)removeKeyAtIndexes:(NSIndexSet *)indexes 8350 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8351 std::string SelectorName = (Twine("remove") + UpperKey + "AtIndexes").str(); 8352 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8353 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8354 if (ReturnType.isNull()) { 8355 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8356 Builder.AddTextChunk("void"); 8357 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8358 } 8359 8360 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8361 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8362 Builder.AddTextChunk("NSIndexSet *"); 8363 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8364 Builder.AddTextChunk("indexes"); 8365 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8366 CXCursor_ObjCInstanceMethodDecl)); 8367 } 8368 } 8369 8370 // - (void)replaceObjectInKeyAtIndex:(NSUInteger)index withObject:(id)object 8371 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8372 std::string SelectorName = 8373 (Twine("replaceObjectIn") + UpperKey + "AtIndex").str(); 8374 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName), 8375 &Context.Idents.get("withObject")}; 8376 8377 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8378 if (ReturnType.isNull()) { 8379 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8380 Builder.AddTextChunk("void"); 8381 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8382 } 8383 8384 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8385 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8386 Builder.AddPlaceholderChunk("NSUInteger"); 8387 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8388 Builder.AddTextChunk("index"); 8389 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8390 Builder.AddTypedTextChunk("withObject:"); 8391 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8392 Builder.AddTextChunk("id"); 8393 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8394 Builder.AddTextChunk("object"); 8395 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8396 CXCursor_ObjCInstanceMethodDecl)); 8397 } 8398 } 8399 8400 // - (void)replaceKeyAtIndexes:(NSIndexSet *)indexes withKey:(NSArray *)array 8401 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8402 std::string SelectorName1 = 8403 (Twine("replace") + UpperKey + "AtIndexes").str(); 8404 std::string SelectorName2 = (Twine("with") + UpperKey).str(); 8405 IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1), 8406 &Context.Idents.get(SelectorName2)}; 8407 8408 if (KnownSelectors.insert(Selectors.getSelector(2, SelectorIds)).second) { 8409 if (ReturnType.isNull()) { 8410 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8411 Builder.AddTextChunk("void"); 8412 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8413 } 8414 8415 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 + ":")); 8416 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8417 Builder.AddPlaceholderChunk("NSIndexSet *"); 8418 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8419 Builder.AddTextChunk("indexes"); 8420 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8421 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 + ":")); 8422 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8423 Builder.AddTextChunk("NSArray *"); 8424 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8425 Builder.AddTextChunk("array"); 8426 Results.AddResult(Result(Builder.TakeString(), IndexedSetterPriority, 8427 CXCursor_ObjCInstanceMethodDecl)); 8428 } 8429 } 8430 8431 // Unordered getters 8432 // - (NSEnumerator *)enumeratorOfKey 8433 if (IsInstanceMethod && 8434 (ReturnType.isNull() || 8435 (ReturnType->isObjCObjectPointerType() && 8436 ReturnType->getAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8437 ReturnType->getAs<ObjCObjectPointerType>() 8438 ->getInterfaceDecl() 8439 ->getName() == "NSEnumerator"))) { 8440 std::string SelectorName = (Twine("enumeratorOf") + UpperKey).str(); 8441 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8442 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8443 .second) { 8444 if (ReturnType.isNull()) { 8445 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8446 Builder.AddTextChunk("NSEnumerator *"); 8447 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8448 } 8449 8450 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 8451 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 8452 CXCursor_ObjCInstanceMethodDecl)); 8453 } 8454 } 8455 8456 // - (type *)memberOfKey:(type *)object 8457 if (IsInstanceMethod && 8458 (ReturnType.isNull() || ReturnType->isObjCObjectPointerType())) { 8459 std::string SelectorName = (Twine("memberOf") + UpperKey).str(); 8460 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8461 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8462 if (ReturnType.isNull()) { 8463 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8464 Builder.AddPlaceholderChunk("object-type"); 8465 Builder.AddTextChunk(" *"); 8466 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8467 } 8468 8469 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8470 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8471 if (ReturnType.isNull()) { 8472 Builder.AddPlaceholderChunk("object-type"); 8473 Builder.AddTextChunk(" *"); 8474 } else { 8475 Builder.AddTextChunk(GetCompletionTypeString( 8476 ReturnType, Context, Policy, Builder.getAllocator())); 8477 } 8478 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8479 Builder.AddTextChunk("object"); 8480 Results.AddResult(Result(Builder.TakeString(), UnorderedGetterPriority, 8481 CXCursor_ObjCInstanceMethodDecl)); 8482 } 8483 } 8484 8485 // Mutable unordered accessors 8486 // - (void)addKeyObject:(type *)object 8487 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8488 std::string SelectorName = 8489 (Twine("add") + UpperKey + Twine("Object")).str(); 8490 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8491 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8492 if (ReturnType.isNull()) { 8493 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8494 Builder.AddTextChunk("void"); 8495 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8496 } 8497 8498 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8499 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8500 Builder.AddPlaceholderChunk("object-type"); 8501 Builder.AddTextChunk(" *"); 8502 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8503 Builder.AddTextChunk("object"); 8504 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 8505 CXCursor_ObjCInstanceMethodDecl)); 8506 } 8507 } 8508 8509 // - (void)addKey:(NSSet *)objects 8510 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8511 std::string SelectorName = (Twine("add") + UpperKey).str(); 8512 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8513 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8514 if (ReturnType.isNull()) { 8515 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8516 Builder.AddTextChunk("void"); 8517 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8518 } 8519 8520 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8521 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8522 Builder.AddTextChunk("NSSet *"); 8523 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8524 Builder.AddTextChunk("objects"); 8525 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 8526 CXCursor_ObjCInstanceMethodDecl)); 8527 } 8528 } 8529 8530 // - (void)removeKeyObject:(type *)object 8531 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8532 std::string SelectorName = 8533 (Twine("remove") + UpperKey + Twine("Object")).str(); 8534 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8535 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8536 if (ReturnType.isNull()) { 8537 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8538 Builder.AddTextChunk("void"); 8539 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8540 } 8541 8542 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8543 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8544 Builder.AddPlaceholderChunk("object-type"); 8545 Builder.AddTextChunk(" *"); 8546 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8547 Builder.AddTextChunk("object"); 8548 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 8549 CXCursor_ObjCInstanceMethodDecl)); 8550 } 8551 } 8552 8553 // - (void)removeKey:(NSSet *)objects 8554 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8555 std::string SelectorName = (Twine("remove") + UpperKey).str(); 8556 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8557 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8558 if (ReturnType.isNull()) { 8559 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8560 Builder.AddTextChunk("void"); 8561 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8562 } 8563 8564 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8565 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8566 Builder.AddTextChunk("NSSet *"); 8567 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8568 Builder.AddTextChunk("objects"); 8569 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 8570 CXCursor_ObjCInstanceMethodDecl)); 8571 } 8572 } 8573 8574 // - (void)intersectKey:(NSSet *)objects 8575 if (IsInstanceMethod && ReturnTypeMatchesVoid) { 8576 std::string SelectorName = (Twine("intersect") + UpperKey).str(); 8577 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8578 if (KnownSelectors.insert(Selectors.getUnarySelector(SelectorId)).second) { 8579 if (ReturnType.isNull()) { 8580 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8581 Builder.AddTextChunk("void"); 8582 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8583 } 8584 8585 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName + ":")); 8586 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8587 Builder.AddTextChunk("NSSet *"); 8588 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8589 Builder.AddTextChunk("objects"); 8590 Results.AddResult(Result(Builder.TakeString(), UnorderedSetterPriority, 8591 CXCursor_ObjCInstanceMethodDecl)); 8592 } 8593 } 8594 8595 // Key-Value Observing 8596 // + (NSSet *)keyPathsForValuesAffectingKey 8597 if (!IsInstanceMethod && 8598 (ReturnType.isNull() || 8599 (ReturnType->isObjCObjectPointerType() && 8600 ReturnType->castAs<ObjCObjectPointerType>()->getInterfaceDecl() && 8601 ReturnType->castAs<ObjCObjectPointerType>() 8602 ->getInterfaceDecl() 8603 ->getName() == "NSSet"))) { 8604 std::string SelectorName = 8605 (Twine("keyPathsForValuesAffecting") + UpperKey).str(); 8606 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8607 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8608 .second) { 8609 if (ReturnType.isNull()) { 8610 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8611 Builder.AddTextChunk("NSSet<NSString *> *"); 8612 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8613 } 8614 8615 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 8616 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8617 CXCursor_ObjCClassMethodDecl)); 8618 } 8619 } 8620 8621 // + (BOOL)automaticallyNotifiesObserversForKey 8622 if (!IsInstanceMethod && 8623 (ReturnType.isNull() || ReturnType->isIntegerType() || 8624 ReturnType->isBooleanType())) { 8625 std::string SelectorName = 8626 (Twine("automaticallyNotifiesObserversOf") + UpperKey).str(); 8627 IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName); 8628 if (KnownSelectors.insert(Selectors.getNullarySelector(SelectorId)) 8629 .second) { 8630 if (ReturnType.isNull()) { 8631 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8632 Builder.AddTextChunk("BOOL"); 8633 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8634 } 8635 8636 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName)); 8637 Results.AddResult(Result(Builder.TakeString(), CCP_CodePattern, 8638 CXCursor_ObjCClassMethodDecl)); 8639 } 8640 } 8641 } 8642 8643 void Sema::CodeCompleteObjCMethodDecl(Scope *S, Optional<bool> IsInstanceMethod, 8644 ParsedType ReturnTy) { 8645 // Determine the return type of the method we're declaring, if 8646 // provided. 8647 QualType ReturnType = GetTypeFromParser(ReturnTy); 8648 Decl *IDecl = nullptr; 8649 if (CurContext->isObjCContainer()) { 8650 ObjCContainerDecl *OCD = dyn_cast<ObjCContainerDecl>(CurContext); 8651 IDecl = OCD; 8652 } 8653 // Determine where we should start searching for methods. 8654 ObjCContainerDecl *SearchDecl = nullptr; 8655 bool IsInImplementation = false; 8656 if (Decl *D = IDecl) { 8657 if (ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D)) { 8658 SearchDecl = Impl->getClassInterface(); 8659 IsInImplementation = true; 8660 } else if (ObjCCategoryImplDecl *CatImpl = 8661 dyn_cast<ObjCCategoryImplDecl>(D)) { 8662 SearchDecl = CatImpl->getCategoryDecl(); 8663 IsInImplementation = true; 8664 } else 8665 SearchDecl = dyn_cast<ObjCContainerDecl>(D); 8666 } 8667 8668 if (!SearchDecl && S) { 8669 if (DeclContext *DC = S->getEntity()) 8670 SearchDecl = dyn_cast<ObjCContainerDecl>(DC); 8671 } 8672 8673 if (!SearchDecl) { 8674 HandleCodeCompleteResults(this, CodeCompleter, 8675 CodeCompletionContext::CCC_Other, nullptr, 0); 8676 return; 8677 } 8678 8679 // Find all of the methods that we could declare/implement here. 8680 KnownMethodsMap KnownMethods; 8681 FindImplementableMethods(Context, SearchDecl, IsInstanceMethod, ReturnType, 8682 KnownMethods); 8683 8684 // Add declarations or definitions for each of the known methods. 8685 typedef CodeCompletionResult Result; 8686 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8687 CodeCompleter->getCodeCompletionTUInfo(), 8688 CodeCompletionContext::CCC_Other); 8689 Results.EnterNewScope(); 8690 PrintingPolicy Policy = getCompletionPrintingPolicy(*this); 8691 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 8692 MEnd = KnownMethods.end(); 8693 M != MEnd; ++M) { 8694 ObjCMethodDecl *Method = M->second.getPointer(); 8695 CodeCompletionBuilder Builder(Results.getAllocator(), 8696 Results.getCodeCompletionTUInfo()); 8697 8698 // Add the '-'/'+' prefix if it wasn't provided yet. 8699 if (!IsInstanceMethod) { 8700 Builder.AddTextChunk(Method->isInstanceMethod() ? "-" : "+"); 8701 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8702 } 8703 8704 // If the result type was not already provided, add it to the 8705 // pattern as (type). 8706 if (ReturnType.isNull()) { 8707 QualType ResTy = Method->getSendResultType().stripObjCKindOfType(Context); 8708 AttributedType::stripOuterNullability(ResTy); 8709 AddObjCPassingTypeChunk(ResTy, Method->getObjCDeclQualifier(), Context, 8710 Policy, Builder); 8711 } 8712 8713 Selector Sel = Method->getSelector(); 8714 8715 // Add the first part of the selector to the pattern. 8716 Builder.AddTypedTextChunk( 8717 Builder.getAllocator().CopyString(Sel.getNameForSlot(0))); 8718 8719 // Add parameters to the pattern. 8720 unsigned I = 0; 8721 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 8722 PEnd = Method->param_end(); 8723 P != PEnd; (void)++P, ++I) { 8724 // Add the part of the selector name. 8725 if (I == 0) 8726 Builder.AddTypedTextChunk(":"); 8727 else if (I < Sel.getNumArgs()) { 8728 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8729 Builder.AddTypedTextChunk( 8730 Builder.getAllocator().CopyString(Sel.getNameForSlot(I) + ":")); 8731 } else 8732 break; 8733 8734 // Add the parameter type. 8735 QualType ParamType; 8736 if ((*P)->getObjCDeclQualifier() & Decl::OBJC_TQ_CSNullability) 8737 ParamType = (*P)->getType(); 8738 else 8739 ParamType = (*P)->getOriginalType(); 8740 ParamType = ParamType.substObjCTypeArgs( 8741 Context, {}, ObjCSubstitutionContext::Parameter); 8742 AttributedType::stripOuterNullability(ParamType); 8743 AddObjCPassingTypeChunk(ParamType, (*P)->getObjCDeclQualifier(), Context, 8744 Policy, Builder); 8745 8746 if (IdentifierInfo *Id = (*P)->getIdentifier()) 8747 Builder.AddTextChunk(Builder.getAllocator().CopyString(Id->getName())); 8748 } 8749 8750 if (Method->isVariadic()) { 8751 if (Method->param_size() > 0) 8752 Builder.AddChunk(CodeCompletionString::CK_Comma); 8753 Builder.AddTextChunk("..."); 8754 } 8755 8756 if (IsInImplementation && Results.includeCodePatterns()) { 8757 // We will be defining the method here, so add a compound statement. 8758 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8759 Builder.AddChunk(CodeCompletionString::CK_LeftBrace); 8760 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 8761 if (!Method->getReturnType()->isVoidType()) { 8762 // If the result type is not void, add a return clause. 8763 Builder.AddTextChunk("return"); 8764 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8765 Builder.AddPlaceholderChunk("expression"); 8766 Builder.AddChunk(CodeCompletionString::CK_SemiColon); 8767 } else 8768 Builder.AddPlaceholderChunk("statements"); 8769 8770 Builder.AddChunk(CodeCompletionString::CK_VerticalSpace); 8771 Builder.AddChunk(CodeCompletionString::CK_RightBrace); 8772 } 8773 8774 unsigned Priority = CCP_CodePattern; 8775 auto R = Result(Builder.TakeString(), Method, Priority); 8776 if (!M->second.getInt()) 8777 setInBaseClass(R); 8778 Results.AddResult(std::move(R)); 8779 } 8780 8781 // Add Key-Value-Coding and Key-Value-Observing accessor methods for all of 8782 // the properties in this class and its categories. 8783 if (Context.getLangOpts().ObjC) { 8784 SmallVector<ObjCContainerDecl *, 4> Containers; 8785 Containers.push_back(SearchDecl); 8786 8787 VisitedSelectorSet KnownSelectors; 8788 for (KnownMethodsMap::iterator M = KnownMethods.begin(), 8789 MEnd = KnownMethods.end(); 8790 M != MEnd; ++M) 8791 KnownSelectors.insert(M->first); 8792 8793 ObjCInterfaceDecl *IFace = dyn_cast<ObjCInterfaceDecl>(SearchDecl); 8794 if (!IFace) 8795 if (ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(SearchDecl)) 8796 IFace = Category->getClassInterface(); 8797 8798 if (IFace) 8799 for (auto *Cat : IFace->visible_categories()) 8800 Containers.push_back(Cat); 8801 8802 if (IsInstanceMethod) { 8803 for (unsigned I = 0, N = Containers.size(); I != N; ++I) 8804 for (auto *P : Containers[I]->instance_properties()) 8805 AddObjCKeyValueCompletions(P, *IsInstanceMethod, ReturnType, Context, 8806 KnownSelectors, Results); 8807 } 8808 } 8809 8810 Results.ExitScope(); 8811 8812 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8813 Results.data(), Results.size()); 8814 } 8815 8816 void Sema::CodeCompleteObjCMethodDeclSelector( 8817 Scope *S, bool IsInstanceMethod, bool AtParameterName, ParsedType ReturnTy, 8818 ArrayRef<IdentifierInfo *> SelIdents) { 8819 // If we have an external source, load the entire class method 8820 // pool from the AST file. 8821 if (ExternalSource) { 8822 for (uint32_t I = 0, N = ExternalSource->GetNumExternalSelectors(); I != N; 8823 ++I) { 8824 Selector Sel = ExternalSource->GetExternalSelector(I); 8825 if (Sel.isNull() || MethodPool.count(Sel)) 8826 continue; 8827 8828 ReadMethodPool(Sel); 8829 } 8830 } 8831 8832 // Build the set of methods we can see. 8833 typedef CodeCompletionResult Result; 8834 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8835 CodeCompleter->getCodeCompletionTUInfo(), 8836 CodeCompletionContext::CCC_Other); 8837 8838 if (ReturnTy) 8839 Results.setPreferredType(GetTypeFromParser(ReturnTy).getNonReferenceType()); 8840 8841 Results.EnterNewScope(); 8842 for (GlobalMethodPool::iterator M = MethodPool.begin(), 8843 MEnd = MethodPool.end(); 8844 M != MEnd; ++M) { 8845 for (ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first 8846 : &M->second.second; 8847 MethList && MethList->getMethod(); MethList = MethList->getNext()) { 8848 if (!isAcceptableObjCMethod(MethList->getMethod(), MK_Any, SelIdents)) 8849 continue; 8850 8851 if (AtParameterName) { 8852 // Suggest parameter names we've seen before. 8853 unsigned NumSelIdents = SelIdents.size(); 8854 if (NumSelIdents && 8855 NumSelIdents <= MethList->getMethod()->param_size()) { 8856 ParmVarDecl *Param = 8857 MethList->getMethod()->parameters()[NumSelIdents - 1]; 8858 if (Param->getIdentifier()) { 8859 CodeCompletionBuilder Builder(Results.getAllocator(), 8860 Results.getCodeCompletionTUInfo()); 8861 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString( 8862 Param->getIdentifier()->getName())); 8863 Results.AddResult(Builder.TakeString()); 8864 } 8865 } 8866 8867 continue; 8868 } 8869 8870 Result R(MethList->getMethod(), 8871 Results.getBasePriority(MethList->getMethod()), nullptr); 8872 R.StartParameter = SelIdents.size(); 8873 R.AllParametersAreInformative = false; 8874 R.DeclaringEntity = true; 8875 Results.MaybeAddResult(R, CurContext); 8876 } 8877 } 8878 8879 Results.ExitScope(); 8880 8881 if (!AtParameterName && !SelIdents.empty() && 8882 SelIdents.front()->getName().startswith("init")) { 8883 for (const auto &M : PP.macros()) { 8884 if (M.first->getName() != "NS_DESIGNATED_INITIALIZER") 8885 continue; 8886 Results.EnterNewScope(); 8887 CodeCompletionBuilder Builder(Results.getAllocator(), 8888 Results.getCodeCompletionTUInfo()); 8889 Builder.AddTypedTextChunk( 8890 Builder.getAllocator().CopyString(M.first->getName())); 8891 Results.AddResult(CodeCompletionResult(Builder.TakeString(), CCP_Macro, 8892 CXCursor_MacroDefinition)); 8893 Results.ExitScope(); 8894 } 8895 } 8896 8897 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 8898 Results.data(), Results.size()); 8899 } 8900 8901 void Sema::CodeCompletePreprocessorDirective(bool InConditional) { 8902 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 8903 CodeCompleter->getCodeCompletionTUInfo(), 8904 CodeCompletionContext::CCC_PreprocessorDirective); 8905 Results.EnterNewScope(); 8906 8907 // #if <condition> 8908 CodeCompletionBuilder Builder(Results.getAllocator(), 8909 Results.getCodeCompletionTUInfo()); 8910 Builder.AddTypedTextChunk("if"); 8911 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8912 Builder.AddPlaceholderChunk("condition"); 8913 Results.AddResult(Builder.TakeString()); 8914 8915 // #ifdef <macro> 8916 Builder.AddTypedTextChunk("ifdef"); 8917 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8918 Builder.AddPlaceholderChunk("macro"); 8919 Results.AddResult(Builder.TakeString()); 8920 8921 // #ifndef <macro> 8922 Builder.AddTypedTextChunk("ifndef"); 8923 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8924 Builder.AddPlaceholderChunk("macro"); 8925 Results.AddResult(Builder.TakeString()); 8926 8927 if (InConditional) { 8928 // #elif <condition> 8929 Builder.AddTypedTextChunk("elif"); 8930 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8931 Builder.AddPlaceholderChunk("condition"); 8932 Results.AddResult(Builder.TakeString()); 8933 8934 // #else 8935 Builder.AddTypedTextChunk("else"); 8936 Results.AddResult(Builder.TakeString()); 8937 8938 // #endif 8939 Builder.AddTypedTextChunk("endif"); 8940 Results.AddResult(Builder.TakeString()); 8941 } 8942 8943 // #include "header" 8944 Builder.AddTypedTextChunk("include"); 8945 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8946 Builder.AddTextChunk("\""); 8947 Builder.AddPlaceholderChunk("header"); 8948 Builder.AddTextChunk("\""); 8949 Results.AddResult(Builder.TakeString()); 8950 8951 // #include <header> 8952 Builder.AddTypedTextChunk("include"); 8953 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8954 Builder.AddTextChunk("<"); 8955 Builder.AddPlaceholderChunk("header"); 8956 Builder.AddTextChunk(">"); 8957 Results.AddResult(Builder.TakeString()); 8958 8959 // #define <macro> 8960 Builder.AddTypedTextChunk("define"); 8961 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8962 Builder.AddPlaceholderChunk("macro"); 8963 Results.AddResult(Builder.TakeString()); 8964 8965 // #define <macro>(<args>) 8966 Builder.AddTypedTextChunk("define"); 8967 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8968 Builder.AddPlaceholderChunk("macro"); 8969 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 8970 Builder.AddPlaceholderChunk("args"); 8971 Builder.AddChunk(CodeCompletionString::CK_RightParen); 8972 Results.AddResult(Builder.TakeString()); 8973 8974 // #undef <macro> 8975 Builder.AddTypedTextChunk("undef"); 8976 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8977 Builder.AddPlaceholderChunk("macro"); 8978 Results.AddResult(Builder.TakeString()); 8979 8980 // #line <number> 8981 Builder.AddTypedTextChunk("line"); 8982 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8983 Builder.AddPlaceholderChunk("number"); 8984 Results.AddResult(Builder.TakeString()); 8985 8986 // #line <number> "filename" 8987 Builder.AddTypedTextChunk("line"); 8988 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8989 Builder.AddPlaceholderChunk("number"); 8990 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8991 Builder.AddTextChunk("\""); 8992 Builder.AddPlaceholderChunk("filename"); 8993 Builder.AddTextChunk("\""); 8994 Results.AddResult(Builder.TakeString()); 8995 8996 // #error <message> 8997 Builder.AddTypedTextChunk("error"); 8998 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 8999 Builder.AddPlaceholderChunk("message"); 9000 Results.AddResult(Builder.TakeString()); 9001 9002 // #pragma <arguments> 9003 Builder.AddTypedTextChunk("pragma"); 9004 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9005 Builder.AddPlaceholderChunk("arguments"); 9006 Results.AddResult(Builder.TakeString()); 9007 9008 if (getLangOpts().ObjC) { 9009 // #import "header" 9010 Builder.AddTypedTextChunk("import"); 9011 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9012 Builder.AddTextChunk("\""); 9013 Builder.AddPlaceholderChunk("header"); 9014 Builder.AddTextChunk("\""); 9015 Results.AddResult(Builder.TakeString()); 9016 9017 // #import <header> 9018 Builder.AddTypedTextChunk("import"); 9019 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9020 Builder.AddTextChunk("<"); 9021 Builder.AddPlaceholderChunk("header"); 9022 Builder.AddTextChunk(">"); 9023 Results.AddResult(Builder.TakeString()); 9024 } 9025 9026 // #include_next "header" 9027 Builder.AddTypedTextChunk("include_next"); 9028 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9029 Builder.AddTextChunk("\""); 9030 Builder.AddPlaceholderChunk("header"); 9031 Builder.AddTextChunk("\""); 9032 Results.AddResult(Builder.TakeString()); 9033 9034 // #include_next <header> 9035 Builder.AddTypedTextChunk("include_next"); 9036 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9037 Builder.AddTextChunk("<"); 9038 Builder.AddPlaceholderChunk("header"); 9039 Builder.AddTextChunk(">"); 9040 Results.AddResult(Builder.TakeString()); 9041 9042 // #warning <message> 9043 Builder.AddTypedTextChunk("warning"); 9044 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9045 Builder.AddPlaceholderChunk("message"); 9046 Results.AddResult(Builder.TakeString()); 9047 9048 // Note: #ident and #sccs are such crazy anachronisms that we don't provide 9049 // completions for them. And __include_macros is a Clang-internal extension 9050 // that we don't want to encourage anyone to use. 9051 9052 // FIXME: we don't support #assert or #unassert, so don't suggest them. 9053 Results.ExitScope(); 9054 9055 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9056 Results.data(), Results.size()); 9057 } 9058 9059 void Sema::CodeCompleteInPreprocessorConditionalExclusion(Scope *S) { 9060 CodeCompleteOrdinaryName(S, S->getFnParent() ? Sema::PCC_RecoveryInFunction 9061 : Sema::PCC_Namespace); 9062 } 9063 9064 void Sema::CodeCompletePreprocessorMacroName(bool IsDefinition) { 9065 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9066 CodeCompleter->getCodeCompletionTUInfo(), 9067 IsDefinition ? CodeCompletionContext::CCC_MacroName 9068 : CodeCompletionContext::CCC_MacroNameUse); 9069 if (!IsDefinition && (!CodeCompleter || CodeCompleter->includeMacros())) { 9070 // Add just the names of macros, not their arguments. 9071 CodeCompletionBuilder Builder(Results.getAllocator(), 9072 Results.getCodeCompletionTUInfo()); 9073 Results.EnterNewScope(); 9074 for (Preprocessor::macro_iterator M = PP.macro_begin(), 9075 MEnd = PP.macro_end(); 9076 M != MEnd; ++M) { 9077 Builder.AddTypedTextChunk( 9078 Builder.getAllocator().CopyString(M->first->getName())); 9079 Results.AddResult(CodeCompletionResult( 9080 Builder.TakeString(), CCP_CodePattern, CXCursor_MacroDefinition)); 9081 } 9082 Results.ExitScope(); 9083 } else if (IsDefinition) { 9084 // FIXME: Can we detect when the user just wrote an include guard above? 9085 } 9086 9087 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9088 Results.data(), Results.size()); 9089 } 9090 9091 void Sema::CodeCompletePreprocessorExpression() { 9092 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9093 CodeCompleter->getCodeCompletionTUInfo(), 9094 CodeCompletionContext::CCC_PreprocessorExpression); 9095 9096 if (!CodeCompleter || CodeCompleter->includeMacros()) 9097 AddMacroResults(PP, Results, 9098 !CodeCompleter || CodeCompleter->loadExternal(), true); 9099 9100 // defined (<macro>) 9101 Results.EnterNewScope(); 9102 CodeCompletionBuilder Builder(Results.getAllocator(), 9103 Results.getCodeCompletionTUInfo()); 9104 Builder.AddTypedTextChunk("defined"); 9105 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); 9106 Builder.AddChunk(CodeCompletionString::CK_LeftParen); 9107 Builder.AddPlaceholderChunk("macro"); 9108 Builder.AddChunk(CodeCompletionString::CK_RightParen); 9109 Results.AddResult(Builder.TakeString()); 9110 Results.ExitScope(); 9111 9112 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9113 Results.data(), Results.size()); 9114 } 9115 9116 void Sema::CodeCompletePreprocessorMacroArgument(Scope *S, 9117 IdentifierInfo *Macro, 9118 MacroInfo *MacroInfo, 9119 unsigned Argument) { 9120 // FIXME: In the future, we could provide "overload" results, much like we 9121 // do for function calls. 9122 9123 // Now just ignore this. There will be another code-completion callback 9124 // for the expanded tokens. 9125 } 9126 9127 // This handles completion inside an #include filename, e.g. #include <foo/ba 9128 // We look for the directory "foo" under each directory on the include path, 9129 // list its files, and reassemble the appropriate #include. 9130 void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { 9131 // RelDir should use /, but unescaped \ is possible on windows! 9132 // Our completions will normalize to / for simplicity, this case is rare. 9133 std::string RelDir = llvm::sys::path::convert_to_slash(Dir); 9134 // We need the native slashes for the actual file system interactions. 9135 SmallString<128> NativeRelDir = StringRef(RelDir); 9136 llvm::sys::path::native(NativeRelDir); 9137 llvm::vfs::FileSystem &FS = 9138 getSourceManager().getFileManager().getVirtualFileSystem(); 9139 9140 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9141 CodeCompleter->getCodeCompletionTUInfo(), 9142 CodeCompletionContext::CCC_IncludedFile); 9143 llvm::DenseSet<StringRef> SeenResults; // To deduplicate results. 9144 9145 // Helper: adds one file or directory completion result. 9146 auto AddCompletion = [&](StringRef Filename, bool IsDirectory) { 9147 SmallString<64> TypedChunk = Filename; 9148 // Directory completion is up to the slash, e.g. <sys/ 9149 TypedChunk.push_back(IsDirectory ? '/' : Angled ? '>' : '"'); 9150 auto R = SeenResults.insert(TypedChunk); 9151 if (R.second) { // New completion 9152 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk); 9153 *R.first = InternedTyped; // Avoid dangling StringRef. 9154 CodeCompletionBuilder Builder(CodeCompleter->getAllocator(), 9155 CodeCompleter->getCodeCompletionTUInfo()); 9156 Builder.AddTypedTextChunk(InternedTyped); 9157 // The result is a "Pattern", which is pretty opaque. 9158 // We may want to include the real filename to allow smart ranking. 9159 Results.AddResult(CodeCompletionResult(Builder.TakeString())); 9160 } 9161 }; 9162 9163 // Helper: scans IncludeDir for nice files, and adds results for each. 9164 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir, 9165 bool IsSystem, 9166 DirectoryLookup::LookupType_t LookupType) { 9167 llvm::SmallString<128> Dir = IncludeDir; 9168 if (!NativeRelDir.empty()) { 9169 if (LookupType == DirectoryLookup::LT_Framework) { 9170 // For a framework dir, #include <Foo/Bar/> actually maps to 9171 // a path of Foo.framework/Headers/Bar/. 9172 auto Begin = llvm::sys::path::begin(NativeRelDir); 9173 auto End = llvm::sys::path::end(NativeRelDir); 9174 9175 llvm::sys::path::append(Dir, *Begin + ".framework", "Headers"); 9176 llvm::sys::path::append(Dir, ++Begin, End); 9177 } else { 9178 llvm::sys::path::append(Dir, NativeRelDir); 9179 } 9180 } 9181 9182 std::error_code EC; 9183 unsigned Count = 0; 9184 for (auto It = FS.dir_begin(Dir, EC); 9185 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) { 9186 if (++Count == 2500) // If we happen to hit a huge directory, 9187 break; // bail out early so we're not too slow. 9188 StringRef Filename = llvm::sys::path::filename(It->path()); 9189 9190 // To know whether a symlink should be treated as file or a directory, we 9191 // have to stat it. This should be cheap enough as there shouldn't be many 9192 // symlinks. 9193 llvm::sys::fs::file_type Type = It->type(); 9194 if (Type == llvm::sys::fs::file_type::symlink_file) { 9195 if (auto FileStatus = FS.status(It->path())) 9196 Type = FileStatus->getType(); 9197 } 9198 switch (Type) { 9199 case llvm::sys::fs::file_type::directory_file: 9200 // All entries in a framework directory must have a ".framework" suffix, 9201 // but the suffix does not appear in the source code's include/import. 9202 if (LookupType == DirectoryLookup::LT_Framework && 9203 NativeRelDir.empty() && !Filename.consume_back(".framework")) 9204 break; 9205 9206 AddCompletion(Filename, /*IsDirectory=*/true); 9207 break; 9208 case llvm::sys::fs::file_type::regular_file: 9209 // Only files that really look like headers. (Except in system dirs). 9210 if (!IsSystem) { 9211 // Header extensions from Types.def, which we can't depend on here. 9212 if (!(Filename.endswith_lower(".h") || 9213 Filename.endswith_lower(".hh") || 9214 Filename.endswith_lower(".hpp") || 9215 Filename.endswith_lower(".inc"))) 9216 break; 9217 } 9218 AddCompletion(Filename, /*IsDirectory=*/false); 9219 break; 9220 default: 9221 break; 9222 } 9223 } 9224 }; 9225 9226 // Helper: adds results relative to IncludeDir, if possible. 9227 auto AddFilesFromDirLookup = [&](const DirectoryLookup &IncludeDir, 9228 bool IsSystem) { 9229 switch (IncludeDir.getLookupType()) { 9230 case DirectoryLookup::LT_HeaderMap: 9231 // header maps are not (currently) enumerable. 9232 break; 9233 case DirectoryLookup::LT_NormalDir: 9234 AddFilesFromIncludeDir(IncludeDir.getDir()->getName(), IsSystem, 9235 DirectoryLookup::LT_NormalDir); 9236 break; 9237 case DirectoryLookup::LT_Framework: 9238 AddFilesFromIncludeDir(IncludeDir.getFrameworkDir()->getName(), IsSystem, 9239 DirectoryLookup::LT_Framework); 9240 break; 9241 } 9242 }; 9243 9244 // Finally with all our helpers, we can scan the include path. 9245 // Do this in standard order so deduplication keeps the right file. 9246 // (In case we decide to add more details to the results later). 9247 const auto &S = PP.getHeaderSearchInfo(); 9248 using llvm::make_range; 9249 if (!Angled) { 9250 // The current directory is on the include path for "quoted" includes. 9251 auto *CurFile = PP.getCurrentFileLexer()->getFileEntry(); 9252 if (CurFile && CurFile->getDir()) 9253 AddFilesFromIncludeDir(CurFile->getDir()->getName(), false, 9254 DirectoryLookup::LT_NormalDir); 9255 for (const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end())) 9256 AddFilesFromDirLookup(D, false); 9257 } 9258 for (const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end())) 9259 AddFilesFromDirLookup(D, false); 9260 for (const auto &D : make_range(S.system_dir_begin(), S.system_dir_end())) 9261 AddFilesFromDirLookup(D, true); 9262 9263 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9264 Results.data(), Results.size()); 9265 } 9266 9267 void Sema::CodeCompleteNaturalLanguage() { 9268 HandleCodeCompleteResults(this, CodeCompleter, 9269 CodeCompletionContext::CCC_NaturalLanguage, nullptr, 9270 0); 9271 } 9272 9273 void Sema::CodeCompleteAvailabilityPlatformName() { 9274 ResultBuilder Results(*this, CodeCompleter->getAllocator(), 9275 CodeCompleter->getCodeCompletionTUInfo(), 9276 CodeCompletionContext::CCC_Other); 9277 Results.EnterNewScope(); 9278 static const char *Platforms[] = {"macOS", "iOS", "watchOS", "tvOS"}; 9279 for (const char *Platform : llvm::makeArrayRef(Platforms)) { 9280 Results.AddResult(CodeCompletionResult(Platform)); 9281 Results.AddResult(CodeCompletionResult(Results.getAllocator().CopyString( 9282 Twine(Platform) + "ApplicationExtension"))); 9283 } 9284 Results.ExitScope(); 9285 HandleCodeCompleteResults(this, CodeCompleter, Results.getCompletionContext(), 9286 Results.data(), Results.size()); 9287 } 9288 9289 void Sema::GatherGlobalCodeCompletions( 9290 CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, 9291 SmallVectorImpl<CodeCompletionResult> &Results) { 9292 ResultBuilder Builder(*this, Allocator, CCTUInfo, 9293 CodeCompletionContext::CCC_Recovery); 9294 if (!CodeCompleter || CodeCompleter->includeGlobals()) { 9295 CodeCompletionDeclConsumer Consumer(Builder, 9296 Context.getTranslationUnitDecl()); 9297 LookupVisibleDecls(Context.getTranslationUnitDecl(), LookupAnyName, 9298 Consumer, 9299 !CodeCompleter || CodeCompleter->loadExternal()); 9300 } 9301 9302 if (!CodeCompleter || CodeCompleter->includeMacros()) 9303 AddMacroResults(PP, Builder, 9304 !CodeCompleter || CodeCompleter->loadExternal(), true); 9305 9306 Results.clear(); 9307 Results.insert(Results.end(), Builder.data(), 9308 Builder.data() + Builder.size()); 9309 } 9310