Skip to content

Commit dbb814b

Browse files
Allow postfix unary expressions after array index expressions;
1 parent 202cb7f commit dbb814b

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

XtractQuery/Logic.Business.Level5ScriptManagement/Logic.Business.Level5ScriptManagement/Level5CodeUnitConverter.cs

+26-5
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,6 @@ private void AddExpressions(ScriptFile result, IReadOnlyList<StatementSyntax> ex
107107

108108
private void AddPostfixUnaryStatement(ScriptFile result, PostfixUnaryStatementSyntax postfixUnaryStatement)
109109
{
110-
if (postfixUnaryStatement.Expression.Value is not ValueExpressionSyntax { Value: VariableExpressionSyntax variable })
111-
throw CreateException($"Invalid expression {postfixUnaryStatement.Expression.Value.GetType().Name}", postfixUnaryStatement.Expression.Value.Location);
112-
113-
int variableSlot = GetVariable(variable);
114-
115110
int instructionType;
116111
switch (postfixUnaryStatement.Expression.Operation.RawKind)
117112
{
@@ -126,10 +121,36 @@ private void AddPostfixUnaryStatement(ScriptFile result, PostfixUnaryStatementSy
126121
default:
127122
throw CreateException($"Invalid operation {(SyntaxTokenKind)postfixUnaryStatement.Expression.Operation.RawKind} in postfix unary expression.", postfixUnaryStatement.Expression.Location);
128123
}
124+
125+
if (postfixUnaryStatement.Expression.Value is ValueExpressionSyntax { Value: VariableExpressionSyntax variable })
126+
{
127+
int variableSlot = GetVariable(variable);
128+
AddVariablePostfixUnaryStatement(result, instructionType, variableSlot);
129+
}
130+
else if (postfixUnaryStatement.Expression.Value is ArrayIndexExpressionSyntax { Value.Value: VariableExpressionSyntax variable1 } arrayValue)
131+
{
132+
int variableSlot = GetVariable(variable1);
133+
AddArrayPostfixUnaryVariableStatement(result, arrayValue.Indexer, instructionType, variableSlot);
134+
}
135+
else
136+
throw CreateException($"Invalid expression {postfixUnaryStatement.Expression.Value.GetType().Name}", postfixUnaryStatement.Expression.Value.Location);
137+
}
129138

139+
private void AddVariablePostfixUnaryStatement(ScriptFile result, int instructionType, int variableSlot)
140+
{
130141
AddInstruction(result, result.Arguments.Count, 0, instructionType, variableSlot);
131142
}
132143

144+
private void AddArrayPostfixUnaryVariableStatement(ScriptFile result, IReadOnlyList<ArrayIndexerExpressionSyntax> indexer, int instructionType, int variableSlot)
145+
{
146+
int argumentIndex = result.Arguments.Count;
147+
148+
foreach (var index in indexer)
149+
AddArgument(result, index.Index);
150+
151+
AddInstruction(result, argumentIndex, indexer.Count, instructionType, variableSlot);
152+
}
153+
133154
private void AddIfGotoStatement(ScriptFile result, IfGotoStatementSyntax ifGotoStatement)
134155
{
135156
var argumentStartIndex = (short)result.Arguments.Count;

0 commit comments

Comments
 (0)