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)) {
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)) {
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits