Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/glayzzle/php-parser
Browse files Browse the repository at this point in the history
  • Loading branch information
ichiriac committed Aug 31, 2019
2 parents 30a67c7 + 41bec41 commit e0cdfbc
Show file tree
Hide file tree
Showing 3 changed files with 219 additions and 20 deletions.
6 changes: 6 additions & 0 deletions src/parser/variable.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,11 @@ module.exports = {
const num = this.text();
this.next();
offset = offset("number", num, null);
} else if (this.token === "-") {
this.next();
const num = -1 * this.text();
this.expect(this.tok.T_NUM_STRING) && this.next();
offset = offset("number", num, null);
} else if (this.token === this.tok.T_VARIABLE) {
const name = this.text().substring(1);
this.next();
Expand All @@ -258,6 +263,7 @@ module.exports = {
this.expect([
this.tok.T_STRING,
this.tok.T_NUM_STRING,
"-",
this.tok.T_VARIABLE
]);
// fallback : consider as identifier
Expand Down
141 changes: 141 additions & 0 deletions test/snapshot/__snapshots__/encapsed.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,41 @@ Program {
}
`;

exports[`encapsed negative offset in encapsed var offset 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Encapsed {
"kind": "encapsed",
"raw": "\\"$var[-1]\\"",
"type": "string",
"value": Array [
EncapsedPart {
"curly": false,
"expression": OffsetLookup {
"kind": "offsetlookup",
"offset": Number {
"kind": "number",
"value": -1,
},
"what": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
},
"kind": "encapsedpart",
},
],
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`encapsed newline before closing curly (complex syntax) 1`] = `
Program {
"children": Array [
Expand Down Expand Up @@ -542,6 +577,41 @@ Program {
}
`;

exports[`encapsed positive offset in encapsed var offset 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Encapsed {
"kind": "encapsed",
"raw": "\\"$var[1]\\"",
"type": "string",
"value": Array [
EncapsedPart {
"curly": false,
"expression": OffsetLookup {
"kind": "offsetlookup",
"offset": Number {
"kind": "number",
"value": "1",
},
"what": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
},
"kind": "encapsedpart",
},
],
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`encapsed propertylookup (complex syntax) 1`] = `
Program {
"children": Array [
Expand Down Expand Up @@ -1313,6 +1383,77 @@ Program {
}
`;

exports[`encapsed string offset in encapsed var offset 1`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Encapsed {
"kind": "encapsed",
"raw": "\\"$var[var]\\"",
"type": "string",
"value": Array [
EncapsedPart {
"curly": false,
"expression": OffsetLookup {
"kind": "offsetlookup",
"offset": Identifier {
"kind": "identifier",
"name": "var",
},
"what": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
},
"kind": "encapsedpart",
},
],
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`encapsed string offset in encapsed var offset 2`] = `
Program {
"children": Array [
ExpressionStatement {
"expression": Encapsed {
"kind": "encapsed",
"raw": "\\"$var[$var]\\"",
"type": "string",
"value": Array [
EncapsedPart {
"curly": false,
"expression": OffsetLookup {
"kind": "offsetlookup",
"offset": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
"what": Variable {
"curly": false,
"kind": "variable",
"name": "var",
},
},
"kind": "encapsedpart",
},
],
},
"kind": "expressionstatement",
},
],
"errors": Array [],
"kind": "program",
}
`;

exports[`encapsed two variable (simple syntax) 1`] = `
Program {
"children": Array [
Expand Down
92 changes: 72 additions & 20 deletions test/snapshot/encapsed.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const parser = require('../main');
const parser = require("../main");

describe("encapsed", function() {
it("variable (simple syntax)", function() {
Expand All @@ -14,13 +14,17 @@ describe("encapsed", function() {
expect(parser.parseEval('"string $array[0] string";')).toMatchSnapshot();
});
it("offsetlookup (2) (simple syntax)", function() {
expect(parser.parseEval('"string $array[koolaid1] string";')).toMatchSnapshot();
expect(
parser.parseEval('"string $array[koolaid1] string";')
).toMatchSnapshot();
});
it("offsetlookup (3) (simple syntax)", function() {
expect(parser.parseEval('"string $array[0][0] string";')).toMatchSnapshot();
});
it("propertylookup (simple syntax)", function() {
expect(parser.parseEval('"string $obj->property string";')).toMatchSnapshot();
expect(
parser.parseEval('"string $obj->property string";')
).toMatchSnapshot();
});
it("variable with space opening before curly", function() {
expect(parser.parseEval('"string { $var} string";')).toMatchSnapshot();
Expand All @@ -32,22 +36,34 @@ describe("encapsed", function() {
expect(parser.parseEval('"string {$var} string";')).toMatchSnapshot();
});
it("propertylookup (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->property} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj->property} string";')
).toMatchSnapshot();
});
it("offsetlookup (complex syntax)", function() {
expect(parser.parseEval('"string {$array["key"]} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$array["key"]} string";')
).toMatchSnapshot();
});
it("offsetlookup 2 (complex syntax)", function() {
expect(parser.parseEval('"string {$array[4][3]} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$array[4][3]} string";')
).toMatchSnapshot();
});
it("offsetlookup 3 (complex syntax)", function() {
expect(parser.parseEval('"string {$arr[foo][3]} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$arr[foo][3]} string";')
).toMatchSnapshot();
});
it("offsetlookup 4 (complex syntax)", function() {
expect(parser.parseEval('"string {$arr["foo"][3]} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$arr["foo"][3]} string";')
).toMatchSnapshot();
});
it("propertylookup and offsetlookup (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->values[3]->name} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj->values[3]->name} string";')
).toMatchSnapshot();
});
it("value of the var (complex syntax)", function() {
expect(parser.parseEval('"string {${$name}} string";')).toMatchSnapshot();
Expand All @@ -59,31 +75,47 @@ describe("encapsed", function() {
expect(parser.parseEval('"string {${call()}} string";')).toMatchSnapshot();
});
it("value of the var named by the return value (3) (complex syntax)", function() {
expect(parser.parseEval('"string {${$obj->property}} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {${$obj->property}} string";')
).toMatchSnapshot();
});
it("value of the var named by the return value (4) (complex syntax)", function() {
expect(parser.parseEval('"string {${$obj->call()}} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {${$obj->call()}} string";')
).toMatchSnapshot();
});
it("value of the var named by the return value (5) (complex syntax)", function() {
expect(parser.parseEval('"string {${$obj::$var}} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {${$obj::$var}} string";')
).toMatchSnapshot();
});
it("value of the var named by the return value (6) (complex syntax)", function() {
expect(parser.parseEval('"string {${$obj::call()}} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {${$obj::call()}} string";')
).toMatchSnapshot();
});
it("propertylookup by variable (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->$var} string";')).toMatchSnapshot();
});
it("propertylookup by variable (2) (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->{$array[1]}} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj->{$array[1]}} string";')
).toMatchSnapshot();
});
it("propertylookup with multiple call (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->call()->call()} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj->call()->call()} string";')
).toMatchSnapshot();
});
it("multiple propertylookup (complex syntax)", function() {
expect(parser.parseEval('"string {$obj->property->property} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj->property->property} string";')
).toMatchSnapshot();
});
it("propertylookup with comments (complex syntax)", function() {
expect(parser.parseEval('"string {$var->foo->bar /* Comment */ } string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$var->foo->bar /* Comment */ } string";')
).toMatchSnapshot();
});
it("newline before closing curly (complex syntax)", function() {
expect(parser.parseEval('"string {$var\n} string";')).toMatchSnapshot();
Expand All @@ -92,12 +124,32 @@ describe("encapsed", function() {
expect(parser.parseEval('"string {$obj::$var} string";')).toMatchSnapshot();
});
it("staticlookup (2) (complex syntax)", function() {
expect(parser.parseEval('"string {$obj::call()} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj::call()} string";')
).toMatchSnapshot();
});
it("staticlookup (3) (complex syntax)", function() {
expect(parser.parseEval('"string {$obj::$var::$var} string";')).toMatchSnapshot();
expect(
parser.parseEval('"string {$obj::$var::$var} string";')
).toMatchSnapshot();
});
it("staticlookup (4) (complex syntax)", function() {
expect(parser.parseEval('"string {$var::$target::$resource::$binary::$foo::$bar::$foobar::$bar::$foo::$foobar::$bar::$foo} string";')).toMatchSnapshot();
expect(
parser.parseEval(
'"string {$var::$target::$resource::$binary::$foo::$bar::$foobar::$bar::$foo::$foobar::$bar::$foo} string";'
)
).toMatchSnapshot();
});
it("string offset in encapsed var offset", () => {
expect(parser.parseEval(`"$var[var]";`)).toMatchSnapshot();
});
it("positive offset in encapsed var offset", () => {
expect(parser.parseEval(`"$var[1]";`)).toMatchSnapshot();
});
it("negative offset in encapsed var offset", () => {
expect(parser.parseEval(`"$var[-1]";`)).toMatchSnapshot();
});
it("string offset in encapsed var offset", () => {
expect(parser.parseEval(`"$var[$var]";`)).toMatchSnapshot();
});
});

0 comments on commit e0cdfbc

Please sign in to comment.