[clang-tools-extra] [clangd] Support go-to-definition on type hints. The core part (PR #86629)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Sat Jun 1 04:25:49 PDT 2024
================
@@ -1637,6 +1678,144 @@ TEST(TypeHints, SubstTemplateParameterAliases) {
ExpectedHint{": static_vector<int>", "vector_name"});
}
+template <typename... Labels>
+void assertTypeLinkHints(StringRef Code, StringRef HintRange,
+ Labels... ExpectedLabels) {
+ Annotations Source(Code);
+ auto HintAt = [&](llvm::ArrayRef<InlayHint> InlayHints,
+ llvm::StringRef Range) {
+ auto *Hint = llvm::find_if(InlayHints, [&](const InlayHint &InlayHint) {
+ return InlayHint.range == Source.range(Range);
+ });
+ assert(Hint && "No range was found");
+ return llvm::ArrayRef(Hint->label);
+ };
+
+ TestTU TU = TestTU::withCode(Source.code());
+ TU.ExtraArgs.push_back("-std=c++2c");
+ auto AST = TU.build();
+
+ Config C;
+ C.InlayHints.TypeNameLimit = 0;
+ WithContextValue WithCfg(Config::Key, std::move(C));
+
+ auto Hints = hintsOfKind(AST, InlayHintKind::Type);
+ EXPECT_THAT(HintAt(Hints, HintRange),
+ ElementsAre(HintLabelPieceMatcher(ExpectedLabels, Source)...));
+}
+
+TEST(TypeHints, Links) {
+ StringRef Source(R"cpp(
+ $Package[[template <class T, class U>
+ struct Package {]]};
+
+ $SpecializationOfPackage[[template <>
+ struct Package<float, const int> {]]};
+
+ $Container[[template <class... T>
+ struct Container {]]};
+
+ $NttpContainer[[template <auto... T>
+ struct NttpContainer {]]};
+
+ enum struct ScopedEnum {
+ X = 1,
+ };
+
+ enum Enum {
+ E = 2,
+ };
+
+ namespace ns {
+ $Nested[[template <class T>
+ struct Nested {
+ $NestedClass[[template <class U>
+ struct ]]Class {
+ };
+ ]]};
+
+ $NestedInt[[using NestedInt = Nested<int]]>;
+ }
+
+ void basic() {
+ auto $1[[C]] = Container<Package<char, int>>();
+ auto $2[[D]] = Container<Package<float, const int>>();
+ auto $3[[E]] = Container<Container<int, int>, long>();
+ auto $4[[F]] = NttpContainer<D, E, ScopedEnum::X, Enum::E>();
+ auto $5[[G]] = ns::Nested<Container<int>>::Class<Package<char, int>>();
+ }
+
+ void compounds() {
+ auto $6[[A]] = Container<ns::Nested<int>::Class<float>&>();
+ auto $7[[B]] = Container<ns::Nested<int>::Class<float>&&>();
+ auto $8[[C]] = Container<ns::Nested<int>::Class<const Container<int>> *>();
+ }
+
+ namespace nns {
+ $UsingShadow[[using ns::]]NestedInt;
+
+ void aliases() {
+ auto $9[[A]] = Container<NestedInt>();
+ auto $10[[B]] = Container<ns::NestedInt>();
+ }
+ }
+
+ )cpp");
+
+ assertTypeLinkHints(Source, "1", ExpectedHintLabelPiece{": Container<"},
----------------
zyn0217 wrote:
Thanks! That makes sense and I'll take that.
https://github.com/llvm/llvm-project/pull/86629
More information about the cfe-commits
mailing list