forked from OSchip/llvm-project
[Sema] Store MacroInfo in CodeCompletionResult for macro results.
Summary: This provides information about the macro definition. For example, it can be used to compute macro USRs. Reviewers: sammccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D51675 llvm-svn: 341476
This commit is contained in:
parent
fcc97daa8a
commit
d485df17d5
|
@ -17,6 +17,7 @@
|
|||
#include "clang-c/Index.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "clang/Lex/MacroInfo.h"
|
||||
#include "clang/Sema/CodeCompleteOptions.h"
|
||||
#include "clang/Sema/DeclSpec.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
|
@ -843,6 +844,11 @@ public:
|
|||
/// corresponding `using decl::qualified::name;` nearby.
|
||||
const UsingShadowDecl *ShadowDecl = nullptr;
|
||||
|
||||
/// If the result is RK_Macro, this can store the information about the macro
|
||||
/// definition. This should be set in most cases but can be missing when
|
||||
/// the macro has been undefined.
|
||||
const MacroInfo *MacroDefInfo = nullptr;
|
||||
|
||||
/// Build a result that refers to a declaration.
|
||||
CodeCompletionResult(const NamedDecl *Declaration, unsigned Priority,
|
||||
NestedNameSpecifier *Qualifier = nullptr,
|
||||
|
@ -867,11 +873,13 @@ public:
|
|||
|
||||
/// Build a result that refers to a macro.
|
||||
CodeCompletionResult(const IdentifierInfo *Macro,
|
||||
const MacroInfo *MI = nullptr,
|
||||
unsigned Priority = CCP_Macro)
|
||||
: Macro(Macro), Priority(Priority), Kind(RK_Macro),
|
||||
CursorKind(CXCursor_MacroDefinition), Hidden(false),
|
||||
QualifierIsInformative(false), StartsNestedNameSpecifier(false),
|
||||
AllParametersAreInformative(false), DeclaringEntity(false) {}
|
||||
AllParametersAreInformative(false), DeclaringEntity(false),
|
||||
MacroDefInfo(MI) {}
|
||||
|
||||
/// Build a result that refers to a pattern.
|
||||
CodeCompletionResult(CodeCompletionString *Pattern,
|
||||
|
|
|
@ -3313,14 +3313,14 @@ static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
|
|||
M != MEnd; ++M) {
|
||||
auto MD = PP.getMacroDefinition(M->first);
|
||||
if (IncludeUndefined || MD) {
|
||||
if (MacroInfo *MI = MD.getMacroInfo())
|
||||
if (MI->isUsedForHeaderGuard())
|
||||
continue;
|
||||
MacroInfo *MI = MD.getMacroInfo();
|
||||
if (MI && MI->isUsedForHeaderGuard())
|
||||
continue;
|
||||
|
||||
Results.AddResult(Result(M->first,
|
||||
getMacroUsagePriority(M->first->getName(),
|
||||
PP.getLangOpts(),
|
||||
TargetTypeIsPointer)));
|
||||
Results.AddResult(
|
||||
Result(M->first, MI,
|
||||
getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
|
||||
TargetTypeIsPointer)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1412,16 +1412,16 @@ CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
|
|||
}
|
||||
} else if (kind == CXCursor_MacroDefinition) {
|
||||
const MacroDefinitionRecord *definition = getCursorMacroDefinition(cursor);
|
||||
const IdentifierInfo *MacroInfo = definition->getName();
|
||||
const IdentifierInfo *Macro = definition->getName();
|
||||
ASTUnit *unit = getCursorASTUnit(cursor);
|
||||
CodeCompletionResult Result(MacroInfo);
|
||||
CodeCompletionString *String
|
||||
= Result.CreateCodeCompletionString(unit->getASTContext(),
|
||||
unit->getPreprocessor(),
|
||||
CodeCompletionContext::CCC_Other,
|
||||
unit->getCodeCompletionTUInfo().getAllocator(),
|
||||
unit->getCodeCompletionTUInfo(),
|
||||
false);
|
||||
CodeCompletionResult Result(
|
||||
Macro,
|
||||
unit->getPreprocessor().getMacroDefinition(Macro).getMacroInfo());
|
||||
CodeCompletionString *String = Result.CreateCodeCompletionString(
|
||||
unit->getASTContext(), unit->getPreprocessor(),
|
||||
CodeCompletionContext::CCC_Other,
|
||||
unit->getCodeCompletionTUInfo().getAllocator(),
|
||||
unit->getCodeCompletionTUInfo(), false);
|
||||
return String;
|
||||
}
|
||||
return nullptr;
|
||||
|
|
Loading…
Reference in New Issue