Skip to content

Commit 65d19a6

Browse files
committed
Extend supported ExpressionTypes by Expression visitors
1 parent 5621c98 commit 65d19a6

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

Orm/Xtensive.Orm/Linq/ExpressionVisitor{TResult}.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ protected virtual TResult Visit(Expression e)
6060
case ExpressionType.ArrayLength:
6161
case ExpressionType.Quote:
6262
case ExpressionType.TypeAs:
63+
case ExpressionType.Decrement:
64+
case ExpressionType.Increment:
65+
case ExpressionType.IsFalse:
66+
case ExpressionType.IsTrue:
67+
case ExpressionType.OnesComplement:
6368
result = VisitUnary((UnaryExpression) e);
6469
break;
6570
case ExpressionType.Add:
@@ -85,9 +90,12 @@ protected virtual TResult Visit(Expression e)
8590
case ExpressionType.RightShift:
8691
case ExpressionType.LeftShift:
8792
case ExpressionType.ExclusiveOr:
93+
case ExpressionType.Power:
94+
case ExpressionType.Assign:
8895
result = VisitBinary((BinaryExpression) e);
8996
break;
9097
case ExpressionType.TypeIs:
98+
case ExpressionType.TypeEqual:
9199
result = VisitTypeIs((TypeBinaryExpression) e);
92100
break;
93101
case ExpressionType.Conditional:

Orm/Xtensive.Orm/Linq/Internals/ExpressionComparer.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ private bool Visit(Expression x, Expression y)
5151
case ExpressionType.ArrayLength:
5252
case ExpressionType.Quote:
5353
case ExpressionType.TypeAs:
54+
case ExpressionType.Decrement:
55+
case ExpressionType.Increment:
56+
case ExpressionType.IsFalse:
57+
case ExpressionType.IsTrue:
58+
case ExpressionType.OnesComplement:
5459
return VisitUnary((UnaryExpression) x, (UnaryExpression) y);
5560
case ExpressionType.Add:
5661
case ExpressionType.AddChecked:
@@ -75,13 +80,19 @@ private bool Visit(Expression x, Expression y)
7580
case ExpressionType.RightShift:
7681
case ExpressionType.LeftShift:
7782
case ExpressionType.ExclusiveOr:
83+
case ExpressionType.Power:
84+
case ExpressionType.Assign:
7885
return VisitBinary((BinaryExpression) x, (BinaryExpression) y);
7986
case ExpressionType.TypeIs:
8087
return VisitTypeIs((TypeBinaryExpression) x, (TypeBinaryExpression) y);
88+
case ExpressionType.TypeEqual:
89+
return VisitTypeEqual((TypeBinaryExpression) x, (TypeBinaryExpression) y);
8190
case ExpressionType.Conditional:
8291
return VisitConditional((ConditionalExpression) x, (ConditionalExpression) y);
8392
case ExpressionType.Constant:
8493
return VisitConstant((ConstantExpression) x, (ConstantExpression) y);
94+
case ExpressionType.Default:
95+
return true; // types and references are already compared
8596
case ExpressionType.Parameter:
8697
return VisitParameter((ParameterExpression) x, (ParameterExpression) y);
8798
case ExpressionType.MemberAccess:
@@ -236,6 +247,11 @@ private bool VisitTypeIs(TypeBinaryExpression x, TypeBinaryExpression y)
236247
return x.TypeOperand==y.TypeOperand && Visit(x.Expression, y.Expression);
237248
}
238249

250+
private bool VisitTypeEqual(TypeBinaryExpression x, TypeBinaryExpression y)
251+
{
252+
return x.TypeOperand == y.TypeOperand && Visit(x.Expression, y.Expression);
253+
}
254+
239255
private bool VisitBinary(BinaryExpression x, BinaryExpression y)
240256
{
241257
return x.Method==y.Method && Visit(x.Left, y.Left) && Visit(x.Right, y.Right);

0 commit comments

Comments
 (0)