Skip to content

Commit 30e229e

Browse files
authored
feat: support for readonly class (#1046)
1 parent 0cbf7c4 commit 30e229e

27 files changed

+325
-37
lines changed

src/ast/class.js

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const KIND = "class";
1919
* @property {boolean} isAnonymous
2020
* @property {boolean} isAbstract
2121
* @property {boolean} isFinal
22+
* @property {boolean} isReadonly
2223
* @property {AttrGroup[]} attrGroups
2324
*/
2425
module.exports = Declaration.extends(

src/ast/declaration.js

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ const Declaration = Statement.extends(
3939
Declaration.prototype.parseFlags = function (flags) {
4040
this.isAbstract = flags[2] === 1;
4141
this.isFinal = flags[2] === 2;
42+
this.isReadonly = flags[3] === 1;
4243
if (this.kind !== "class") {
4344
if (flags[0] === -1) {
4445
this.visibility = IS_UNDEFINED;

src/parser/class.js

+23-9
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,35 @@ module.exports = {
3636
},
3737

3838
read_class_modifiers: function () {
39-
return [0, 0, this.read_class_modifier()];
39+
const modifier = this.read_class_modifier({
40+
readonly: 0,
41+
final_or_abstract: 0,
42+
});
43+
return [0, 0, modifier.final_or_abstract, modifier.readonly];
4044
},
4145

42-
read_class_modifier: function () {
43-
const result = 0;
44-
45-
if (this.token === this.tok.T_ABSTRACT) {
46+
read_class_modifier: function (memo) {
47+
if (this.token === this.tok.T_READ_ONLY) {
48+
this.next();
49+
memo.readonly = 1;
50+
memo = this.read_class_modifier(memo);
51+
} else if (
52+
memo.final_or_abstract === 0 &&
53+
this.token === this.tok.T_ABSTRACT
54+
) {
4655
this.next();
47-
return 1;
48-
} else if (this.token === this.tok.T_FINAL) {
56+
memo.final_or_abstract = 1;
57+
memo = this.read_class_modifier(memo);
58+
} else if (
59+
memo.final_or_abstract === 0 &&
60+
this.token === this.tok.T_FINAL
61+
) {
4962
this.next();
50-
return 2;
63+
memo.final_or_abstract = 2;
64+
memo = this.read_class_modifier(memo);
5165
}
5266

53-
return result;
67+
return memo;
5468
},
5569

5670
/*

src/parser/statement.js

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ module.exports = {
4747
// optional flags
4848
case this.tok.T_ABSTRACT:
4949
case this.tok.T_FINAL:
50+
case this.tok.T_READ_ONLY:
5051
case this.tok.T_CLASS:
5152
return this.read_class_declaration_statement(attrs);
5253
case this.tok.T_INTERFACE:

test/snapshot/__snapshots__/acid.test.js.snap

+9
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,7 @@ Program {
15401540
"byref": false,
15411541
"isAbstract": false,
15421542
"isFinal": true,
1543+
"isReadonly": false,
15431544
"isStatic": false,
15441545
"kind": "method",
15451546
"leadingComments": [
@@ -1625,6 +1626,7 @@ Program {
16251626
"isAbstract": true,
16261627
"isAnonymous": false,
16271628
"isFinal": false,
1629+
"isReadonly": false,
16281630
"kind": "class",
16291631
"leadingComments": [
16301632
CommentBlock {
@@ -1713,6 +1715,7 @@ Program {
17131715
"byref": false,
17141716
"isAbstract": false,
17151717
"isFinal": false,
1718+
"isReadonly": false,
17161719
"isStatic": false,
17171720
"kind": "method",
17181721
"loc": Location {
@@ -1773,6 +1776,7 @@ Program {
17731776
"byref": false,
17741777
"isAbstract": false,
17751778
"isFinal": false,
1779+
"isReadonly": false,
17761780
"isStatic": false,
17771781
"kind": "method",
17781782
"loc": Location {
@@ -1833,6 +1837,7 @@ Program {
18331837
"byref": false,
18341838
"isAbstract": false,
18351839
"isFinal": false,
1840+
"isReadonly": false,
18361841
"isStatic": true,
18371842
"kind": "method",
18381843
"loc": Location {
@@ -2823,6 +2828,7 @@ Program {
28232828
"byref": false,
28242829
"isAbstract": false,
28252830
"isFinal": false,
2831+
"isReadonly": false,
28262832
"isStatic": false,
28272833
"kind": "method",
28282834
"loc": Location {
@@ -2936,6 +2942,7 @@ Program {
29362942
"byref": false,
29372943
"isAbstract": false,
29382944
"isFinal": false,
2945+
"isReadonly": false,
29392946
"isStatic": false,
29402947
"kind": "method",
29412948
"loc": Location {
@@ -5284,6 +5291,7 @@ next:
52845291
"byref": false,
52855292
"isAbstract": false,
52865293
"isFinal": false,
5294+
"isReadonly": false,
52875295
"isStatic": false,
52885296
"kind": "method",
52895297
"loc": Location {
@@ -5343,6 +5351,7 @@ next:
53435351
"isAbstract": false,
53445352
"isAnonymous": true,
53455353
"isFinal": false,
5354+
"isReadonly": false,
53465355
"kind": "class",
53475356
"loc": Location {
53485357
"end": Position {

test/snapshot/__snapshots__/attributes.test.js.snap

+19
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ Program {
3434
"isAbstract": false,
3535
"isAnonymous": true,
3636
"isFinal": false,
37+
"isReadonly": false,
3738
"kind": "class",
3839
"name": null,
3940
},
@@ -287,6 +288,7 @@ Program {
287288
"isAbstract": false,
288289
"isAnonymous": false,
289290
"isFinal": false,
291+
"isReadonly": false,
290292
"kind": "class",
291293
"name": Identifier {
292294
"kind": "identifier",
@@ -340,6 +342,7 @@ Program {
340342
"isAbstract": false,
341343
"isAnonymous": false,
342344
"isFinal": false,
345+
"isReadonly": false,
343346
"kind": "class",
344347
"name": Identifier {
345348
"kind": "identifier",
@@ -462,6 +465,7 @@ Program {
462465
"isAbstract": false,
463466
"isAnonymous": false,
464467
"isFinal": false,
468+
"isReadonly": false,
465469
"kind": "class",
466470
"name": Identifier {
467471
"kind": "identifier",
@@ -538,6 +542,7 @@ Program {
538542
"byref": false,
539543
"isAbstract": false,
540544
"isFinal": false,
545+
"isReadonly": false,
541546
"isStatic": false,
542547
"kind": "method",
543548
"name": Identifier {
@@ -589,6 +594,7 @@ Program {
589594
"byref": false,
590595
"isAbstract": false,
591596
"isFinal": false,
597+
"isReadonly": false,
592598
"isStatic": false,
593599
"kind": "method",
594600
"name": Identifier {
@@ -605,6 +611,7 @@ Program {
605611
"isAbstract": false,
606612
"isAnonymous": false,
607613
"isFinal": false,
614+
"isReadonly": false,
608615
"kind": "class",
609616
"name": Identifier {
610617
"kind": "identifier",
@@ -659,6 +666,7 @@ Program {
659666
"isAbstract": false,
660667
"isAnonymous": false,
661668
"isFinal": false,
669+
"isReadonly": false,
662670
"kind": "class",
663671
"name": Identifier {
664672
"kind": "identifier",
@@ -990,6 +998,7 @@ Program {
990998
"isAbstract": false,
991999
"isAnonymous": false,
9921000
"isFinal": false,
1001+
"isReadonly": false,
9931002
"kind": "class",
9941003
"name": Identifier {
9951004
"kind": "identifier",
@@ -1174,6 +1183,7 @@ Program {
11741183
"isAbstract": false,
11751184
"isAnonymous": false,
11761185
"isFinal": false,
1186+
"isReadonly": false,
11771187
"kind": "class",
11781188
"name": Identifier {
11791189
"kind": "identifier",
@@ -1420,6 +1430,7 @@ Program {
14201430
"isAbstract": false,
14211431
"isAnonymous": false,
14221432
"isFinal": false,
1433+
"isReadonly": false,
14231434
"kind": "class",
14241435
"name": Identifier {
14251436
"kind": "identifier",
@@ -1525,6 +1536,7 @@ Program {
15251536
"isAbstract": false,
15261537
"isAnonymous": false,
15271538
"isFinal": false,
1539+
"isReadonly": false,
15281540
"kind": "class",
15291541
"name": Identifier {
15301542
"kind": "identifier",
@@ -1691,6 +1703,7 @@ Program {
16911703
"byref": false,
16921704
"isAbstract": false,
16931705
"isFinal": false,
1706+
"isReadonly": false,
16941707
"isStatic": false,
16951708
"kind": "method",
16961709
"name": Identifier {
@@ -1711,6 +1724,7 @@ Program {
17111724
"byref": false,
17121725
"isAbstract": false,
17131726
"isFinal": false,
1727+
"isReadonly": false,
17141728
"isStatic": false,
17151729
"kind": "method",
17161730
"name": Identifier {
@@ -1731,6 +1745,7 @@ Program {
17311745
"byref": false,
17321746
"isAbstract": false,
17331747
"isFinal": false,
1748+
"isReadonly": false,
17341749
"isStatic": false,
17351750
"kind": "method",
17361751
"name": Identifier {
@@ -1747,6 +1762,7 @@ Program {
17471762
"isAbstract": false,
17481763
"isAnonymous": false,
17491764
"isFinal": false,
1765+
"isReadonly": false,
17501766
"kind": "class",
17511767
"name": Identifier {
17521768
"kind": "identifier",
@@ -1775,6 +1791,7 @@ Program {
17751791
"byref": false,
17761792
"isAbstract": false,
17771793
"isFinal": false,
1794+
"isReadonly": false,
17781795
"isStatic": false,
17791796
"kind": "method",
17801797
"leadingComments": [
@@ -1799,6 +1816,7 @@ Program {
17991816
"isAbstract": false,
18001817
"isAnonymous": false,
18011818
"isFinal": false,
1819+
"isReadonly": false,
18021820
"kind": "class",
18031821
"leadingComments": [
18041822
CommentLine {
@@ -1968,6 +1986,7 @@ Program {
19681986
"isAbstract": false,
19691987
"isAnonymous": false,
19701988
"isFinal": false,
1989+
"isReadonly": false,
19711990
"kind": "class",
19721991
"name": Identifier {
19731992
"kind": "identifier",

test/snapshot/__snapshots__/block.test.js.snap

+3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Program {
8888
"isAbstract": false,
8989
"isAnonymous": false,
9090
"isFinal": false,
91+
"isReadonly": false,
9192
"kind": "class",
9293
"name": Identifier {
9394
"kind": "identifier",
@@ -667,6 +668,7 @@ Program {
667668
"byref": false,
668669
"isAbstract": false,
669670
"isFinal": false,
671+
"isReadonly": false,
670672
"isStatic": false,
671673
"kind": "method",
672674
"name": Identifier {
@@ -683,6 +685,7 @@ Program {
683685
"isAbstract": false,
684686
"isAnonymous": false,
685687
"isFinal": false,
688+
"isReadonly": false,
686689
"kind": "class",
687690
"name": Identifier {
688691
"kind": "identifier",

test/snapshot/__snapshots__/call.test.js.snap

+6
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,7 @@ Program {
12131213
"byref": false,
12141214
"isAbstract": false,
12151215
"isFinal": false,
1216+
"isReadonly": false,
12161217
"isStatic": false,
12171218
"kind": "method",
12181219
"name": Identifier {
@@ -1229,6 +1230,7 @@ Program {
12291230
"isAbstract": false,
12301231
"isAnonymous": false,
12311232
"isFinal": false,
1233+
"isReadonly": false,
12321234
"kind": "class",
12331235
"name": Identifier {
12341236
"kind": "identifier",
@@ -1339,6 +1341,7 @@ Program {
13391341
"byref": false,
13401342
"isAbstract": false,
13411343
"isFinal": false,
1344+
"isReadonly": false,
13421345
"isStatic": false,
13431346
"kind": "method",
13441347
"name": Identifier {
@@ -1355,6 +1358,7 @@ Program {
13551358
"isAbstract": false,
13561359
"isAnonymous": false,
13571360
"isFinal": false,
1361+
"isReadonly": false,
13581362
"kind": "class",
13591363
"name": Identifier {
13601364
"kind": "identifier",
@@ -1450,6 +1454,7 @@ Program {
14501454
"byref": false,
14511455
"isAbstract": false,
14521456
"isFinal": false,
1457+
"isReadonly": false,
14531458
"isStatic": false,
14541459
"kind": "method",
14551460
"name": Identifier {
@@ -1466,6 +1471,7 @@ Program {
14661471
"isAbstract": false,
14671472
"isAnonymous": false,
14681473
"isFinal": false,
1474+
"isReadonly": false,
14691475
"kind": "class",
14701476
"name": Identifier {
14711477
"kind": "identifier",

0 commit comments

Comments
 (0)