diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/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(D)) - HI.Type = printType(VD->getType(), VD->getASTContext(), PP); + HI.Type = printType(VD->getType(), Ctx, PP); else if (const auto *TTP = dyn_cast(D)) HI.Type = TTP->wasDeclaredWithTypename() ? "typename" : "class"; else if (const auto *TTP = dyn_cast(D)) HI.Type = printType(TTP, PP); else if (const auto *VT = dyn_cast(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(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(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(D)) { diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/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 + struct cond { using type = T; }; + template + struct cond { using type = F; }; + + template + using type = typename cond::type; + + void foo() { + using f^oo = type; + } + )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"); +} } // namespace } // namespace clangd } // namespace clang