summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-check-expr.cpp166
-rw-r--r--source/slang/slang-check-overload.cpp18
-rw-r--r--source/slang/slang-language-server-completion.cpp29
-rw-r--r--source/slang/slang-language-server-completion.h5
-rw-r--r--tests/bugs/invalid-swizzle-count.slang4
-rw-r--r--tests/diagnostics/matrix-swizzle.slang.expected26
-rw-r--r--tests/front-end/matrix-member.slang17
-rw-r--r--tests/front-end/scalar-member.slang17
-rw-r--r--tests/front-end/vector-member.slang17
-rw-r--r--tests/language-server/member-completion-broken-syntax-3.slang10
-rw-r--r--tests/language-server/scalar-member.slang9
-rw-r--r--tests/language-server/vector-member.slang7
-rw-r--r--tools/slang-test/slang-test-main.cpp18
13 files changed, 200 insertions, 143 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index b249bb343..b730069b6 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -4136,12 +4136,6 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
IntegerLiteralValue baseElementRowCount,
IntegerLiteralValue baseElementColCount)
{
- MatrixSwizzleExpr* swizExpr = m_astBuilder->create<MatrixSwizzleExpr>();
- swizExpr->loc = memberRefExpr->loc;
- swizExpr->base = memberRefExpr->baseExpression;
- swizExpr->memberOpLoc = memberRefExpr->memberOperatorLoc;
- swizExpr->checked = true;
-
// We can have up to 4 swizzles of two elements each
MatrixCoord elementCoords[4];
int elementCount = 0;
@@ -4170,24 +4164,14 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
// Throw out swizzling with more than 4 output elements
if (elementCount >= 4)
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
MatrixCoord elementCoord = {0, 0};
// Check for the preceding underscore
if (*cursor++ != '_')
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
// Check for one or zero indexing
@@ -4196,12 +4180,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
// Can't mix one and zero indexing
if (zeroIndexOffset == 1)
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
zeroIndexOffset = 0;
// Increment the index since we saw 'm'
@@ -4212,12 +4191,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
// Can't mix one and zero indexing
if (zeroIndexOffset == 0)
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
zeroIndexOffset = 1;
}
@@ -4229,13 +4203,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
if (ch < '0' || ch > '4')
{
- // An invalid character in the swizzle is an error
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
const int subIndex = ch - '0' - zeroIndexOffset;
@@ -4255,12 +4223,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
// Account for off-by-one and reject 0 if oneIndexed
if (subIndex >= elementLimit || subIndex < 0)
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
}
// Check if we've seen this index before
@@ -4275,6 +4238,12 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
elementCount++;
}
+ MatrixSwizzleExpr* swizExpr = m_astBuilder->create<MatrixSwizzleExpr>();
+ swizExpr->loc = memberRefExpr->loc;
+ swizExpr->base = memberRefExpr->baseExpression;
+ swizExpr->memberOpLoc = memberRefExpr->memberOperatorLoc;
+ swizExpr->checked = true;
+
// Store our list in the actual AST node
for (int ee = 0; ee < elementCount; ++ee)
{
@@ -4324,11 +4293,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
constantColCount->getValue());
}
}
- getSink()->diagnose(
- memberRefExpr,
- Diagnostics::unimplemented,
- "swizzle on matrix of unknown size");
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
Expr* SemanticsVisitor::checkTupleSwizzleExpr(MemberExpr* memberExpr, TupleType* baseTupleType)
@@ -4439,26 +4404,13 @@ Expr* SemanticsVisitor::CheckSwizzleExpr(
Type* baseElementType,
IntegerLiteralValue baseElementCount)
{
- SwizzleExpr* swizExpr = m_astBuilder->create<SwizzleExpr>();
- swizExpr->loc = memberRefExpr->loc;
- swizExpr->base = memberRefExpr->baseExpression;
- swizExpr->memberOpLoc = memberRefExpr->memberOperatorLoc;
IntegerLiteralValue limitElement = baseElementCount;
ShortList<uint32_t, 4> elementIndices;
bool anyDuplicates = false;
bool anyError = false;
- if (memberRefExpr->name == getSession()->getCompletionRequestTokenName())
- {
- auto& suggestions = getLinkage()->contentAssistInfo.completionSuggestions;
- suggestions.clear();
- suggestions.scopeKind = CompletionSuggestions::ScopeKind::Swizzle;
- suggestions.swizzleBaseType =
- memberRefExpr->baseExpression ? memberRefExpr->baseExpression->type : nullptr;
- suggestions.elementCount[0] = baseElementCount;
- suggestions.elementCount[1] = 0;
- }
+
auto swizzleText = getText(memberRefExpr->name);
for (Index i = 0; i < swizzleText.getLength(); i++)
@@ -4518,18 +4470,18 @@ Expr* SemanticsVisitor::CheckSwizzleExpr(
elementIndices.add(elementIndex);
}
- swizExpr->elementIndices = _Move(elementIndices);
-
if (anyError)
{
- getSink()->diagnose(
- swizExpr,
- Diagnostics::invalidSwizzleExpr,
- swizzleText,
- baseElementType->toString());
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
- else if (swizExpr->elementIndices.getCount() == 1)
+
+ SwizzleExpr* swizExpr = m_astBuilder->create<SwizzleExpr>();
+ swizExpr->loc = memberRefExpr->loc;
+ swizExpr->base = memberRefExpr->baseExpression;
+ swizExpr->memberOpLoc = memberRefExpr->memberOperatorLoc;
+ swizExpr->elementIndices = _Move(elementIndices);
+
+ if (swizExpr->elementIndices.getCount() == 1)
{
// single-component swizzle produces a scalar
//
@@ -4568,11 +4520,7 @@ Expr* SemanticsVisitor::CheckSwizzleExpr(
}
else
{
- getSink()->diagnose(
- memberRefExpr,
- Diagnostics::unimplemented,
- "swizzle on vector of unknown size");
- return CreateErrorExpr(memberRefExpr);
+ return nullptr;
}
}
@@ -4914,6 +4862,28 @@ Expr* SemanticsVisitor::checkGeneralMemberLookupExpr(MemberExpr* expr, Type* bas
if (expr->name == getSession()->getCompletionRequestTokenName())
{
suggestCompletionItems(CompletionSuggestions::ScopeKind::Member, lookupResult);
+ if (expr->baseExpression)
+ {
+ if (auto vectorType = as<VectorExpressionType>(expr->baseExpression->type))
+ {
+ auto& suggestions = getLinkage()->contentAssistInfo.completionSuggestions;
+ suggestions.scopeKind = CompletionSuggestions::ScopeKind::Swizzle;
+ suggestions.elementCount[1] = 0;
+ suggestions.swizzleBaseType = vectorType;
+ if (auto elementCount = as<ConstantIntVal>(vectorType->getElementCount()))
+ suggestions.elementCount[0] = elementCount->getValue();
+ else
+ suggestions.elementCount[0] = 1;
+ }
+ else if (auto scalarType = as<BasicExpressionType>(expr->baseExpression->type))
+ {
+ auto& suggestions = getLinkage()->contentAssistInfo.completionSuggestions;
+ suggestions.scopeKind = CompletionSuggestions::ScopeKind::Swizzle;
+ suggestions.elementCount[1] = 0;
+ suggestions.elementCount[0] = 1;
+ suggestions.swizzleBaseType = scalarType;
+ }
+ }
}
return createLookupResultExpr(expr->name, lookupResult, expr->baseExpression, expr->loc, expr);
}
@@ -4942,34 +4912,36 @@ Expr* SemanticsExprVisitor::visitMemberExpr(MemberExpr* expr)
if (auto modifiedType = as<ModifiedType>(baseType))
baseType = modifiedType->getBase();
- // Note: Checking for vector types before declaration-reference types,
- // because vectors are also declaration reference types...
+ // Try handle swizzle-able types (scalar,vector,matrix) first.
+ // If checking as a swizzle failed for these types,
+ // we will fallback to normal member lookup.
//
- // Also note: the way this is done right now means that the ability
- // to swizzle vectors interferes with any chance of looking up
- // members via extension, for vector or scalar types.
- //
- if (auto baseMatrixType = as<MatrixExpressionType>(baseType))
+ if (auto baseScalarType = as<BasicExpressionType>(baseType))
{
- return CheckMatrixSwizzleExpr(
- expr,
- baseMatrixType->getElementType(),
- baseMatrixType->getRowCount(),
- baseMatrixType->getColumnCount());
+ // Treat scalar like a 1-element vector when swizzling
+ auto swizzle = CheckSwizzleExpr(expr, baseScalarType, 1);
+ if (swizzle)
+ return swizzle;
}
- if (auto baseVecType = as<VectorExpressionType>(baseType))
+ else if (auto baseVecType = as<VectorExpressionType>(baseType))
{
- return CheckSwizzleExpr(
- expr,
- baseVecType->getElementType(),
- baseVecType->getElementCount());
+ auto swizzle =
+ CheckSwizzleExpr(expr, baseVecType->getElementType(), baseVecType->getElementCount());
+ if (swizzle)
+ return swizzle;
}
- else if (auto baseScalarType = as<BasicExpressionType>(baseType))
+ else if (auto baseMatrixType = as<MatrixExpressionType>(baseType))
{
- // Treat scalar like a 1-element vector when swizzling
- return CheckSwizzleExpr(expr, baseScalarType, 1);
+ auto swizzle = CheckMatrixSwizzleExpr(
+ expr,
+ baseMatrixType->getElementType(),
+ baseMatrixType->getRowCount(),
+ baseMatrixType->getColumnCount());
+ if (swizzle)
+ return swizzle;
}
- else if (as<NamespaceType>(baseType))
+
+ if (as<NamespaceType>(baseType))
{
return _lookupStaticMember(expr, expr->baseExpression);
}
diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp
index 5e55eb70f..21fc21df6 100644
--- a/source/slang/slang-check-overload.cpp
+++ b/source/slang/slang-check-overload.cpp
@@ -1316,15 +1316,17 @@ int SemanticsVisitor::CompareLookupResultItems(
// Add a special case for constructors, where we prefer the one that is not synthesized,
if (auto leftCtor = as<ConstructorDecl>(left.declRef.getDecl()))
{
- auto rightCtor = as<ConstructorDecl>(right.declRef.getDecl());
- bool leftIsSynthesized =
- leftCtor->containsFlavor(ConstructorDecl::ConstructorFlavor::SynthesizedDefault);
- bool rightIsSynthesized =
- rightCtor->containsFlavor(ConstructorDecl::ConstructorFlavor::SynthesizedDefault);
-
- if (leftIsSynthesized != rightIsSynthesized)
+ if (auto rightCtor = as<ConstructorDecl>(right.declRef.getDecl()))
{
- return int(leftIsSynthesized) - int(rightIsSynthesized);
+ bool leftIsSynthesized = leftCtor->containsFlavor(
+ ConstructorDecl::ConstructorFlavor::SynthesizedDefault);
+ bool rightIsSynthesized = rightCtor->containsFlavor(
+ ConstructorDecl::ConstructorFlavor::SynthesizedDefault);
+
+ if (leftIsSynthesized != rightIsSynthesized)
+ {
+ return int(leftIsSynthesized) - int(rightIsSynthesized);
+ }
}
}
diff --git a/source/slang/slang-language-server-completion.cpp b/source/slang/slang-language-server-completion.cpp
index 77ed33002..1e5bae4b0 100644
--- a/source/slang/slang-language-server-completion.cpp
+++ b/source/slang/slang-language-server-completion.cpp
@@ -512,11 +512,14 @@ LanguageServerResult<CompletionResult> CompletionContext::tryCompleteMemberAndSy
CompletionResult CompletionContext::collectMembersAndSymbols()
{
+ List<LanguageServerProtocol::CompletionItem> result;
+
auto linkage = version->linkage;
if (linkage->contentAssistInfo.completionSuggestions.scopeKind ==
CompletionSuggestions::ScopeKind::Swizzle)
{
- return createSwizzleCandidates(
+ createSwizzleCandidates(
+ result,
linkage->contentAssistInfo.completionSuggestions.swizzleBaseType,
linkage->contentAssistInfo.completionSuggestions.elementCount);
}
@@ -526,12 +529,12 @@ CompletionResult CompletionContext::collectMembersAndSymbols()
{
return createCapabilityCandidates();
}
- List<LanguageServerProtocol::CompletionItem> result;
bool useCommitChars = true;
bool addKeywords = false;
switch (linkage->contentAssistInfo.completionSuggestions.scopeKind)
{
case CompletionSuggestions::ScopeKind::Member:
+ case CompletionSuggestions::ScopeKind::Swizzle:
useCommitChars =
(commitCharacterBehavior == CommitCharacterBehavior::MembersOnly ||
commitCharacterBehavior == CommitCharacterBehavior::All);
@@ -698,13 +701,12 @@ CompletionResult CompletionContext::createCapabilityCandidates()
return result;
}
-CompletionResult CompletionContext::createSwizzleCandidates(
+void CompletionContext::createSwizzleCandidates(
+ List<LanguageServerProtocol::CompletionItem>& result,
Type* type,
IntegerLiteralValue elementCount[2])
{
- List<LanguageServerProtocol::CompletionItem> result;
// Hard code members for vector and matrix types.
- result.clear();
if (auto vectorType = as<VectorExpressionType>(type))
{
const char* memberNames[4] = {"x", "y", "z", "w"};
@@ -724,6 +726,17 @@ CompletionResult CompletionContext::createSwizzleCandidates(
result.add(item);
}
}
+ else if (auto scalarType = as<BasicExpressionType>(type))
+ {
+ String typeStr;
+ typeStr = scalarType->toString();
+ LanguageServerProtocol::CompletionItem item;
+ item.data = 0;
+ item.detail = typeStr;
+ item.kind = LanguageServerProtocol::kCompletionItemKindVariable;
+ item.label = "x";
+ result.add(item);
+ }
else if (auto matrixType = as<MatrixExpressionType>(type))
{
Type* elementType = nullptr;
@@ -769,12 +782,6 @@ CompletionResult CompletionContext::createSwizzleCandidates(
result.add(item);
}
}
- for (auto& item : result)
- {
- for (auto ch : getCommitChars())
- item.commitCharacters.add(ch);
- }
- return result;
}
LanguageServerProtocol::CompletionItem CompletionContext::generateGUIDCompletionItem()
diff --git a/source/slang/slang-language-server-completion.h b/source/slang/slang-language-server-completion.h
index 560702dea..fab1c8a75 100644
--- a/source/slang/slang-language-server-completion.h
+++ b/source/slang/slang-language-server-completion.h
@@ -55,7 +55,10 @@ struct CompletionContext
CompletionResult collectMembersAndSymbols();
- CompletionResult createSwizzleCandidates(Type* baseType, IntegerLiteralValue elementCount[2]);
+ void createSwizzleCandidates(
+ List<LanguageServerProtocol::CompletionItem>& result,
+ Type* type,
+ IntegerLiteralValue elementCount[2]);
CompletionResult createCapabilityCandidates();
CompletionResult collectAttributes();
LanguageServerProtocol::CompletionItem generateGUIDCompletionItem();
diff --git a/tests/bugs/invalid-swizzle-count.slang b/tests/bugs/invalid-swizzle-count.slang
index 811cf6f44..93cb1fdcc 100644
--- a/tests/bugs/invalid-swizzle-count.slang
+++ b/tests/bugs/invalid-swizzle-count.slang
@@ -1,6 +1,6 @@
//TEST:SIMPLE(filecheck=CHECK): -target spirv -stage compute -entry computeMain -emit-spirv-directly
-// CHECK: error 30052
-// CHECK-NOT: error 30052
+// CHECK: error 30027
+// CHECK-NOT: error 30027
RWStructuredBuffer<float> outputBuffer;
[numthreads(1,1,1)]
diff --git a/tests/diagnostics/matrix-swizzle.slang.expected b/tests/diagnostics/matrix-swizzle.slang.expected
index 832ddd739..3c8853161 100644
--- a/tests/diagnostics/matrix-swizzle.slang.expected
+++ b/tests/diagnostics/matrix-swizzle.slang.expected
@@ -1,42 +1,42 @@
result code = -1
standard error = {
-tests/diagnostics/matrix-swizzle.slang(8): error 30052: invalid swizzle pattern '_14' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(8): error 30027: '_14' is not a member of 'matrix<int,2,3>'.
int c = m1._14; // Out of bounds
^~~
-tests/diagnostics/matrix-swizzle.slang(9): error 30052: invalid swizzle pattern '_32' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(9): error 30027: '_32' is not a member of 'matrix<int,2,3>'.
c = m1._32;
^~~
-tests/diagnostics/matrix-swizzle.slang(10): error 30052: invalid swizzle pattern '_m22' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(10): error 30027: '_m22' is not a member of 'matrix<int,3,2>'.
c = m2._m22;
^~~~
-tests/diagnostics/matrix-swizzle.slang(11): error 30052: invalid swizzle pattern '_' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(11): error 30027: '_' is not a member of 'matrix<int,3,2>'.
c = m2._; // unfinished
^
-tests/diagnostics/matrix-swizzle.slang(12): error 30052: invalid swizzle pattern '_m' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(12): error 30027: '_m' is not a member of 'matrix<int,3,2>'.
c = m2._m;
^~
-tests/diagnostics/matrix-swizzle.slang(13): error 30052: invalid swizzle pattern '_1' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(13): error 30027: '_1' is not a member of 'matrix<int,3,2>'.
c = m2._1;
^~
-tests/diagnostics/matrix-swizzle.slang(14): error 30052: invalid swizzle pattern '_m1' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(14): error 30027: '_m1' is not a member of 'matrix<int,3,2>'.
c = m2._m1;
^~~
-tests/diagnostics/matrix-swizzle.slang(15): error 30052: invalid swizzle pattern '_m12_' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(15): error 30027: '_m12_' is not a member of 'matrix<int,3,2>'.
c = m2._m12_;
^~~~~
-tests/diagnostics/matrix-swizzle.slang(16): error 30052: invalid swizzle pattern '_m11_11' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(16): error 30027: '_m11_11' is not a member of 'matrix<int,2,3>'.
int2 c2 = m1._m11_11; // Mixing of 1 and 0-indexing
^~~~~~~
-tests/diagnostics/matrix-swizzle.slang(17): error 30052: invalid swizzle pattern '_11_11_11_11_11' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(17): error 30027: '_11_11_11_11_11' is not a member of 'matrix<int,2,3>'.
c = m1._11_11_11_11_11; // More than 4 elements
^~~~~~~~~~~~~~~
-tests/diagnostics/matrix-swizzle.slang(18): error 30052: invalid swizzle pattern 'x' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(18): error 30027: 'x' is not a member of 'matrix<int,2,3>'.
c = m1.x; // Invalid character
^
-tests/diagnostics/matrix-swizzle.slang(19): error 30052: invalid swizzle pattern '_x' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(19): error 30027: '_x' is not a member of 'matrix<int,2,3>'.
c = m1._x;
^~
-tests/diagnostics/matrix-swizzle.slang(20): error 30052: invalid swizzle pattern 'x123' on type 'int'
+tests/diagnostics/matrix-swizzle.slang(20): error 30027: 'x123' is not a member of 'matrix<int,2,3>'.
c = m1.x123;
^~~~
}
diff --git a/tests/front-end/matrix-member.slang b/tests/front-end/matrix-member.slang
new file mode 100644
index 000000000..447fe715f
--- /dev/null
+++ b/tests/front-end/matrix-member.slang
@@ -0,0 +1,17 @@
+//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK):-output-using-type
+
+extension float2x2
+{
+ float sum() { return this[0][0] + this[1][1]; }
+}
+
+//TEST_INPUT: set outputBuffer = out ubuffer(data=[0 0 0 0], stride = 4)
+RWStructuredBuffer<float> outputBuffer;
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ float2x2 v = {1,2,3,4};
+ // CHECK: 5
+ outputBuffer[0] = v.sum();
+} \ No newline at end of file
diff --git a/tests/front-end/scalar-member.slang b/tests/front-end/scalar-member.slang
new file mode 100644
index 000000000..b85b8772c
--- /dev/null
+++ b/tests/front-end/scalar-member.slang
@@ -0,0 +1,17 @@
+//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK):-output-using-type
+
+extension float
+{
+ float sum() { return this + 1; }
+}
+
+//TEST_INPUT: set outputBuffer = out ubuffer(data=[0 0 0 0], stride = 4)
+RWStructuredBuffer<float> outputBuffer;
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ float v = 10.0;
+ // CHECK: 11
+ outputBuffer[0] = v.sum();
+} \ No newline at end of file
diff --git a/tests/front-end/vector-member.slang b/tests/front-end/vector-member.slang
new file mode 100644
index 000000000..adced39e4
--- /dev/null
+++ b/tests/front-end/vector-member.slang
@@ -0,0 +1,17 @@
+//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK):-output-using-type
+
+extension float3
+{
+ float sum() { return this.x + this.y + this.z; }
+}
+
+//TEST_INPUT: set outputBuffer = out ubuffer(data=[0 0 0 0], stride = 4)
+RWStructuredBuffer<float> outputBuffer;
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ float3 v = { 1, 2, 3 };
+ // CHECK: 6
+ outputBuffer[0] = v.sum();
+} \ No newline at end of file
diff --git a/tests/language-server/member-completion-broken-syntax-3.slang b/tests/language-server/member-completion-broken-syntax-3.slang
index 316afc541..9d497f9e1 100644
--- a/tests/language-server/member-completion-broken-syntax-3.slang
+++ b/tests/language-server/member-completion-broken-syntax-3.slang
@@ -1,9 +1,13 @@
-//TEST:LANG_SERVER:
-//COMPLETE:7,9
+//TEST:LANG_SERVER(filecheck=CHECK):
float3 m()
{
float3 val = 0;
+//COMPLETE:7,9
val.
return val;
-} \ No newline at end of file
+}
+
+// CHECK: x
+// CHECK: y
+// CHECK: z \ No newline at end of file
diff --git a/tests/language-server/scalar-member.slang b/tests/language-server/scalar-member.slang
new file mode 100644
index 000000000..6b12ab897
--- /dev/null
+++ b/tests/language-server/scalar-member.slang
@@ -0,0 +1,9 @@
+//TEST:LANG_SERVER(filecheck=CHECK):
+void f()
+{
+ float v;
+//COMPLETE:6,7
+ v.
+}
+
+// CHECK: x \ No newline at end of file
diff --git a/tests/language-server/vector-member.slang b/tests/language-server/vector-member.slang
index 5d624e56d..341544ac0 100644
--- a/tests/language-server/vector-member.slang
+++ b/tests/language-server/vector-member.slang
@@ -1,7 +1,12 @@
-//TEST:LANG_SERVER:
+//TEST:LANG_SERVER(filecheck=CHECK):
void f()
{
float4 v;
//COMPLETE:6,7
v.
}
+
+// CHECK: x
+// CHECK: y
+// CHECK: z
+// CHECK: w \ No newline at end of file
diff --git a/tools/slang-test/slang-test-main.cpp b/tools/slang-test/slang-test-main.cpp
index 10bc99017..57328c210 100644
--- a/tools/slang-test/slang-test-main.cpp
+++ b/tools/slang-test/slang-test-main.cpp
@@ -2037,9 +2037,13 @@ TestResult runLanguageServerTest(TestContext* context, TestInput& input)
int callId = 2;
for (auto line : lines)
{
- if (line.startsWith("//COMPLETE:"))
+ line = line.trimStart();
+ if (!line.startsWith("//"))
+ continue;
+ line = line.tail(2).trimStart();
+ if (line.startsWith("COMPLETE:"))
{
- auto arg = line.tail(UnownedStringSlice("//COMPLETE:").getLength());
+ auto arg = line.tail(UnownedStringSlice("COMPLETE:").getLength());
Int linePos, colPos;
parseLocation(arg, 0, linePos, colPos);
@@ -2074,9 +2078,9 @@ TestResult runLanguageServerTest(TestContext* context, TestInput& input)
}
}
}
- else if (line.startsWith("//SIGNATURE:"))
+ else if (line.startsWith("SIGNATURE:"))
{
- auto arg = line.tail(UnownedStringSlice("//SIGNATURE:").getLength());
+ auto arg = line.tail(UnownedStringSlice("SIGNATURE:").getLength());
Int linePos, colPos;
parseLocation(arg, 0, linePos, colPos);
@@ -2116,9 +2120,9 @@ TestResult runLanguageServerTest(TestContext* context, TestInput& input)
}
}
}
- else if (line.startsWith("//HOVER:"))
+ else if (line.startsWith("HOVER:"))
{
- auto arg = line.tail(UnownedStringSlice("//HOVER:").getLength());
+ auto arg = line.tail(UnownedStringSlice("HOVER:").getLength());
Int linePos, colPos;
parseLocation(arg, 0, linePos, colPos);
@@ -2150,7 +2154,7 @@ TestResult runLanguageServerTest(TestContext* context, TestInput& input)
actualOutputSB << "\ncontent:\n" << hover.contents.value << "\n";
}
}
- else if (line.startsWith("//DIAGNOSTICS"))
+ else if (line.startsWith("DIAGNOSTICS"))
{
if (!diagnosticsReceived)
{