]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/InvertBasicExpressionVisitor.java
Fixed InvertBasicExpressionVisitor bugs with subtractions and divisions
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / expression / InvertBasicExpressionVisitor.java
index 6479a622323174c2d2e2a97430429da711857a31..9101700d0c2dea734ab4f0022f07657c78f5fe7a 100644 (file)
-package org.simantics.modeling.ui.expression;\r
-\r
-import java.util.Stack;\r
-\r
-import org.simantics.basicexpression.analysis.DepthFirstAdapter;\r
-import org.simantics.basicexpression.node.AConstantValue;\r
-import org.simantics.basicexpression.node.ADivMultiplicative;\r
-import org.simantics.basicexpression.node.AMultMultiplicative;\r
-import org.simantics.basicexpression.node.APlusExpression;\r
-import org.simantics.basicexpression.node.AStringValue;\r
-import org.simantics.utils.datastructures.Triple;\r
-\r
-public class InvertBasicExpressionVisitor extends DepthFirstAdapter {\r
-\r
-       Stack<Object> stack = new Stack<Object>();\r
-\r
-       public Object getResult() {\r
-               return stack.pop();\r
-       }\r
-\r
-       public void outAConstantValue(AConstantValue node) {\r
-               stack.push(Double.valueOf(node.toString()));\r
-       }\r
-\r
-       public void outAStringValue(AStringValue node) {\r
-               String value = node.toString();\r
-               stack.push(Triple.make(1.0, 0.0, value.substring(1, value.length() - 2).trim()));\r
-       }\r
-\r
-       @SuppressWarnings("unchecked")\r
-    public void outAPlusExpression(APlusExpression node) {\r
-               \r
-               final Object o1 = stack.pop();\r
-               final Object o2 = stack.pop();\r
-               \r
-               if(o1 instanceof Double && o2 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o2;\r
-                       stack.push(Triple.make(p.first, p.second + (Double)o1, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o1;\r
-                       stack.push(Triple.make(p.first, p.second + (Double)o2, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Double) {\r
-                       stack.push((Double)o1 + (Double)o2);\r
-               } else {\r
-                       stack.push(Double.NaN);\r
-               }\r
-               \r
-       }\r
-\r
-       @SuppressWarnings("unchecked")\r
-    public void outAMinusExpression(APlusExpression node) {\r
-               \r
-               final Object o1 = stack.pop();\r
-               final Object o2 = stack.pop();\r
-               \r
-               if(o1 instanceof Double && o2 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o2;\r
-                       stack.push(Triple.make(-p.first, (Double)o1 - p.second, p.third ));\r
-               } else if (o2 instanceof Double && o1 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o1;\r
-                       stack.push(Triple.make(p.first, p.second - (Double)o2, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Double) {\r
-                       stack.push((Double)o1 - (Double)o2);\r
-               } else {\r
-                       stack.push(Double.NaN);\r
-               }\r
-               \r
-       }\r
-\r
-       @SuppressWarnings("unchecked")\r
-    public void outAMultMultiplicative(AMultMultiplicative node) {\r
-               \r
-               final Object o1 = stack.pop();\r
-               final Object o2 = stack.pop();\r
-               \r
-               if(o1 instanceof Double && o2 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o2;\r
-                       stack.push(Triple.make(p.first * (Double)o1, p.second * (Double)o1, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double, Double, String>)o1;\r
-                       stack.push(Triple.make(p.first * (Double)o2, p.second * (Double)o2, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Double) {\r
-                       stack.push((Double)o1 * (Double)o2);\r
-               } else {\r
-                       stack.push(Double.NaN);\r
-               }\r
-               \r
-       }\r
-\r
-       @SuppressWarnings("unchecked")\r
-    public void outADivMultiplicative(ADivMultiplicative node) {\r
-               \r
-               final Object o1 = stack.pop();\r
-               final Object o2 = stack.pop();\r
-               \r
-               if(o1 instanceof Double && o2 instanceof Triple) {\r
-                       stack.push(Double.NaN);\r
-               } else if (o2 instanceof Double && o1 instanceof Triple) {\r
-                       Triple<Double, Double, String> p = (Triple<Double,Double, String>)o1;\r
-                       stack.push(Triple.make(p.first / (Double)o2, p.second / (Double)o2, p.third));\r
-               } else if (o2 instanceof Double && o1 instanceof Double) {\r
-                       stack.push((Double)o1 / (Double)o2);\r
-               } else {\r
-                       stack.push(Double.NaN);\r
-               }\r
-               \r
-       }\r
-       \r
-}\r
+package org.simantics.modeling.ui.expression;
+
+import org.simantics.basicexpression.node.AStringValue;
+import org.simantics.modeling.InvertBasicExpressionVisitorBase;
+import org.simantics.utils.datastructures.Triple;
+
+public class InvertBasicExpressionVisitor extends InvertBasicExpressionVisitorBase {
+
+       @Override
+       public void outAStringValue(AStringValue node) {
+               String value = node.toString();
+               stack.push(Triple.make(1.0, 0.0, value.substring(1, value.length() - 2).trim()));
+       }
+
+}