@@ -12,9 +12,10 @@ public interface IParseTreeValue
12
12
bool ParsesToConstantValue { get ; set ; }
13
13
}
14
14
15
+ public delegate bool TryConvertParseTreeValue < T > ( IParseTreeValue value , out T result ) ;
16
+
15
17
public class ParseTreeValue : IParseTreeValue
16
18
{
17
- private string _valueText ;
18
19
private string _declaredType ;
19
20
private string _derivedType ;
20
21
@@ -31,23 +32,25 @@ public ParseTreeValue(string value, string declaredType = null)
31
32
if ( derivedFromTypeHint )
32
33
{
33
34
_declaredType = _derivedType ;
34
- _valueText = RemoveTypeHintChar ( value ) ;
35
+ ValueText = RemoveTypeHintChar ( value ) ;
35
36
}
36
37
else
37
38
{
38
- _valueText = value . Replace ( "\" " , "" ) ;
39
+ ValueText = value . Replace ( "\" " , "" ) ;
39
40
}
40
41
var conformToTypeName = _declaredType ?? _derivedType ;
41
42
ConformValueTextToType ( conformToTypeName ) ;
42
43
}
43
44
45
+ private static bool IsStringConstant ( string input ) => input . StartsWith ( "\" " ) && input . EndsWith ( "\" " ) ;
46
+
44
47
public string TypeName => _declaredType ?? _derivedType ?? string . Empty ;
45
48
46
- public string ValueText => _valueText ;
49
+ public string ValueText { private set ; get ; }
47
50
48
51
public bool ParsesToConstantValue { set ; get ; }
49
52
50
- public override string ToString ( ) => _valueText ;
53
+ public override string ToString ( ) => ValueText ;
51
54
52
55
private static string RemoveTypeHintChar ( string inputValue )
53
56
{
@@ -111,32 +114,32 @@ private static string DeriveTypeName(string inputString, out bool derivedFromTyp
111
114
112
115
private void ConformValueTextToType ( string conformTypeName )
113
116
{
114
- if ( _valueText . Equals ( double . NaN . ToString ( ) ) && ! conformTypeName . Equals ( Tokens . String ) )
117
+ if ( ValueText . Equals ( double . NaN . ToString ( ) ) && ! conformTypeName . Equals ( Tokens . String ) )
115
118
{
116
119
return ;
117
120
}
118
121
119
122
if ( conformTypeName . Equals ( Tokens . Long ) || conformTypeName . Equals ( Tokens . Integer ) || conformTypeName . Equals ( Tokens . Byte ) )
120
123
{
121
- if ( ParseTreeValueConverter . TryConvertValue ( _valueText , out long newVal ) )
124
+ if ( TryConvertValue ( this , out long newVal ) )
122
125
{
123
- _valueText = newVal . ToString ( ) ;
126
+ ValueText = newVal . ToString ( ) ;
124
127
ParsesToConstantValue = true ;
125
128
}
126
129
}
127
130
else if ( conformTypeName . Equals ( Tokens . Double ) || conformTypeName . Equals ( Tokens . Single ) )
128
131
{
129
- if ( ParseTreeValueConverter . TryConvertValue ( _valueText , out double newVal ) )
132
+ if ( TryConvertValue ( this , out double newVal ) )
130
133
{
131
- _valueText = newVal . ToString ( ) ;
134
+ ValueText = newVal . ToString ( ) ;
132
135
ParsesToConstantValue = true ;
133
136
}
134
137
}
135
138
else if ( conformTypeName . Equals ( Tokens . Boolean ) )
136
139
{
137
- if ( ParseTreeValueConverter . TryConvertValue ( _valueText , out bool newVal ) )
140
+ if ( TryConvertValue ( this , out bool newVal ) )
138
141
{
139
- _valueText = newVal . ToString ( ) ;
142
+ ValueText = newVal . ToString ( ) ;
140
143
ParsesToConstantValue = true ;
141
144
}
142
145
}
@@ -146,14 +149,86 @@ private void ConformValueTextToType(string conformTypeName)
146
149
}
147
150
else if ( conformTypeName . Equals ( Tokens . Currency ) )
148
151
{
149
- if ( ParseTreeValueConverter . TryConvertValue ( _valueText , out decimal newVal ) )
152
+ if ( TryConvertValue ( this , out decimal newVal ) )
150
153
{
151
- _valueText = newVal . ToString ( ) ;
154
+ ValueText = newVal . ToString ( ) ;
152
155
ParsesToConstantValue = true ;
153
156
}
154
157
}
155
158
}
156
159
157
- private static bool IsStringConstant ( string input ) => input . StartsWith ( "\" " ) && input . EndsWith ( "\" " ) ;
160
+ public static bool TryConvertValue ( IParseTreeValue parseTreeValue , out long value )
161
+ {
162
+ value = default ;
163
+ var inspVal = parseTreeValue . ValueText ;
164
+ if ( inspVal . Equals ( Tokens . True ) || inspVal . Equals ( Tokens . False ) )
165
+ {
166
+ value = inspVal . Equals ( Tokens . True ) ? - 1 : 0 ;
167
+ return true ;
168
+ }
169
+ if ( double . TryParse ( inspVal , out double rational ) )
170
+ {
171
+ value = Convert . ToInt64 ( rational ) ;
172
+ return true ;
173
+ }
174
+ return false ;
175
+ }
176
+
177
+ public static bool TryConvertValue ( IParseTreeValue parseTreeValue , out double value )
178
+ {
179
+ value = default ;
180
+ var inspVal = parseTreeValue . ValueText ;
181
+ if ( inspVal . Equals ( Tokens . True ) || inspVal . Equals ( Tokens . False ) )
182
+ {
183
+ value = inspVal . Equals ( Tokens . True ) ? - 1 : 0 ;
184
+ return true ;
185
+ }
186
+ if ( double . TryParse ( inspVal , out double rational ) )
187
+ {
188
+ value = rational ;
189
+ return true ;
190
+ }
191
+ return false ;
192
+ }
193
+
194
+ public static bool TryConvertValue ( IParseTreeValue parseTreeValue , out decimal value )
195
+ {
196
+ value = default ;
197
+ var inspVal = parseTreeValue . ValueText ;
198
+ if ( inspVal . Equals ( Tokens . True ) || inspVal . Equals ( Tokens . False ) )
199
+ {
200
+ value = inspVal . Equals ( Tokens . True ) ? - 1 : 0 ;
201
+ return true ;
202
+ }
203
+ if ( decimal . TryParse ( inspVal , out decimal rational ) )
204
+ {
205
+ value = rational ;
206
+ return true ;
207
+ }
208
+ return false ;
209
+ }
210
+
211
+ public static bool TryConvertValue ( IParseTreeValue parseTreeValue , out bool value )
212
+ {
213
+ value = default ;
214
+ var inspVal = parseTreeValue . ValueText ;
215
+ if ( inspVal . Equals ( Tokens . True ) || inspVal . Equals ( Tokens . False ) )
216
+ {
217
+ value = inspVal . Equals ( Tokens . True ) ;
218
+ return true ;
219
+ }
220
+ if ( double . TryParse ( inspVal , out double dVal ) )
221
+ {
222
+ value = Math . Abs ( dVal ) >= double . Epsilon ;
223
+ return true ;
224
+ }
225
+ return false ;
226
+ }
227
+
228
+ public static bool TryConvertValue ( IParseTreeValue parseTreeValue , out string value )
229
+ {
230
+ value = parseTreeValue . ValueText ;
231
+ return true ;
232
+ }
158
233
}
159
234
}
0 commit comments