forked from OSchip/llvm-project
[clangd] Enhance macro hover to see full definition
Summary: Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com> Reviewers: simark, ilya-biryukov, sammccall, ioeric, hokein Reviewed By: ilya-biryukov Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D55250 llvm-svn: 354761
This commit is contained in:
parent
b7918f3c14
commit
25e690273a
|
@ -558,13 +558,30 @@ static Hover getHoverContents(QualType T, ASTContext &ASTCtx) {
|
|||
return H;
|
||||
}
|
||||
|
||||
/// Generate a \p Hover object given the macro \p MacroInf.
|
||||
static Hover getHoverContents(llvm::StringRef MacroName) {
|
||||
/// Generate a \p Hover object given the macro \p MacroDecl.
|
||||
static Hover getHoverContents(MacroDecl Decl, ParsedAST &AST) {
|
||||
SourceManager &SM = AST.getASTContext().getSourceManager();
|
||||
std::string Definition = Decl.Name;
|
||||
|
||||
// Try to get the full definition, not just the name
|
||||
SourceLocation StartLoc = Decl.Info->getDefinitionLoc();
|
||||
SourceLocation EndLoc = Decl.Info->getDefinitionEndLoc();
|
||||
if (EndLoc.isValid()) {
|
||||
EndLoc = Lexer::getLocForEndOfToken(EndLoc, 0, SM,
|
||||
AST.getASTContext().getLangOpts());
|
||||
bool Invalid;
|
||||
StringRef Buffer = SM.getBufferData(SM.getFileID(StartLoc), &Invalid);
|
||||
if (!Invalid) {
|
||||
unsigned StartOffset = SM.getFileOffset(StartLoc);
|
||||
unsigned EndOffset = SM.getFileOffset(EndLoc);
|
||||
if (EndOffset <= Buffer.size() && StartOffset < EndOffset)
|
||||
Definition = Buffer.substr(StartOffset, EndOffset - StartOffset).str();
|
||||
}
|
||||
}
|
||||
|
||||
Hover H;
|
||||
|
||||
H.contents.value = "#define ";
|
||||
H.contents.value += MacroName;
|
||||
|
||||
H.contents.kind = MarkupKind::PlainText;
|
||||
H.contents.value = "#define " + Definition;
|
||||
return H;
|
||||
}
|
||||
|
||||
|
@ -688,7 +705,7 @@ llvm::Optional<Hover> getHover(ParsedAST &AST, Position Pos) {
|
|||
auto Symbols = getSymbolAtPosition(AST, SourceLocationBeg);
|
||||
|
||||
if (!Symbols.Macros.empty())
|
||||
return getHoverContents(Symbols.Macros[0].Name);
|
||||
return getHoverContents(Symbols.Macros[0], AST);
|
||||
|
||||
if (!Symbols.Decls.empty())
|
||||
return getHoverContents(Symbols.Decls[0]);
|
||||
|
|
|
@ -743,7 +743,25 @@ TEST(Hover, All) {
|
|||
#define MACRO 2
|
||||
#undef macro
|
||||
)cpp",
|
||||
"#define MACRO",
|
||||
"#define MACRO 1",
|
||||
},
|
||||
{
|
||||
R"cpp(// Macro
|
||||
#define MACRO 0
|
||||
#define MACRO2 ^MACRO
|
||||
)cpp",
|
||||
"#define MACRO 0",
|
||||
},
|
||||
{
|
||||
R"cpp(// Macro
|
||||
#define MACRO {\
|
||||
return 0;\
|
||||
}
|
||||
int main() ^MACRO
|
||||
)cpp",
|
||||
R"cpp(#define MACRO {\
|
||||
return 0;\
|
||||
})cpp",
|
||||
},
|
||||
{
|
||||
R"cpp(// Forward class declaration
|
||||
|
|
Loading…
Reference in New Issue