forked from OSchip/llvm-project
[clangd] Collect missing macro references.
Summary: Semantic highlghting is missing a few macro references. Reviewers: ilya-biryukov Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68458 llvm-svn: 373889
This commit is contained in:
parent
6942327a8f
commit
2fa81d201f
|
@ -25,7 +25,8 @@ struct MainFileMacros {
|
||||||
std::vector<Range> Ranges;
|
std::vector<Range> Ranges;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Collects macro definitions and expansions in the main file. It is used to:
|
/// Collects macro references (e.g. definitions, expansions) in the main file.
|
||||||
|
/// It is used to:
|
||||||
/// - collect macros in the preamble section of the main file (in Preamble.cpp)
|
/// - collect macros in the preamble section of the main file (in Preamble.cpp)
|
||||||
/// - collect macros after the preamble of the main file (in ParsedAST.cpp)
|
/// - collect macros after the preamble of the main file (in ParsedAST.cpp)
|
||||||
class CollectMainFileMacros : public PPCallbacks {
|
class CollectMainFileMacros : public PPCallbacks {
|
||||||
|
@ -49,6 +50,27 @@ public:
|
||||||
add(MacroName, MD.getMacroInfo());
|
add(MacroName, MD.getMacroInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroUndefined(const clang::Token &MacroName,
|
||||||
|
const clang::MacroDefinition &MD,
|
||||||
|
const clang::MacroDirective *Undef) override {
|
||||||
|
add(MacroName, MD.getMacroInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ifdef(SourceLocation Loc, const Token &MacroName,
|
||||||
|
const MacroDefinition &MD) override {
|
||||||
|
add(MacroName, MD.getMacroInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ifndef(SourceLocation Loc, const Token &MacroName,
|
||||||
|
const MacroDefinition &MD) override {
|
||||||
|
add(MacroName, MD.getMacroInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Defined(const Token &MacroName, const MacroDefinition &MD,
|
||||||
|
SourceRange Range) override {
|
||||||
|
add(MacroName, MD.getMacroInfo());
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void add(const Token &MacroNameTok, const MacroInfo *MI) {
|
void add(const Token &MacroNameTok, const MacroInfo *MI) {
|
||||||
if (!InMainFile)
|
if (!InMainFile)
|
||||||
|
@ -57,7 +79,7 @@ private:
|
||||||
if (Loc.isMacroID())
|
if (Loc.isMacroID())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (auto Range = getTokenRange(SM, LangOpts, MacroNameTok.getLocation())) {
|
if (auto Range = getTokenRange(SM, LangOpts, Loc)) {
|
||||||
Out.Names.insert(MacroNameTok.getIdentifierInfo()->getName());
|
Out.Names.insert(MacroNameTok.getIdentifierInfo()->getName());
|
||||||
Out.Ranges.push_back(*Range);
|
Out.Ranges.push_back(*Range);
|
||||||
}
|
}
|
||||||
|
|
|
@ -475,6 +475,20 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
|
||||||
$Macro[[assert]]($Variable[[x]] != $Variable[[y]]);
|
$Macro[[assert]]($Variable[[x]] != $Variable[[y]]);
|
||||||
$Macro[[assert]]($Variable[[x]] != $Function[[f]]());
|
$Macro[[assert]]($Variable[[x]] != $Function[[f]]());
|
||||||
}
|
}
|
||||||
|
)cpp",
|
||||||
|
// highlighting all macro references
|
||||||
|
R"cpp(
|
||||||
|
#ifndef $Macro[[name]]
|
||||||
|
#define $Macro[[name]]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define $Macro[[test]]
|
||||||
|
#undef $Macro[[test]]
|
||||||
|
#ifdef $Macro[[test]]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined($Macro[[test]])
|
||||||
|
#endif
|
||||||
)cpp",
|
)cpp",
|
||||||
R"cpp(
|
R"cpp(
|
||||||
struct $Class[[S]] {
|
struct $Class[[S]] {
|
||||||
|
|
Loading…
Reference in New Issue