Skip to content

Commit 5b62027

Browse files
committed
glayzzle#188 - implement static, parent, self nodes
1 parent fd8d0dc commit 5b62027

25 files changed

+425
-335
lines changed

src/ast.js

+10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ const Position = require("./ast/position");
1515
* - [Position](#position)
1616
* - [Node](#node)
1717
* - [Identifier](#identifier)
18+
* - [Reference](#reference)
19+
* - [TypeReference](#classreference)
20+
* - [ParentReference](#classreference)
21+
* - [StaticReference](#classreference)
22+
* - [SelfReference](#classreference)
23+
* - [ClassReference](#classreference)
1824
* - [TraitUse](#traituse)
1925
* - [TraitAlias](#traitalias)
2026
* - [TraitPrecedence](#traitprecedence)
@@ -345,6 +351,7 @@ AST.prototype.prepare = function(kind, docs, parser) {
345351
require("./ast/catch"),
346352
require("./ast/class"),
347353
require("./ast/classconstant"),
354+
require("./ast/classreference"),
348355
require("./ast/clone"),
349356
require("./ast/closure"),
350357
require("./ast/comment"),
@@ -391,6 +398,7 @@ AST.prototype.prepare = function(kind, docs, parser) {
391398
require("./ast/offsetlookup"),
392399
require("./ast/operation"),
393400
require("./ast/parameter"),
401+
require("./ast/parentreference"),
394402
require("./ast/post"),
395403
require("./ast/pre"),
396404
require("./ast/print"),
@@ -400,10 +408,12 @@ AST.prototype.prepare = function(kind, docs, parser) {
400408
require("./ast/reference"),
401409
require("./ast/retif"),
402410
require("./ast/return"),
411+
require("./ast/selfreference"),
403412
require("./ast/silent"),
404413
require("./ast/statement"),
405414
require("./ast/static"),
406415
require("./ast/staticlookup"),
416+
require("./ast/staticreference"),
407417
require("./ast/string"),
408418
require("./ast/switch"),
409419
require("./ast/sys"),

src/ast/classreference.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (C) 2018 Glayzzle (BSD3 License)
3+
* @authors https://github.com/glayzzle/php-parser/graphs/contributors
4+
* @url http://glayzzle.com
5+
*/
6+
"use strict";
7+
8+
const Reference = require("./reference");
9+
const KIND = "classreference";
10+
11+
/**
12+
* Defines a class reference node
13+
* @constructor ClassReference
14+
* @extends {Node}
15+
* @property {string} name
16+
* @property {string} resolution
17+
*/
18+
const ClassReference = Reference.extends(KIND, function ClassReference(
19+
name,
20+
isRelative,
21+
docs,
22+
location
23+
) {
24+
Reference.apply(this, [KIND, docs, location]);
25+
if (isRelative) {
26+
this.resolution = ClassReference.RELATIVE_NAME;
27+
} else if (name.length === 1) {
28+
this.resolution = ClassReference.UNQUALIFIED_NAME;
29+
} else if (name[0] === "") {
30+
this.resolution = ClassReference.FULL_QUALIFIED_NAME;
31+
} else {
32+
this.resolution = ClassReference.QUALIFIED_NAME;
33+
}
34+
this.name = name.join("\\");
35+
});
36+
37+
/**
38+
* This is an identifier without a namespace separator, such as Foo
39+
* @constant {String} UNQUALIFIED_NAME
40+
*/
41+
ClassReference.UNQUALIFIED_NAME = "uqn";
42+
/**
43+
* This is an identifier with a namespace separator, such as Foo\Bar
44+
* @constant {String} QUALIFIED_NAME
45+
*/
46+
ClassReference.QUALIFIED_NAME = "qn";
47+
/**
48+
* This is an identifier with a namespace separator that begins with
49+
* a namespace separator, such as \Foo\Bar. The namespace \Foo is also
50+
* a fully qualified name.
51+
* @constant {String} FULL_QUALIFIED_NAME
52+
*/
53+
ClassReference.FULL_QUALIFIED_NAME = "fqn";
54+
/**
55+
* This is an identifier starting with namespace, such as namespace\Foo\Bar.
56+
* @constant {String} RELATIVE_NAME
57+
*/
58+
ClassReference.RELATIVE_NAME = "rn";
59+
60+
module.exports = ClassReference;

src/ast/parentreference.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Copyright (C) 2018 Glayzzle (BSD3 License)
3+
* @authors https://github.com/glayzzle/php-parser/graphs/contributors
4+
* @url http://glayzzle.com
5+
*/
6+
"use strict";
7+
8+
const Reference = require("./reference");
9+
const KIND = "parentreference";
10+
11+
/**
12+
* Defines a class reference node
13+
* @constructor ParentReference
14+
* @extends {Reference}
15+
*/
16+
const ParentReference = Reference.extends(KIND, function ParentReference(
17+
docs,
18+
location
19+
) {
20+
Reference.apply(this, [KIND, docs, location]);
21+
});
22+
module.exports = ParentReference;

src/ast/reference.js

+2-42
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,9 @@ const KIND = "reference";
1212
* Defines a reference node
1313
* @constructor Reference
1414
* @extends {Node}
15-
* @property {string} name
16-
* @property {string} resolution
1715
*/
18-
const Reference = Node.extends(KIND, function Reference(
19-
name,
20-
isRelative,
21-
docs,
22-
location
23-
) {
24-
Node.apply(this, [KIND, docs, location]);
25-
if (isRelative) {
26-
this.resolution = Reference.RELATIVE_NAME;
27-
} else if (name.length === 1) {
28-
this.resolution = Reference.UNQUALIFIED_NAME;
29-
} else if (name[0] === "") {
30-
this.resolution = Reference.FULL_QUALIFIED_NAME;
31-
} else {
32-
this.resolution = Reference.QUALIFIED_NAME;
33-
}
34-
this.name = name.join("\\");
16+
const Reference = Node.extends(KIND, function Reference(kind, docs, location) {
17+
Node.apply(this, [kind || KIND, docs, location]);
3518
});
3619

37-
/**
38-
* This is an identifier without a namespace separator, such as Foo
39-
* @constant {String} UNQUALIFIED_NAME
40-
*/
41-
Reference.UNQUALIFIED_NAME = "uqn";
42-
/**
43-
* This is an identifier with a namespace separator, such as Foo\Bar
44-
* @constant {String} QUALIFIED_NAME
45-
*/
46-
Reference.QUALIFIED_NAME = "qn";
47-
/**
48-
* This is an identifier with a namespace separator that begins with
49-
* a namespace separator, such as \Foo\Bar. The namespace \Foo is also
50-
* a fully qualified name.
51-
* @constant {String} FULL_QUALIFIED_NAME
52-
*/
53-
Reference.FULL_QUALIFIED_NAME = "fqn";
54-
/**
55-
* This is an identifier starting with namespace, such as namespace\Foo\Bar.
56-
* @constant {String} RELATIVE_NAME
57-
*/
58-
Reference.RELATIVE_NAME = "rn";
59-
6020
module.exports = Reference;

src/ast/selfreference.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Copyright (C) 2018 Glayzzle (BSD3 License)
3+
* @authors https://github.com/glayzzle/php-parser/graphs/contributors
4+
* @url http://glayzzle.com
5+
*/
6+
"use strict";
7+
8+
const Reference = require("./reference");
9+
const KIND = "selfreference";
10+
11+
/**
12+
* Defines a class reference node
13+
* @constructor SelfReference
14+
* @extends {Reference}
15+
*/
16+
const SelfReference = Reference.extends(KIND, function SelfReference(
17+
docs,
18+
location
19+
) {
20+
Reference.apply(this, [KIND, docs, location]);
21+
});
22+
module.exports = SelfReference;

src/ast/staticreference.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Copyright (C) 2018 Glayzzle (BSD3 License)
3+
* @authors https://github.com/glayzzle/php-parser/graphs/contributors
4+
* @url http://glayzzle.com
5+
*/
6+
"use strict";
7+
8+
const Reference = require("./reference");
9+
const KIND = "staticreference";
10+
11+
/**
12+
* Defines a class reference node
13+
* @constructor StaticReference
14+
* @extends {Reference}
15+
*/
16+
const StaticReference = Reference.extends(KIND, function StaticReference(
17+
docs,
18+
location
19+
) {
20+
Reference.apply(this, [KIND, docs, location]);
21+
});
22+
module.exports = StaticReference;

src/parser/function.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ module.exports = {
240240
* ```
241241
*/
242242
read_type: function() {
243-
const result = this.node("reference");
243+
const result = this.node("classreference");
244244
switch (this.token) {
245245
case this.tok.T_ARRAY:
246246
this.next();

src/parser/namespace.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,25 @@ module.exports = {
6262
* @return {Reference}
6363
*/
6464
read_namespace_name: function() {
65-
const result = this.node("reference");
65+
const result = this.node();
6666
let relative = false;
6767
if (this.token === this.tok.T_NAMESPACE) {
6868
this.next().expect(this.tok.T_NS_SEPARATOR) && this.next();
6969
relative = true;
7070
}
71-
return result(
72-
this.read_list(this.tok.T_STRING, this.tok.T_NS_SEPARATOR, true),
73-
relative
71+
const names = this.read_list(
72+
this.tok.T_STRING,
73+
this.tok.T_NS_SEPARATOR,
74+
true
7475
);
76+
if (!relative && names.length === 1) {
77+
if (names[0] === "parent") {
78+
return result("parentreference");
79+
} else if (names[0] === "self") {
80+
return result("selfreference");
81+
}
82+
}
83+
return result("classreference", names, relative);
7584
},
7685
/**
7786
* Reads a use statement

src/parser/variable.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,9 @@ module.exports = {
5959
result = name;
6060
}
6161
} else if (this.token === this.tok.T_STATIC) {
62-
result = this.node("identifier");
63-
let name = this.text();
62+
result = this.node("staticreference");
6463
this.next();
65-
result = result(name);
64+
result = result();
6665
} else {
6766
this.expect("VARIABLE");
6867
}

0 commit comments

Comments
 (0)