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

Commit d1a2dea

Browse files
committed
feat(MemberExpression): ✨Support [] member access
1 parent 641c367 commit d1a2dea

File tree

2 files changed

+54
-38
lines changed

2 files changed

+54
-38
lines changed

__tests__/fixtures/parser/003/index.json

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,15 @@
3737
"left": {
3838
"type": "MemberExpression",
3939
"object": {
40-
"type": "Identifier",
41-
"name": "starNoteShowMediaInfo[index]"
40+
"type": "MemberExpression",
41+
"object": {
42+
"type": "Identifier",
43+
"name": "starNoteShowMediaInfo"
44+
},
45+
"property": {
46+
"type": "Identifier",
47+
"name": "index"
48+
}
4249
},
4350
"property": {
4451
"type": "Identifier",
@@ -62,8 +69,15 @@
6269
"left": {
6370
"type": "MemberExpression",
6471
"object": {
65-
"type": "Identifier",
66-
"name": "starNoteShowMediaInfo[index]"
72+
"type": "MemberExpression",
73+
"object": {
74+
"type": "Identifier",
75+
"name": "starNoteShowMediaInfo"
76+
},
77+
"property": {
78+
"type": "Identifier",
79+
"name": "index"
80+
}
6781
},
6882
"property": {
6983
"type": "Identifier",
@@ -87,8 +101,15 @@
87101
"left": {
88102
"type": "MemberExpression",
89103
"object": {
90-
"type": "Identifier",
91-
"name": "starNoteShowMediaInfo[index]"
104+
"type": "MemberExpression",
105+
"object": {
106+
"type": "Identifier",
107+
"name": "starNoteShowMediaInfo"
108+
},
109+
"property": {
110+
"type": "Identifier",
111+
"name": "index"
112+
}
92113
},
93114
"property": {
94115
"type": "Identifier",
@@ -112,8 +133,15 @@
112133
"left": {
113134
"type": "MemberExpression",
114135
"object": {
115-
"type": "Identifier",
116-
"name": "starNoteShowMediaInfo[index]"
136+
"type": "MemberExpression",
137+
"object": {
138+
"type": "Identifier",
139+
"name": "starNoteShowMediaInfo"
140+
},
141+
"property": {
142+
"type": "Identifier",
143+
"name": "index"
144+
}
117145
},
118146
"property": {
119147
"type": "Identifier",

index.js

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -486,42 +486,30 @@ function parser(inputTokens) {
486486
return null;
487487
}
488488

489-
if (tokens[0].type !== tokenTypes.IDENTIFIER || tokens[tokens.length - 1].type !== tokenTypes.IDENTIFIER) {
490-
return null;
489+
if (
490+
tokens[tokens.length - 1].type === tokenTypes.IDENTIFIER &&
491+
tokens[tokens.length - 2].type === tokenTypes.LABEL &&
492+
tokens[tokens.length - 2].value === '.'
493+
) {
494+
return new astFactory.MemberExpression(getExpression(tokens.slice(0, -2)), getExpression(tokens.slice(-1)));
491495
}
492496

493-
// * ... + (identifier || literal) + label(.) + identify
494-
// * ... + (identifier || literal) + label([) + (identify || literal) + label(])
495-
let expecting = tokenTypes.IDENTIFIER;
496-
let access = [];
497-
let i = 0;
498-
while (
499-
i < tokens.length && (
500-
(tokens[i].type === expecting && expecting === tokenTypes.LABEL && tokens[i].value === '.')
501-
|| (tokens[i].type === expecting && expecting === tokenTypes.IDENTIFIER)
502-
)
503-
) {
504-
if (tokens[i].type === tokenTypes.IDENTIFIER) {
505-
access.push(tokens[i]);
497+
if (tokens[tokens.length - 1].type === tokenTypes.LABEL && tokens[tokens.length - 1].value === ']') {
498+
// get [ index
499+
let startBracketIndex = -1;
500+
for (let i = tokens.length - 1; i >= 0; i--) {
501+
if (tokens[i].type === tokenTypes.LABEL && tokens[i].value === '[') {
502+
startBracketIndex = i;
503+
break;
504+
}
506505
}
507-
i++;
508-
if (expecting === tokenTypes.LABEL) {
509-
expecting = tokenTypes.IDENTIFIER;
510-
} else {
511-
expecting = tokenTypes.LABEL;
506+
if (startBracketIndex === -1) {
507+
throw new Error('Expect [');
512508
}
509+
return new astFactory.MemberExpression(getExpression(tokens.slice(0, startBracketIndex)), getExpression(tokens.slice(startBracketIndex + 1, tokens.length - 1)));
513510
}
514511

515-
if (expecting === tokenTypes.IDENTIFIER && i !== tokens.length - 1) {
516-
return null;
517-
}
518-
519-
let object = new astFactory.Identifier(access[0].value);
520-
521-
for (let j = 1; j < access.length; j++) {
522-
object = new astFactory.MemberExpression(object, new astFactory.Identifier(access[j].value));
523-
}
524-
return object;
512+
return null;
525513
}
526514

527515
function getExpression(tokens) {

0 commit comments

Comments
 (0)