Skip to content

Commit 0ab0cbd

Browse files
committed
fix glayzzle#355 & glayzzle#356 - silent node precendence
1 parent 0998e54 commit 0ab0cbd

File tree

4 files changed

+38
-12
lines changed

4 files changed

+38
-12
lines changed

src/ast.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -325,15 +325,17 @@ AST.prototype.resolvePrecedence = function(result, parser) {
325325
}
326326
} else if (
327327
result.kind === "silent" &&
328-
result.expr.right &&
329328
!result.expr.parenthesizedExpression
330329
) {
330+
if (result.expr.kind === 'assign') return result;
331331
// overall least precedence
332-
buffer = result.expr;
333-
result.expr = buffer.left;
334-
buffer.left = result;
335-
this.swapLocations(buffer, buffer.left, buffer.right, parser);
336-
result = buffer;
332+
if (result.expr.right) {
333+
buffer = result.expr;
334+
result.expr = buffer.left;
335+
buffer.left = result;
336+
this.swapLocations(buffer, buffer.left, buffer.right, parser);
337+
result = buffer;
338+
}
337339
}
338340
return result;
339341
};

src/parser/expr.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
module.exports = {
99
read_expr: function(expr) {
1010
const result = this.node();
11+
if (this.token === "@") {
12+
if (!expr) {
13+
expr = this.next().read_expr();
14+
}
15+
return result("silent", expr);
16+
}
1117
if (!expr) {
1218
expr = this.read_expr_item();
1319
}
@@ -118,7 +124,6 @@ module.exports = {
118124
*/
119125
read_expr_item: function() {
120126
let result, expr;
121-
if (this.token === "@") return this.node("silent")(this.next().read_expr());
122127
if (this.token === "+")
123128
return this.node("unary")("+", this.next().read_expr());
124129
if (this.token === "-")

test/debug.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
const util = require('util');
1818
const parser = require("../src/index");
1919
const ast = parser.parseEval(`
20-
$var->foo_{$bar};
20+
@$var += 10
2121
`, {
2222
parser: {
2323
debug: true,

test/precedence.test.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,27 @@ var parser = require("./main");
44
* Check precedence by using parenthesis on node B
55
*/
66
var checkPrecedence = function(a, b) {
7-
if (!a || !b)
7+
if (!a && !b)
88
return false;
9-
for (var k in b) {
9+
for (let k in b) {
1010
if (k === 'parenthesizedExpression') continue;
1111
if (b.hasOwnProperty(k)) {
1212
if (!a.hasOwnProperty(k))
13-
return false;
14-
if (typeof b[k] === "object") {
13+
return expect(a).toHaveProperty(k, b[k]);
14+
if (typeof b[k] === "object" && b[k] !== null) {
1515
checkPrecedence(a[k], b[k]);
1616
} else {
1717
expect(a[k]).toEqual(b[k]);
1818
}
1919
}
2020
}
21+
for (let k in a) {
22+
if (k === 'parenthesizedExpression') continue;
23+
if (a.hasOwnProperty(k)) {
24+
if (!b.hasOwnProperty(k))
25+
return expect(b).toHaveProperty(k, a[k]);
26+
}
27+
}
2128
return true;
2229
};
2330

@@ -131,6 +138,18 @@ describe("Test precedence", function() {
131138
it("test silent node / ret if", function() {
132139
shouldBeSame("@$i == true ? @$foo : @$bar;", "@($i) == true ? @($foo) : @($bar);");
133140
});
141+
it("test silent node - bugfix #355", function() {
142+
shouldBeSame(
143+
"echo 'pre' . (@$_GET['foo'] === 'bar' ? 'ok' : 'ko') . 'post'",
144+
"echo 'pre' . (@($_GET['foo']) === 'bar' ? 'ok' : 'ko') . 'post'"
145+
);
146+
});
147+
it("test silent node - bugfix #356", function() {
148+
shouldBeSame(
149+
"@$var += 10",
150+
"@($var += 10)"
151+
);
152+
});
134153
it("test silent node / cast", function() {
135154
shouldBeSame("@(int)$i + 1;", "@((int)$i) + 1;");
136155
});

0 commit comments

Comments
 (0)