@@ -62,6 +62,20 @@ function convertMathExpression(node, precision) {
62
62
return node
63
63
}
64
64
65
+ function flip ( operator ) {
66
+ return operator === '+' ? '-' : '+'
67
+ }
68
+
69
+ function flipValue ( node ) {
70
+ if ( isValueType ( node . type ) )
71
+ node . value = - node . value
72
+ else if ( node . type == 'MathExpression' ) {
73
+ node . left = flipValue ( node . left )
74
+ node . right = flipValue ( node . right )
75
+ }
76
+ return node
77
+ }
78
+
65
79
function reduceAddSubExpression ( node , precision ) {
66
80
const { left, right, operator : op } = node
67
81
@@ -77,6 +91,10 @@ function reduceAddSubExpression(node, precision) {
77
91
if ( left . value === 0 && op === "+" )
78
92
return right
79
93
94
+ // 0 - something => -something
95
+ if ( left . value === 0 && op === "-" )
96
+ return flipValue ( right )
97
+
80
98
// value + value
81
99
// value - value
82
100
if ( left . type === right . type && isValueType ( left . type ) ) {
@@ -115,13 +133,13 @@ function reduceAddSubExpression(node, precision) {
115
133
}
116
134
// value + (something + value) => (value + value) + something
117
135
// value + (something - value) => (value - value) + something
118
- // value - (something + value) => (value + value) - something
119
- // value - (something - value) => (value - value) - something
136
+ // value - (something + value) => (value - value) - something
137
+ // value - (something - value) => (value + value) - something
120
138
else if ( left . type === right . right . type ) {
121
139
node = Object . assign ( { } , node )
122
140
node . left = reduce ( {
123
141
type : 'MathExpression' ,
124
- operator : right . operator ,
142
+ operator : op === '-' ? flip ( right . operator ) : right . operator ,
125
143
left : left ,
126
144
right : right . right
127
145
} , precision )
@@ -183,7 +201,7 @@ function reduceAddSubExpression(node, precision) {
183
201
return node
184
202
}
185
203
186
- function reduceDivisionExpression ( node ) {
204
+ function reduceDivisionExpression ( node , precision ) {
187
205
if ( ! isValueType ( node . right . type ) )
188
206
return node
189
207
@@ -201,7 +219,7 @@ function reduceDivisionExpression(node) {
201
219
) {
202
220
node . left . left . value /= node . right . value
203
221
node . left . right . value /= node . right . value
204
- return node . left
222
+ return reduce ( node . left , precision )
205
223
}
206
224
return node
207
225
}
@@ -255,7 +273,7 @@ function reduceMathExpression(node, precision) {
255
273
case "-" :
256
274
return reduceAddSubExpression ( node , precision )
257
275
case "/" :
258
- return reduceDivisionExpression ( node )
276
+ return reduceDivisionExpression ( node , precision )
259
277
case "*" :
260
278
return reduceMultiplicationExpression ( node )
261
279
}
0 commit comments