================ @@ -1637,6 +1678,168 @@ TEST(TypeHints, SubstTemplateParameterAliases) { ExpectedHint{": static_vector<int>", "vector_name"}); } +template <typename... Labels> +void assertTypeLinkHints(StringRef Code, StringRef HintRange, + Labels... ExpectedLabels) { + Annotations Source(Code); + + 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); + auto Hint = llvm::find_if(Hints, [&](const InlayHint &InlayHint) { + return InlayHint.range == Source.range(HintRange); + }); + ASSERT_TRUE(Hint != Hints.end()) << "No hint was found at " << HintRange; + EXPECT_THAT(Hint->label, + ElementsAre(HintLabelPieceMatcher(ExpectedLabels, Source)...)); +} + +TEST(TypeHints, Links) { + StringRef Source(R"cpp( + template <class T, class U> + struct $Package[[Package]] {}; + + template <> + struct $SpecializationOfPackage[[Package]]<float, const int> {}; + + template <class... T> + struct $Container[[Container]] {}; + + template <auto... T> + struct $NttpContainer[[NttpContainer]] {}; + + enum struct $ScopedEnum[[ScopedEnum]] { + X = 1, + }; + + enum $Enum[[Enum]] { + E = 2, + }; + + namespace ns { + template <class T> + struct $Nested[[Nested]] { + template <class U> + struct $NestedClass[[Class]] { + }; + }; + + using $NestedInt[[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 { + using ns::$UsingShadow[[NestedInt]]; + + void aliases() { + auto $9[[A]] = Container<NestedInt>(); + auto $10[[B]] = Container<ns::NestedInt>(); + } + } + + auto $11[[A]] = Container<Enum, ScopedEnum>(); + + )cpp"); + assertTypeLinkHints(Source, "1", ExpectedHintLabelPiece{": "}, + ExpectedHintLabelPiece{"Container", "Container"}, + ExpectedHintLabelPiece{"<"}, + ExpectedHintLabelPiece{"Package", "Package"}, + ExpectedHintLabelPiece{"<char, int>>"}); + + assertTypeLinkHints( + Source, "2", ExpectedHintLabelPiece{": "}, + ExpectedHintLabelPiece{"Container", "Container"}, + ExpectedHintLabelPiece{"<"}, + ExpectedHintLabelPiece{"Package", "SpecializationOfPackage"}, + ExpectedHintLabelPiece{"<float, const int>>"}); + + assertTypeLinkHints(Source, "3", ExpectedHintLabelPiece{": "}, + ExpectedHintLabelPiece{"Container", "Container"}, + ExpectedHintLabelPiece{"<"}, + ExpectedHintLabelPiece{"Container", "Container"}, + ExpectedHintLabelPiece{"<int, int>, long>"}); + + // TODO: Support links on NTTP arguments. + assertTypeLinkHints(Source, "4", ExpectedHintLabelPiece{": "}, + ExpectedHintLabelPiece{"NttpContainer", "NttpContainer"}, + ExpectedHintLabelPiece{"<D, E, ScopedEnum::X, Enum::E>"}); + + assertTypeLinkHints(Source, "5", ExpectedHintLabelPiece{": "}, + ExpectedHintLabelPiece{"ns::Nested", "Nested"}, ---------------- HighCommander4 wrote:
Maybe it's because my baseline is some weeks behind HEAD, and something in the upstream behaviour changed. I will update and re-test, please feel free to ignore this for now. https://github.com/llvm/llvm-project/pull/86629 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits