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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits