kadircet updated this revision to Diff 234050. kadircet marked 9 inline comments as done. kadircet added a comment.
- Address comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71543/new/ https://reviews.llvm.org/D71543 Files: clang-tools-extra/clangd/AST.cpp 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 @@ -104,7 +104,7 @@ }} )cpp", [](HoverInfo &HI) { - HI.NamespaceScope = "ns1::(anonymous)::"; + HI.NamespaceScope = "ns1::"; HI.LocalScope = "(anonymous struct)::"; HI.Name = "bar"; HI.Kind = index::SymbolKind::Field; @@ -362,7 +362,8 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "class (lambda)"; + // FIXME: Special case lambdas. + HI.Name = "(anonymous class)"; HI.Kind = index::SymbolKind::Class; }}, // auto on template instantiation @@ -373,7 +374,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "class Foo<int>"; + HI.Name = "Foo"; HI.Kind = index::SymbolKind::Class; }}, // auto on specialized template @@ -385,7 +386,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "class Foo<int>"; + HI.Name = "Foo<int>"; HI.Kind = index::SymbolKind::Class; }}, @@ -524,6 +525,32 @@ HI.NamespaceScope = ""; HI.LocalScope = "boom::"; }}, + { + R"cpp(// Should not print inline or anon namespaces. + namespace ns { + inline namespace in_ns { + namespace a { + namespace { + namespace b { + inline namespace in_ns2 { + class Foo {}; + } // in_ns2 + } // b + } // anon + } // a + } // in_ns + } // ns + void foo() { + ns::a::b::[[F^oo]] x; + (void)x; + } + )cpp", + [](HoverInfo &HI) { + HI.Name = "Foo"; + HI.Kind = index::SymbolKind::Class; + HI.NamespaceScope = "ns::a::b::"; + HI.Definition = "class Foo {}"; + }}, }; for (const auto &Case : Cases) { SCOPED_TRACE(Case.Code); @@ -895,7 +922,7 @@ [](HoverInfo &HI) { HI.Name = "foo"; HI.Kind = index::SymbolKind::Variable; - HI.NamespaceScope = "ns::(anonymous)::"; + HI.NamespaceScope = "ns::"; HI.Type = "int"; HI.Definition = "int foo"; }}, @@ -1173,7 +1200,8 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "class std::initializer_list<int>"; + // FIXME: Print template instantiation parameters. + HI.Name = "initializer_list"; HI.Kind = index::SymbolKind::Class; }}, { @@ -1231,7 +1259,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1242,7 +1270,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1253,7 +1281,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1265,7 +1293,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1277,7 +1305,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1289,7 +1317,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1300,7 +1328,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { @@ -1364,7 +1392,7 @@ } )cpp", [](HoverInfo &HI) { - HI.Name = "struct Bar"; + HI.Name = "Bar"; HI.Kind = index::SymbolKind::Struct; }}, { Index: clang-tools-extra/clangd/Hover.cpp =================================================================== --- clang-tools-extra/clangd/Hover.cpp +++ clang-tools-extra/clangd/Hover.cpp @@ -19,9 +19,12 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/ASTTypeTraits.h" +#include "clang/AST/Decl.h" +#include "clang/AST/DeclBase.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/PrettyPrinter.h" #include "clang/Index/IndexSymbol.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/raw_ostream.h" namespace clang { @@ -72,12 +75,17 @@ std::string getNamespaceScope(const Decl *D) { const DeclContext *DC = D->getDeclContext(); - if (const TypeDecl *TD = dyn_cast<TypeDecl>(DC)) + if (const TagDecl *TD = dyn_cast<TagDecl>(DC)) return getNamespaceScope(TD); if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(DC)) return getNamespaceScope(FD); + if (const NamespaceDecl *NSD = dyn_cast<NamespaceDecl>(DC)) { + // Skip inline/anon namespaces. + if (NSD->isInline() || NSD->isAnonymousNamespace()) + return getNamespaceScope(NSD); + } if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) - return ND->getQualifiedNameAsString(); + return printQualifiedName(*ND); return ""; } @@ -343,17 +351,25 @@ /// Generate a \p Hover object given the type \p T. HoverInfo getHoverContents(QualType T, const Decl *D, ASTContext &ASTCtx, - const SymbolIndex *Index) { + const SymbolIndex *Index) { HoverInfo HI; - llvm::raw_string_ostream OS(HI.Name); - PrintingPolicy Policy = printingPolicyForDecls(ASTCtx.getPrintingPolicy()); - T.print(OS, Policy); - OS.flush(); + if (!D) + D = T->getAsTagDecl(); if (D) { + if (const auto *ND = llvm::dyn_cast<NamedDecl>(D)) + HI.Name = printName(ASTCtx, *ND); HI.Kind = index::getSymbolInfo(D).Kind; enhanceFromIndex(HI, D, Index); } + + if (HI.Name.empty()) { + // Builtin types + llvm::raw_string_ostream OS(HI.Name); + PrintingPolicy Policy = printingPolicyForDecls(ASTCtx.getPrintingPolicy()); + T.print(OS, Policy); + OS.flush(); + } return HI; } Index: clang-tools-extra/clangd/AST.cpp =================================================================== --- clang-tools-extra/clangd/AST.cpp +++ clang-tools-extra/clangd/AST.cpp @@ -12,6 +12,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclarationName.h" #include "clang/AST/NestedNameSpecifier.h"
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits