Skip to content

Commit eb9b065

Browse files
committed
add division error messages
1 parent bfbe67e commit eb9b065

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

src/lib/reducer.es6

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import assign from 'object-assign';
22
import convert from './convert';
33

4-
function reduce(node, precision) {
4+
function reduce(node, precision, item) {
55
if (node.type === "MathExpression")
6-
return reduceMathExpression(node, precision);
6+
return reduceMathExpression(node, precision, item);
77

88
return node;
99
}
@@ -12,10 +12,10 @@ function isEqual(left, right) {
1212
return left.type === right.type && left.value === right.value;
1313
}
1414

15-
function convertMathExpression(node, precision) {
15+
function convertMathExpression(node, precision, item) {
1616
let nodes = convert(node.left, node.right, precision);
17-
let left = reduce(nodes.left, precision);
18-
let right = reduce(nodes.right, precision);
17+
let left = reduce(nodes.left, precision, item);
18+
let right = reduce(nodes.right, precision, item);
1919

2020
if (left.type === "MathExpression" && right.type === "MathExpression") {
2121

@@ -30,8 +30,8 @@ function convertMathExpression(node, precision) {
3030
else if (isEqual(left.right, right.left))
3131
nodes = convert(left.left, right.right, precision);
3232

33-
left = reduce(nodes.left, precision);
34-
right = reduce(nodes.right, precision);
33+
left = reduce(nodes.left, precision, item);
34+
right = reduce(nodes.right, precision, item);
3535

3636
}
3737
}
@@ -41,7 +41,7 @@ function convertMathExpression(node, precision) {
4141
return node;
4242
}
4343

44-
function reduceAddSubExpression(node, precision) {
44+
function reduceAddSubExpression(node, precision, item) {
4545
let op = node.operator;
4646
let left = node.left;
4747
let right = node.right;
@@ -78,9 +78,9 @@ function reduceAddSubExpression(node, precision) {
7878
operator: op,
7979
left: left,
8080
right: right.left
81-
}, precision);
81+
}, precision, item);
8282
node.right = right.right;
83-
return reduce(node, precision);
83+
return reduce(node, precision, item);
8484
}
8585
// value + (something + value) => (value + value) + something
8686
// value + (something - value) => (value - value) + something
@@ -93,9 +93,9 @@ function reduceAddSubExpression(node, precision) {
9393
operator: right.operator,
9494
left: left,
9595
right: right.right
96-
}, precision);
96+
}, precision, item);
9797
node.right = right.left;
98-
return reduce(node, precision);
98+
return reduce(node, precision, item);
9999
}
100100
}
101101

@@ -112,8 +112,8 @@ function reduceAddSubExpression(node, precision) {
112112
operator: op,
113113
left: left.left,
114114
right: right
115-
}, precision);
116-
return reduce(node, precision);
115+
}, precision, item);
116+
return reduce(node, precision, item);
117117
}
118118
// (something + value) + value => something + (value + value)
119119
// (something - value) + value => something - (value + value)
@@ -126,19 +126,22 @@ function reduceAddSubExpression(node, precision) {
126126
operator: op,
127127
left: left.right,
128128
right: right
129-
}, precision);
130-
return reduce(node, precision);
129+
}, precision, item);
130+
return reduce(node, precision, item);
131131
}
132132
}
133133
return node;
134134
}
135135

136-
function reduceDivisionExpression(node) {
137-
if (node.right.type !== 'Value')
136+
function reduceDivisionExpression(node, item) {
137+
if (node.right.type === 'MathExpression')
138138
return node;
139139

140+
if (node.right.type !== 'Value')
141+
throw item.error(`Cannot divide by "${node.right.unit}", number expected`);
142+
140143
if (node.right.value === 0)
141-
return node; // throw error?
144+
throw item.error('Cannot divide by zero');
142145

143146
// (expr) / value
144147
if (node.left.type === 'MathExpression') {
@@ -194,15 +197,15 @@ function reduceMultiplicationExpression(node) {
194197
return node;
195198
}
196199

197-
function reduceMathExpression(node, precision) {
198-
node = convertMathExpression(node, precision);
200+
function reduceMathExpression(node, precision, item) {
201+
node = convertMathExpression(node, precision, item);
199202

200203
switch (node.operator) {
201204
case "+":
202205
case "-":
203-
return reduceAddSubExpression(node, precision);
206+
return reduceAddSubExpression(node, precision, item);
204207
case "/":
205-
return reduceDivisionExpression(node);
208+
return reduceDivisionExpression(node, item);
206209
case "*":
207210
return reduceMultiplicationExpression(node);
208211
}

src/lib/transform.es6

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function transformValue(value, options, result, item) {
1818

1919
// reduce AST to its simplest form, that is, either to a single value
2020
// or a simplified calc expression
21-
let reducedAst = reducer(ast, options.precision);
21+
let reducedAst = reducer(ast, options.precision, item);
2222

2323
// stringify AST and write it back
2424
node.type = 'word';

src/tests/test.es6

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,5 @@ test(
5959
'foo{font-size: calc(14px + 6 * ((100vw - 320px) / 448))}',
6060
'foo{font-size: calc(9.71px + 1.34vw)}',
6161
{ precision: 2 });
62+
assert.throws(() => test('foo{bar:calc(500px/0)}'), /Cannot divide by zero/);
63+
assert.throws(() => test('foo{bar:calc(500px/2px)}'), /Cannot divide by "px", number expected/);

0 commit comments

Comments
 (0)