================
@@ -5163,6 +5163,92 @@ TEST(CompletionTest, FuzzyMatchMacro) {
}
}
+static void configureHLSL(TestTU &TU, bool EnableMatrix = false) {
+ TU.Filename = "TestTU.hlsl";
+ TU.ExtraArgs.push_back("-x");
+ TU.ExtraArgs.push_back("hlsl");
+ if (EnableMatrix)
+ TU.ExtraArgs.push_back("-fenable-matrix");
+ TU.ExtraArgs.push_back("--target=dxil-pc-shadermodel6.3-library");
+}
+
+TEST(CompletionTest, HLSLVectorSwizzle) {
+ // v. -> suggests individual components, both xyzw and rgba sets.
+ Annotations Dot(R"hlsl(
+ typedef float float3 __attribute__((ext_vector_type(3)));
+ void main() {
+ float3 v;
+ v.^
+ }
+ )hlsl");
+ TestTU TUDot = TestTU::withCode(Dot.code());
+ configureHLSL(TUDot);
+ auto ResultsDot = completions(TUDot, Dot.point());
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "x")));
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "y")));
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "z")));
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "r")));
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "g")));
+ EXPECT_THAT(ResultsDot.Completions,
+ Contains(Field(&CodeCompletion::Name, "b")));
+ // float3 has no 4th component.
+ EXPECT_THAT(ResultsDot.Completions,
+ Not(Contains(Field(&CodeCompletion::Name, "w"))));
+ EXPECT_THAT(ResultsDot.Completions,
+ Not(Contains(Field(&CodeCompletion::Name, "a"))));
+
+ // v.x -> continuation locked to the xyzw set, rgba excluded.
+ Annotations Partial(R"hlsl(
+ typedef float float3 __attribute__((ext_vector_type(3)));
+ void main() {
+ float3 v;
+ v.x^
+ }
+ )hlsl");
+ TestTU TUPartial = TestTU::withCode(Partial.code());
+ configureHLSL(TUPartial);
+ auto ResultsPartial = completions(TUPartial, Partial.point());
+ EXPECT_THAT(ResultsPartial.Completions,
+ Contains(Field(&CodeCompletion::Name, "xx")));
+ EXPECT_THAT(ResultsPartial.Completions,
+ Contains(Field(&CodeCompletion::Name, "xy")));
+ EXPECT_THAT(ResultsPartial.Completions,
+ Contains(Field(&CodeCompletion::Name, "xz")));
+ EXPECT_THAT(ResultsPartial.Completions,
+ Not(Contains(Field(&CodeCompletion::Name, "xr"))));
+
+ // v.xr -> mixing xyzw and rgba is invalid, no suggestions.
+ Annotations Mixed(R"hlsl(
+ typedef float float3 __attribute__((ext_vector_type(3)));
+ void main() {
+ float3 v;
+ v.xr^
+ }
+ )hlsl");
+ TestTU TUMixed = TestTU::withCode(Mixed.code());
+ configureHLSL(TUMixed);
+ auto ResultsMixed = completions(TUMixed, Mixed.point());
+ EXPECT_THAT(ResultsMixed.Completions, IsEmpty());
+
+ // v.xyzw -> already at the 4-component maximum, no more suggestions.
----------------
V-FEXrt wrote:
we need a test for a long vector ala `vector<float, 5>` that returns no
completions
https://github.com/llvm/llvm-project/pull/217381
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits