11package com .annimon .ownlang .parser .visitors ;
22
3- import com .annimon .ownlang .lib .NumberValue ;
4- import com .annimon .ownlang .lib .Types ;
5- import com .annimon .ownlang .lib .Value ;
63import com .annimon .ownlang .parser .Optimizer ;
74import com .annimon .ownlang .parser .ast .BinaryExpression ;
85import com .annimon .ownlang .parser .ast .ConditionalExpression ;
6+ import com .annimon .ownlang .parser .ast .FunctionDefineStatement ;
97import com .annimon .ownlang .parser .ast .Node ;
108import com .annimon .ownlang .parser .ast .UnaryExpression ;
119import com .annimon .ownlang .parser .ast .ValueExpression ;
12- import com .annimon .ownlang .parser .ast .VariableExpression ;
10+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isIntegerValue ;
11+ import static com .annimon .ownlang .parser .visitors .VisitorUtils .isSameVariables ;
12+ import java .util .HashSet ;
13+ import java .util .Set ;
1314
1415/**
1516 * Performs expression simplification.
1617 */
1718public class ExpressionSimplification extends OptimizationVisitor <Void > implements Optimizer .Info {
1819
20+ private static final Set <String > OPERATORS = VisitorUtils .operators ();
21+
1922 private int simplificationsCount ;
2023
24+ private final Set <String > overloadedOperators ;
25+
2126 public ExpressionSimplification () {
2227 simplificationsCount = 0 ;
28+ overloadedOperators = new HashSet <>();
2329 }
2430
2531 @ Override
@@ -39,6 +45,9 @@ public String summaryInfo() {
3945
4046 @ Override
4147 public Node visit (BinaryExpression s , Void t ) {
48+ if (overloadedOperators .contains (s .operation .toString ())) {
49+ return super .visit (s , t );
50+ }
4251 // operations with 0
4352 final boolean expr1IsZero = isIntegerValue (s .expr1 , 0 );
4453 if (expr1IsZero || isIntegerValue (s .expr2 , 0 )) {
@@ -108,6 +117,9 @@ public Node visit(BinaryExpression s, Void t) {
108117
109118 @ Override
110119 public Node visit (ConditionalExpression s , Void t ) {
120+ if (overloadedOperators .contains (s .operation .getName ())) {
121+ return super .visit (s , t );
122+ }
111123 if (isIntegerValue (s .expr1 , 0 ) && s .operation == ConditionalExpression .Operator .AND ) {
112124 // 0 && x2 to 0
113125 simplificationsCount ++;
@@ -121,26 +133,11 @@ public Node visit(ConditionalExpression s, Void t) {
121133 return super .visit (s , t );
122134 }
123135
124-
125- private boolean isIntegerValue (Node node , int valueToCheck ) {
126- if (!(node instanceof ValueExpression )) return false ;
127-
128- final Value value = ((ValueExpression ) node ).value ;
129- if (value .type () != Types .NUMBER ) return false ;
130-
131- final Number number = ((NumberValue ) value ).raw ();
132- if ( (number instanceof Integer ) || (number instanceof Short ) || (number instanceof Byte )) {
133- return number .intValue () == valueToCheck ;
134- }
135- return false ;
136- }
137-
138- private boolean isSameVariables (Node n1 , Node n2 ) {
139- if ( (n1 instanceof VariableExpression ) && (n2 instanceof VariableExpression ) ) {
140- final VariableExpression v1 = (VariableExpression ) n1 ;
141- final VariableExpression v2 = (VariableExpression ) n2 ;
142- return v1 .name .equals (v2 .name );
136+ @ Override
137+ public Node visit (FunctionDefineStatement s , Void t ) {
138+ if (OPERATORS .contains (s .name )) {
139+ overloadedOperators .add (s .name );
143140 }
144- return false ;
141+ return super . visit ( s , t ) ;
145142 }
146143}
0 commit comments