Skip to content
This repository was archived by the owner on Mar 29, 2023. It is now read-only.

Commit b73c136

Browse files
committed
1 parent 2bfe692 commit b73c136

File tree

5 files changed

+185
-8
lines changed

5 files changed

+185
-8
lines changed

src/parser/expr.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ module.exports = {
502502
this.token === this.tok.T_STRING ||
503503
this.token === this.tok.T_NAMESPACE
504504
) {
505-
let result = this.read_namespace_name();
505+
let result = this.read_namespace_name(true);
506506
if (this.token === this.tok.T_DOUBLE_COLON) {
507507
result = this.read_static_getter(result);
508508
}

src/parser/namespace.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module.exports = {
6161
* @see http://php.net/manual/en/language.namespaces.rules.php
6262
* @return {Reference}
6363
*/
64-
read_namespace_name: function() {
64+
read_namespace_name: function(resolveReference) {
6565
const result = this.node();
6666
let relative = false;
6767
if (this.token === this.tok.T_NAMESPACE) {
@@ -73,7 +73,11 @@ module.exports = {
7373
this.tok.T_NS_SEPARATOR,
7474
true
7575
);
76-
if (!relative && names.length === 1) {
76+
if (
77+
!relative &&
78+
names.length === 1 &&
79+
(resolveReference || this.token !== "(")
80+
) {
7781
if (names[0].toLowerCase() === "parent") {
7882
return result("parentreference", names[0]);
7983
} else if (names[0].toLowerCase() === "self") {

test/debug.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
]
1515
}
1616
*/
17-
var parser = require("../src/index");
18-
parser.parseEval(`
19-
new foo;
20-
$a = (new foo)[0];
17+
const parser = require("../src/index");
18+
const ast = parser.parseEval(`
19+
self();
20+
paRenT();
2121
`, {
2222
parser: {
2323
debug: true
2424
}
2525
}
26-
);
26+
);
27+
console.log(ast);

test/snapshot/__snapshots__/expr.test.js.snap

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,99 @@ Program {
314314
}
315315
`;
316316

317+
exports[`Test expressions fix #235 1`] = `
318+
Program {
319+
"children": Array [
320+
Call {
321+
"arguments": Array [],
322+
"kind": "call",
323+
"what": ClassReference {
324+
"kind": "classreference",
325+
"name": "self",
326+
"resolution": "uqn",
327+
},
328+
},
329+
Call {
330+
"arguments": Array [],
331+
"kind": "call",
332+
"what": ClassReference {
333+
"kind": "classreference",
334+
"name": "sElF",
335+
"resolution": "uqn",
336+
},
337+
},
338+
Call {
339+
"arguments": Array [],
340+
"kind": "call",
341+
"what": ClassReference {
342+
"kind": "classreference",
343+
"name": "parent",
344+
"resolution": "uqn",
345+
},
346+
},
347+
Call {
348+
"arguments": Array [],
349+
"kind": "call",
350+
"what": ClassReference {
351+
"kind": "classreference",
352+
"name": "pArEnT",
353+
"resolution": "uqn",
354+
},
355+
},
356+
Call {
357+
"arguments": Array [],
358+
"kind": "call",
359+
"what": StaticLookup {
360+
"kind": "staticlookup",
361+
"offset": Identifier {
362+
"kind": "identifier",
363+
"name": "foo",
364+
},
365+
"what": ParentReference {
366+
"kind": "parentreference",
367+
"raw": "parent",
368+
},
369+
},
370+
},
371+
ExpressionStatement {
372+
"expression": New {
373+
"arguments": Array [],
374+
"kind": "new",
375+
"what": SelfReference {
376+
"kind": "selfreference",
377+
"raw": "self",
378+
},
379+
},
380+
"kind": "expressionstatement",
381+
},
382+
ExpressionStatement {
383+
"expression": New {
384+
"arguments": Array [],
385+
"kind": "new",
386+
"what": StaticReference {
387+
"kind": "staticreference",
388+
"raw": "static",
389+
},
390+
},
391+
"kind": "expressionstatement",
392+
},
393+
ExpressionStatement {
394+
"expression": New {
395+
"arguments": Array [],
396+
"kind": "new",
397+
"what": ParentReference {
398+
"kind": "parentreference",
399+
"raw": "parent",
400+
},
401+
},
402+
"kind": "expressionstatement",
403+
},
404+
],
405+
"errors": Array [],
406+
"kind": "program",
407+
}
408+
`;
409+
317410
exports[`Test expressions should assign class static 1`] = `
318411
Program {
319412
"children": Array [
@@ -2208,6 +2301,63 @@ Program {
22082301
}
22092302
`;
22102303

2304+
exports[`Test expressions test node references 1`] = `
2305+
Program {
2306+
"children": Array [
2307+
Call {
2308+
"arguments": Array [],
2309+
"kind": "call",
2310+
"what": StaticLookup {
2311+
"kind": "staticlookup",
2312+
"offset": Identifier {
2313+
"kind": "identifier",
2314+
"name": "foo",
2315+
},
2316+
"what": ParentReference {
2317+
"kind": "parentreference",
2318+
"raw": "parent",
2319+
},
2320+
},
2321+
},
2322+
ExpressionStatement {
2323+
"expression": New {
2324+
"arguments": Array [],
2325+
"kind": "new",
2326+
"what": SelfReference {
2327+
"kind": "selfreference",
2328+
"raw": "self",
2329+
},
2330+
},
2331+
"kind": "expressionstatement",
2332+
},
2333+
ExpressionStatement {
2334+
"expression": New {
2335+
"arguments": Array [],
2336+
"kind": "new",
2337+
"what": StaticReference {
2338+
"kind": "staticreference",
2339+
"raw": "static",
2340+
},
2341+
},
2342+
"kind": "expressionstatement",
2343+
},
2344+
ExpressionStatement {
2345+
"expression": New {
2346+
"arguments": Array [],
2347+
"kind": "new",
2348+
"what": ParentReference {
2349+
"kind": "parentreference",
2350+
"raw": "parent",
2351+
},
2352+
},
2353+
"kind": "expressionstatement",
2354+
},
2355+
],
2356+
"errors": Array [],
2357+
"kind": "program",
2358+
}
2359+
`;
2360+
22112361
exports[`Test expressions test silent 1`] = `
22122362
Program {
22132363
"children": Array [

test/snapshot/expr.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,28 @@ describe("Test expressions", function() {
228228
`, { parser: { debug: false } })).toMatchSnapshot();
229229
});
230230

231+
it("fix #235", function() {
232+
expect(parser.parseEval(`
233+
self();
234+
sElF();
235+
parent();
236+
pArEnT();
237+
parent::foo();
238+
new self();
239+
new static();
240+
new parent();
241+
`, { parser: { debug: false } })).toMatchSnapshot();
242+
});
243+
244+
it("test node references", function() {
245+
expect(parser.parseEval(`
246+
parent::foo();
247+
new self();
248+
new static();
249+
new parent();
250+
`, { parser: { debug: false } })).toMatchSnapshot();
251+
});
252+
231253
it("test fail new", function() {
232254
expect(parser.parseEval(`
233255
$a = new foo[0];

0 commit comments

Comments
 (0)