[PATCH] D127832: [clangd] Always desugar type aliases in hover
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 15 01:06:30 PDT 2022
kadircet created this revision.
kadircet added a reviewer: hokein.
Herald added subscribers: jeroen.dobbelaere, usaxena95, arphaman.
Herald added a project: All.
kadircet requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.
The alias itself is already included in the definition section of the
hover (it's printed as spelled in source code). So it doesn't provide any value
when we print the aliases as-is.
Fixes https://github.com/clangd/clangd/issues/1134.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D127832
Files:
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -3206,6 +3206,30 @@
ASSERT_TRUE(H);
EXPECT_EQ(H->Definition, "int arr[]");
}
+
+TEST(Hover, Typedefs) {
+ Annotations T(R"cpp(
+ template <bool X, typename T, typename F>
+ struct cond { using type = T; };
+ template <typename T, typename F>
+ struct cond<false, T, F> { using type = F; };
+
+ template <bool X, typename T, typename F>
+ using type = typename cond<X, T, F>::type;
+
+ void foo() {
+ using f^oo = type<true, int, double>;
+ }
+ )cpp");
+
+ TestTU TU = TestTU::withCode(T.code());
+ auto AST = TU.build();
+ auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+
+ ASSERT_TRUE(H && H->Type);
+ EXPECT_EQ(H->Type->Type, "int");
+ EXPECT_EQ(H->Definition, "using foo = type<true, int, double>");
+}
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -578,7 +578,7 @@
const SymbolIndex *Index,
const syntax::TokenBuffer &TB) {
HoverInfo HI;
- const ASTContext &Ctx = D->getASTContext();
+ ASTContext &Ctx = D->getASTContext();
HI.AccessSpecifier = getAccessSpelling(D->getAccess()).str();
HI.NamespaceScope = getNamespaceScope(D);
@@ -614,19 +614,17 @@
if (const FunctionDecl *FD = getUnderlyingFunction(D))
fillFunctionTypeAndParams(HI, D, FD, PP);
else if (const auto *VD = dyn_cast<ValueDecl>(D))
- HI.Type = printType(VD->getType(), VD->getASTContext(), PP);
+ HI.Type = printType(VD->getType(), Ctx, PP);
else if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(D))
HI.Type = TTP->wasDeclaredWithTypename() ? "typename" : "class";
else if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(D))
HI.Type = printType(TTP, PP);
else if (const auto *VT = dyn_cast<VarTemplateDecl>(D))
- HI.Type =
- printType(VT->getTemplatedDecl()->getType(), VT->getASTContext(), PP);
+ HI.Type = printType(VT->getTemplatedDecl()->getType(), Ctx, PP);
else if (const auto *TN = dyn_cast<TypedefNameDecl>(D))
- HI.Type = printType(TN->getUnderlyingType(), TN->getASTContext(), PP);
+ HI.Type = printType(TN->getUnderlyingType().getDesugaredType(Ctx), Ctx, PP);
else if (const auto *TAT = dyn_cast<TypeAliasTemplateDecl>(D))
- HI.Type = printType(TAT->getTemplatedDecl()->getUnderlyingType(),
- TAT->getASTContext(), PP);
+ HI.Type = printType(TAT->getTemplatedDecl()->getUnderlyingType(), Ctx, PP);
// Fill in value with evaluated initializer if possible.
if (const auto *Var = dyn_cast<VarDecl>(D)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127832.437068.patch
Type: text/x-patch
Size: 2947 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220615/e1daa954/attachment.bin>
More information about the cfe-commits
mailing list