[clang-tools-extra] 2982bd9 - [clangd] Use the active file's language for hover code blocks
David Goldman via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 3 08:38:44 PDT 2021
Author: David Goldman
Date: 2021-09-03T11:38:27-04:00
New Revision: 2982bd9e9b58ea17bc047ffb9b28df6f92531287
URL: https://github.com/llvm/llvm-project/commit/2982bd9e9b58ea17bc047ffb9b28df6f92531287
DIFF: https://github.com/llvm/llvm-project/commit/2982bd9e9b58ea17bc047ffb9b28df6f92531287.diff
LOG: [clangd] Use the active file's language for hover code blocks
This helps improve the syntax highlighting for Objective-C code,
although it currently doesn't work well in VS Code with
methods/properties/ivars since we don't currently include the proper
decl context (e.g. class).
Differential Revision: https://reviews.llvm.org/D108584
Added:
Modified:
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index 763125cd10f5f..8ef7d20c1d535 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -131,6 +131,13 @@ std::string printDefinition(const Decl *D, const PrintingPolicy &PP) {
return Definition;
}
+const char *getMarkdownLanguage(const ASTContext &Ctx) {
+ const auto &LangOpts = Ctx.getLangOpts();
+ if (LangOpts.ObjC && LangOpts.CPlusPlus)
+ return "objective-cpp";
+ return LangOpts.ObjC ? "objective-c" : "cpp";
+}
+
std::string printType(QualType QT, const PrintingPolicy &PP) {
// TypePrinter doesn't resolve decltypes, so resolve them here.
// FIXME: This doesn't handle composite types that contain a decltype in them.
@@ -1007,6 +1014,7 @@ llvm::Optional<HoverInfo> getHover(ParsedAST &AST, Position Pos,
if (auto Formatted =
tooling::applyAllReplacements(HI->Definition, Replacements))
HI->Definition = *Formatted;
+ HI->DefinitionLanguage = getMarkdownLanguage(AST.getASTContext());
HI->SymRange = halfOpenToRange(SM, HighlightRange);
return HI;
diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 457cc55dd19a0..72efe5ab6ad87 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -939,6 +939,39 @@ class Foo {})cpp";
}
}
+TEST(Hover, DefinitionLanuage) {
+ struct {
+ const char *const Code;
+ const std::string ClangLanguageFlag;
+ const char *const ExpectedDefinitionLanguage;
+ } Cases[] = {{R"cpp(
+ void [[some^Global]]() {}
+ )cpp",
+ "", "cpp"},
+ {R"cpp(
+ void [[some^Global]]() {}
+ )cpp",
+ "-xobjective-c++", "objective-cpp"},
+ {R"cpp(
+ void [[some^Global]]() {}
+ )cpp",
+ "-xobjective-c", "objective-c"}};
+ for (const auto &Case : Cases) {
+ SCOPED_TRACE(Case.Code);
+
+ Annotations T(Case.Code);
+ TestTU TU = TestTU::withCode(T.code());
+ if (!Case.ClangLanguageFlag.empty())
+ TU.ExtraArgs.push_back(Case.ClangLanguageFlag);
+ auto AST = TU.build();
+
+ auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+ ASSERT_TRUE(H);
+
+ EXPECT_STREQ(H->DefinitionLanguage, Case.ExpectedDefinitionLanguage);
+ }
+}
+
TEST(Hover, CallPassType) {
const llvm::StringRef CodePrefix = R"cpp(
class Base {};
More information about the cfe-commits
mailing list