Skip to content

Commit b776e7d

Browse files
improve errors for expressions
1 parent 36eaf09 commit b776e7d

1 file changed

Lines changed: 38 additions & 25 deletions

File tree

Code/Helpers/NumericExpressionReslover.cs

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public static TryGet<CompiledExpression> CompileExpression(BaseToken[] tokens)
4141
var initial = tokens.Select(t => t.RawRep).JoinStrings(" ");
4242
Result mainErr = $"Expression '{initial}' is invalid.";
4343

44-
var variables = new Dictionary<string, DynamicTryGet<object>>(StringComparer.OrdinalIgnoreCase);
44+
var variables = new Dictionary<string, (DynamicTryGet<object>, string)>(StringComparer.OrdinalIgnoreCase);
4545
var sb = new StringBuilder();
4646
uint tempId = 0;
4747

@@ -52,7 +52,7 @@ public static TryGet<CompiledExpression> CompileExpression(BaseToken[] tokens)
5252

5353
if (ParseToken(token, variables, sb, mainErr, tempId).HasErrored(out var err))
5454
{
55-
return err;
55+
return mainErr + err;
5656
}
5757
}
5858

@@ -69,13 +69,13 @@ public static TryGet<CompiledExpression> CompileExpression(BaseToken[] tokens)
6969
public class CompiledExpression
7070
{
7171
private readonly Expression _expression;
72-
private readonly Dictionary<string, DynamicTryGet<object>> _parameters;
72+
private readonly Dictionary<string, (DynamicTryGet<object> value, string repr)> _parameters;
7373
private readonly string _rawRepresentation;
7474
private readonly Dictionary<string, object> _values = [];
7575

7676
public CompiledExpression(
7777
Expression expression,
78-
Dictionary<string, DynamicTryGet<object>> parameters,
78+
Dictionary<string, (DynamicTryGet<object>, string)> parameters,
7979
string rawRepresentation
8080
)
8181
{
@@ -87,31 +87,38 @@ string rawRepresentation
8787

8888
public TryGet<object> Evaluate()
8989
{
90-
try
90+
_values.Clear();
91+
foreach (var (key, (getter, _)) in _parameters)
9192
{
92-
_values.Clear();
93-
foreach (var (key, dtg) in _parameters)
93+
if (getter.Invoke().HasErrored(out var err, out var value))
9494
{
95-
if (dtg.Invoke().HasErrored(out var err, out var value))
96-
{
97-
return err;
98-
}
99-
100-
_values[key] = value;
95+
return err;
10196
}
102-
97+
98+
_values[key] = value;
99+
}
100+
101+
try
102+
{
103103
return _expression.Evaluate();
104104
}
105105
catch (Exception)
106106
{
107-
return $"Expression '{_rawRepresentation}' is invalid.";
107+
if (_values.Count <= 0)
108+
{
109+
return $"Expression '{_rawRepresentation}' is invalid.";
110+
}
111+
112+
return $"Expression '{_rawRepresentation}' is invalid. Variable values:\n" +
113+
_values.Select((kvp, _) => $"- {_parameters[kvp.Key].repr} = {kvp.Value}")
114+
.JoinStrings("\n");
108115
}
109116
}
110117
}
111118

112119
private static Result ParseToken(
113120
BaseToken token,
114-
Dictionary<string, DynamicTryGet<object>> variables,
121+
Dictionary<string, (DynamicTryGet<object> value, string serRepr)> variables,
115122
StringBuilder sb,
116123
Result mainErr,
117124
uint tempId)
@@ -124,15 +131,21 @@ private static Result ParseToken(
124131

125132
if (valueToken.IsConstant)
126133
{
127-
variables[tmp] = valueToken
128-
.Value()
129-
.OnSuccess(s => s.ToCSharpObject(null), mainErr);
134+
variables[tmp] = (
135+
valueToken
136+
.Value()
137+
.OnSuccess(s => s.ToCSharpObject(null), mainErr),
138+
token.RawRep
139+
);
130140
}
131141
else
132142
{
133-
variables[tmp] = new(() => valueToken
134-
.Value()
135-
.OnSuccess(s => s.ToCSharpObject(null), mainErr));
143+
variables[tmp] = (
144+
new(() => valueToken
145+
.Value()
146+
.OnSuccess(s => s.ToCSharpObject(null), mainErr)),
147+
token.RawRep
148+
);
136149
}
137150

138151
AppendRaw(tmp);
@@ -180,11 +193,11 @@ string MakeTempName()
180193
{
181194
return "value" + tempId.ToString(CultureInfo.InvariantCulture);
182195
}
183-
184-
void AppendRaw(string s)
196+
197+
void AppendRaw(string value)
185198
{
186199
if (sb.Length > 0) sb.Append(' ');
187-
sb.Append(s);
200+
sb.Append(value);
188201
}
189202
}
190203
}

0 commit comments

Comments
 (0)