Skip to content

Commit

Permalink
Merge e944bb3 into 0df5a49
Browse files Browse the repository at this point in the history
  • Loading branch information
evilebottnawi committed Sep 1, 2019
2 parents 0df5a49 + e944bb3 commit 184b798
Show file tree
Hide file tree
Showing 10 changed files with 203 additions and 5 deletions.
3 changes: 2 additions & 1 deletion index.d.ts
Expand Up @@ -141,7 +141,8 @@ declare module "php-parser" {
T_COALESCE = 230,
T_POW = 231,
T_POW_EQUAL = 232,
T_SPACESHIP = 233
T_SPACESHIP = 233,
T_COALESCE_EQUAL = 234
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/index.js
Expand Up @@ -96,6 +96,7 @@ const engine = function(options) {
}
options.lexer.php7 = options.parser.php7;
options.lexer.php73 = options.parser.php73;
options.lexer.php74 = options.parser.php74;
}
combine(options, this);
}
Expand Down
1 change: 1 addition & 0 deletions src/lexer.js
Expand Up @@ -31,6 +31,7 @@ const lexer = function(engine) {
this.short_tags = false;
this.php7 = true;
this.php73 = true;
this.php74 = true;
this.yyprevcol = 0;
this.keywords = {
__class__: this.tok.T_CLASS_C,
Expand Down
9 changes: 7 additions & 2 deletions src/lexer/tokens.js
Expand Up @@ -154,8 +154,13 @@ module.exports = {
},
"?": function() {
if (this.php7 && this._input[this.offset] === "?") {
this.input();
return this.tok.T_COALESCE;
if (this.php74 && this._input[this.offset + 1] === "=") {
this.consume(2);
return this.tok.T_COALESCE_EQUAL;
} else {
this.input();
return this.tok.T_COALESCE;
}
}
return "?";
},
Expand Down
4 changes: 4 additions & 0 deletions src/parser/expr.js
Expand Up @@ -433,6 +433,10 @@ module.exports = {
if (isConst) this.error("VARIABLE");
return result("assign", expr, this.next().read_expr(), ">>=");

case this.tok.T_COALESCE_EQUAL:
if (isConst) this.error("VARIABLE");
return result("assign", expr, this.next().read_expr(), "??=");

case this.tok.T_INC:
if (isConst) this.error("VARIABLE");
this.next();
Expand Down
6 changes: 4 additions & 2 deletions src/tokens.js
Expand Up @@ -143,7 +143,8 @@ module.exports = {
230: "T_COALESCE",
231: "T_POW",
232: "T_POW_EQUAL",
233: "T_SPACESHIP"
233: "T_SPACESHIP",
234: "T_COALESCE_EQUAL"
},
names: {
T_HALT_COMPILER: 101,
Expand Down Expand Up @@ -278,6 +279,7 @@ module.exports = {
T_COALESCE: 230,
T_POW: 231,
T_POW_EQUAL: 232,
T_SPACESHIP: 233
T_SPACESHIP: 233,
T_COALESCE_EQUAL: 234
}
};
119 changes: 119 additions & 0 deletions test/snapshot/__snapshots__/assign.test.js.snap
Expand Up @@ -234,6 +234,125 @@ Program {
}
`;

exports[`assign ??= (php < 7) 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": RetIf {
"falseExpr": undefined,
"kind": "retif",
"test": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"trueExpr": undefined,
},
"kind": "expressionstatement",
},
ExpressionStatement {
"expression": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"kind": "expressionstatement",
},
],
"errors": Array [
Error {
"expected": "EXPR",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '?' on line 1",
"token": "'?'",
},
Error {
"expected": ":",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '=', expecting ':' on line 1",
"token": "'='",
},
Error {
"expected": "EXPR",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '=' on line 1",
"token": "'='",
},
Error {
"expected": ";",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE), expecting ';' on line 1",
"token": "'$var' (T_VARIABLE)",
},
],
"kind": "program",
}
`;

exports[`assign ??= 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Assign {
"kind": "assign",
"left": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"operator": "??=",
"right": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`assign ??= with bin 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Assign {
"kind": "assign",
"left": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"operator": "??=",
"right": Bin {
"kind": "bin",
"left": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"right": Number {
"kind": "number",
"value": "10",
},
"type": "+",
},
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`assign ^= 1`] = `
Program {
"children": Array [
Expand Down
41 changes: 41 additions & 0 deletions test/snapshot/__snapshots__/bin.test.js.snap
Expand Up @@ -494,6 +494,47 @@ Program {
}
`;

exports[`bin ?? (php < 7) 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": RetIf {
"falseExpr": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"kind": "retif",
"test": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"trueExpr": undefined,
},
"kind": "expressionstatement",
},
],
"errors": Array [
Error {
"expected": "EXPR",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '?' on line 1",
"token": "'?'",
},
Error {
"expected": ":",
"kind": "error",
"line": 1,
"message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE), expecting ':' on line 1",
"token": "'$var' (T_VARIABLE)",
},
],
"kind": "program",
}
`;

exports[`bin ?? 1`] = `
Program {
"children": Array [
Expand Down
15 changes: 15 additions & 0 deletions test/snapshot/assign.test.js
Expand Up @@ -46,6 +46,21 @@ describe('assign', () => {
it('>>=', () => {
expect(parser.parseEval("$var >>= $var;")).toMatchSnapshot();
});
it('??=', () => {
expect(parser.parseEval("$var ??= $var;")).toMatchSnapshot();
});
it('??= with bin', () => {
expect(parser.parseEval("$var ??= $var + 10;")).toMatchSnapshot();
});
it('??= (php < 7)', function() {
const astErr = parser.parseEval(`$var ??= $var;`, {
parser: {
php7: false,
suppressErrors: true
}
});
expect(astErr).toMatchSnapshot();
});
it('with ref', () => {
expect(parser.parseEval("$bar = &$foo;")).toMatchSnapshot();
});
Expand Down
9 changes: 9 additions & 0 deletions test/snapshot/bin.test.js
Expand Up @@ -101,6 +101,15 @@ describe('bin', () => {
it('??', () => {
expect(parser.parseEval('$foo ?? $bar;')).toMatchSnapshot();
});
it('?? (php < 7)', function() {
const astErr = parser.parseEval(`$var ?? $var;`, {
parser: {
php7: false,
suppressErrors: true
}
});
expect(astErr).toMatchSnapshot();
});
it('assign', () => {
expect(parser.parseEval('$var = $var + $var;')).toMatchSnapshot();
});
Expand Down

0 comments on commit 184b798

Please sign in to comment.