@@ -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