21 #include "llvm/ADT/STLExtras.h" 22 #include "llvm/ADT/SmallString.h" 23 #include "llvm/ADT/Twine.h" 24 #include "llvm/Support/raw_ostream.h" 29 using namespace clang;
76 llvm_unreachable(
"Invalid CodeCompletionContext::Kind!");
83 : Kind(Kind), Text(
"")
96 llvm_unreachable(
"Optional strings cannot be created from text");
186 const char *CurrentParameter) {
190 CodeCompletionString::CodeCompletionString(
const Chunk *Chunks,
194 const char **Annotations,
195 unsigned NumAnnotations,
196 StringRef ParentName,
197 const char *BriefComment)
198 : NumChunks(NumChunks), NumAnnotations(NumAnnotations),
199 Priority(Priority), Availability(Availability),
200 ParentName(ParentName), BriefComment(BriefComment)
202 assert(NumChunks <= 0xffff);
203 assert(NumAnnotations <= 0xffff);
205 Chunk *StoredChunks =
reinterpret_cast<Chunk *
>(
this + 1);
206 for (
unsigned I = 0; I != NumChunks; ++I)
207 StoredChunks[I] = Chunks[I];
209 const char **StoredAnnotations =
reinterpret_cast<const char **
>(StoredChunks + NumChunks);
210 for (
unsigned I = 0; I != NumAnnotations; ++I)
211 StoredAnnotations[I] = Annotations[I];
215 return NumAnnotations;
219 if (AnnotationNr < NumAnnotations)
220 return reinterpret_cast<const char * const*
>(
end())[AnnotationNr];
228 llvm::raw_string_ostream OS(Result);
232 case CK_Optional: OS <<
"{#" <<
C->Optional->getAsString() <<
"#}";
break;
237 OS <<
"[#" <<
C->Text <<
"#]";
241 default: OS <<
C->Text;
break;
257 StringRef Ref = String.toStringRef(Data);
261 char *Mem = (
char *)Allocate(Ref.size() + 1, 1);
262 std::copy(Ref.begin(), Ref.end(), Mem);
273 StringRef &CachedParentName = ParentNames[DC];
274 if (!CachedParentName.empty())
275 return CachedParentName;
279 if (CachedParentName.data() !=
nullptr)
285 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) {
287 Contexts.push_back(DC);
295 llvm::raw_svector_ostream OS(S);
297 for (
unsigned I = Contexts.size(); I != 0; --I) {
306 CurDC = CatImpl->getCategoryDecl();
313 CachedParentName = StringRef((
const char *)(
uintptr_t)~0U, 0);
317 OS << Interface->
getName() <<
'(' << Cat->getName() <<
')';
319 OS << cast<NamedDecl>(CurDC)->getName();
323 CachedParentName = AllocatorRef->CopyString(OS.str());
326 return CachedParentName;
330 void *Mem = getAllocator().Allocate(
332 sizeof(
const char *) * Annotations.size(),
336 Priority, Availability,
337 Annotations.data(), Annotations.size(),
338 ParentName, BriefComment);
374 Chunks.push_back(
Chunk(CK, Text));
389 ParentName = getCodeCompletionTUInfo().getParentName(DC);
393 BriefComment = Allocator.CopyString(Comment);
403 else if (
getKind() == CK_FunctionTemplate)
404 return FunctionTemplate->getTemplatedDecl();
415 case CK_FunctionTemplate:
416 return FunctionTemplate->getTemplatedDecl()->getType()
419 case CK_FunctionType:
423 llvm_unreachable(
"Invalid CandidateKind!");
434 switch (Result.
Kind) {
440 return !StringRef(Result.
Keyword).startswith(Filter);
449 llvm_unreachable(
"Unknown code completion result Kind.");
456 unsigned NumResults) {
457 std::stable_sort(Results, Results + NumResults);
462 for (
unsigned I = 0; I != NumResults; ++I) {
463 if(!Filter.empty() && isResultFilteredOut(Filter, Results[I]))
465 OS <<
"COMPLETION: ";
466 switch (Results[I].
Kind) {
469 if (Results[I].Hidden)
472 = Results[I].CreateCodeCompletionString(SemaRef, Context,
475 includeBriefComments())) {
476 OS <<
" : " << CCS->getAsString();
477 if (
const char *BriefComment = CCS->getBriefComment())
478 OS <<
" : " << BriefComment;
485 OS << Results[I].
Keyword <<
'\n';
491 = Results[I].CreateCodeCompletionString(SemaRef, Context,
494 includeBriefComments())) {
495 OS <<
" : " << CCS->getAsString();
516 llvm::raw_string_ostream OS(Result);
518 for (
auto &
C : CCS) {
522 OS <<
"[#" <<
C.Text <<
"#]";
526 OS <<
"<#" <<
C.Text <<
"#>";
529 default: OS <<
C.Text;
break;
539 unsigned NumCandidates) {
540 for (
unsigned I = 0; I != NumCandidates; ++I) {
542 = Candidates[I].CreateSignatureString(CurrentArg, SemaRef,
543 getAllocator(), CCTUInfo,
544 includeBriefComments())) {
553 if (isa<EnumConstantDecl>(D))
558 void CodeCompletionResult::computeCursorKindAndAvailability(
bool Accessible) {
567 case RK_Declaration: {
584 if (
const FunctionDecl *Function = dyn_cast<FunctionDecl>(Declaration))
585 if (Function->isDeleted())
593 if (isa<ObjCInterfaceDecl>(Declaration))
595 else if (isa<ObjCProtocolDecl>(Declaration))
605 llvm_unreachable(
"Macro and keyword kinds are handled by the constructors");
621 return Pattern->getTypedText();
623 return Macro->getName();
634 return Id->getName();
638 return Id->getName();
646 std::string XSaved, YSaved;
649 int cmp = XStr.compare_lower(YStr);
654 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...
An instance of this class is created to represent 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...
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.
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.
IdentifierInfo * getIdentifier() const
getIdentifier - 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.
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...
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.
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...
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.
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.
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.
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.
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple()) const
Determine the availability of the given declaration.
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.
char __ovld __cnfn max(char x, char y)
Returns y if x < y, otherwise it returns x.
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.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
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
getName - Get the name of identifier for this declaration as a StringRef.
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 (' ').
bool isResultFilteredOut(StringRef Filter, CodeCompletionResult Results) override
The entity is available, but has been deprecated (and its use is not recommended).
NamedDecl - This represents a decl with 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...