25 #include "llvm/ADT/SmallString.h" 26 #include "llvm/ADT/SmallVector.h" 27 #include "llvm/ADT/StringRef.h" 28 #include "llvm/ADT/Twine.h" 29 #include "llvm/Support/Casting.h" 30 #include "llvm/Support/Compiler.h" 31 #include "llvm/Support/ErrorHandling.h" 32 #include "llvm/Support/raw_ostream.h" 38 using namespace clang;
85 llvm_unreachable(
"Invalid CodeCompletionContext::Kind!");
91 case CCKind::CCC_Other:
93 case CCKind::CCC_OtherWithMacros:
94 return "OtherWithMacros";
95 case CCKind::CCC_TopLevel:
97 case CCKind::CCC_ObjCInterface:
98 return "ObjCInterface";
99 case CCKind::CCC_ObjCImplementation:
100 return "ObjCImplementation";
101 case CCKind::CCC_ObjCIvarList:
102 return "ObjCIvarList";
103 case CCKind::CCC_ClassStructUnion:
104 return "ClassStructUnion";
105 case CCKind::CCC_Statement:
107 case CCKind::CCC_Expression:
109 case CCKind::CCC_ObjCMessageReceiver:
110 return "ObjCMessageReceiver";
111 case CCKind::CCC_DotMemberAccess:
112 return "DotMemberAccess";
113 case CCKind::CCC_ArrowMemberAccess:
114 return "ArrowMemberAccess";
115 case CCKind::CCC_ObjCPropertyAccess:
116 return "ObjCPropertyAccess";
117 case CCKind::CCC_EnumTag:
119 case CCKind::CCC_UnionTag:
121 case CCKind::CCC_ClassOrStructTag:
122 return "ClassOrStructTag";
123 case CCKind::CCC_ObjCProtocolName:
124 return "ObjCProtocolName";
125 case CCKind::CCC_Namespace:
127 case CCKind::CCC_Type:
129 case CCKind::CCC_Name:
131 case CCKind::CCC_PotentiallyQualifiedName:
132 return "PotentiallyQualifiedName";
133 case CCKind::CCC_MacroName:
135 case CCKind::CCC_MacroNameUse:
136 return "MacroNameUse";
137 case CCKind::CCC_PreprocessorExpression:
138 return "PreprocessorExpression";
139 case CCKind::CCC_PreprocessorDirective:
140 return "PreprocessorDirective";
141 case CCKind::CCC_NaturalLanguage:
142 return "NaturalLanguage";
143 case CCKind::CCC_SelectorName:
144 return "SelectorName";
145 case CCKind::CCC_TypeQualifiers:
146 return "TypeQualifiers";
147 case CCKind::CCC_ParenthesizedExpression:
148 return "ParenthesizedExpression";
149 case CCKind::CCC_ObjCInstanceMessage:
150 return "ObjCInstanceMessage";
151 case CCKind::CCC_ObjCClassMessage:
152 return "ObjCClassMessage";
153 case CCKind::CCC_ObjCInterfaceName:
154 return "ObjCInterfaceName";
155 case CCKind::CCC_ObjCCategoryName:
156 return "ObjCCategoryName";
157 case CCKind::CCC_Recovery:
160 llvm_unreachable(
"Invalid CodeCompletionContext::Kind!");
168 : Kind(Kind), Text(
"") {
180 llvm_unreachable(
"Optional strings cannot be created from text");
270 const char *CurrentParameter) {
274 CodeCompletionString::CodeCompletionString(
const Chunk *Chunks,
278 const char **Annotations,
279 unsigned NumAnnotations,
280 StringRef ParentName,
281 const char *BriefComment)
282 : NumChunks(NumChunks), NumAnnotations(NumAnnotations),
283 Priority(Priority), Availability(Availability),
284 ParentName(ParentName), BriefComment(BriefComment) {
285 assert(NumChunks <= 0xffff);
286 assert(NumAnnotations <= 0xffff);
288 Chunk *StoredChunks =
reinterpret_cast<Chunk *
>(
this + 1);
289 for (
unsigned I = 0; I != NumChunks; ++I)
290 StoredChunks[I] = Chunks[I];
292 const char **StoredAnnotations =
reinterpret_cast<const char **
>(StoredChunks + NumChunks);
293 for (
unsigned I = 0; I != NumAnnotations; ++I)
294 StoredAnnotations[I] = Annotations[I];
298 return NumAnnotations;
302 if (AnnotationNr < NumAnnotations)
303 return reinterpret_cast<const char * const*
>(
end())[AnnotationNr];
310 llvm::raw_string_ostream OS(Result);
314 case CK_Optional: OS <<
"{#" <<
C->Optional->getAsString() <<
"#}";
break;
319 OS <<
"[#" <<
C->Text <<
"#]";
323 default: OS <<
C->Text;
break;
339 StringRef Ref = String.toStringRef(Data);
343 char *Mem = (
char *)Allocate(Ref.size() + 1, 1);
344 std::copy(Ref.begin(), Ref.end(), Mem);
355 StringRef &CachedParentName = ParentNames[DC];
356 if (!CachedParentName.empty())
357 return CachedParentName;
361 if (CachedParentName.data() !=
nullptr)
367 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) {
369 Contexts.push_back(DC);
377 llvm::raw_svector_ostream OS(S);
379 for (
unsigned I = Contexts.size(); I != 0; --I) {
388 CurDC = CatImpl->getCategoryDecl();
395 CachedParentName = StringRef((
const char *)(
uintptr_t)~0U, 0);
399 OS << Interface->
getName() <<
'(' << Cat->getName() <<
')';
401 OS << cast<NamedDecl>(CurDC)->
getName();
405 CachedParentName = AllocatorRef->CopyString(OS.str());
408 return CachedParentName;
412 void *Mem = getAllocator().Allocate(
414 sizeof(
const char *) * Annotations.size(),
418 Priority, Availability,
419 Annotations.data(), Annotations.size(),
420 ParentName, BriefComment);
456 Chunks.push_back(
Chunk(CK, Text));
470 ParentName = getCodeCompletionTUInfo().getParentName(DC);
474 BriefComment = Allocator.CopyString(Comment);
484 else if (
getKind() == CK_FunctionTemplate)
485 return FunctionTemplate->getTemplatedDecl();
496 case CK_FunctionTemplate:
497 return FunctionTemplate->getTemplatedDecl()->getType()
500 case CK_FunctionType:
504 llvm_unreachable(
"Invalid CandidateKind!");
515 switch (Result.
Kind) {
520 return !StringRef(Result.
Keyword).startswith(Filter);
526 llvm_unreachable(
"Unknown code completion result Kind.");
533 unsigned NumResults) {
534 std::stable_sort(Results, Results + NumResults);
539 for (
unsigned I = 0; I != NumResults; ++I) {
540 if(!Filter.empty() && isResultFilteredOut(Filter, Results[I]))
542 OS <<
"COMPLETION: ";
543 switch (Results[I].
Kind) {
546 if (Results[I].Hidden)
549 = Results[I].CreateCodeCompletionString(SemaRef, Context,
552 includeBriefComments())) {
553 OS <<
" : " << CCS->getAsString();
554 if (
const char *BriefComment = CCS->getBriefComment())
555 OS <<
" : " << BriefComment;
565 if (
FixIt.RemoveRange.isTokenRange())
568 OS <<
" (requires fix-it:" 569 <<
" {" << SM.
getLineNumber(BInfo.first, BInfo.second) <<
':' 573 <<
" to \"" <<
FixIt.CodeToInsert <<
"\")";
579 OS << Results[I].
Keyword <<
'\n';
585 = Results[I].CreateCodeCompletionString(SemaRef, Context,
588 includeBriefComments())) {
589 OS <<
" : " << CCS->getAsString();
608 llvm::raw_string_ostream OS(Result);
610 for (
auto &
C : CCS) {
614 OS <<
"[#" <<
C.Text <<
"#]";
618 OS <<
"<#" <<
C.Text <<
"#>";
621 default: OS <<
C.Text;
break;
631 unsigned NumCandidates) {
632 for (
unsigned I = 0; I != NumCandidates; ++I) {
634 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
635 getAllocator(), CCTUInfo,
636 includeBriefComments())) {
645 if (isa<EnumConstantDecl>(D))
650 void CodeCompletionResult::computeCursorKindAndAvailability(
bool Accessible) {
659 case RK_Declaration: {
676 if (
const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
677 if (Function->isDeleted())
685 if (isa<ObjCInterfaceDecl>(Declaration))
687 else if (isa<ObjCProtocolDecl>(Declaration))
697 llvm_unreachable(
"Macro and keyword kinds are handled by the constructors");
713 return Pattern->getTypedText();
715 return Macro->getName();
726 return Id->getName();
730 return Id->getName();
738 std::string XSaved, YSaved;
741 int cmp = XStr.compare_lower(YStr);
746 cmp = XStr.compare(YStr);
One piece of the code completion string.
An unknown context, in which we are recovering from a parsing error and don't know which completions ...
A code completion string that is entirely optional.
CXAvailabilityKind
Describes the availability of a particular entity, which indicates whether the use of this entity wil...
Represents a function declaration or definition.
ResultKind Kind
The kind of result stored here.
StringRef getParentName(const DeclContext *DC)
Code completion for a selector, as in an @selector expression.
const FunctionType * getFunctionType() const
Retrieve the function type of the entity, regardless of how the function is stored.
void AddTextChunk(const char *Text)
Add a new text chunk.
Code completion where an Objective-C class message is expected.
FunctionType - C99 6.7.5.3 - Function Declarators.
FunctionDecl * getFunction() const
Retrieve the function overload candidate or the templated function declaration for a function templat...
C Language Family Type Representation.
Code completion within a type-qualifier list.
Decl - This represents one declaration (or definition), e.g.
void AddChunk(CodeCompletionString::ChunkKind CK, const char *Text="")
Add a new chunk.
Selector getObjCSelector() const
getObjCSelector - Get the Objective-C selector stored in this declaration name.
Defines the C++ template declaration subclasses.
unsigned getColumnNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const
Return the column # for the specified file position.
static Chunk CreateText(const char *Text)
Create a new text chunk.
The base class of the type hierarchy.
An unspecified code-completion context.
static Chunk CreateOptional(CodeCompletionString *Optional)
Create a new optional chunk.
Code completion occurred where an Objective-C message receiver is expected.
unsigned getAnnotationCount() const
Retrieve the number of annotations for this code completion result.
Code completion occurred on the right-hand side of a member access expression using the arrow operato...
ChunkKind
The different kinds of "chunks" that can occur within a code completion string.
Code completion occurred after the "enum" keyword, to indicate an enumeration name.
A left bracket ('[').
const T * getAs() const
Member-template getAs<specific type>'.
A piece of text that describes the type of an entity or, for functions and methods, the return type.
const char * Keyword
When Kind == RK_Keyword, the string representing the keyword or symbol's spelling.
static Chunk CreateResultType(const char *ResultType)
Create a new result type chunk.
void AddOptionalChunk(CodeCompletionString *Optional)
Add a new optional chunk.
Code completion occurred within the instance variable list of an Objective-C interface, implementation, or category implementation.
void AddTypedTextChunk(const char *Text)
Add a new typed-text chunk.
The entity is not available; any use of it will be an error.
Parse and apply any fixits to the source.
std::string getName(ArrayRef< StringRef > Parts) const
Get the platform-specific name separator.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
One of these records is kept for each identifier that is lexed.
CodeCompletionString * TakeString()
Take the resulting completion string.
static Chunk CreateInformative(const char *Informative)
Create a new informative chunk.
A "string" used to describe how code completion can be performed for an entity.
An Objective-C @protocol declaration.
void AddResultTypeChunk(const char *ResultType)
Add a new result-type chunk.
static Chunk CreatePlaceholder(const char *Placeholder)
Create a new placeholder chunk.
CodeCompletionString * Pattern
When Kind == RK_Pattern, the code-completion string that describes the completion text to insert...
Code completion occurred where a preprocessor directive is expected.
Code completion occurred within an Objective-C implementation or category implementation.
Code completion occurred where a namespace or namespace alias is expected.
static Chunk CreateCurrentParameter(const char *CurrentParameter)
Create a new current-parameter chunk.
A right brace ('}').
Represents an ObjC class declaration.
The piece of text that the user is expected to type to match the code-completion string, typically a keyword or the name of a declarator or macro.
A comma separator (',').
bool wantConstructorResults() const
Determines whether we want C++ constructors as results within this context.
const LangOptions & LangOpts
Refers to a keyword or symbol.
AvailabilityResult
Captures the result of checking the availability of a declaration.
A right parenthesis (')').
Code completion where an Objective-C category name is expected.
Sema - This implements semantic analysis and AST building for C.
Code completion occurred within a "top-level" completion context, e.g., at namespace or global scope...
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
static std::string getOverloadAsString(const CodeCompletionString &CCS)
Code completion occurred where a protocol name is expected.
CXCursorKind getCursorKindForDecl(const Decl *D)
Determine the libclang cursor kind associated with the given declaration.
llvm::StringRef getCompletionKindString(CodeCompletionContext::Kind Kind)
Get string representation of Kind, useful for for debugging.
Code completion occurred where a new name is expected.
std::string getAsString() const
Retrieve a string representation of the code completion string, which is mainly useful for debugging...
static unsigned MeasureTokenLength(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
MeasureTokenLength - Relex the token at the specified location and return its length in bytes in the ...
const char * Text
The text string associated with a CK_Text, CK_Placeholder, CK_Informative, or CK_Comma chunk...
std::string getAsString() const
getNameAsString - Retrieve the human-readable string for this name.
Defines the clang::Preprocessor interface.
const NamedDecl * Declaration
When Kind == RK_Declaration or RK_Pattern, the declaration we are referring to.
DeclContext * getDeclContext()
A semicolon (';').
IdentifierInfo * getAsIdentifierInfo() const
getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in this declaration name, or NULL if this declaration name isn't a simple identifier.
Captures a result of code completion.
Code completion occurred where a new name is expected and a qualified name is permissible.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
bool isFunctionOrMethod() const
Code completion in a parenthesized expression, which means that we may also have types here in C and ...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Code completion occurred in a context where natural language is expected, e.g., a comment or string l...
Preprocessor & getPreprocessor() const
A piece of text that should be placed in the buffer, e.g., parentheses or a comma in a function call...
The result type of a method or function.
const char * CopyString(const Twine &String)
Copy the given string into this allocator.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
const char * getTypedText() const
Returns the text in the TypedText chunk.
CodeCompletionString * Optional
The code completion string associated with a CK_Optional chunk.
The context in which code completion occurred, so that the code-completion consumer can process the r...
const IdentifierInfo * Macro
When Kind == RK_Macro, the identifier that refers to a macro.
Code completion occurred within a class, struct, or union.
IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
Encodes a location in the source.
const char * getAnnotation(unsigned AnnotationNr) const
Retrieve the annotation string specified by AnnotationNr.
Code completion where the name of an Objective-C class is expected.
Code completion occurred within an Objective-C interface, protocol, or category interface.
unsigned getLineNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const
Given a SourceLocation, return the spelling line number for the position indicated.
A right bracket (']').
ObjCCategoryDecl - Represents a category declaration.
void addParentContext(const DeclContext *DC)
Add the parent context information to this code completion.
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
The entity is available, but not accessible; any use of it will be an error.
ChunkKind Kind
The kind of data stored in this piece of the code completion string.
A left brace ('{').
void addBriefComment(StringRef Comment)
StringRef getName() const
Return the actual identifier string.
Dataflow Directional Tag Classes.
Code completion occurred where an macro is being defined.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
A piece of text that describes something about the result but should not be inserted into the buffer...
Code completion occurred after the "struct" or "class" keyword, to indicate a struct or class name...
static AvailabilityResult getDeclAvailability(const Decl *D)
Retrieve the effective availability of the given declaration.
void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, CodeCompletionResult *Results, unsigned NumResults) override
Prints the finalized code-completion results.
Code completion occurred after the "union" keyword, to indicate a union name.
Code completion occurred where a macro name is expected (without any arguments, in the case of a func...
Code completion where an Objective-C instance message is expected.
DeclarationName - The name of a declaration.
StringRef getCodeCompletionFilter()
Get the code completion token for filtering purposes.
Refers to a precomputed pattern.
Code completion occurred where a statement (or declaration) is expected in a function, method, or block.
Code completion occurred on the right-hand side of an Objective-C property access expression...
void AddInformativeChunk(const char *Text)
Add a new informative chunk.
void AddCurrentParameterChunk(const char *CurrentParameter)
Add a new current-parameter chunk.
A declaration whose specific kind is not exposed via this interface.
A piece of text that describes the parameter that corresponds to the code-completion location within ...
A string that acts as a placeholder for, e.g., a function call argument.
unsigned getAvailability() const
Retrieve the availability of this code completion result.
A left parenthesis ('(').
X
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
Code completion occurred within a preprocessor expression.
Code completion occurred where an expression is expected.
An unspecified code-completion context where we should also add macro completions.
A left angle bracket ('<').
A right angle bracket ('>').
Vertical whitespace ('\n' or '\r\n', depending on the platform).
void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, OverloadCandidate *Candidates, unsigned NumCandidates) override
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
__DEVICE__ int max(int __a, int __b)
static Decl::Kind getKind(const Decl *D)
StringRef getOrderedName(std::string &Saved) const
Retrieve the name that should be used to order a result.
Code completion occurred on the right-hand side of a member access expression using the dot operator...
void AddPlaceholderChunk(const char *Placeholder)
Add a new placeholder chunk.
Code completion occurred where a type name is expected.
Horizontal whitespace (' ').
SourceManager & SourceMgr
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
bool isResultFilteredOut(StringRef Filter, CodeCompletionResult Results) override
The entity is available, but has been deprecated (and its use is not recommended).
This represents a decl that may have a name.
bool isTranslationUnit() const
An Objective-C @interface.
virtual ~CodeCompleteConsumer()
Deregisters and destroys this code-completion consumer.
bool isObjCZeroArgSelector() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration...
This class handles loading and caching of source files into memory.
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.