File indexing completed on 2026-05-10 08:36:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H
0014 #define LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H
0015
0016 #include "clang-c/Index.h"
0017 #include "clang/AST/Type.h"
0018 #include "clang/Basic/LLVM.h"
0019 #include "clang/Lex/MacroInfo.h"
0020 #include "clang/Sema/CodeCompleteOptions.h"
0021 #include "clang/Sema/DeclSpec.h"
0022 #include "llvm/ADT/ArrayRef.h"
0023 #include "llvm/ADT/DenseMap.h"
0024 #include "llvm/ADT/SmallPtrSet.h"
0025 #include "llvm/ADT/SmallVector.h"
0026 #include "llvm/ADT/StringRef.h"
0027 #include "llvm/Support/Allocator.h"
0028 #include "llvm/Support/type_traits.h"
0029 #include <cassert>
0030 #include <memory>
0031 #include <optional>
0032 #include <string>
0033 #include <utility>
0034
0035 namespace clang {
0036
0037 class ASTContext;
0038 class Decl;
0039 class DeclContext;
0040 class FunctionDecl;
0041 class FunctionTemplateDecl;
0042 class IdentifierInfo;
0043 class LangOptions;
0044 class NamedDecl;
0045 class NestedNameSpecifier;
0046 class Preprocessor;
0047 class RawComment;
0048 class Sema;
0049 class UsingShadowDecl;
0050
0051
0052
0053 enum {
0054
0055
0056 CCP_NextInitializer = 7,
0057
0058
0059
0060 CCP_EnumInCase = 7,
0061
0062
0063 CCP_SuperCompletion = 20,
0064
0065
0066 CCP_LocalDeclaration = 34,
0067
0068
0069
0070 CCP_MemberDeclaration = 35,
0071
0072
0073
0074 CCP_Keyword = 40,
0075
0076
0077 CCP_CodePattern = 40,
0078
0079
0080 CCP_Declaration = 50,
0081
0082
0083 CCP_Type = CCP_Declaration,
0084
0085
0086 CCP_Constant = 65,
0087
0088
0089 CCP_Macro = 70,
0090
0091
0092 CCP_NestedNameSpecifier = 75,
0093
0094
0095
0096 CCP_Unlikely = 80,
0097
0098
0099 CCP_ObjC_cmd = CCP_Unlikely
0100 };
0101
0102
0103
0104 enum {
0105
0106 CCD_InBaseClass = 2,
0107
0108
0109
0110 CCD_ObjectQualifierMatch = -1,
0111
0112
0113
0114
0115 CCD_SelectorMatch = -3,
0116
0117
0118
0119 CCD_bool_in_ObjC = 1,
0120
0121
0122
0123 CCD_ProbablyNotObjCCollection = 15,
0124
0125
0126 CCD_MethodAsProperty = 2,
0127
0128
0129
0130 CCD_BlockPropertySetter = 3
0131 };
0132
0133
0134
0135 enum {
0136
0137
0138 CCF_ExactTypeMatch = 4,
0139
0140
0141
0142
0143 CCF_SimilarTypeMatch = 2
0144 };
0145
0146
0147
0148 enum SimplifiedTypeClass {
0149 STC_Arithmetic,
0150 STC_Array,
0151 STC_Block,
0152 STC_Function,
0153 STC_ObjectiveC,
0154 STC_Other,
0155 STC_Pointer,
0156 STC_Record,
0157 STC_Void
0158 };
0159
0160
0161 SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T);
0162
0163
0164
0165 QualType getDeclUsageType(ASTContext &C, const NamedDecl *ND);
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 unsigned getMacroUsagePriority(StringRef MacroName,
0177 const LangOptions &LangOpts,
0178 bool PreferredTypeIsPointer = false);
0179
0180
0181
0182 CXCursorKind getCursorKindForDecl(const Decl *D);
0183
0184
0185
0186 class CodeCompletionContext {
0187 public:
0188 enum Kind {
0189
0190 CCC_Other,
0191
0192
0193
0194 CCC_OtherWithMacros,
0195
0196
0197
0198 CCC_TopLevel,
0199
0200
0201
0202 CCC_ObjCInterface,
0203
0204
0205
0206 CCC_ObjCImplementation,
0207
0208
0209
0210 CCC_ObjCIvarList,
0211
0212
0213 CCC_ClassStructUnion,
0214
0215
0216
0217 CCC_Statement,
0218
0219
0220 CCC_Expression,
0221
0222
0223
0224 CCC_ObjCMessageReceiver,
0225
0226
0227
0228
0229
0230
0231
0232 CCC_DotMemberAccess,
0233
0234
0235
0236
0237
0238
0239
0240 CCC_ArrowMemberAccess,
0241
0242
0243
0244
0245
0246
0247
0248 CCC_ObjCPropertyAccess,
0249
0250
0251
0252 CCC_EnumTag,
0253
0254
0255
0256 CCC_UnionTag,
0257
0258
0259
0260 CCC_ClassOrStructTag,
0261
0262
0263 CCC_ObjCProtocolName,
0264
0265
0266
0267 CCC_Namespace,
0268
0269
0270 CCC_Type,
0271
0272
0273 CCC_NewName,
0274
0275
0276
0277 CCC_SymbolOrNewName,
0278
0279
0280
0281 CCC_Symbol,
0282
0283
0284 CCC_MacroName,
0285
0286
0287
0288 CCC_MacroNameUse,
0289
0290
0291 CCC_PreprocessorExpression,
0292
0293
0294
0295 CCC_PreprocessorDirective,
0296
0297
0298
0299
0300
0301
0302 CCC_NaturalLanguage,
0303
0304
0305 CCC_SelectorName,
0306
0307
0308 CCC_TypeQualifiers,
0309
0310
0311
0312 CCC_ParenthesizedExpression,
0313
0314
0315
0316 CCC_ObjCInstanceMessage,
0317
0318
0319 CCC_ObjCClassMessage,
0320
0321
0322
0323 CCC_ObjCInterfaceName,
0324
0325
0326 CCC_ObjCCategoryName,
0327
0328
0329 CCC_IncludedFile,
0330
0331
0332 CCC_Attribute,
0333
0334
0335
0336 CCC_Recovery,
0337
0338
0339 CCC_ObjCClassForwardDecl,
0340
0341
0342
0343
0344 CCC_TopLevelOrExpression,
0345 };
0346
0347 using VisitedContextSet = llvm::SmallPtrSet<DeclContext *, 8>;
0348
0349 private:
0350 Kind CCKind;
0351
0352
0353
0354
0355 bool IsUsingDeclaration;
0356
0357
0358
0359 QualType PreferredType;
0360
0361
0362 QualType BaseType;
0363
0364
0365 ArrayRef<const IdentifierInfo *> SelIdents;
0366
0367
0368
0369 std::optional<CXXScopeSpec> ScopeSpecifier;
0370
0371
0372
0373 VisitedContextSet VisitedContexts;
0374
0375 public:
0376
0377 CodeCompletionContext(Kind CCKind)
0378 : CCKind(CCKind), IsUsingDeclaration(false), SelIdents() {}
0379
0380
0381 CodeCompletionContext(Kind CCKind, QualType T,
0382 ArrayRef<const IdentifierInfo *> SelIdents = {})
0383 : CCKind(CCKind), IsUsingDeclaration(false), SelIdents(SelIdents) {
0384 if (CCKind == CCC_DotMemberAccess || CCKind == CCC_ArrowMemberAccess ||
0385 CCKind == CCC_ObjCPropertyAccess || CCKind == CCC_ObjCClassMessage ||
0386 CCKind == CCC_ObjCInstanceMessage)
0387 BaseType = T;
0388 else
0389 PreferredType = T;
0390 }
0391
0392 bool isUsingDeclaration() const { return IsUsingDeclaration; }
0393 void setIsUsingDeclaration(bool V) { IsUsingDeclaration = V; }
0394
0395
0396 Kind getKind() const { return CCKind; }
0397
0398
0399
0400
0401 QualType getPreferredType() const { return PreferredType; }
0402 void setPreferredType(QualType T) { PreferredType = T; }
0403
0404
0405
0406 QualType getBaseType() const { return BaseType; }
0407
0408
0409 ArrayRef<const IdentifierInfo *> getSelIdents() const { return SelIdents; }
0410
0411
0412
0413 bool wantConstructorResults() const;
0414
0415
0416
0417
0418 void setCXXScopeSpecifier(CXXScopeSpec SS) {
0419 this->ScopeSpecifier = std::move(SS);
0420 }
0421
0422
0423 void addVisitedContext(DeclContext *Ctx) {
0424 VisitedContexts.insert(Ctx);
0425 }
0426
0427
0428 const VisitedContextSet &getVisitedContexts() const {
0429 return VisitedContexts;
0430 }
0431
0432 std::optional<const CXXScopeSpec *> getCXXScopeSpecifier() {
0433 if (ScopeSpecifier)
0434 return &*ScopeSpecifier;
0435 return std::nullopt;
0436 }
0437 };
0438
0439
0440 llvm::StringRef getCompletionKindString(CodeCompletionContext::Kind Kind);
0441
0442
0443
0444
0445
0446
0447
0448
0449 class CodeCompletionString {
0450 public:
0451
0452
0453 enum ChunkKind {
0454
0455
0456
0457 CK_TypedText,
0458
0459
0460
0461 CK_Text,
0462
0463
0464
0465
0466 CK_Optional,
0467
0468
0469
0470 CK_Placeholder,
0471
0472
0473
0474 CK_Informative,
0475
0476
0477 CK_ResultType,
0478
0479
0480
0481
0482 CK_CurrentParameter,
0483
0484
0485 CK_LeftParen,
0486
0487
0488 CK_RightParen,
0489
0490
0491 CK_LeftBracket,
0492
0493
0494 CK_RightBracket,
0495
0496
0497 CK_LeftBrace,
0498
0499
0500 CK_RightBrace,
0501
0502
0503 CK_LeftAngle,
0504
0505
0506 CK_RightAngle,
0507
0508
0509 CK_Comma,
0510
0511
0512 CK_Colon,
0513
0514
0515 CK_SemiColon,
0516
0517
0518 CK_Equal,
0519
0520
0521 CK_HorizontalSpace,
0522
0523
0524
0525 CK_VerticalSpace
0526 };
0527
0528
0529 struct Chunk {
0530
0531
0532 ChunkKind Kind = CK_Text;
0533
0534 union {
0535
0536
0537
0538
0539 const char *Text;
0540
0541
0542
0543
0544 CodeCompletionString *Optional;
0545 };
0546
0547 Chunk() : Text(nullptr) {}
0548
0549 explicit Chunk(ChunkKind Kind, const char *Text = "");
0550
0551
0552 static Chunk CreateText(const char *Text);
0553
0554
0555 static Chunk CreateOptional(CodeCompletionString *Optional);
0556
0557
0558 static Chunk CreatePlaceholder(const char *Placeholder);
0559
0560
0561 static Chunk CreateInformative(const char *Informative);
0562
0563
0564 static Chunk CreateResultType(const char *ResultType);
0565
0566
0567 static Chunk CreateCurrentParameter(const char *CurrentParameter);
0568 };
0569
0570 private:
0571 friend class CodeCompletionBuilder;
0572 friend class CodeCompletionResult;
0573
0574
0575 unsigned NumChunks : 16;
0576
0577
0578 unsigned NumAnnotations : 16;
0579
0580
0581 unsigned Priority : 16;
0582
0583
0584 LLVM_PREFERRED_TYPE(CXAvailabilityKind)
0585 unsigned Availability : 2;
0586
0587
0588 StringRef ParentName;
0589
0590
0591
0592 const char *BriefComment;
0593
0594 CodeCompletionString(const Chunk *Chunks, unsigned NumChunks,
0595 unsigned Priority, CXAvailabilityKind Availability,
0596 const char **Annotations, unsigned NumAnnotations,
0597 StringRef ParentName,
0598 const char *BriefComment);
0599 ~CodeCompletionString() = default;
0600
0601 public:
0602 CodeCompletionString(const CodeCompletionString &) = delete;
0603 CodeCompletionString &operator=(const CodeCompletionString &) = delete;
0604
0605 using iterator = const Chunk *;
0606
0607 iterator begin() const { return reinterpret_cast<const Chunk *>(this + 1); }
0608 iterator end() const { return begin() + NumChunks; }
0609 bool empty() const { return NumChunks == 0; }
0610 unsigned size() const { return NumChunks; }
0611
0612 const Chunk &operator[](unsigned I) const {
0613 assert(I < size() && "Chunk index out-of-range");
0614 return begin()[I];
0615 }
0616
0617
0618 const char *getTypedText() const;
0619
0620
0621 std::string getAllTypedText() const;
0622
0623
0624 unsigned getPriority() const { return Priority; }
0625
0626
0627 unsigned getAvailability() const { return Availability; }
0628
0629
0630 unsigned getAnnotationCount() const;
0631
0632
0633 const char *getAnnotation(unsigned AnnotationNr) const;
0634
0635
0636 StringRef getParentContextName() const {
0637 return ParentName;
0638 }
0639
0640 const char *getBriefComment() const {
0641 return BriefComment;
0642 }
0643
0644
0645
0646 std::string getAsString() const;
0647 };
0648
0649
0650 class CodeCompletionAllocator : public llvm::BumpPtrAllocator {
0651 public:
0652
0653 const char *CopyString(const Twine &String);
0654 };
0655
0656
0657 class GlobalCodeCompletionAllocator : public CodeCompletionAllocator {};
0658
0659 class CodeCompletionTUInfo {
0660 llvm::DenseMap<const DeclContext *, StringRef> ParentNames;
0661 std::shared_ptr<GlobalCodeCompletionAllocator> AllocatorRef;
0662
0663 public:
0664 explicit CodeCompletionTUInfo(
0665 std::shared_ptr<GlobalCodeCompletionAllocator> Allocator)
0666 : AllocatorRef(std::move(Allocator)) {}
0667
0668 std::shared_ptr<GlobalCodeCompletionAllocator> getAllocatorRef() const {
0669 return AllocatorRef;
0670 }
0671
0672 CodeCompletionAllocator &getAllocator() const {
0673 assert(AllocatorRef);
0674 return *AllocatorRef;
0675 }
0676
0677 StringRef getParentName(const DeclContext *DC);
0678 };
0679
0680 }
0681
0682 namespace clang {
0683
0684
0685 class CodeCompletionBuilder {
0686 public:
0687 using Chunk = CodeCompletionString::Chunk;
0688
0689 private:
0690 CodeCompletionAllocator &Allocator;
0691 CodeCompletionTUInfo &CCTUInfo;
0692 unsigned Priority = 0;
0693 CXAvailabilityKind Availability = CXAvailability_Available;
0694 StringRef ParentName;
0695 const char *BriefComment = nullptr;
0696
0697
0698 SmallVector<Chunk, 4> Chunks;
0699
0700 SmallVector<const char *, 2> Annotations;
0701
0702 public:
0703 CodeCompletionBuilder(CodeCompletionAllocator &Allocator,
0704 CodeCompletionTUInfo &CCTUInfo)
0705 : Allocator(Allocator), CCTUInfo(CCTUInfo) {}
0706
0707 CodeCompletionBuilder(CodeCompletionAllocator &Allocator,
0708 CodeCompletionTUInfo &CCTUInfo,
0709 unsigned Priority, CXAvailabilityKind Availability)
0710 : Allocator(Allocator), CCTUInfo(CCTUInfo), Priority(Priority),
0711 Availability(Availability) {}
0712
0713
0714
0715 CodeCompletionAllocator &getAllocator() const { return Allocator; }
0716
0717 CodeCompletionTUInfo &getCodeCompletionTUInfo() const { return CCTUInfo; }
0718
0719
0720
0721
0722 CodeCompletionString *TakeString();
0723
0724
0725 void AddTypedTextChunk(const char *Text);
0726
0727
0728 void AddTextChunk(const char *Text);
0729
0730
0731 void AddOptionalChunk(CodeCompletionString *Optional);
0732
0733
0734 void AddPlaceholderChunk(const char *Placeholder);
0735
0736
0737 void AddInformativeChunk(const char *Text);
0738
0739
0740 void AddResultTypeChunk(const char *ResultType);
0741
0742
0743 void AddCurrentParameterChunk(const char *CurrentParameter);
0744
0745
0746 void AddChunk(CodeCompletionString::ChunkKind CK, const char *Text = "");
0747
0748 void AddAnnotation(const char *A) { Annotations.push_back(A); }
0749
0750
0751 void addParentContext(const DeclContext *DC);
0752
0753 const char *getBriefComment() const { return BriefComment; }
0754 void addBriefComment(StringRef Comment);
0755
0756 StringRef getParentName() const { return ParentName; }
0757 };
0758
0759
0760 class CodeCompletionResult {
0761 public:
0762
0763 enum ResultKind {
0764
0765 RK_Declaration = 0,
0766
0767
0768 RK_Keyword,
0769
0770
0771 RK_Macro,
0772
0773
0774 RK_Pattern
0775 };
0776
0777
0778
0779 const NamedDecl *Declaration = nullptr;
0780
0781 union {
0782
0783
0784 const char *Keyword;
0785
0786
0787
0788 CodeCompletionString *Pattern;
0789
0790
0791 const IdentifierInfo *Macro;
0792 };
0793
0794
0795 unsigned Priority;
0796
0797
0798
0799 unsigned StartParameter = 0;
0800
0801
0802 ResultKind Kind;
0803
0804
0805 CXCursorKind CursorKind;
0806
0807
0808 CXAvailabilityKind Availability = CXAvailability_Available;
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838 std::vector<FixItHint> FixIts;
0839
0840
0841 bool Hidden : 1;
0842
0843
0844 bool InBaseClass : 1;
0845
0846
0847 bool QualifierIsInformative : 1;
0848
0849
0850
0851 bool StartsNestedNameSpecifier : 1;
0852
0853
0854
0855 bool AllParametersAreInformative : 1;
0856
0857
0858
0859 bool DeclaringEntity : 1;
0860
0861
0862
0863
0864
0865 bool FunctionCanBeCall : 1;
0866
0867
0868
0869
0870 NestedNameSpecifier *Qualifier = nullptr;
0871
0872
0873
0874
0875
0876 const UsingShadowDecl *ShadowDecl = nullptr;
0877
0878
0879
0880
0881 const MacroInfo *MacroDefInfo = nullptr;
0882
0883
0884 CodeCompletionResult(const NamedDecl *Declaration, unsigned Priority,
0885 NestedNameSpecifier *Qualifier = nullptr,
0886 bool QualifierIsInformative = false,
0887 bool Accessible = true,
0888 std::vector<FixItHint> FixIts = std::vector<FixItHint>())
0889 : Declaration(Declaration), Priority(Priority), Kind(RK_Declaration),
0890 FixIts(std::move(FixIts)), Hidden(false), InBaseClass(false),
0891 QualifierIsInformative(QualifierIsInformative),
0892 StartsNestedNameSpecifier(false), AllParametersAreInformative(false),
0893 DeclaringEntity(false), FunctionCanBeCall(true), Qualifier(Qualifier) {
0894
0895 computeCursorKindAndAvailability(Accessible);
0896 }
0897
0898
0899 CodeCompletionResult(const char *Keyword, unsigned Priority = CCP_Keyword)
0900 : Keyword(Keyword), Priority(Priority), Kind(RK_Keyword),
0901 CursorKind(CXCursor_NotImplemented), Hidden(false), InBaseClass(false),
0902 QualifierIsInformative(false), StartsNestedNameSpecifier(false),
0903 AllParametersAreInformative(false), DeclaringEntity(false),
0904 FunctionCanBeCall(true) {}
0905
0906
0907 CodeCompletionResult(const IdentifierInfo *Macro,
0908 const MacroInfo *MI = nullptr,
0909 unsigned Priority = CCP_Macro)
0910 : Macro(Macro), Priority(Priority), Kind(RK_Macro),
0911 CursorKind(CXCursor_MacroDefinition), Hidden(false), InBaseClass(false),
0912 QualifierIsInformative(false), StartsNestedNameSpecifier(false),
0913 AllParametersAreInformative(false), DeclaringEntity(false),
0914 FunctionCanBeCall(true), MacroDefInfo(MI) {}
0915
0916
0917 CodeCompletionResult(
0918 CodeCompletionString *Pattern, unsigned Priority = CCP_CodePattern,
0919 CXCursorKind CursorKind = CXCursor_NotImplemented,
0920 CXAvailabilityKind Availability = CXAvailability_Available,
0921 const NamedDecl *D = nullptr)
0922 : Declaration(D), Pattern(Pattern), Priority(Priority), Kind(RK_Pattern),
0923 CursorKind(CursorKind), Availability(Availability), Hidden(false),
0924 InBaseClass(false), QualifierIsInformative(false),
0925 StartsNestedNameSpecifier(false), AllParametersAreInformative(false),
0926 DeclaringEntity(false), FunctionCanBeCall(true) {}
0927
0928
0929
0930 CodeCompletionResult(CodeCompletionString *Pattern, const NamedDecl *D,
0931 unsigned Priority)
0932 : Declaration(D), Pattern(Pattern), Priority(Priority), Kind(RK_Pattern),
0933 Hidden(false), InBaseClass(false), QualifierIsInformative(false),
0934 StartsNestedNameSpecifier(false), AllParametersAreInformative(false),
0935 DeclaringEntity(false), FunctionCanBeCall(true) {
0936 computeCursorKindAndAvailability();
0937 }
0938
0939
0940
0941 const NamedDecl *getDeclaration() const {
0942 assert(((Kind == RK_Declaration) || (Kind == RK_Pattern)) &&
0943 "Not a declaration or pattern result");
0944 return Declaration;
0945 }
0946
0947
0948 const char *getKeyword() const {
0949 assert(Kind == RK_Keyword && "Not a keyword result");
0950 return Keyword;
0951 }
0952
0953
0954
0955
0956
0957
0958
0959
0960 CodeCompletionString *CreateCodeCompletionString(Sema &S,
0961 const CodeCompletionContext &CCContext,
0962 CodeCompletionAllocator &Allocator,
0963 CodeCompletionTUInfo &CCTUInfo,
0964 bool IncludeBriefComments);
0965 CodeCompletionString *CreateCodeCompletionString(ASTContext &Ctx,
0966 Preprocessor &PP,
0967 const CodeCompletionContext &CCContext,
0968 CodeCompletionAllocator &Allocator,
0969 CodeCompletionTUInfo &CCTUInfo,
0970 bool IncludeBriefComments);
0971
0972
0973
0974 CodeCompletionString *
0975 CreateCodeCompletionStringForMacro(Preprocessor &PP,
0976 CodeCompletionAllocator &Allocator,
0977 CodeCompletionTUInfo &CCTUInfo);
0978
0979 CodeCompletionString *createCodeCompletionStringForDecl(
0980 Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
0981 bool IncludeBriefComments, const CodeCompletionContext &CCContext,
0982 PrintingPolicy &Policy);
0983
0984 CodeCompletionString *createCodeCompletionStringForOverride(
0985 Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result,
0986 bool IncludeBriefComments, const CodeCompletionContext &CCContext,
0987 PrintingPolicy &Policy);
0988
0989
0990
0991
0992
0993 StringRef getOrderedName(std::string &Saved) const;
0994
0995 private:
0996 void computeCursorKindAndAvailability(bool Accessible = true);
0997 };
0998
0999 bool operator<(const CodeCompletionResult &X, const CodeCompletionResult &Y);
1000
1001 inline bool operator>(const CodeCompletionResult &X,
1002 const CodeCompletionResult &Y) {
1003 return Y < X;
1004 }
1005
1006 inline bool operator<=(const CodeCompletionResult &X,
1007 const CodeCompletionResult &Y) {
1008 return !(Y < X);
1009 }
1010
1011 inline bool operator>=(const CodeCompletionResult &X,
1012 const CodeCompletionResult &Y) {
1013 return !(X < Y);
1014 }
1015
1016
1017
1018 class CodeCompleteConsumer {
1019 protected:
1020 const CodeCompleteOptions CodeCompleteOpts;
1021
1022 public:
1023 class OverloadCandidate {
1024 public:
1025
1026 enum CandidateKind {
1027
1028 CK_Function,
1029
1030
1031 CK_FunctionTemplate,
1032
1033
1034
1035 CK_FunctionType,
1036
1037
1038
1039 CK_FunctionProtoTypeLoc,
1040
1041
1042 CK_Template,
1043
1044
1045 CK_Aggregate,
1046 };
1047
1048 private:
1049
1050 CandidateKind Kind;
1051
1052 union {
1053
1054
1055 FunctionDecl *Function;
1056
1057
1058
1059 FunctionTemplateDecl *FunctionTemplate;
1060
1061
1062
1063 const FunctionType *Type;
1064
1065
1066
1067 FunctionProtoTypeLoc ProtoTypeLoc;
1068
1069
1070
1071 const TemplateDecl *Template;
1072
1073
1074
1075 const RecordDecl *AggregateType;
1076 };
1077
1078 public:
1079 OverloadCandidate(FunctionDecl *Function)
1080 : Kind(CK_Function), Function(Function) {
1081 assert(Function != nullptr);
1082 }
1083
1084 OverloadCandidate(FunctionTemplateDecl *FunctionTemplateDecl)
1085 : Kind(CK_FunctionTemplate), FunctionTemplate(FunctionTemplateDecl) {
1086 assert(FunctionTemplateDecl != nullptr);
1087 }
1088
1089 OverloadCandidate(const FunctionType *Type)
1090 : Kind(CK_FunctionType), Type(Type) {
1091 assert(Type != nullptr);
1092 }
1093
1094 OverloadCandidate(FunctionProtoTypeLoc Prototype)
1095 : Kind(CK_FunctionProtoTypeLoc), ProtoTypeLoc(Prototype) {
1096 assert(!Prototype.isNull());
1097 }
1098
1099 OverloadCandidate(const RecordDecl *Aggregate)
1100 : Kind(CK_Aggregate), AggregateType(Aggregate) {
1101 assert(Aggregate != nullptr);
1102 }
1103
1104 OverloadCandidate(const TemplateDecl *Template)
1105 : Kind(CK_Template), Template(Template) {}
1106
1107
1108 CandidateKind getKind() const { return Kind; }
1109
1110
1111
1112 FunctionDecl *getFunction() const;
1113
1114
1115 FunctionTemplateDecl *getFunctionTemplate() const {
1116 assert(getKind() == CK_FunctionTemplate && "Not a function template");
1117 return FunctionTemplate;
1118 }
1119
1120
1121
1122 const FunctionType *getFunctionType() const;
1123
1124
1125
1126
1127 const FunctionProtoTypeLoc getFunctionProtoTypeLoc() const;
1128
1129 const TemplateDecl *getTemplate() const {
1130 assert(getKind() == CK_Template && "Not a template");
1131 return Template;
1132 }
1133
1134
1135 const RecordDecl *getAggregate() const {
1136 assert(getKind() == CK_Aggregate);
1137 return AggregateType;
1138 }
1139
1140
1141 unsigned getNumParams() const;
1142
1143
1144
1145 QualType getParamType(unsigned N) const;
1146
1147
1148
1149 const NamedDecl *getParamDecl(unsigned N) const;
1150
1151
1152
1153 CodeCompletionString *
1154 CreateSignatureString(unsigned CurrentArg, Sema &S,
1155 CodeCompletionAllocator &Allocator,
1156 CodeCompletionTUInfo &CCTUInfo,
1157 bool IncludeBriefComments, bool Braced) const;
1158 };
1159
1160 CodeCompleteConsumer(const CodeCompleteOptions &CodeCompleteOpts)
1161 : CodeCompleteOpts(CodeCompleteOpts) {}
1162
1163
1164 bool includeMacros() const {
1165 return CodeCompleteOpts.IncludeMacros;
1166 }
1167
1168
1169 bool includeCodePatterns() const {
1170 return CodeCompleteOpts.IncludeCodePatterns;
1171 }
1172
1173
1174 bool includeGlobals() const { return CodeCompleteOpts.IncludeGlobals; }
1175
1176
1177
1178
1179 bool includeNamespaceLevelDecls() const {
1180 return CodeCompleteOpts.IncludeNamespaceLevelDecls;
1181 }
1182
1183
1184
1185 bool includeBriefComments() const {
1186 return CodeCompleteOpts.IncludeBriefComments;
1187 }
1188
1189
1190
1191 bool includeFixIts() const { return CodeCompleteOpts.IncludeFixIts; }
1192
1193
1194
1195 bool loadExternal() const {
1196 return CodeCompleteOpts.LoadExternal;
1197 }
1198
1199
1200 virtual ~CodeCompleteConsumer();
1201
1202
1203
1204 virtual bool isResultFilteredOut(StringRef Filter,
1205 CodeCompletionResult Results) {
1206 return false;
1207 }
1208
1209
1210
1211
1212 virtual void ProcessCodeCompleteResults(Sema &S,
1213 CodeCompletionContext Context,
1214 CodeCompletionResult *Results,
1215 unsigned NumResults) {}
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228 virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
1229 OverloadCandidate *Candidates,
1230 unsigned NumCandidates,
1231 SourceLocation OpenParLoc,
1232 bool Braced) {}
1233
1234
1235
1236
1237 virtual CodeCompletionAllocator &getAllocator() = 0;
1238
1239 virtual CodeCompletionTUInfo &getCodeCompletionTUInfo() = 0;
1240 };
1241
1242
1243
1244 const RawComment *getCompletionComment(const ASTContext &Ctx,
1245 const NamedDecl *Decl);
1246
1247
1248
1249 const RawComment *getPatternCompletionComment(const ASTContext &Ctx,
1250 const NamedDecl *Decl);
1251
1252
1253
1254 const RawComment *
1255 getParameterComment(const ASTContext &Ctx,
1256 const CodeCompleteConsumer::OverloadCandidate &Result,
1257 unsigned ArgIndex);
1258
1259
1260
1261 class PrintingCodeCompleteConsumer : public CodeCompleteConsumer {
1262
1263 raw_ostream &OS;
1264
1265 CodeCompletionTUInfo CCTUInfo;
1266
1267 public:
1268
1269
1270 PrintingCodeCompleteConsumer(const CodeCompleteOptions &CodeCompleteOpts,
1271 raw_ostream &OS)
1272 : CodeCompleteConsumer(CodeCompleteOpts), OS(OS),
1273 CCTUInfo(std::make_shared<GlobalCodeCompletionAllocator>()) {}
1274
1275
1276 void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context,
1277 CodeCompletionResult *Results,
1278 unsigned NumResults) override;
1279
1280 void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
1281 OverloadCandidate *Candidates,
1282 unsigned NumCandidates,
1283 SourceLocation OpenParLoc,
1284 bool Braced) override;
1285
1286 bool isResultFilteredOut(StringRef Filter, CodeCompletionResult Results) override;
1287
1288 CodeCompletionAllocator &getAllocator() override {
1289 return CCTUInfo.getAllocator();
1290 }
1291
1292 CodeCompletionTUInfo &getCodeCompletionTUInfo() override { return CCTUInfo; }
1293 };
1294
1295 }
1296
1297 #endif