4
4
namespace StringMath
5
5
{
6
6
/// <inheritdoc />
7
- internal class ExpressionOptimizer : IExpressionVisitor < Expression >
7
+ internal class ExpressionOptimizer : IExpressionVisitor < IExpression >
8
8
{
9
- private readonly Dictionary < Type , Func < Expression , Expression > > _expressionOptimizers ;
9
+ private readonly Dictionary < ExpressionType , Func < IExpression , IExpression > > _expressionOptimizers ;
10
10
private readonly IMathContext _context ;
11
11
12
12
/// <summary>Initializez a new instance of an expression optimizer.</summary>
@@ -16,43 +16,43 @@ public ExpressionOptimizer(IMathContext mathContext)
16
16
mathContext . EnsureNotNull ( nameof ( mathContext ) ) ;
17
17
_context = mathContext ;
18
18
19
- _expressionOptimizers = new Dictionary < Type , Func < Expression , Expression > >
19
+ _expressionOptimizers = new Dictionary < ExpressionType , Func < IExpression , IExpression > >
20
20
{
21
- [ typeof ( BinaryExpression ) ] = OptimizeBinaryExpression ,
22
- [ typeof ( UnaryExpression ) ] = EvaluateUnaryExpression ,
23
- [ typeof ( ConstantExpression ) ] = OptimizeConstantExpression ,
24
- [ typeof ( GroupingExpression ) ] = OptimizeGroupingExpression ,
25
- [ typeof ( VariableExpression ) ] = SkipExpressionOptimization ,
26
- [ typeof ( ValueExpression ) ] = SkipExpressionOptimization
21
+ [ ExpressionType . BinaryExpression ] = OptimizeBinaryExpression ,
22
+ [ ExpressionType . UnaryExpression ] = EvaluateUnaryExpression ,
23
+ [ ExpressionType . ConstantExpression ] = OptimizeConstantExpression ,
24
+ [ ExpressionType . GroupingExpression ] = OptimizeGroupingExpression ,
25
+ [ ExpressionType . VariableExpression ] = SkipExpressionOptimization ,
26
+ [ ExpressionType . ValueExpression ] = SkipExpressionOptimization
27
27
} ;
28
28
}
29
29
30
30
/// <summary>Simplifies an expression tree by removing unnecessary nodes and evaluating constant expressions.</summary>
31
31
/// <param name="expression">The expression tree to optimize.</param>
32
32
/// <returns>An optimized expression tree.</returns>
33
- public Expression Visit ( Expression expression )
33
+ public IExpression Visit ( IExpression expression )
34
34
{
35
- Expression result = _expressionOptimizers [ expression . Type ] ( expression ) ;
35
+ IExpression result = _expressionOptimizers [ expression . Type ] ( expression ) ;
36
36
return result ;
37
37
}
38
38
39
- private Expression OptimizeConstantExpression ( Expression expr )
39
+ private IExpression OptimizeConstantExpression ( IExpression expr )
40
40
{
41
41
ConstantExpression constantExpr = ( ConstantExpression ) expr ;
42
42
return constantExpr . ToValueExpression ( ) ;
43
43
}
44
44
45
- private Expression OptimizeGroupingExpression ( Expression expr )
45
+ private IExpression OptimizeGroupingExpression ( IExpression expr )
46
46
{
47
47
GroupingExpression groupingExpr = ( GroupingExpression ) expr ;
48
- Expression innerExpr = Visit ( groupingExpr . Inner ) ;
48
+ IExpression innerExpr = Visit ( groupingExpr . Inner ) ;
49
49
return innerExpr ;
50
50
}
51
51
52
- private Expression EvaluateUnaryExpression ( Expression expr )
52
+ private IExpression EvaluateUnaryExpression ( IExpression expr )
53
53
{
54
54
UnaryExpression unaryExpr = ( UnaryExpression ) expr ;
55
- Expression operandExpr = Visit ( unaryExpr . Operand ) ;
55
+ IExpression operandExpr = Visit ( unaryExpr . Operand ) ;
56
56
if ( operandExpr is ValueExpression valueExpr )
57
57
{
58
58
double result = _context . EvaluateUnary ( unaryExpr . OperatorName , valueExpr . Value ) ;
@@ -62,11 +62,11 @@ private Expression EvaluateUnaryExpression(Expression expr)
62
62
return new UnaryExpression ( unaryExpr . OperatorName , operandExpr ) ;
63
63
}
64
64
65
- private Expression OptimizeBinaryExpression ( Expression expr )
65
+ private IExpression OptimizeBinaryExpression ( IExpression expr )
66
66
{
67
67
BinaryExpression binaryExpr = ( BinaryExpression ) expr ;
68
- Expression leftExpr = Visit ( binaryExpr . Left ) ;
69
- Expression rightExpr = Visit ( binaryExpr . Right ) ;
68
+ IExpression leftExpr = Visit ( binaryExpr . Left ) ;
69
+ IExpression rightExpr = Visit ( binaryExpr . Right ) ;
70
70
71
71
if ( leftExpr is ValueExpression leftValue && rightExpr is ValueExpression rightValue )
72
72
{
@@ -77,7 +77,7 @@ private Expression OptimizeBinaryExpression(Expression expr)
77
77
return new BinaryExpression ( leftExpr , binaryExpr . OperatorName , rightExpr ) ;
78
78
}
79
79
80
- private Expression SkipExpressionOptimization ( Expression expr )
80
+ private IExpression SkipExpressionOptimization ( IExpression expr )
81
81
{
82
82
return expr ;
83
83
}
0 commit comments