@adminide-stack/extension-api 10.2.2-alpha.7 → 11.0.1-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/connections/jsonrpc2/connection.js +507 -525
- package/lib/connections/jsonrpc2/connection.js.map +1 -0
- package/lib/connections/jsonrpc2/events.js +100 -100
- package/lib/connections/jsonrpc2/events.js.map +1 -0
- package/lib/connections/jsonrpc2/linkedMap.js +248 -246
- package/lib/connections/jsonrpc2/linkedMap.js.map +1 -0
- package/lib/connections/jsonrpc2/messages.js +36 -40
- package/lib/connections/jsonrpc2/messages.js.map +1 -0
- package/lib/connections/jsonrpc2/test-helper.js +35 -21
- package/lib/connections/jsonrpc2/test-helper.js.map +1 -0
- package/lib/connections/jsonrpc2/trace.js +70 -82
- package/lib/connections/jsonrpc2/trace.js.map +1 -0
- package/lib/connections/jsonrpc2/transport.js +56 -56
- package/lib/connections/jsonrpc2/transport.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/webWorker.js +80 -88
- package/lib/connections/jsonrpc2/transports/webWorker.js.map +1 -0
- package/lib/connections/proxy/proxy.js +46 -47
- package/lib/connections/proxy/proxy.js.map +1 -0
- package/lib/connections/remote-rpc/browser-remote-rpc.js +55 -54
- package/lib/connections/remote-rpc/browser-remote-rpc.js.map +1 -0
- package/lib/connections/remote-rpc/rxjs-websockets.js +68 -68
- package/lib/connections/remote-rpc/rxjs-websockets.js.map +1 -0
- package/lib/constants/action-types.js +27 -27
- package/lib/constants/action-types.js.map +1 -0
- package/lib/constants/types.js +7 -7
- package/lib/constants/types.js.map +1 -0
- package/lib/core/expr/evaluator.js +103 -104
- package/lib/core/expr/evaluator.js.map +1 -0
- package/lib/core/expr/lexer.js +366 -361
- package/lib/core/expr/lexer.js.map +1 -0
- package/lib/core/expr/parser.js +228 -217
- package/lib/core/expr/parser.js.map +1 -0
- package/lib/core/types/ext-host-types.js +53 -54
- package/lib/core/types/ext-host-types.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -0
- package/lib/interfaces/contributions/contribution.js +40 -40
- package/lib/interfaces/contributions/contribution.js.map +1 -0
- package/lib/interfaces/graphql.js +1 -1
- package/lib/interfaces/graphql.js.map +1 -0
- package/lib/interfaces/model.js +3 -3
- package/lib/interfaces/model.js.map +1 -0
- package/lib/interfaces/text-document.js +76 -77
- package/lib/interfaces/text-document.js.map +1 -0
- package/lib/interfaces/webview/webview.js +3 -3
- package/lib/interfaces/webview/webview.js.map +1 -0
- package/lib/middlewares/extensionController.js +9 -5
- package/lib/middlewares/extensionController.js.map +1 -0
- package/lib/protocol/client.protocol.js +2 -2
- package/lib/protocol/client.protocol.js.map +1 -0
- package/lib/protocol/common.protocol.js +50 -48
- package/lib/protocol/common.protocol.js.map +1 -0
- package/lib/protocol/editor-missing-types.js +4 -4
- package/lib/protocol/editor-missing-types.js.map +1 -0
- package/lib/protocol/proxy-identifier.js +39 -39
- package/lib/protocol/proxy-identifier.js.map +1 -0
- package/lib/protocol/rpc-logger.js +39 -43
- package/lib/protocol/rpc-logger.js.map +1 -0
- package/lib/protocol/rpc-protocol.js +736 -724
- package/lib/protocol/rpc-protocol.js.map +1 -0
- package/lib/protocol/server.protocol.js +22 -22
- package/lib/protocol/server.protocol.js.map +1 -0
- package/lib/protocol/shared/editor.js +17 -17
- package/lib/protocol/shared/editor.js.map +1 -0
- package/lib/protocol/temporary-types.js +16 -16
- package/lib/protocol/temporary-types.js.map +1 -0
- package/lib/protocol/utils/lazy-promise.js +60 -61
- package/lib/protocol/utils/lazy-promise.js.map +1 -0
- package/lib/react/components/view-component/ViewComponent.js +31 -26
- package/lib/react/components/view-component/ViewComponent.js.map +1 -0
- package/lib/react/index.js +1 -1
- package/lib/react/index.js.map +1 -0
- package/lib/react/useExtensionController.js +12 -10
- package/lib/react/useExtensionController.js.map +1 -0
- package/lib/utils/abortable-rx.js +73 -70
- package/lib/utils/abortable-rx.js.map +1 -0
- package/lib/utils/errors.js +10 -10
- package/lib/utils/errors.js.map +1 -0
- package/lib/utils/extensions.js +11 -11
- package/lib/utils/extensions.js.map +1 -0
- package/lib/utils/helper.test.js +7 -4
- package/lib/utils/helper.test.js.map +1 -0
- package/lib/utils/paths-util.js +79 -82
- package/lib/utils/paths-util.js.map +1 -0
- package/lib/utils/rxjs/combineLatestOrDefault.js +72 -70
- package/lib/utils/rxjs/combineLatestOrDefault.js.map +1 -0
- package/lib/utils/util.js +24 -25
- package/lib/utils/util.js.map +1 -0
- package/package.json +6 -6
package/lib/core/expr/lexer.js
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
/** Valid token types in expressions. */
|
2
2
|
var TokenType;
|
3
3
|
(function (TokenType) {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
4
|
+
/** An operator. */
|
5
|
+
TokenType[TokenType["Operator"] = 0] = "Operator";
|
6
|
+
/** An identifier. */
|
7
|
+
TokenType[TokenType["Identifier"] = 1] = "Identifier";
|
8
|
+
/** A string literal. */
|
9
|
+
TokenType[TokenType["String"] = 2] = "String";
|
10
|
+
/**
|
11
|
+
* The start of a template until its first expression.
|
12
|
+
*
|
13
|
+
* See https://tc39.github.io/ecma262/#sec-template-literal-lexical-components for documentation on the
|
14
|
+
* ECMAScript lexical components for templates, upon which this is based.
|
15
|
+
*/
|
16
|
+
TokenType[TokenType["TemplateHead"] = 3] = "TemplateHead";
|
17
|
+
/** The end of a previous template expression until the next template expression. */
|
18
|
+
TokenType[TokenType["TemplateMiddle"] = 4] = "TemplateMiddle";
|
19
|
+
/** The end of a previous template expression until the end of the template. */
|
20
|
+
TokenType[TokenType["TemplateTail"] = 5] = "TemplateTail";
|
21
|
+
/** A template with no substitutions. */
|
22
|
+
TokenType[TokenType["NoSubstitutionTemplate"] = 6] = "NoSubstitutionTemplate";
|
23
|
+
/** A number literal. */
|
24
|
+
TokenType[TokenType["Number"] = 7] = "Number";
|
25
25
|
})(TokenType || (TokenType = {}));
|
26
26
|
/**
|
27
27
|
* All valid operators in expressions. The values are the operator precedence (or, for operators that are not operators, 0). This
|
@@ -30,28 +30,28 @@ var TokenType;
|
|
30
30
|
* Exported for testing only.
|
31
31
|
*/
|
32
32
|
const OPERATORS = {
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
33
|
+
'(': 0,
|
34
|
+
')': 0,
|
35
|
+
'}': 0,
|
36
|
+
',': 0,
|
37
|
+
'=': 0,
|
38
|
+
'||': 1,
|
39
|
+
'&&': 2,
|
40
|
+
'^': 4,
|
41
|
+
'==': 6,
|
42
|
+
'!=': 6,
|
43
|
+
'===': 6,
|
44
|
+
'!==': 6,
|
45
|
+
'<': 7,
|
46
|
+
'>': 7,
|
47
|
+
'<=': 7,
|
48
|
+
'>=': 7,
|
49
|
+
'+': 9,
|
50
|
+
'-': 9,
|
51
|
+
'*': 10,
|
52
|
+
'/': 10,
|
53
|
+
'%': 10,
|
54
|
+
'!': 11
|
55
55
|
};
|
56
56
|
/**
|
57
57
|
* A tree with the next valid operator characters for multi-character operators. This must be kept in sync with
|
@@ -60,351 +60,356 @@ const OPERATORS = {
|
|
60
60
|
* Exported for testing only.
|
61
61
|
*/
|
62
62
|
const OPERATOR_CHARS = {
|
63
|
-
|
64
|
-
'
|
63
|
+
'&': {
|
64
|
+
'&': true
|
65
|
+
},
|
66
|
+
'|': {
|
67
|
+
'|': true
|
68
|
+
},
|
69
|
+
'=': {
|
70
|
+
'\u0000': true,
|
65
71
|
'=': {
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
'
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
'
|
80
|
-
|
81
|
-
|
82
|
-
'
|
83
|
-
'
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
72
|
+
'\u0000': true,
|
73
|
+
'=': true
|
74
|
+
}
|
75
|
+
},
|
76
|
+
'!': {
|
77
|
+
'\u0000': true,
|
78
|
+
'=': {
|
79
|
+
'\u0000': true,
|
80
|
+
'=': true
|
81
|
+
}
|
82
|
+
},
|
83
|
+
'<': {
|
84
|
+
'\u0000': true,
|
85
|
+
'=': true
|
86
|
+
},
|
87
|
+
'>': {
|
88
|
+
'\u0000': true,
|
89
|
+
'=': true
|
90
|
+
},
|
91
|
+
'^': true,
|
92
|
+
'}': true,
|
93
|
+
'(': true,
|
94
|
+
')': true,
|
95
|
+
',': true,
|
96
|
+
'+': true,
|
97
|
+
'-': true,
|
98
|
+
'*': true,
|
99
|
+
'/': true,
|
100
|
+
'%': true
|
91
101
|
};
|
92
102
|
function isWhiteSpace(character) {
|
93
|
-
|
103
|
+
return character === '\u0009' || character === ' ' || character === '\u00A0';
|
94
104
|
}
|
95
105
|
function isLetter(character) {
|
96
|
-
|
106
|
+
return character >= 'a' && character <= 'z' || character >= 'A' && character <= 'Z';
|
97
107
|
}
|
98
108
|
function isDecimalDigit(character) {
|
99
|
-
|
109
|
+
return character >= '0' && character <= '9';
|
100
110
|
}
|
101
111
|
function isIdentifierStart(character) {
|
102
|
-
|
112
|
+
return character === '_' || isLetter(character);
|
103
113
|
}
|
104
114
|
function isIdentifierPart(character) {
|
105
|
-
|
115
|
+
return isIdentifierStart(character) || isDecimalDigit(character) || character === '.';
|
106
116
|
}
|
107
117
|
/** Scans an expression. */
|
108
118
|
class Lexer {
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
}
|
129
|
-
this.marker = this._index;
|
130
|
-
const token = this.scanNext();
|
131
|
-
if (token !== undefined) {
|
132
|
-
return token;
|
133
|
-
}
|
134
|
-
throw new SyntaxError(`Unexpected character ${JSON.stringify(this.peekNextChar())} (at ${this.index})`);
|
135
|
-
}
|
136
|
-
peek() {
|
137
|
-
const savedIndex = this._index;
|
138
|
-
const savedCurlyStack = this.curlyStack;
|
139
|
-
let token;
|
140
|
-
try {
|
141
|
-
token = this.next();
|
142
|
-
}
|
143
|
-
catch {
|
144
|
-
token = undefined;
|
145
|
-
}
|
146
|
-
this._index = savedIndex;
|
147
|
-
this.curlyStack = savedCurlyStack;
|
148
|
-
if (!token) {
|
149
|
-
return undefined;
|
150
|
-
}
|
151
|
-
return { type: token.type, value: token.value };
|
119
|
+
expression = '';
|
120
|
+
length = 0;
|
121
|
+
_index = 0;
|
122
|
+
marker = 0;
|
123
|
+
curlyStack = 0;
|
124
|
+
/** The current character position of the lexer's cursor. */
|
125
|
+
get index() {
|
126
|
+
return this._index;
|
127
|
+
}
|
128
|
+
reset(string) {
|
129
|
+
this.expression = string;
|
130
|
+
this.length = string.length;
|
131
|
+
this._index = 0;
|
132
|
+
this.curlyStack = 0;
|
133
|
+
}
|
134
|
+
next() {
|
135
|
+
this.skipSpaces();
|
136
|
+
if (this._index >= this.length) {
|
137
|
+
return undefined;
|
152
138
|
}
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
}
|
158
|
-
token = this.scanTemplate();
|
159
|
-
if (token !== undefined) {
|
160
|
-
return token;
|
161
|
-
}
|
162
|
-
token = this.scanNumber();
|
163
|
-
if (token !== undefined) {
|
164
|
-
return token;
|
165
|
-
}
|
166
|
-
token = this.scanOperator();
|
167
|
-
if (token !== undefined) {
|
168
|
-
return token;
|
169
|
-
}
|
170
|
-
token = this.scanIdentifier();
|
171
|
-
if (token !== undefined) {
|
172
|
-
return token;
|
173
|
-
}
|
174
|
-
return undefined;
|
175
|
-
}
|
176
|
-
peekNextChar(advance = 0) {
|
177
|
-
const index = this._index + advance;
|
178
|
-
return index < this.length ? this.expression.charAt(index) : '\u0000';
|
179
|
-
}
|
180
|
-
getNextChar() {
|
181
|
-
let character = '\u0000';
|
182
|
-
const index = this._index;
|
183
|
-
if (index < this.length) {
|
184
|
-
character = this.expression.charAt(index);
|
185
|
-
this._index += 1;
|
186
|
-
}
|
187
|
-
return character;
|
188
|
-
}
|
189
|
-
createToken(type, value) {
|
190
|
-
return {
|
191
|
-
type,
|
192
|
-
value,
|
193
|
-
start: this.marker,
|
194
|
-
end: this._index,
|
195
|
-
};
|
196
|
-
}
|
197
|
-
skipSpaces() {
|
198
|
-
while (this._index < this.length) {
|
199
|
-
const character = this.peekNextChar();
|
200
|
-
if (!isWhiteSpace(character)) {
|
201
|
-
break;
|
202
|
-
}
|
203
|
-
this.getNextChar();
|
204
|
-
}
|
139
|
+
this.marker = this._index;
|
140
|
+
const token = this.scanNext();
|
141
|
+
if (token !== undefined) {
|
142
|
+
return token;
|
205
143
|
}
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
}
|
217
|
-
if (value === '}') {
|
218
|
-
this.curlyStack--;
|
219
|
-
}
|
220
|
-
if (value === '') {
|
221
|
-
return undefined;
|
222
|
-
}
|
223
|
-
return this.createToken(TokenType.Operator, value);
|
144
|
+
throw new SyntaxError(`Unexpected character ${JSON.stringify(this.peekNextChar())} (at ${this.index})`);
|
145
|
+
}
|
146
|
+
peek() {
|
147
|
+
const savedIndex = this._index;
|
148
|
+
const savedCurlyStack = this.curlyStack;
|
149
|
+
let token;
|
150
|
+
try {
|
151
|
+
token = this.next();
|
152
|
+
} catch {
|
153
|
+
token = undefined;
|
224
154
|
}
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
}
|
230
|
-
let id = this.getNextChar();
|
231
|
-
while (true) {
|
232
|
-
character = this.peekNextChar();
|
233
|
-
if (!isIdentifierPart(character)) {
|
234
|
-
break;
|
235
|
-
}
|
236
|
-
id += this.getNextChar();
|
237
|
-
}
|
238
|
-
return this.createToken(TokenType.Identifier, id);
|
155
|
+
this._index = savedIndex;
|
156
|
+
this.curlyStack = savedCurlyStack;
|
157
|
+
if (!token) {
|
158
|
+
return undefined;
|
239
159
|
}
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
const character = this.getNextChar();
|
250
|
-
if (character === quote) {
|
251
|
-
terminated = true;
|
252
|
-
break;
|
253
|
-
}
|
254
|
-
if (character === '\\') {
|
255
|
-
string += backslashEscapeCodeString(this.getNextChar());
|
256
|
-
}
|
257
|
-
else {
|
258
|
-
string += character;
|
259
|
-
}
|
260
|
-
}
|
261
|
-
if (!terminated) {
|
262
|
-
throw new Error(`Unterminated string literal (at ${this.index})`);
|
263
|
-
}
|
264
|
-
return this.createToken(TokenType.String, string);
|
160
|
+
return {
|
161
|
+
type: token.type,
|
162
|
+
value: token.value
|
163
|
+
};
|
164
|
+
}
|
165
|
+
scanNext() {
|
166
|
+
let token = this.scanString();
|
167
|
+
if (token !== undefined) {
|
168
|
+
return token;
|
265
169
|
}
|
266
|
-
scanTemplate()
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
170
|
+
token = this.scanTemplate();
|
171
|
+
if (token !== undefined) {
|
172
|
+
return token;
|
173
|
+
}
|
174
|
+
token = this.scanNumber();
|
175
|
+
if (token !== undefined) {
|
176
|
+
return token;
|
177
|
+
}
|
178
|
+
token = this.scanOperator();
|
179
|
+
if (token !== undefined) {
|
180
|
+
return token;
|
181
|
+
}
|
182
|
+
token = this.scanIdentifier();
|
183
|
+
if (token !== undefined) {
|
184
|
+
return token;
|
185
|
+
}
|
186
|
+
return undefined;
|
187
|
+
}
|
188
|
+
peekNextChar(advance = 0) {
|
189
|
+
const index = this._index + advance;
|
190
|
+
return index < this.length ? this.expression.charAt(index) : '\u0000';
|
191
|
+
}
|
192
|
+
getNextChar() {
|
193
|
+
let character = '\u0000';
|
194
|
+
const index = this._index;
|
195
|
+
if (index < this.length) {
|
196
|
+
character = this.expression.charAt(index);
|
197
|
+
this._index += 1;
|
198
|
+
}
|
199
|
+
return character;
|
200
|
+
}
|
201
|
+
createToken(type, value) {
|
202
|
+
return {
|
203
|
+
type,
|
204
|
+
value,
|
205
|
+
start: this.marker,
|
206
|
+
end: this._index
|
207
|
+
};
|
208
|
+
}
|
209
|
+
skipSpaces() {
|
210
|
+
while (this._index < this.length) {
|
211
|
+
const character = this.peekNextChar();
|
212
|
+
if (!isWhiteSpace(character)) {
|
213
|
+
break;
|
214
|
+
}
|
215
|
+
this.getNextChar();
|
216
|
+
}
|
217
|
+
}
|
218
|
+
scanOperator() {
|
219
|
+
let searchTree = OPERATOR_CHARS;
|
220
|
+
let value = '';
|
221
|
+
while (searchTree && searchTree !== true) {
|
222
|
+
const character = this.peekNextChar();
|
223
|
+
searchTree = searchTree[character];
|
224
|
+
if (searchTree) {
|
225
|
+
value += character;
|
271
226
|
this.getNextChar();
|
272
|
-
|
273
|
-
return this.doScanTemplate(head);
|
274
|
-
}
|
275
|
-
backtick() {
|
276
|
-
return true;
|
277
|
-
}
|
278
|
-
doScanTemplate(head) {
|
279
|
-
let tail = false;
|
280
|
-
let terminated = false;
|
281
|
-
let hasSubstitution = false;
|
282
|
-
let string = '';
|
283
|
-
while (this._index < this.length) {
|
284
|
-
const character = this.getNextChar();
|
285
|
-
if (character === '`' && this.backtick()) {
|
286
|
-
tail = true;
|
287
|
-
terminated = true;
|
288
|
-
break;
|
289
|
-
}
|
290
|
-
if (character === '\\') {
|
291
|
-
string += backslashEscapeCodeString(this.getNextChar());
|
292
|
-
}
|
293
|
-
else {
|
294
|
-
if (character === '$') {
|
295
|
-
const character2 = this.peekNextChar();
|
296
|
-
if (character2 === '{') {
|
297
|
-
this.curlyStack++;
|
298
|
-
this.getNextChar();
|
299
|
-
terminated = true;
|
300
|
-
hasSubstitution = true;
|
301
|
-
break;
|
302
|
-
}
|
303
|
-
}
|
304
|
-
string += character;
|
305
|
-
}
|
306
|
-
}
|
307
|
-
if (!head) {
|
308
|
-
this.curlyStack--;
|
309
|
-
}
|
310
|
-
if (this.backtick()) {
|
311
|
-
if (!terminated) {
|
312
|
-
throw new Error(`Unterminated template literal (at ${this.index})`);
|
313
|
-
}
|
314
|
-
}
|
315
|
-
else if (this._index === this.length) {
|
316
|
-
tail = true;
|
317
|
-
}
|
318
|
-
let type;
|
319
|
-
if (head && terminated && !hasSubstitution) {
|
320
|
-
type = TokenType.NoSubstitutionTemplate;
|
321
|
-
}
|
322
|
-
else if (head) {
|
323
|
-
type = TokenType.TemplateHead;
|
324
|
-
}
|
325
|
-
else if (tail) {
|
326
|
-
type = TokenType.TemplateTail;
|
327
|
-
}
|
328
|
-
else {
|
329
|
-
type = TokenType.TemplateMiddle;
|
330
|
-
}
|
331
|
-
return this.createToken(type, string);
|
227
|
+
}
|
332
228
|
}
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
229
|
+
if (value === '}') {
|
230
|
+
this.curlyStack--;
|
231
|
+
}
|
232
|
+
if (value === '') {
|
233
|
+
return undefined;
|
234
|
+
}
|
235
|
+
return this.createToken(TokenType.Operator, value);
|
236
|
+
}
|
237
|
+
scanIdentifier() {
|
238
|
+
let character = this.peekNextChar();
|
239
|
+
if (!isIdentifierStart(character)) {
|
240
|
+
return undefined;
|
241
|
+
}
|
242
|
+
let id = this.getNextChar();
|
243
|
+
while (true) {
|
244
|
+
character = this.peekNextChar();
|
245
|
+
if (!isIdentifierPart(character)) {
|
246
|
+
break;
|
247
|
+
}
|
248
|
+
id += this.getNextChar();
|
249
|
+
}
|
250
|
+
return this.createToken(TokenType.Identifier, id);
|
251
|
+
}
|
252
|
+
scanString() {
|
253
|
+
const quote = this.peekNextChar();
|
254
|
+
if (quote !== "'" && quote !== '"') {
|
255
|
+
return undefined;
|
256
|
+
}
|
257
|
+
this.getNextChar();
|
258
|
+
let terminated = false;
|
259
|
+
let string = '';
|
260
|
+
while (this._index < this.length) {
|
261
|
+
const character = this.getNextChar();
|
262
|
+
if (character === quote) {
|
263
|
+
terminated = true;
|
264
|
+
break;
|
265
|
+
}
|
266
|
+
if (character === '\\') {
|
267
|
+
string += backslashEscapeCodeString(this.getNextChar());
|
268
|
+
} else {
|
269
|
+
string += character;
|
270
|
+
}
|
271
|
+
}
|
272
|
+
if (!terminated) {
|
273
|
+
throw new Error(`Unterminated string literal (at ${this.index})`);
|
274
|
+
}
|
275
|
+
return this.createToken(TokenType.String, string);
|
276
|
+
}
|
277
|
+
scanTemplate() {
|
278
|
+
const character = this.peekNextChar();
|
279
|
+
if (!(character === '`' || character === '}' && this.curlyStack > 0)) {
|
280
|
+
return undefined;
|
281
|
+
}
|
282
|
+
this.getNextChar();
|
283
|
+
const head = character === '`';
|
284
|
+
return this.doScanTemplate(head);
|
285
|
+
}
|
286
|
+
backtick() {
|
287
|
+
return true;
|
288
|
+
}
|
289
|
+
doScanTemplate(head) {
|
290
|
+
let tail = false;
|
291
|
+
let terminated = false;
|
292
|
+
let hasSubstitution = false;
|
293
|
+
let string = '';
|
294
|
+
while (this._index < this.length) {
|
295
|
+
const character = this.getNextChar();
|
296
|
+
if (character === '`' && this.backtick()) {
|
297
|
+
tail = true;
|
298
|
+
terminated = true;
|
299
|
+
break;
|
300
|
+
}
|
301
|
+
if (character === '\\') {
|
302
|
+
string += backslashEscapeCodeString(this.getNextChar());
|
303
|
+
} else {
|
304
|
+
if (character === '$') {
|
305
|
+
const character2 = this.peekNextChar();
|
306
|
+
if (character2 === '{') {
|
307
|
+
this.curlyStack++;
|
308
|
+
this.getNextChar();
|
309
|
+
terminated = true;
|
310
|
+
hasSubstitution = true;
|
311
|
+
break;
|
312
|
+
}
|
379
313
|
}
|
380
|
-
|
381
|
-
|
314
|
+
string += character;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
if (!head) {
|
318
|
+
this.curlyStack--;
|
319
|
+
}
|
320
|
+
if (this.backtick()) {
|
321
|
+
if (!terminated) {
|
322
|
+
throw new Error(`Unterminated template literal (at ${this.index})`);
|
323
|
+
}
|
324
|
+
} else if (this._index === this.length) {
|
325
|
+
tail = true;
|
326
|
+
}
|
327
|
+
let type;
|
328
|
+
if (head && terminated && !hasSubstitution) {
|
329
|
+
type = TokenType.NoSubstitutionTemplate;
|
330
|
+
} else if (head) {
|
331
|
+
type = TokenType.TemplateHead;
|
332
|
+
} else if (tail) {
|
333
|
+
type = TokenType.TemplateTail;
|
334
|
+
} else {
|
335
|
+
type = TokenType.TemplateMiddle;
|
336
|
+
}
|
337
|
+
return this.createToken(type, string);
|
338
|
+
}
|
339
|
+
scanNumber() {
|
340
|
+
let character = this.peekNextChar();
|
341
|
+
if (!isDecimalDigit(character) && character !== '.') {
|
342
|
+
return undefined;
|
343
|
+
}
|
344
|
+
let number = '';
|
345
|
+
if (character !== '.') {
|
346
|
+
number = this.getNextChar();
|
347
|
+
while (true) {
|
348
|
+
character = this.peekNextChar();
|
349
|
+
if (!isDecimalDigit(character)) {
|
350
|
+
break;
|
351
|
+
}
|
352
|
+
number += this.getNextChar();
|
353
|
+
}
|
354
|
+
}
|
355
|
+
if (character === '.') {
|
356
|
+
number += this.getNextChar();
|
357
|
+
while (true) {
|
358
|
+
character = this.peekNextChar();
|
359
|
+
if (!isDecimalDigit(character)) {
|
360
|
+
break;
|
361
|
+
}
|
362
|
+
number += this.getNextChar();
|
363
|
+
}
|
364
|
+
}
|
365
|
+
if (character === 'e' || character === 'E') {
|
366
|
+
number += this.getNextChar();
|
367
|
+
character = this.peekNextChar();
|
368
|
+
if (character === '+' || character === '-' || isDecimalDigit(character)) {
|
369
|
+
number += this.getNextChar();
|
370
|
+
while (true) {
|
371
|
+
character = this.peekNextChar();
|
372
|
+
if (!isDecimalDigit(character)) {
|
373
|
+
break;
|
374
|
+
}
|
375
|
+
number += this.getNextChar();
|
376
|
+
}
|
377
|
+
} else {
|
378
|
+
character = `character ${JSON.stringify(character)}`;
|
379
|
+
if (this._index >= this.length) {
|
380
|
+
character = '<end>';
|
382
381
|
}
|
383
|
-
|
382
|
+
throw new SyntaxError(`Unexpected ${character} after the exponent sign (at ${this.index})`);
|
383
|
+
}
|
384
|
+
}
|
385
|
+
if (number === '.') {
|
386
|
+
throw new SyntaxError(`Expected decimal digits after the dot sign (at ${this.index})`);
|
384
387
|
}
|
388
|
+
return this.createToken(TokenType.Number, number);
|
389
|
+
}
|
385
390
|
}
|
386
391
|
/** Scans a template. */
|
387
392
|
class TemplateLexer extends Lexer {
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
}
|
392
|
-
return super.next();
|
393
|
-
}
|
394
|
-
backtick() {
|
395
|
-
// The root is not surrounded with backticks.
|
396
|
-
return this.curlyStack !== 0;
|
393
|
+
next() {
|
394
|
+
if (this._index === 0) {
|
395
|
+
return this.doScanTemplate(true);
|
397
396
|
}
|
397
|
+
return super.next();
|
398
|
+
}
|
399
|
+
backtick() {
|
400
|
+
// The root is not surrounded with backticks.
|
401
|
+
return this.curlyStack !== 0;
|
402
|
+
}
|
398
403
|
}
|
399
404
|
function backslashEscapeCodeString(character) {
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
}export{Lexer,OPERATORS,OPERATOR_CHARS,TemplateLexer,TokenType}
|
405
|
+
switch (character) {
|
406
|
+
case 'n':
|
407
|
+
return '\n';
|
408
|
+
case 'r':
|
409
|
+
return '\r';
|
410
|
+
case 't':
|
411
|
+
return '\t';
|
412
|
+
default:
|
413
|
+
return character;
|
414
|
+
}
|
415
|
+
}export{Lexer,OPERATORS,OPERATOR_CHARS,TemplateLexer,TokenType};//# sourceMappingURL=lexer.js.map
|