@@ -490,19 +490,19 @@ private Expression ParseComparisonOperator()
490
490
}
491
491
}
492
492
}
493
- else if ( ( constantExpr = right as ConstantExpression ) != null && constantExpr . Value is string stringValueR && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null )
493
+ else if ( ( constantExpr = right as ConstantExpression ) != null && constantExpr . Value is string stringValueR && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
494
494
{
495
495
right = Expression . Constant ( typeConverter . ConvertFromInvariantString ( stringValueR ) , left . Type ) ;
496
496
}
497
- else if ( ( constantExpr = left as ConstantExpression ) != null && constantExpr . Value is string stringValueL && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null )
497
+ else if ( ( constantExpr = left as ConstantExpression ) != null && constantExpr . Value is string stringValueL && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
498
498
{
499
499
left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( stringValueL ) , right . Type ) ;
500
500
}
501
- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null )
501
+ else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
502
502
{
503
503
right = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueR ) , left . Type ) ;
504
504
}
505
- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null )
505
+ else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
506
506
{
507
507
left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueL ) , right . Type ) ;
508
508
}
@@ -654,10 +654,11 @@ private Expression ParseShiftOperator()
654
654
private Expression ParseAdditive ( )
655
655
{
656
656
Expression left = ParseMultiplicative ( ) ;
657
- while ( _textParser . CurrentToken . Id == TokenId . Plus || _textParser . CurrentToken . Id == TokenId . Minus )
657
+ while ( _textParser . CurrentToken . Id is TokenId . Plus or TokenId . Minus )
658
658
{
659
659
Token op = _textParser . CurrentToken ;
660
660
_textParser . NextToken ( ) ;
661
+
661
662
Expression right = ParseMultiplicative ( ) ;
662
663
switch ( op . Id )
663
664
{
@@ -668,12 +669,13 @@ private Expression ParseAdditive()
668
669
}
669
670
else
670
671
{
671
- CheckAndPromoteOperands ( typeof ( IAddSignatures ) , op . Id , op . Text , ref left , ref right , op . Pos ) ;
672
+ CheckAndPromoteOperands ( typeof ( IAddAndSubtractSignatures ) , op . Id , op . Text , ref left , ref right , op . Pos ) ;
672
673
left = _expressionHelper . GenerateAdd ( left , right ) ;
673
674
}
674
675
break ;
676
+
675
677
case TokenId . Minus :
676
- CheckAndPromoteOperands ( typeof ( ISubtractSignatures ) , op . Id , op . Text , ref left , ref right , op . Pos ) ;
678
+ CheckAndPromoteOperands ( typeof ( IAddAndSubtractSignatures ) , op . Id , op . Text , ref left , ref right , op . Pos ) ;
677
679
left = _expressionHelper . GenerateSubtract ( left , right ) ;
678
680
break ;
679
681
}
@@ -685,8 +687,7 @@ private Expression ParseAdditive()
685
687
private Expression ParseMultiplicative ( )
686
688
{
687
689
Expression left = ParseUnary ( ) ;
688
- while ( _textParser . CurrentToken . Id == TokenId . Asterisk || _textParser . CurrentToken . Id == TokenId . Slash ||
689
- _textParser . CurrentToken . Id == TokenId . Percent || TokenIdentifierIs ( "mod" ) )
690
+ while ( _textParser . CurrentToken . Id is TokenId . Asterisk or TokenId . Slash or TokenId . Percent || TokenIdentifierIs ( "mod" ) )
690
691
{
691
692
Token op = _textParser . CurrentToken ;
692
693
_textParser . NextToken ( ) ;
@@ -697,9 +698,11 @@ private Expression ParseMultiplicative()
697
698
case TokenId . Asterisk :
698
699
left = Expression . Multiply ( left , right ) ;
699
700
break ;
701
+
700
702
case TokenId . Slash :
701
703
left = Expression . Divide ( left , right ) ;
702
704
break ;
705
+
703
706
case TokenId . Percent :
704
707
case TokenId . Identifier :
705
708
left = Expression . Modulo ( left , right ) ;
0 commit comments