@ibyar/expressions 0.5.1 → 0.5.2
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/README.md +1 -1
- package/package.json +3 -3
- package/scope/event.d.ts +2 -2
- package/scope/event.js +8 -14
- package/scope/event.js.map +1 -1
- package/scope/scope.d.ts +2 -2
- package/scope/scope.js +6 -9
- package/scope/scope.js.map +1 -1
- package/v8/app.js.map +1 -1
- package/v8/parser.d.ts +1 -1
- package/v8/parser.js.map +1 -1
package/README.md
CHANGED
|
@@ -136,7 +136,7 @@ console.log(
|
|
|
136
136
|
| logical-and | `&&` |
|
|
137
137
|
| logical-or | `\|\|` |
|
|
138
138
|
| conditional | `?:` |
|
|
139
|
-
| pipeline |
|
|
139
|
+
| pipeline | `\|>` |
|
|
140
140
|
| assignment | `= += -= *= **= /= %= <<= >>= >>>= &= ^= \|= &&= \|\|= ??= >?= <?= %%=` |
|
|
141
141
|
| comma | `,` |
|
|
142
142
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ibyar/expressions",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Aurora expression, an template expression evaluation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/ibyar/aurora/tree/dev/packages/expressions",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"tslib": "^2.3.1"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"typescript": "^4.5.
|
|
30
|
+
"typescript": "^4.5.4"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "tsc --build --verbose"
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"eval",
|
|
50
50
|
"evaluation"
|
|
51
51
|
],
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "9edc86bbc2e99670dda5f9310da83377e68e3535"
|
|
53
53
|
}
|
package/scope/event.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ExpressionEventMap } from '../api/expression.js';
|
|
2
2
|
import { ReactiveScope, Scope, ScopeContext } from './scope.js';
|
|
3
3
|
import { Stack } from './stack.js';
|
|
4
|
-
export declare function findScopeByEventMap(events: ExpressionEventMap, stack: Stack):
|
|
5
|
-
export declare function findReactiveScopeByEventMap(events: ExpressionEventMap, stack: Stack):
|
|
4
|
+
export declare function findScopeByEventMap(events: ExpressionEventMap, stack: Stack): [string, Scope<ScopeContext>][];
|
|
5
|
+
export declare function findReactiveScopeByEventMap(events: ExpressionEventMap, stack: Stack): [string, ReactiveScope<ScopeContext>][];
|
package/scope/event.js
CHANGED
|
@@ -1,41 +1,35 @@
|
|
|
1
1
|
import { ReactiveScope } from './scope.js';
|
|
2
|
-
function visitInnerScope(eventNames, events, scope,
|
|
2
|
+
function visitInnerScope(eventNames, events, scope, scopeTuples) {
|
|
3
3
|
eventNames.forEach(eventName => {
|
|
4
4
|
if (eventName.startsWith(':')) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
scopeTuples.push([eventName, scope]);
|
|
8
8
|
const nextEvents = Object.keys(events[eventName]);
|
|
9
9
|
if (!nextEvents.length) {
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
const innerScope = scope.getScopeOrCreat(eventName);
|
|
13
|
-
visitInnerScope(nextEvents, events[eventName], innerScope,
|
|
13
|
+
visitInnerScope(nextEvents, events[eventName], innerScope, scopeTuples);
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
export function findScopeByEventMap(events, stack) {
|
|
17
|
-
const
|
|
17
|
+
const scopeTuples = [];
|
|
18
18
|
const rootEventNames = Object.keys(events);
|
|
19
19
|
rootEventNames.forEach(eventName => {
|
|
20
20
|
const scope = stack.findScope(eventName);
|
|
21
|
-
|
|
21
|
+
scopeTuples.push([eventName, scope]);
|
|
22
22
|
const nextEvents = Object.keys(events[eventName]);
|
|
23
23
|
if (!nextEvents.length) {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
const eventScope = scope.getScopeOrCreat(eventName);
|
|
27
|
-
visitInnerScope(nextEvents, events[eventName], eventScope,
|
|
27
|
+
visitInnerScope(nextEvents, events[eventName], eventScope, scopeTuples);
|
|
28
28
|
});
|
|
29
|
-
return
|
|
29
|
+
return scopeTuples;
|
|
30
30
|
}
|
|
31
31
|
export function findReactiveScopeByEventMap(events, stack) {
|
|
32
32
|
const allScopes = findScopeByEventMap(events, stack);
|
|
33
|
-
|
|
34
|
-
allScopes.forEach((scope, eventName) => {
|
|
35
|
-
if (scope instanceof ReactiveScope) {
|
|
36
|
-
scopeMap.set(eventName, scope);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
return scopeMap;
|
|
33
|
+
return allScopes.filter(tuple => tuple[1] instanceof ReactiveScope);
|
|
40
34
|
}
|
|
41
35
|
//# sourceMappingURL=event.js.map
|
package/scope/event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/expressions/scope/event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,YAAY,CAAC;AAGhE,SAAS,eAAe,CAAC,UAAoB,EAAE,MAA0B,EAAE,KAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/expressions/scope/event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,YAAY,CAAC;AAGhE,SAAS,eAAe,CAAC,UAAoB,EAAE,MAA0B,EAAE,KAA0B,EAAE,WAA4C;IAClJ,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC9B,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC9B,OAAO;SACP;QACD,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACvB,OAAO;SACP;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpD,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA0B,EAAE,KAAY;IAC3E,MAAM,WAAW,GAAoC,EAAE,CAAC;IACxD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAe,SAAS,CAAC,CAAC;QACvD,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACvB,OAAO;SACP;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAe,SAAS,CAAC,CAAC;QAClE,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAA0B,EAAE,KAAY;IACnF,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,aAAa,CAA4C,CAAC;AAChH,CAAC","sourcesContent":["import { ExpressionEventMap } from '../api/expression.js';\nimport { ReactiveScope, Scope, ScopeContext } from './scope.js';\nimport { Stack } from './stack.js';\n\nfunction visitInnerScope(eventNames: string[], events: ExpressionEventMap, scope: Scope<ScopeContext>, scopeTuples: [string, Scope<ScopeContext>][]) {\n\teventNames.forEach(eventName => {\n\t\tif (eventName.startsWith(':')) {\n\t\t\treturn;\n\t\t}\n\t\tscopeTuples.push([eventName, scope]);\n\t\tconst nextEvents = Object.keys(events[eventName]);\n\t\tif (!nextEvents.length) {\n\t\t\treturn;\n\t\t}\n\t\tconst innerScope = scope.getScopeOrCreat(eventName);\n\t\tvisitInnerScope(nextEvents, events[eventName], innerScope, scopeTuples);\n\t});\n}\n\nexport function findScopeByEventMap(events: ExpressionEventMap, stack: Stack): [string, Scope<ScopeContext>][] {\n\tconst scopeTuples: [string, Scope<ScopeContext>][] = [];\n\tconst rootEventNames = Object.keys(events);\n\trootEventNames.forEach(eventName => {\n\t\tconst scope = stack.findScope<ScopeContext>(eventName);\n\t\tscopeTuples.push([eventName, scope]);\n\t\tconst nextEvents = Object.keys(events[eventName]);\n\t\tif (!nextEvents.length) {\n\t\t\treturn;\n\t\t}\n\t\tconst eventScope = scope.getScopeOrCreat<ScopeContext>(eventName);\n\t\tvisitInnerScope(nextEvents, events[eventName], eventScope, scopeTuples);\n\t});\n\treturn scopeTuples;\n}\n\nexport function findReactiveScopeByEventMap(events: ExpressionEventMap, stack: Stack): [string, ReactiveScope<ScopeContext>][] {\n\tconst allScopes = findScopeByEventMap(events, stack);\n\treturn allScopes.filter(tuple => tuple[1] instanceof ReactiveScope) as [string, ReactiveScope<ScopeContext>][];\n}\n"]}
|
package/scope/scope.d.ts
CHANGED
|
@@ -91,7 +91,7 @@ export declare class ReactiveScope<T extends ScopeContext> extends Scope<T> {
|
|
|
91
91
|
export interface ScopeControl<T extends ScopeContext> {
|
|
92
92
|
detach(): void;
|
|
93
93
|
reattach(): void;
|
|
94
|
-
emitChanges(propertyKey?: keyof T): void;
|
|
94
|
+
emitChanges(propertyKey?: keyof T, propertyValue?: any): void;
|
|
95
95
|
}
|
|
96
96
|
export declare class ReactiveScopeControl<T extends ScopeContext> extends ReactiveScope<T> implements ScopeControl<T> {
|
|
97
97
|
static for<T extends ScopeContext>(context: T, type: ScopeType): ReactiveScopeControl<T>;
|
|
@@ -110,5 +110,5 @@ export declare class ReactiveScopeControl<T extends ScopeContext> extends Reacti
|
|
|
110
110
|
emit(propertyKey: keyof T, newValue: any, oldValue?: any): void;
|
|
111
111
|
detach(): void;
|
|
112
112
|
reattach(): void;
|
|
113
|
-
emitChanges(propertyKey?: keyof T): void;
|
|
113
|
+
emitChanges(propertyKey?: keyof T, propertyValue?: any): void;
|
|
114
114
|
}
|
package/scope/scope.js
CHANGED
|
@@ -348,19 +348,16 @@ export class ReactiveScopeControl extends ReactiveScope {
|
|
|
348
348
|
this.attached = true;
|
|
349
349
|
this.emitChanges();
|
|
350
350
|
}
|
|
351
|
-
emitChanges(propertyKey) {
|
|
351
|
+
emitChanges(propertyKey, propertyValue) {
|
|
352
352
|
if (propertyKey) {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
Reflect.deleteProperty(this.marked, propertyKey);
|
|
356
|
-
super.emit(propertyKey, lastValue);
|
|
357
|
-
}
|
|
353
|
+
super.emit(propertyKey, propertyValue);
|
|
354
|
+
Reflect.deleteProperty(this.marked, propertyKey);
|
|
358
355
|
return;
|
|
359
356
|
}
|
|
360
|
-
const
|
|
357
|
+
const latestChanges = this.marked;
|
|
361
358
|
this.marked = {};
|
|
362
|
-
Object.keys(
|
|
363
|
-
super.emit(propertyKey,
|
|
359
|
+
Object.keys(latestChanges).forEach(propertyKey => {
|
|
360
|
+
super.emit(propertyKey, latestChanges[propertyKey]);
|
|
364
361
|
});
|
|
365
362
|
}
|
|
366
363
|
}
|
package/scope/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/expressions/scope/scope.ts"],"names":[],"mappings":"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","sourcesContent":["\nexport type ScopeType = 'block' | 'function' | 'class' | 'module' | 'global';\n\nexport type ScopeContext = { [key: PropertyKey]: ScopeContext | any };\nexport interface Scope<T = ScopeContext> {\n\n\t/**\n\t * scope type\n\t */\n\ttype: ScopeType;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tget(propertyKey: keyof T): any;\n\n\t/**\n\t * set the value of `propertyKey` in current context, could be instilled with `value`.\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: keyof T, value?: any, receiver?: any): boolean;\n\n\t/**\n\t * is current context has `propertyKey` in hash map keys\n\t * @param propertyKey \n\t */\n\thas(propertyKey: keyof T): boolean;\n\n\t/**\n\t * delete property from context\n\t * @param propertyKey \n\t */\n\tdelete(propertyKey: keyof T): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if the current value is not type od `object`, will return `undefined`.\n\t * @param propertyKey the name of the property\n\t */\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if no scope found in the cache, will create a new one, add this one to the map, return a reference.\n\t * @param propertyKey\n\t */\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V>;\n}\n\nexport class Scope<T extends ScopeContext> implements Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new Scope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'global');\n\t}\n\tprotected scopeMap = new Map<keyof T, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: keyof T): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: keyof T): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\treturn Reflect.deleteProperty(this.context, propertyKey);\n\t}\n\tgetContext(): T {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V> {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n}\n\nexport class ReadOnlyScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReadOnlyScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'global');\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nexport class ScopeSubscription<T> {\n\tconstructor(private propertyKey: keyof T, private observer: ValueChangeObserver<T>) { }\n\tpause() {\n\t\tthis.observer.pause(this.propertyKey, this);\n\t}\n\tresume() {\n\t\tthis.observer.resume(this.propertyKey, this);\n\t}\n\tunsubscribe(): void {\n\t\tthis.observer.unsubscribe(this.propertyKey, this);\n\t}\n}\n\nexport type ValueChangedCallback = (newValue: any, oldValue?: any) => void;\n\ntype SubscriptionInfo = { callback: ValueChangedCallback, enable: boolean };\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<keyof T, Map<ScopeSubscription<T>, SubscriptionInfo>> = new Map();\n\tprivate propertiesLock: (keyof T)[] = [];\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.propertiesLock.includes(propertyKey)) {\n\t\t\treturn;\n\t\t}\n\t\tconst subscribers = this.subscribers.get(propertyKey);\n\t\tif (!subscribers) {\n\t\t\treturn;\n\t\t}\n\t\tthis.propertiesLock.push(propertyKey);\n\t\tsubscribers?.forEach(subscriptionInfo => {\n\t\t\tif (!subscriptionInfo.enable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsubscriptionInfo.callback(newValue, oldValue);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t\tif (this.propertiesLock.pop() !== propertyKey) {\n\t\t\tconsole.error('lock error');\n\t\t};\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\tconst subscription: ScopeSubscription<T> = new ScopeSubscription(propertyKey, this);\n\t\tlet propertySubscribers = this.subscribers.get(propertyKey);\n\t\tif (!propertySubscribers) {\n\t\t\tpropertySubscribers = new Map();\n\t\t\tthis.subscribers.set(propertyKey, propertySubscribers);\n\t\t}\n\t\tpropertySubscribers.set(subscription, { callback, enable: true });\n\t\treturn subscription;\n\t}\n\n\tunsubscribe(propertyKey: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (subscription) {\n\t\t\tthis.subscribers.get(propertyKey)?.delete(subscription);\n\t\t} else {\n\t\t\tthis.subscribers.delete(propertyKey);\n\t\t}\n\t}\n\n\tpause(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = false);\n\t}\n\n\tresume(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = true);\n\t}\n\n\t/**\n\t * clear subscription maps\n\t */\n\tdestroy() {\n\t\tthis.subscribers.clear();\n\t}\n}\n\nexport class ReactiveScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'global');\n\t}\n\n\tprotected observer: ValueChangeObserver<T> = new ValueChangeObserver<T>();\n\n\tconstructor(context: T, type: ScopeType);\n\tconstructor(context: T, type: ScopeType, name: string, parent: ReactiveScope<any>);\n\tconstructor(context: T, type: ScopeType, protected name?: string, protected parent?: ReactiveScope<any>) {\n\t\tsuper(context, type);\n\t}\n\n\tset(propertyKey: keyof T, newValue: any, receiver?: any): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst result = Reflect.set(this.context, propertyKey, newValue);\n\t\tif (result) {\n\t\t\tthis.emit(propertyKey, newValue, oldValue);\n\t\t}\n\t\treturn result;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst isDelete = Reflect.deleteProperty(this.context, propertyKey);\n\t\tif (isDelete && oldValue !== undefined) {\n\t\t\tthis.emit(propertyKey, undefined, oldValue);\n\t\t}\n\t\treturn isDelete;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tthis.observer.emit(propertyKey, newValue, oldValue);\n\t\tthis.parent?.emit(this.name!, this.context);\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\treturn this.observer.subscribe(propertyKey, callback);\n\t}\n\tunsubscribe(propertyKey?: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (propertyKey && subscription) {\n\t\t\tthis.observer.unsubscribe(propertyKey, subscription);\n\t\t} else if (propertyKey) {\n\t\t\tthis.observer.unsubscribe(propertyKey);\n\t\t} else {\n\t\t\tthis.observer.destroy();\n\t\t}\n\t}\n}\n\n/**\n * used control/notify/pause scope about changes in current context\n */\nexport interface ScopeControl<T extends ScopeContext> {\n\n\t/**\n\t * used when want to update ui-view like, you want to replace an array with another \n\t * without reflect changes on view until reattached again.\n\t */\n\tdetach(): void;\n\n\t/**\n\t * apply all the not emitted changes, and continue emit in time.\n\t */\n\treattach(): void;\n\n\t/**\n\t * apply changes now,\n\t * will not effect the state of the detector wither if attached ot not.\n\t * \n\t * if a propertyKey is provided, will emit this property only \n\t * @param propertyKey \n\t */\n\temitChanges(propertyKey?: keyof T): void;\n}\n\nexport class ReactiveScopeControl<T extends ScopeContext> extends ReactiveScope<T> implements ScopeControl<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScopeControl(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'global');\n\t}\n\n\tprotected attached: boolean = true;\n\tprotected marked: ScopeContext = {};\n\toverride emit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.attached) {\n\t\t\tsuper.emit(propertyKey, newValue, oldValue);\n\t\t} else {\n\t\t\tthis.marked[propertyKey] = newValue;\n\t\t}\n\t}\n\tdetach(): void {\n\t\tthis.attached = false;\n\t}\n\treattach(): void {\n\t\tthis.attached = true;\n\t\tthis.emitChanges();\n\t}\n\temitChanges(propertyKey?: keyof T): void {\n\t\tif (propertyKey) {\n\t\t\tif (propertyKey in this.marked) {\n\t\t\t\tconst lastValue = this.marked[propertyKey];\n\t\t\t\tReflect.deleteProperty(this.marked, propertyKey);\n\t\t\t\tsuper.emit(propertyKey, lastValue);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst oldChanges = this.marked;\n\t\tthis.marked = {};\n\t\tObject.keys(oldChanges).forEach(propertyKey => {\n\t\t\tsuper.emit(propertyKey, oldChanges[propertyKey]);\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/expressions/scope/scope.ts"],"names":[],"mappings":"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","sourcesContent":["\nexport type ScopeType = 'block' | 'function' | 'class' | 'module' | 'global';\n\nexport type ScopeContext = { [key: PropertyKey]: ScopeContext | any };\nexport interface Scope<T = ScopeContext> {\n\n\t/**\n\t * scope type\n\t */\n\ttype: ScopeType;\n\n\t/**\n\t * get value of `propertyKey` in current context\n\t * @param propertyKey \n\t */\n\tget(propertyKey: keyof T): any;\n\n\t/**\n\t * set the value of `propertyKey` in current context, could be instilled with `value`.\n\t * @param propertyKey \n\t * @param value \n\t * @param receiver \n\t */\n\tset(propertyKey: keyof T, value?: any, receiver?: any): boolean;\n\n\t/**\n\t * is current context has `propertyKey` in hash map keys\n\t * @param propertyKey \n\t */\n\thas(propertyKey: keyof T): boolean;\n\n\t/**\n\t * delete property from context\n\t * @param propertyKey \n\t */\n\tdelete(propertyKey: keyof T): boolean;\n\n\t/**\n\t * get current context object of this scope\n\t */\n\tgetContext(): T;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if the current value is not type od `object`, will return `undefined`.\n\t * @param propertyKey the name of the property\n\t */\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined;\n\n\t/**\n\t * get a scope for an object named as `propertyKey` from cache map,\n\t * \n\t * if no scope found in the cache, will create a new one, add this one to the map, return a reference.\n\t * @param propertyKey\n\t */\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V>;\n}\n\nexport class Scope<T extends ScopeContext> implements Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new Scope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new Scope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new Scope({} as T, 'global');\n\t}\n\tprotected scopeMap = new Map<keyof T, Scope<any>>();\n\tconstructor(protected context: T, public type: ScopeType) { }\n\tget(propertyKey: keyof T): any {\n\t\treturn Reflect.get(this.context, propertyKey);\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\treturn Reflect.set(this.context, propertyKey, value);\n\t}\n\thas(propertyKey: keyof T): boolean {\n\t\treturn propertyKey in this.context;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\treturn Reflect.deleteProperty(this.context, propertyKey);\n\t}\n\tgetContext(): T {\n\t\treturn this.context;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): Scope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): Scope<V> {\n\t\tconst scopeContext = this.get(propertyKey);\n\t\tlet scope = this.scopeMap.get(propertyKey);\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new Scope(scopeContext, 'block');\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n}\n\nexport class ReadOnlyScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReadOnlyScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReadOnlyScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReadOnlyScope({} as T, 'global');\n\t}\n\tset(propertyKey: keyof T, value: any, receiver?: any): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\t// do nothing\n\t\treturn false;\n\t}\n}\n\nexport class ScopeSubscription<T> {\n\tconstructor(private propertyKey: keyof T, private observer: ValueChangeObserver<T>) { }\n\tpause() {\n\t\tthis.observer.pause(this.propertyKey, this);\n\t}\n\tresume() {\n\t\tthis.observer.resume(this.propertyKey, this);\n\t}\n\tunsubscribe(): void {\n\t\tthis.observer.unsubscribe(this.propertyKey, this);\n\t}\n}\n\nexport type ValueChangedCallback = (newValue: any, oldValue?: any) => void;\n\ntype SubscriptionInfo = { callback: ValueChangedCallback, enable: boolean };\n\nexport class ValueChangeObserver<T> {\n\tprivate subscribers: Map<keyof T, Map<ScopeSubscription<T>, SubscriptionInfo>> = new Map();\n\tprivate propertiesLock: (keyof T)[] = [];\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.propertiesLock.includes(propertyKey)) {\n\t\t\treturn;\n\t\t}\n\t\tconst subscribers = this.subscribers.get(propertyKey);\n\t\tif (!subscribers) {\n\t\t\treturn;\n\t\t}\n\t\tthis.propertiesLock.push(propertyKey);\n\t\tsubscribers?.forEach(subscriptionInfo => {\n\t\t\tif (!subscriptionInfo.enable) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsubscriptionInfo.callback(newValue, oldValue);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t\tif (this.propertiesLock.pop() !== propertyKey) {\n\t\t\tconsole.error('lock error');\n\t\t};\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\tconst subscription: ScopeSubscription<T> = new ScopeSubscription(propertyKey, this);\n\t\tlet propertySubscribers = this.subscribers.get(propertyKey);\n\t\tif (!propertySubscribers) {\n\t\t\tpropertySubscribers = new Map();\n\t\t\tthis.subscribers.set(propertyKey, propertySubscribers);\n\t\t}\n\t\tpropertySubscribers.set(subscription, { callback, enable: true });\n\t\treturn subscription;\n\t}\n\n\tunsubscribe(propertyKey: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (subscription) {\n\t\t\tthis.subscribers.get(propertyKey)?.delete(subscription);\n\t\t} else {\n\t\t\tthis.subscribers.delete(propertyKey);\n\t\t}\n\t}\n\n\tpause(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = false);\n\t}\n\n\tresume(propertyKey: keyof T, subscription: ScopeSubscription<T>) {\n\t\tconst subscriptionInfo = this.subscribers.get(propertyKey)?.get(subscription);\n\t\tsubscriptionInfo && (subscriptionInfo.enable = true);\n\t}\n\n\t/**\n\t * clear subscription maps\n\t */\n\tdestroy() {\n\t\tthis.subscribers.clear();\n\t}\n}\n\nexport class ReactiveScope<T extends ScopeContext> extends Scope<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScope(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScope(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScope({} as T, 'global');\n\t}\n\n\tprotected observer: ValueChangeObserver<T> = new ValueChangeObserver<T>();\n\n\tconstructor(context: T, type: ScopeType);\n\tconstructor(context: T, type: ScopeType, name: string, parent: ReactiveScope<any>);\n\tconstructor(context: T, type: ScopeType, protected name?: string, protected parent?: ReactiveScope<any>) {\n\t\tsuper(context, type);\n\t}\n\n\tset(propertyKey: keyof T, newValue: any, receiver?: any): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst result = Reflect.set(this.context, propertyKey, newValue);\n\t\tif (result) {\n\t\t\tthis.emit(propertyKey, newValue, oldValue);\n\t\t}\n\t\treturn result;\n\t}\n\tdelete(propertyKey: keyof T): boolean {\n\t\tconst oldValue = Reflect.get(this.context, propertyKey);\n\t\tconst isDelete = Reflect.deleteProperty(this.context, propertyKey);\n\t\tif (isDelete && oldValue !== undefined) {\n\t\t\tthis.emit(propertyKey, undefined, oldValue);\n\t\t}\n\t\treturn isDelete;\n\t}\n\tgetScope<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> | undefined {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tif (typeof scopeContext !== 'object') {\n\t\t\treturn;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\tgetScopeOrCreat<V extends ScopeContext>(propertyKey: keyof T): ReactiveScope<V> {\n\t\tconst scopeContext = this.get(propertyKey) as V;\n\t\tlet scope = this.scopeMap.get(propertyKey) as ReactiveScope<any> | undefined;\n\t\tif (scope) {\n\t\t\tscope.context = scopeContext;\n\t\t\treturn scope;\n\t\t}\n\t\tscope = new ReactiveScope<V>(scopeContext, 'block', propertyKey as string, this);\n\t\tthis.scopeMap.set(propertyKey, scope);\n\t\treturn scope;\n\t}\n\temit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tthis.observer.emit(propertyKey, newValue, oldValue);\n\t\tthis.parent?.emit(this.name!, this.context);\n\t}\n\tsubscribe(propertyKey: keyof T, callback: ValueChangedCallback): ScopeSubscription<T> {\n\t\treturn this.observer.subscribe(propertyKey, callback);\n\t}\n\tunsubscribe(propertyKey?: keyof T, subscription?: ScopeSubscription<T>) {\n\t\tif (propertyKey && subscription) {\n\t\t\tthis.observer.unsubscribe(propertyKey, subscription);\n\t\t} else if (propertyKey) {\n\t\t\tthis.observer.unsubscribe(propertyKey);\n\t\t} else {\n\t\t\tthis.observer.destroy();\n\t\t}\n\t}\n}\n\n/**\n * used control/notify/pause scope about changes in current context\n */\nexport interface ScopeControl<T extends ScopeContext> {\n\n\t/**\n\t * used when want to update ui-view like, you want to replace an array with another \n\t * without reflect changes on view until reattached again.\n\t */\n\tdetach(): void;\n\n\t/**\n\t * apply all the not emitted changes, and continue emit in time.\n\t */\n\treattach(): void;\n\n\t/**\n\t * apply changes now,\n\t * will not effect the state of the detector wither if attached ot not.\n\t * \n\t * if a propertyKey is provided, will emit this property only \n\t * @param propertyKey \n\t */\n\temitChanges(propertyKey?: keyof T, propertyValue?: any): void;\n}\n\nexport class ReactiveScopeControl<T extends ScopeContext> extends ReactiveScope<T> implements ScopeControl<T> {\n\tstatic for<T extends ScopeContext>(context: T, type: ScopeType) {\n\t\treturn new ReactiveScopeControl(context, type);\n\t}\n\tstatic blockScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'block');\n\t}\n\tstatic functionScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'function');\n\t}\n\tstatic classScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'class');\n\t}\n\tstatic moduleScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'module');\n\t}\n\tstatic globalScopeFor<T extends ScopeContext>(context: T) {\n\t\treturn new ReactiveScopeControl(context, 'global');\n\t}\n\tstatic blockScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'block');\n\t}\n\tstatic functionScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'function');\n\t}\n\tstatic classScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'class');\n\t}\n\tstatic moduleScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'module');\n\t}\n\tstatic globalScope<T extends ScopeContext>() {\n\t\treturn new ReactiveScopeControl({} as T, 'global');\n\t}\n\n\tprotected attached: boolean = true;\n\tprotected marked: ScopeContext = {};\n\toverride emit(propertyKey: keyof T, newValue: any, oldValue?: any): void {\n\t\tif (this.attached) {\n\t\t\tsuper.emit(propertyKey, newValue, oldValue);\n\t\t} else {\n\t\t\tthis.marked[propertyKey] = newValue;\n\t\t}\n\t}\n\tdetach(): void {\n\t\tthis.attached = false;\n\t}\n\treattach(): void {\n\t\tthis.attached = true;\n\t\tthis.emitChanges();\n\t}\n\temitChanges(propertyKey?: keyof T, propertyValue?: any): void {\n\t\tif (propertyKey) {\n\t\t\tsuper.emit(propertyKey, propertyValue);\n\t\t\tReflect.deleteProperty(this.marked, propertyKey);\n\t\t\treturn;\n\t\t}\n\t\tconst latestChanges = this.marked;\n\t\tthis.marked = {};\n\t\tObject.keys(latestChanges).forEach(propertyKey => {\n\t\t\tsuper.emit(propertyKey, latestChanges[propertyKey]);\n\t\t});\n\t}\n}\n"]}
|
package/v8/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/expressions/v8/app.ts"],"names":[],"mappings":"","sourcesContent":["// import type { ExpressionNode } from '../api/expression.js';\n// import {\n// \tAssignmentNode, ConstNode, FunctionType,\n// \tLetNode, NullNode, StringNode, Variable\n// } from '../api/index.js';\n// import { JavaScriptParser, PropertyKind } from './parser.js';\n// import { Token } from './token.js';\n// import { MetaProperty } from '../api/app/class.js';\n\n\n// export type ClassInfo = {\n// \tisAnonymous: boolean;\n// \textends: ExpressionNode;\n// \thasSeenConstructor: boolean;\n// \thasStaticComputedNames: boolean;\n// \trequiresBrand: boolean;\n// \thasPrivateMethods: boolean,\n// \thasStaticPrivateMethods: boolean;\n// \tcomputedFieldCount: number;\n// \thasStaticElements: boolean;\n// };\n\n// export enum FunctionNameValidity {\n// \tFunctionNameIsStrictReserved = 'FunctionNameIsStrictReserved',\n// \tSkipFunctionNameCheck = 'SkipFunctionNameCheck',\n// \tFunctionNameValidityUnknown = 'FunctionNameValidityUnknown'\n// };\n\n// export enum AllowLabelledFunctionStatement {\n// \tAllowLabelledFunctionStatement = 'AllowLabelledFunctionStatement',\n// \tDisallowLabelledFunctionStatement = 'DisallowLabelledFunctionStatement',\n// };\n\n// export enum ParsingArrowHeadFlag {\n// \tCertainlyNotArrowHead = 'CertainlyNotArrowHead',\n// \tMaybeArrowHead = 'MaybeArrowHead'\n// };\n\n// export enum PropertyPosition {\n// \tObjectLiteral = 'ObjectLiteral',\n// \tClassLiteral = 'ClassLiteral'\n// }\n\n// const FUNCTIONS_TYPES: FunctionType[][][] = [\n// \t[\n// \t\t// SubFunctionKind::kNormalFunction\n// \t\t[// is_generator=false\n// \t\t\tFunctionType.NORMAL,\n// \t\t\tFunctionType.ASYNC\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionType.GENERATOR,\n// \t\t\tFunctionType.ASYNC_GENERATOR\n// \t\t],\n// \t],\n// \t[\n// \t\t// SubFunctionKind::kNonStaticMethod\n// \t\t[// is_generator=false\n// \t\t\tFunctionType.CONCISE,\n// \t\t\tFunctionType.ASYNC_CONCISE\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionType.CONCISE_GENERATOR,\n// \t\t\tFunctionType.ASYNC_CONCISE_GENERATOR\n// \t\t],\n// \t],\n// \t[\n// \t\t// SubFunctionKind::kStaticMethod\n// \t\t[// is_generator=false\n// \t\t\tFunctionType.STATIC_CONCISE,\n// \t\t\tFunctionType.STATIC_ASYNC_CONCISE\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionType.STATIC_CONCISE_GENERATOR,\n// \t\t\tFunctionType.STATIC_ASYNC_CONCISE_GENERATOR\n// \t\t],\n// \t]\n// ];\n\n// export enum SubFunctionKind {\n// \tNormalFunction,\n// \tNonStaticMethod,\n// \tStaticMethod,\n// }\n\n// export function functionKindForImpl(subFunctionKind: SubFunctionKind, isGenerator: boolean, isAsync: boolean): FunctionType {\n// \treturn FUNCTIONS_TYPES[subFunctionKind as number][isGenerator ? 1 : 0][isAsync ? 1 : 0];\n// }\n\n// export class ParsePropertyInfo {\n// \tname: ExpressionNode;\n// \tposition = PropertyPosition.ClassLiteral;\n// \tfunctionFlags = FunctionType.NORMAL;\n// \tkind = PropertyKind.NotSet;\n// \tisComputedName = false;\n// \tisPrivate = false;\n// \tisStatic = false;\n// \tisRest = false;\n\n// \tPropertyKindFromToken(token: Token): boolean {\n// \t\t// This returns true, setting the property kind, iff the given token is\n// \t\t// one which must occur after a property name, indicating that the\n// \t\t// previous token was in fact a name and not a modifier (like the \"get\" in\n// \t\t// \"get x\").\n// \t\tswitch (token) {\n// \t\t\tcase Token.COLON:\n// \t\t\t\tthis.kind = PropertyKind.Value;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.COMMA:\n// \t\t\t\tthis.kind = PropertyKind.Shorthand;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.R_CURLY:\n// \t\t\t\tthis.kind = PropertyKind.ShorthandOrClassField;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.ASSIGN:\n// \t\t\t\tthis.kind = PropertyKind.Assign;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.L_PARENTHESES:\n// \t\t\t\tthis.kind = PropertyKind.Method;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.MUL:\n// \t\t\tcase Token.SEMICOLON:\n// \t\t\t\tthis.kind = PropertyKind.ClassField;\n// \t\t\t\treturn true;\n// \t\t\tdefault:\n// \t\t\t\tbreak;\n// \t\t}\n// \t\treturn false;\n// \t}\n\n// }\n// enum ObjectLiteralPropertyKind {\n// \tCONSTANT = 'CONSTANT',\t// Property with constant value (compile time).\n// \tCOMPUTED = 'COMPUTED',\t// Property with computed value (execution time).\n// \tMATERIALIZED_LITERAL = 'MATERIALIZED_LITERAL', // Property value is a materialized literal.\n// \tGETTER = 'GETTER',\n// \tSETTER = 'SETTER',\t\t// Property is an accessor function.\n// \tPROTOTYPE = 'PROTOTYPE',\t// Property is __proto__.\n// \tSPREAD = 'SPREAD'\n// }\n// export class ObjectLiteralProperty {\n// \tstatic Kind = ObjectLiteralPropertyKind;\n// }\n\n// enum ClassLiteralPropertyKind {\n// \tMETHOD = 'METHOD',\n// \tGETTER = 'GETTER',\n// \tSETTER = 'SETTER',\n// \tFIELD = 'FIELD'\n// }\n\n// export class ClassLiteralProperty {\n// \tstatic Kind = ClassLiteralPropertyKind;\n// }\n\n// function assertUnreachable(x: never): never {\n// \tthrow new Error(`Didn't expect to get here`);\n// }\n// export function classPropertyKindFor(kind: PropertyKind): ClassLiteralPropertyKind {\n// \tswitch (kind) {\n// \t\tcase PropertyKind.AccessorGetter:\n// \t\t\treturn ClassLiteralPropertyKind.GETTER;\n// \t\tcase PropertyKind.AccessorSetter:\n// \t\t\treturn ClassLiteralPropertyKind.SETTER;\n// \t\tcase PropertyKind.Method:\n// \t\t\treturn ClassLiteralPropertyKind.METHOD;\n// \t\tcase PropertyKind.ClassField:\n// \t\t\treturn ClassLiteralPropertyKind.FIELD;\n// \t}\n// \tthrow new Error(`unexpected property kind: ${kind}`);\n// }\n\n// export enum VariableMode {\n// \tConst = 'Const',\n// \tPrivateMethod = 'PrivateMethod',\n// \tPrivateGetterOnly = 'PrivateGetterOnly',\n// \tPrivateSetterOnly = 'PrivateSetterOnly'\n// }\n\n// export function getVariableMode(kind: ClassLiteralPropertyKind): VariableMode {\n// \tswitch (kind) {\n// \t\tcase ClassLiteralPropertyKind.FIELD:\n// \t\t\treturn VariableMode.Const;\n// \t\tcase ClassLiteralPropertyKind.METHOD:\n// \t\t\treturn VariableMode.PrivateMethod;\n// \t\tcase ClassLiteralPropertyKind.GETTER:\n// \t\t\treturn VariableMode.PrivateGetterOnly;\n// \t\tcase ClassLiteralPropertyKind.SETTER:\n// \t\t\treturn VariableMode.PrivateSetterOnly;\n// \t}\n// }\n\n// export class JavaScriptAppParser extends JavaScriptParser {\n// \tprotected parseNewTargetExpression(): ExpressionNode {\n// \t\tthis.consume(Token.PERIOD);\n//\t\t const target: ExpressionNode = this.parsePropertyName();\n//\t\t if (target.toString() !== 'target') {\n//\t\t \tthrow new Error(this.errorMessage(`Expression (new.${target.toString()}) not supported.`));\n//\t\t }\n//\t\t return MetaProperty.NewTarget;\n// \t}\n// \tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n// \t\t// ClassDeclaration ::\n// \t\t// 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'\n// \t\t// 'class' ('extends' LeftHandExpression)? '{' ClassBody '}'\n// \t\t//\n// \t\t// The anonymous form is allowed iff [default_export] is true.\n// \t\t//\n// \t\t// 'class' is expected to be consumed by the caller.\n// \t\t//\n// \t\t// A ClassDeclaration\n// \t\t//\n// \t\t// class C { ... }\n// \t\t//\n// \t\t// has the same semantics as:\n// \t\t//\n// \t\t// let C = class C { ... };\n// \t\t//\n// \t\t// so rewrite it as such.\n\n// \t\tconst nextToken = this.peek().token;\n// \t\tconst isStrictReserved = Token.isStrictReservedWord(nextToken);\n// \t\tlet name: ExpressionNode | undefined;\n// \t\tlet variableName: ExpressionNode | undefined;\n// \t\tif (defaultExport && (nextToken == Token.EXTENDS || nextToken == Token.L_CURLY)) {\n// \t\t\tname = new StringNode('default');\n// \t\t\tvariableName = new StringNode('.default');\n// \t\t} else {\n// \t\t\tname = this.parseIdentifier();\n// \t\t\tvariableName = name;\n// \t\t}\n// \t\tconst value = this.parseClassLiteral(name, isStrictReserved);\n// \t\treturn this.declareClass(variableName, value, names);\n// \t}\n// \tprotected parseClassLiteral(name: ExpressionNode | undefined, nameIsStrictReserved: boolean): ExpressionNode {\n// \t\t// throw new Error(this.errorMessage(`Expression (class) not supported.`));\n// \t\tconst isAnonymous = !!!name;\n\n// \t\t// All parts of a ClassDeclaration and ClassExpression are strict code.\n// \t\tif (!isAnonymous) {\n// \t\t\tif (nameIsStrictReserved) {\n// \t\t\t\tthrow new Error(this.errorMessage(`Unexpected Strict Reserved class name`));\n// \t\t\t}\n// \t\t\tif (this.isEvalOrArguments(name!)) {\n// \t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments not allowed for class name`));\n// \t\t\t}\n// \t\t}\n\n// \t\t// ClassScope * class_scope = NewClassScope(scope(), is_anonymous);\n// \t\t// BlockState block_state(& scope_, class_scope);\n// \t\t// RaiseLanguageMode(LanguageMode.kStrict);\n\n// \t\t// BlockState object_literal_scope_state(& object_literal_scope_, nullptr);\n\n// \t\t// ClassInfo classInfo(this);\n// \t\t// classInfo.is_anonymous = is_anonymous;\n\n// \t\tconst classInfo = { isAnonymous, computedFieldCount: 0 } as ClassInfo;\n\n// \t\t// scope() -> set_start_position(class_token_pos);\n// \t\tif (this.check(Token.EXTENDS)) {\n// \t\t\t// ClassScope.HeritageParsingScope heritage(class_scope);\n// \t\t\t// FuncNameInferrerState fni_state(& fni_);\n// \t\t\t// ExpressionParsingScope scope(impl());\n// \t\t\tclassInfo.extends = this.parseLeftHandSideExpression();\n// \t\t\t// scope.ValidateExpression();\n// \t\t}\n\n// \t\tthis.expect(Token.L_CURLY);\n\n// \t\tconst hasExtends = !(classInfo.extends === undefined);\n\n// \t\tconst staticBlockList: ExpressionNode[] = [];\n// \t\tconst privateClassMemberList: ExpressionNode[] = [];\n// \t\tconst publicClassFieldList: ExpressionNode[] = [];\n// \t\tconst publicClassMethodList: ExpressionNode[] = [];\n\n// \t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n// \t\t\tif (this.check(Token.SEMICOLON)) continue;\n\n// \t\t\t// Either we're parsing a `static { }` initialization block or a property.\n// \t\t\tif (this.peek().isType(Token.STATIC) && this.peekAhead().isType(Token.L_CURLY)) {\n// \t\t\t\tconst staticBlock = this.parseClassStaticBlock(classInfo);\n// \t\t\t\tstaticBlockList.push(staticBlock);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\t// FuncNameInferrerState fni_state(& fni_);\n// \t\t\t// If we haven't seen the constructor yet, it potentially is the next\n// \t\t\t// property.\n// \t\t\tlet isConstructor = !classInfo.hasSeenConstructor;\n// \t\t\tconst propInfo = new ParsePropertyInfo();\n// \t\t\tpropInfo.position = PropertyPosition.ClassLiteral;\n\n// \t\t\tconst property = this.parseClassPropertyDefinition(classInfo, propInfo, hasExtends);\n\n// \t\t\t// if (has_error()) return impl() -> FailureExpression();\n\n// \t\t\tconst propertyKind = classPropertyKindFor(propInfo.kind);\n// \t\t\tif (!classInfo.hasStaticComputedNames && propInfo.isStatic && propInfo.isComputedName) {\n// \t\t\t\tclassInfo.hasStaticComputedNames = true;\n// \t\t\t}\n// \t\t\tisConstructor &&= classInfo.hasSeenConstructor;\n\n// \t\t\tconst isField = propertyKind == ClassLiteralPropertyKind.FIELD;\n\n// \t\t\tif (propInfo.isPrivate) {\n// \t\t\t\tif (isConstructor) {\n// \t\t\t\t\tthrow new Error(this.errorMessage('private constructor is not allowed'));\n// \t\t\t\t}\n// \t\t\t\tclassInfo.requiresBrand ||= (!isField && !propInfo.isStatic);\n// \t\t\t\tconst isMethod = propertyKind == ClassLiteralPropertyKind.METHOD;\n// \t\t\t\tclassInfo.hasPrivateMethods ||= isMethod;\n// \t\t\t\tclassInfo.hasStaticPrivateMethods ||= isMethod && propInfo.isStatic;\n// \t\t\t\tconst privateClassMember = this.declarePrivateClassMember(propInfo.name, property, propertyKind, propInfo.isStatic, classInfo);\n// \t\t\t\tprivateClassMemberList.push(privateClassMember);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\tif (isField) {\n// \t\t\t\tif (propInfo.isComputedName) {\n// \t\t\t\t\tclassInfo.computedFieldCount++;\n// \t\t\t\t}\n// \t\t\t\tconst publicClassField = this.declarePublicClassField(property, propInfo.isStatic, propInfo.isComputedName, classInfo);\n// \t\t\t\tpublicClassFieldList.push(publicClassField);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\tconst publicClassMethod = this.declarePublicClassMethod(name, property, isConstructor, classInfo);\n// \t\t\tpublicClassMethodList.push(publicClassMethod);\n// \t\t}\n\n// \t\tthis.expect(Token.R_CURLY);\n// \t\t// int end_pos = end_position();\n// \t\t// class_scope -> set_end_position(end_pos);\n\n// \t\t// VariableProxy * unresolvable = class_scope -> ResolvePrivateNamesPartially();\n// \t\t// if (unresolvable != nullptr) {\n// \t\t// \timpl() -> ReportMessageAt(Scanner.Location(unresolvable -> position(),unresolvable -> position() + 1),\n// \t\t// \t\tMessageTemplate.kInvalidPrivateFieldResolution,\n// \t\t// \t\tunresolvable -> raw_name());\n// \t\t// \treturn impl() -> FailureExpression();\n// \t\t// }\n\n// \t\t// if (classInfo.requiresBrand) {\n// \t\t// \tclass_scope -> DeclareBrandVariable(ast_value_factory(), IsStaticFlag.kNotStatic, kNoSourcePosition);\n// \t\t// }\n\n// \t\t// if (class_scope -> needs_home_object()) {\n// \t\t// \tclassInfo.homeObjectVariable = class_scope -> DeclareHomeObjectVariable(ast_value_factory());\n// \t\t// \tclassInfo.staticHomeObjectVariable = class_scope -> DeclareStaticHomeObjectVariable(ast_value_factory());\n// \t\t// }\n\n// \t\t// bool should_save_class_variable_index = class_scope -> should_save_class_variable_index();\n// \t\t// if (!isAnonymous || should_save_class_variable_index) {\n// \t\t// \tthis.declareClassVariable(name, classInfo);\n// \t\t// \tif (should_save_class_variable_index) {\n// \t\t// \t\tclass_scope -> class_variable() -> set_is_used();\n// \t\t// \t\tclass_scope -> class_variable() -> ForceContextAllocation();\n// \t\t// \t}\n// \t\t// }\n// \t\treturn this.rewriteClassLiteral(name, classInfo);\n// \t}\n// \tprotected declarePublicClassMethod(name: ExpressionNode | undefined, property: ExpressionNode, isConstructor: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected declarePublicClassField(property: ExpressionNode, isStatic: boolean, isComputedName: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected inferFunctionName() {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected declarePrivateClassMember(name: ExpressionNode, property: ExpressionNode, propertyKind: ClassLiteralPropertyKind, isStatic: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected parseClassPropertyDefinition(classInfo: ClassInfo, propInfo: ParsePropertyInfo, hasExtends: boolean): ExpressionNode {\n// \t\tif (!classInfo) {\n// \t\t\tthrow new Error(this.errorMessage('class info is undefined'));\n// \t\t}\n// \t\tif (propInfo.position !== PropertyPosition.ClassLiteral) {\n// \t\t\tthrow new Error(this.errorMessage('expected property position ClassLiteral'));\n// \t\t}\n\n// \t\tconst nameToken = this.peek();\n// \t\tlet nameExpression: ExpressionNode;\n// \t\tif (nameToken.isType(Token.STATIC)) {\n// \t\t\tthis.consume(Token.STATIC);\n// \t\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n// \t\t\t\tpropInfo.kind = PropertyKind.Method;\n// \t\t\t\tpropInfo.name = this.parseIdentifier()!;\n// \t\t\t\tnameExpression = new StringNode(propInfo.name.toString());\n// \t\t\t} else if (this.peek().isType(Token.ASSIGN)\n// \t\t\t\t|| this.peek().isType(Token.SEMICOLON)\n// \t\t\t\t|| this.peek().isType(Token.R_BRACKETS)) {\n// \t\t\t\tpropInfo.name = this.parseIdentifier()!;\n// \t\t\t\tnameExpression = new StringNode(propInfo.name.toString());\n// \t\t\t} else {\n// \t\t\t\tpropInfo.isStatic = true;\n// \t\t\t\tnameExpression = this.parseProperty(propInfo);\n// \t\t\t}\n// \t\t} else {\n// \t\t\tnameExpression = this.parseProperty(propInfo);\n// \t\t}\n\n// \t\tswitch (propInfo.kind) {\n// \t\t\tcase PropertyKind.Assign:\n// \t\t\tcase PropertyKind.ClassField:\n// \t\t\tcase PropertyKind.ShorthandOrClassField:\n// \t\t\tcase PropertyKind.NotSet: {\n// \t\t\t\t// This case is a name followed by a\n// \t\t\t\t// name or other property. Here we have\n// \t\t\t\t// to assume that's an uninitialized\n// \t\t\t\t// field followed by a line break\n// \t\t\t\t// followed by a property, with ASI\n// \t\t\t\t// adding the semicolon. If not, there\n// \t\t\t\t// will be a syntax error after parsing\n// \t\t\t\t// the first name as an uninitialized\n// \t\t\t\t// field.\n// \t\t\t\tpropInfo.kind = PropertyKind.ClassField;\n\n// \t\t\t\t// if (!propInfo.isComputedName) {\n// \t\t\t\t// \tthis.checkClassFieldName(propInfo.name, propInfo.isStatic);\n// \t\t\t\t// }\n\n// \t\t\t\tconst initializer: ExpressionNode = this.parseMemberInitializer(classInfo, propInfo.isStatic);\n// \t\t\t\tthis.expectSemicolon();\n\n// \t\t\t\tconst result: ExpressionNode = this.newClassLiteralProperty(\n// \t\t\t\t\tnameExpression,\n// \t\t\t\t\tinitializer,\n// \t\t\t\t\tClassLiteralPropertyKind.FIELD,\n// \t\t\t\t\tpropInfo.isStatic,\n// \t\t\t\t\tpropInfo.isComputedName,\n// \t\t\t\t\tpropInfo.isPrivate\n// \t\t\t\t);\n// \t\t\t\tthis.setFunctionNameFromPropertyName(result, propInfo.name);\n// \t\t\t\treturn result;\n// \t\t\t}\n// \t\t\tcase PropertyKind.Method: {\n// \t\t\t\t// MethodDefinition\n// \t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n// \t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n// \t\t\t\t// async PropertyName '(' StrictFormalParameters ')'\n// \t\t\t\t// '{' FunctionBody '}'\n// \t\t\t\t// async '*' PropertyName '(' StrictFormalParameters ')'\n// \t\t\t\t// '{' FunctionBody '}'\n\n// \t\t\t\t// if (!propInfo.isComputedName) {\n// \t\t\t\t// \tthis.checkClassMethodName(propInfo.name, PropertyKind.Method,propInfo.functionFlags, propInfo.isStatic,classInfo . hasSeenConstructor);\n// \t\t\t\t// }\n\n// \t\t\t\tlet kind: FunctionType = this.methodKindFor(propInfo.isStatic, propInfo.functionFlags);\n\n// \t\t\t\tif (!propInfo.isStatic && propInfo.name.toString() === 'constructor') {\n// \t\t\t\t\tclassInfo.hasSeenConstructor = true;\n// \t\t\t\t\tkind = hasExtends ? FunctionType.DERIVED_CONSTRUCTOR : FunctionType.BASE_CONSTRUCTOR;\n// \t\t\t\t}\n\n// \t\t\t\tconst value = this.parseFunctionLiteral(\n// \t\t\t\t\tkind,\n// \t\t\t\t\tpropInfo.name\n// \t\t\t\t\t// ,kSkipFunctionNameCheck, kind, FunctionSyntaxKind.kAccessorOrMethod\n// \t\t\t\t);\n\n// \t\t\t\tClassLiteralPropertyT result = factory() -> NewClassLiteralProperty(\n// \t\t\t\t\tname_expression, value, ClassLiteralProperty.METHOD,\n// \t\t\t\t\tpropInfo.is_static, propInfo.is_computed_name,\n// \t\t\t\t\tpropInfo.is_private);\n// \t\t\t\timpl() -> SetFunctionNameFromPropertyName(result, propInfo.name);\n// \t\t\t\treturn result;\n// \t\t\t}\n\n// \t\t\tcase PropertyKind.AccessorGetter:\n// \t\t\tcase PropertyKind.AccessorSetter: {\n// \t\t\t\tDCHECK_EQ(propInfo.function_flags, ParseFunctionFlag.kIsNormal);\n// \t\t\t\tbool is_get = propInfo.kind == PropertyKind.kAccessorGetter;\n\n// \t\t\t\tif (!propInfo.is_computed_name) {\n// \t\t\t\t\tCheckClassMethodName(propInfo.name, propInfo.kind,\n// \t\t\t\t\t\tParseFunctionFlag.kIsNormal, propInfo.is_static,\n// & class_info -> has_seen_constructor);\n// \t\t\t\t\t// Make sure the name expression is a string since we need a Name for\n// \t\t\t\t\t// Runtime_DefineAccessorPropertyUnchecked and since we can determine\n// \t\t\t\t\t// this statically we can skip the extra runtime check.\n// \t\t\t\t\tname_expression = factory() -> NewStringLiteral(\n// \t\t\t\t\t\tpropInfo.name, name_expression -> position());\n// \t\t\t\t}\n\n// \t\t\t\tFunctionKind kind;\n// \t\t\t\tif (propInfo.is_static) {\n// \t\t\t\t\tkind = is_get ? FunctionKind.kStaticGetterFunction\n// \t\t\t\t\t\t: FunctionKind.kStaticSetterFunction;\n// \t\t\t\t} else {\n// \t\t\t\t\tkind = is_get ? FunctionKind.kGetterFunction\n// \t\t\t\t\t\t: FunctionKind.kSetterFunction;\n// \t\t\t\t}\n\n// \t\t\t\tFunctionLiteralT value = impl() -> ParseFunctionLiteral(\n// \t\t\t\t\tpropInfo.name, scanner() -> location(), kSkipFunctionNameCheck, kind,\n// \t\t\t\t\tname_token_position, FunctionSyntaxKind.kAccessorOrMethod,\n// \t\t\t\t\tlanguage_mode(), nullptr);\n\n// \t\t\t\tClassLiteralPropertyKind property_kind =\n// \t\t\t\t\tis_get ? ClassLiteralProperty.GETTER : ClassLiteralProperty.SETTER;\n// \t\t\t\tClassLiteralPropertyT result = factory() -> NewClassLiteralProperty(\n// \t\t\t\t\tname_expression, value, property_kind, propInfo.is_static,\n// \t\t\t\t\tpropInfo.is_computed_name, propInfo.is_private);\n// \t\t\t\tconst AstRawString* prefix =\n// \t\t\t\tis_get ? ast_value_factory() -> get_space_string()\n// \t\t\t\t\t: ast_value_factory() -> set_space_string();\n// \t\t\t\timpl() -> SetFunctionNameFromPropertyName(result, propInfo.name, prefix);\n// \t\t\t\treturn result;\n// \t\t\t}\n// \t\t\tcase PropertyKind.Value:\n// \t\t\tcase PropertyKind.Shorthand:\n// \t\t\tcase PropertyKind.Spread:\n// \t\t\t\t// throw new Error(this.errorMessage('Report Unexpected Token'));\n// \t\t\t\treturn NullNode;\n// \t\t}\n// \t\tthrow new Error(this.errorMessage('UNREACHABLE'));\n// \t}\n// \tprotected methodKindFor(isStatic: boolean, functionFlags: FunctionType): FunctionType {\n// \t\tconst isGenerator = functionFlags.includes('GENERATOR');\n// \t\tconst isAsync = functionFlags.includes('ASYNC');\n// \t\treturn functionKindForImpl(\n// \t\t\tisStatic ? SubFunctionKind.StaticMethod : SubFunctionKind.NonStaticMethod,\n// \t\t\tisGenerator,\n// \t\t\tisAsync\n// \t\t);\n// \t}\n// \tnewClassLiteralProperty(nameExpression: ExpressionNode, initializer: ExpressionNode, FIELD: ClassLiteralPropertyKind, isStatic: boolean, isComputedName: boolean, isPrivate: boolean): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tparseMemberInitializer(classInfo: ClassInfo, isStatic: boolean): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected parseClassStaticBlock(classInfo: ClassInfo): ExpressionNode {\n// \t\tthis.consume(Token.STATIC);\n// \t\t// Each static block has its own var and lexical scope, so make a new var\n// \t\t// block scope instead of using the synthetic members initializer function\n// \t\t// scope.\n// \t\tconst staticBlock = this.parseBlock();\n// \t\tclassInfo.hasStaticElements = true;\n// \t\treturn staticBlock;\n\n// \t}\n// \tprotected declareClass(variableName: ExpressionNode | undefined, value: ExpressionNode, names: ExpressionNode[] | undefined): ExpressionNode {\n// \t\tif (names && variableName) {\n// \t\t\tconst proxy = this.declareVariable(variableName, 'let');\n// \t\t\tnames.push(variableName);\n// \t\t\treturn new AssignmentNode('=', proxy, value);\n// \t\t}\n// \t\treturn value;\n// \t}\n// \tprotected parseSuperExpression(): ExpressionNode {\n// \t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n// \t}\n// \tprotected parseImportExpressions(): ExpressionNode {\n// \t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n// \t}\n// \tprotected declareVariable(name: ExpressionNode | undefined, mode: 'let' | 'const' | 'var') {\n// \t\tif (!name) {\n// \t\t\tthrow new Error(this.errorMessage('Variable name is undefined'));\n// \t\t}\n// \t\tswitch (mode) {\n// \t\t\tcase 'const':\n// \t\t\t\treturn new ConstNode([new Variable(name)]);\n// \t\t\tdefault:\n// \t\t\tcase 'var':\n// \t\t\tcase 'let':\n// \t\t\t\treturn new LetNode([new Variable(name)]);\n// \t\t}\n// \t}\n// }\n"]}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/expressions/v8/app.ts"],"names":[],"mappings":"","sourcesContent":["// import type { CanDeclareExpression, ExpressionNode } from '../api/expression.js';\n// import { JavaScriptParser, PropertyKind, PropertyKindInfo } from './parser.js';\n// import { Token } from './token.js';\n// import { MetaProperty } from '../api/app/class.js';\n// import { FunctionKind } from '../api/definition/function.js';\n// import { Identifier, Literal } from '../api/definition/values.js';\n// import { AssignmentExpression } from '../api/operators/assignment.js';\n// import { VariableDeclarationNode, VariableNode } from '../api/statement/declarations/declares.js';\n\n\n// export type ClassInfo = {\n// \tisAnonymous: boolean;\n// \textends: ExpressionNode;\n// \thasSeenConstructor: boolean;\n// \thasStaticComputedNames: boolean;\n// \trequiresBrand: boolean;\n// \thasPrivateMethods: boolean,\n// \thasStaticPrivateMethods: boolean;\n// \tcomputedFieldCount: number;\n// \thasStaticElements: boolean;\n// };\n\n// export enum FunctionNameValidity {\n// \tFunctionNameIsStrictReserved = 'FunctionNameIsStrictReserved',\n// \tSkipFunctionNameCheck = 'SkipFunctionNameCheck',\n// \tFunctionNameValidityUnknown = 'FunctionNameValidityUnknown'\n// };\n\n// export enum AllowLabelledFunctionStatement {\n// \tAllowLabelledFunctionStatement = 'AllowLabelledFunctionStatement',\n// \tDisallowLabelledFunctionStatement = 'DisallowLabelledFunctionStatement',\n// };\n\n// export enum ParsingArrowHeadFlag {\n// \tCertainlyNotArrowHead = 'CertainlyNotArrowHead',\n// \tMaybeArrowHead = 'MaybeArrowHead'\n// };\n\n// export enum PropertyPosition {\n// \tObjectLiteral = 'ObjectLiteral',\n// \tClassLiteral = 'ClassLiteral'\n// }\n\n// const FUNCTIONS_TYPES: FunctionKind[][][] = [\n// \t[\n// \t\t// SubFunctionKind::kNormalFunction\n// \t\t[// is_generator=false\n// \t\t\tFunctionKind.NORMAL,\n// \t\t\tFunctionKind.ASYNC\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionKind.GENERATOR,\n// \t\t\tFunctionKind.ASYNC_GENERATOR\n// \t\t],\n// \t],\n// \t[\n// \t\t// SubFunctionKind::kNonStaticMethod\n// \t\t[// is_generator=false\n// \t\t\tFunctionKind.CONCISE,\n// \t\t\tFunctionKind.ASYNC_CONCISE\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionKind.CONCISE_GENERATOR,\n// \t\t\tFunctionKind.ASYNC_CONCISE_GENERATOR\n// \t\t],\n// \t],\n// \t[\n// \t\t// SubFunctionKind::kStaticMethod\n// \t\t[// is_generator=false\n// \t\t\tFunctionKind.STATIC_CONCISE,\n// \t\t\tFunctionKind.STATIC_ASYNC_CONCISE\n// \t\t],\n// \t\t[// is_generator=true\n// \t\t\tFunctionKind.STATIC_CONCISE_GENERATOR,\n// \t\t\tFunctionKind.STATIC_ASYNC_CONCISE_GENERATOR\n// \t\t],\n// \t]\n// ];\n\n// export enum SubFunctionKind {\n// \tNormalFunction,\n// \tNonStaticMethod,\n// \tStaticMethod,\n// }\n\n// export function functionKindForImpl(subFunctionKind: SubFunctionKind, isGenerator: boolean, isAsync: boolean): FunctionKind {\n// \treturn FUNCTIONS_TYPES[subFunctionKind as number][isGenerator ? 1 : 0][isAsync ? 1 : 0];\n// }\n\n// export class ParsePropertyInfo implements PropertyKindInfo {\n// \tname: string;\n// \tposition = PropertyPosition.ClassLiteral;\n// \tfuncFlag = FunctionKind.NORMAL;\n// \tkind = PropertyKind.NotSet;\n// \tisComputedName = false;\n// \tisPrivate = false;\n// \tisStatic = false;\n// \tisRest = false;\n\n// \tPropertyKindFromToken(token: Token): boolean {\n// \t\t// This returns true, setting the property kind, iff the given token is\n// \t\t// one which must occur after a property name, indicating that the\n// \t\t// previous token was in fact a name and not a modifier (like the \"get\" in\n// \t\t// \"get x\").\n// \t\tswitch (token) {\n// \t\t\tcase Token.COLON:\n// \t\t\t\tthis.kind = PropertyKind.Value;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.COMMA:\n// \t\t\t\tthis.kind = PropertyKind.Shorthand;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.R_CURLY:\n// \t\t\t\tthis.kind = PropertyKind.ShorthandOrClassField;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.ASSIGN:\n// \t\t\t\tthis.kind = PropertyKind.Assign;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.L_PARENTHESES:\n// \t\t\t\tthis.kind = PropertyKind.Method;\n// \t\t\t\treturn true;\n// \t\t\tcase Token.MUL:\n// \t\t\tcase Token.SEMICOLON:\n// \t\t\t\tthis.kind = PropertyKind.ClassField;\n// \t\t\t\treturn true;\n// \t\t\tdefault:\n// \t\t\t\tbreak;\n// \t\t}\n// \t\treturn false;\n// \t}\n\n// }\n// enum ObjectLiteralPropertyKind {\n// \tCONSTANT = 'CONSTANT',\t// Property with constant value (compile time).\n// \tCOMPUTED = 'COMPUTED',\t// Property with computed value (execution time).\n// \tMATERIALIZED_LITERAL = 'MATERIALIZED_LITERAL', // Property value is a materialized literal.\n// \tGETTER = 'GETTER',\n// \tSETTER = 'SETTER',\t\t// Property is an accessor function.\n// \tPROTOTYPE = 'PROTOTYPE',\t// Property is __proto__.\n// \tSPREAD = 'SPREAD'\n// }\n// export class ObjectLiteralProperty {\n// \tstatic Kind = ObjectLiteralPropertyKind;\n// }\n\n// enum ClassLiteralPropertyKind {\n// \tMETHOD = 'METHOD',\n// \tGETTER = 'GETTER',\n// \tSETTER = 'SETTER',\n// \tFIELD = 'FIELD'\n// }\n\n// export class ClassLiteralProperty {\n// \tstatic Kind = ClassLiteralPropertyKind;\n// }\n\n// function assertUnreachable(x: never): never {\n// \tthrow new Error(`Didn't expect to get here`);\n// }\n// export function classPropertyKindFor(kind: PropertyKind): ClassLiteralPropertyKind {\n// \tswitch (kind) {\n// \t\tcase PropertyKind.AccessorGetter:\n// \t\t\treturn ClassLiteralPropertyKind.GETTER;\n// \t\tcase PropertyKind.AccessorSetter:\n// \t\t\treturn ClassLiteralPropertyKind.SETTER;\n// \t\tcase PropertyKind.Method:\n// \t\t\treturn ClassLiteralPropertyKind.METHOD;\n// \t\tcase PropertyKind.ClassField:\n// \t\t\treturn ClassLiteralPropertyKind.FIELD;\n// \t}\n// \tthrow new Error(`unexpected property kind: ${kind}`);\n// }\n\n// export enum VariableMode {\n// \tConst = 'Const',\n// \tPrivateMethod = 'PrivateMethod',\n// \tPrivateGetterOnly = 'PrivateGetterOnly',\n// \tPrivateSetterOnly = 'PrivateSetterOnly'\n// }\n\n// export function getVariableMode(kind: ClassLiteralPropertyKind): VariableMode {\n// \tswitch (kind) {\n// \t\tcase ClassLiteralPropertyKind.FIELD:\n// \t\t\treturn VariableMode.Const;\n// \t\tcase ClassLiteralPropertyKind.METHOD:\n// \t\t\treturn VariableMode.PrivateMethod;\n// \t\tcase ClassLiteralPropertyKind.GETTER:\n// \t\t\treturn VariableMode.PrivateGetterOnly;\n// \t\tcase ClassLiteralPropertyKind.SETTER:\n// \t\t\treturn VariableMode.PrivateSetterOnly;\n// \t}\n// }\n\n// export class JavaScriptAppParser extends JavaScriptParser {\n// \tprotected parseNewTargetExpression(): ExpressionNode {\n// \t\tthis.consume(Token.PERIOD);\n// \t\tconst target: ExpressionNode = this.parsePropertyName();\n// \t\tif (target.toString() !== 'target') {\n// \t\t\tthrow new Error(this.errorMessage(`Expression (new.${target.toString()}) not supported.`));\n// \t\t}\n// \t\treturn MetaProperty.NewTarget;\n// \t}\n// \tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n// \t\t// ClassDeclaration ::\n// \t\t// 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'\n// \t\t// 'class' ('extends' LeftHandExpression)? '{' ClassBody '}'\n// \t\t//\n// \t\t// The anonymous form is allowed iff [default_export] is true.\n// \t\t//\n// \t\t// 'class' is expected to be consumed by the caller.\n// \t\t//\n// \t\t// A ClassDeclaration\n// \t\t//\n// \t\t// class C { ... }\n// \t\t//\n// \t\t// has the same semantics as:\n// \t\t//\n// \t\t// let C = class C { ... };\n// \t\t//\n// \t\t// so rewrite it as such.\n\n// \t\tconst nextToken = this.peek().token;\n// \t\tconst isStrictReserved = Token.isStrictReservedWord(nextToken);\n// \t\tlet name: ExpressionNode | undefined;\n// \t\tlet variableName: ExpressionNode | undefined;\n// \t\tif (defaultExport && (nextToken == Token.EXTENDS || nextToken == Token.L_CURLY)) {\n// \t\t\tname = new Literal('default');\n// \t\t\tvariableName = new Literal('.default');\n// \t\t} else {\n// \t\t\tname = this.parseIdentifier();\n// \t\t\tvariableName = name;\n// \t\t}\n// \t\tconst value = this.parseClassLiteral(name, isStrictReserved);\n// \t\treturn this.declareClass(variableName, value, names);\n// \t}\n// \tprotected parseClassLiteral(name: ExpressionNode | undefined, nameIsStrictReserved: boolean): ExpressionNode {\n// \t\tconst isAnonymous = !!!name;\n\n// \t\t// All parts of a ClassDeclaration and ClassExpression are strict code.\n// \t\tif (!isAnonymous) {\n// \t\t\tif (nameIsStrictReserved) {\n// \t\t\t\tthrow new Error(this.errorMessage(`Unexpected Strict Reserved class name`));\n// \t\t\t}\n// \t\t\tif (this.isEvalOrArguments(name!)) {\n// \t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments not allowed for class name`));\n// \t\t\t}\n// \t\t}\n\n// \t\t// ClassScope * class_scope = NewClassScope(scope(), is_anonymous);\n// \t\t// BlockState block_state(& scope_, class_scope);\n// \t\t// RaiseLanguageMode(LanguageMode.kStrict);\n\n// \t\t// BlockState object_literal_scope_state(& object_literal_scope_, nullptr);\n\n// \t\t// ClassInfo classInfo(this);\n// \t\t// classInfo.is_anonymous = is_anonymous;\n\n// \t\tconst classInfo = { isAnonymous, computedFieldCount: 0 } as ClassInfo;\n\n// \t\t// scope() -> set_start_position(class_token_pos);\n// \t\tif (this.check(Token.EXTENDS)) {\n// \t\t\t// ClassScope.HeritageParsingScope heritage(class_scope);\n// \t\t\t// FuncNameInferrerState fni_state(& fni_);\n// \t\t\t// ExpressionParsingScope scope(impl());\n// \t\t\tclassInfo.extends = this.parseLeftHandSideExpression();\n// \t\t\t// scope.ValidateExpression();\n// \t\t}\n\n// \t\tthis.expect(Token.L_CURLY);\n\n// \t\tconst hasExtends = !(classInfo.extends === undefined);\n\n// \t\tconst staticBlockList: ExpressionNode[] = [];\n// \t\tconst privateClassMemberList: ExpressionNode[] = [];\n// \t\tconst publicClassFieldList: ExpressionNode[] = [];\n// \t\tconst publicClassMethodList: ExpressionNode[] = [];\n\n// \t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n// \t\t\tif (this.check(Token.SEMICOLON)) continue;\n\n// \t\t\t// Either we're parsing a `static { }` initialization block or a property.\n// \t\t\tif (this.peek().isType(Token.STATIC) && this.peekAhead().isType(Token.L_CURLY)) {\n// \t\t\t\tconst staticBlock = this.parseClassStaticBlock(classInfo);\n// \t\t\t\tstaticBlockList.push(staticBlock);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\t// FuncNameInferrerState fni_state(& fni_);\n// \t\t\t// If we haven't seen the constructor yet, it potentially is the next\n// \t\t\t// property.\n// \t\t\tlet isConstructor = !classInfo.hasSeenConstructor;\n// \t\t\tconst propInfo = new ParsePropertyInfo();\n// \t\t\tpropInfo.position = PropertyPosition.ClassLiteral;\n\n// \t\t\tconst property = this.parseClassPropertyDefinition(classInfo, propInfo, hasExtends);\n\n// \t\t\t// if (has_error()) return impl() -> FailureExpression();\n\n// \t\t\tconst propertyKind = classPropertyKindFor(propInfo.kind);\n// \t\t\tif (!classInfo.hasStaticComputedNames && propInfo.isStatic && propInfo.isComputedName) {\n// \t\t\t\tclassInfo.hasStaticComputedNames = true;\n// \t\t\t}\n// \t\t\tisConstructor &&= classInfo.hasSeenConstructor;\n\n// \t\t\tconst isField = propertyKind == ClassLiteralPropertyKind.FIELD;\n\n// \t\t\tif (propInfo.isPrivate) {\n// \t\t\t\tif (isConstructor) {\n// \t\t\t\t\tthrow new Error(this.errorMessage('private constructor is not allowed'));\n// \t\t\t\t}\n// \t\t\t\tclassInfo.requiresBrand ||= (!isField && !propInfo.isStatic);\n// \t\t\t\tconst isMethod = propertyKind == ClassLiteralPropertyKind.METHOD;\n// \t\t\t\tclassInfo.hasPrivateMethods ||= isMethod;\n// \t\t\t\tclassInfo.hasStaticPrivateMethods ||= isMethod && propInfo.isStatic;\n// \t\t\t\tconst privateClassMember = this.declarePrivateClassMember(propInfo.name, property, propertyKind, propInfo.isStatic, classInfo);\n// \t\t\t\tprivateClassMemberList.push(privateClassMember);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\tif (isField) {\n// \t\t\t\tif (propInfo.isComputedName) {\n// \t\t\t\t\tclassInfo.computedFieldCount++;\n// \t\t\t\t}\n// \t\t\t\tconst publicClassField = this.declarePublicClassField(property, propInfo.isStatic, propInfo.isComputedName, classInfo);\n// \t\t\t\tpublicClassFieldList.push(publicClassField);\n// \t\t\t\tcontinue;\n// \t\t\t}\n\n// \t\t\tconst publicClassMethod = this.declarePublicClassMethod(name, property, isConstructor, classInfo);\n// \t\t\tpublicClassMethodList.push(publicClassMethod);\n// \t\t}\n\n// \t\tthis.expect(Token.R_CURLY);\n// \t\t// int end_pos = end_position();\n// \t\t// class_scope -> set_end_position(end_pos);\n\n// \t\t// VariableProxy * unresolvable = class_scope -> ResolvePrivateNamesPartially();\n// \t\t// if (unresolvable != nullptr) {\n// \t\t// \timpl() -> ReportMessageAt(Scanner.Location(unresolvable -> position(),unresolvable -> position() + 1),\n// \t\t// \t\tMessageTemplate.kInvalidPrivateFieldResolution,\n// \t\t// \t\tunresolvable -> raw_name());\n// \t\t// \treturn impl() -> FailureExpression();\n// \t\t// }\n\n// \t\t// if (classInfo.requiresBrand) {\n// \t\t// \tclass_scope -> DeclareBrandVariable(ast_value_factory(), IsStaticFlag.kNotStatic, kNoSourcePosition);\n// \t\t// }\n\n// \t\t// if (class_scope -> needs_home_object()) {\n// \t\t// \tclassInfo.homeObjectVariable = class_scope -> DeclareHomeObjectVariable(ast_value_factory());\n// \t\t// \tclassInfo.staticHomeObjectVariable = class_scope -> DeclareStaticHomeObjectVariable(ast_value_factory());\n// \t\t// }\n\n// \t\t// bool should_save_class_variable_index = class_scope -> should_save_class_variable_index();\n// \t\t// if (!isAnonymous || should_save_class_variable_index) {\n// \t\t// \tthis.declareClassVariable(name, classInfo);\n// \t\t// \tif (should_save_class_variable_index) {\n// \t\t// \t\tclass_scope -> class_variable() -> set_is_used();\n// \t\t// \t\tclass_scope -> class_variable() -> ForceContextAllocation();\n// \t\t// \t}\n// \t\t// }\n// \t\treturn this.rewriteClassLiteral(name, classInfo);\n// \t}\n// \tprotected declarePublicClassMethod(name: ExpressionNode | undefined, property: ExpressionNode, isConstructor: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected declarePublicClassField(property: ExpressionNode, isStatic: boolean, isComputedName: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected inferFunctionName() {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected declarePrivateClassMember(name: string, property: ExpressionNode, propertyKind: ClassLiteralPropertyKind, isStatic: boolean, classInfo: ClassInfo): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected parseClassPropertyDefinition(classInfo: ClassInfo, propInfo: ParsePropertyInfo, hasExtends: boolean): ExpressionNode {\n// \t\tif (!classInfo) {\n// \t\t\tthrow new Error(this.errorMessage('class info is undefined'));\n// \t\t}\n// \t\tif (propInfo.position !== PropertyPosition.ClassLiteral) {\n// \t\t\tthrow new Error(this.errorMessage('expected property position ClassLiteral'));\n// \t\t}\n\n// \t\tconst nameToken = this.peek();\n// \t\tlet nameExpression: ExpressionNode;\n// \t\tif (nameToken.isType(Token.STATIC)) {\n// \t\t\tthis.consume(Token.STATIC);\n// \t\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n// \t\t\t\tpropInfo.kind = PropertyKind.Method;\n// \t\t\t\tnameExpression = this.parseIdentifier();\n// \t\t\t\tpropInfo.name = (nameExpression as Identifier).getName() as string;\n// \t\t\t} else if (this.peek().isType(Token.ASSIGN)\n// \t\t\t\t|| this.peek().isType(Token.SEMICOLON)\n// \t\t\t\t|| this.peek().isType(Token.R_BRACKETS)) {\n// \t\t\t\tnameExpression = this.parseIdentifier();\n// \t\t\t\tpropInfo.name = (nameExpression as Identifier).getName() as string;\n// \t\t\t} else {\n// \t\t\t\tpropInfo.isStatic = true;\n// \t\t\t\tnameExpression = this.parseProperty(propInfo);\n// \t\t\t}\n// \t\t} else {\n// \t\t\tnameExpression = this.parseProperty(propInfo);\n// \t\t}\n\n// \t\tswitch (propInfo.kind) {\n// \t\t\tcase PropertyKind.Assign:\n// \t\t\tcase PropertyKind.ClassField:\n// \t\t\tcase PropertyKind.ShorthandOrClassField:\n// \t\t\tcase PropertyKind.NotSet: {\n// \t\t\t\t// This case is a name followed by a\n// \t\t\t\t// name or other property. Here we have\n// \t\t\t\t// to assume that's an uninitialized\n// \t\t\t\t// field followed by a line break\n// \t\t\t\t// followed by a property, with ASI\n// \t\t\t\t// adding the semicolon. If not, there\n// \t\t\t\t// will be a syntax error after parsing\n// \t\t\t\t// the first name as an uninitialized\n// \t\t\t\t// field.\n// \t\t\t\tpropInfo.kind = PropertyKind.ClassField;\n\n// \t\t\t\t// if (!propInfo.isComputedName) {\n// \t\t\t\t// \tthis.checkClassFieldName(propInfo.name, propInfo.isStatic);\n// \t\t\t\t// }\n\n// \t\t\t\tconst initializer: ExpressionNode = this.parseMemberInitializer(classInfo, propInfo.isStatic);\n// \t\t\t\tthis.expectSemicolon();\n\n// \t\t\t\tconst result: ExpressionNode = this.newClassLiteralProperty(\n// \t\t\t\t\tnameExpression,\n// \t\t\t\t\tinitializer,\n// \t\t\t\t\tClassLiteralPropertyKind.FIELD,\n// \t\t\t\t\tpropInfo.isStatic,\n// \t\t\t\t\tpropInfo.isComputedName,\n// \t\t\t\t\tpropInfo.isPrivate\n// \t\t\t\t);\n// \t\t\t\tthis.setFunctionNameFromPropertyName(result, propInfo.name);\n// \t\t\t\treturn result;\n// \t\t\t}\n// \t\t\tcase PropertyKind.Method: {\n// \t\t\t\t// MethodDefinition\n// \t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n// \t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n// \t\t\t\t// async PropertyName '(' StrictFormalParameters ')'\n// \t\t\t\t// '{' FunctionBody '}'\n// \t\t\t\t// async '*' PropertyName '(' StrictFormalParameters ')'\n// \t\t\t\t// '{' FunctionBody '}'\n\n// \t\t\t\t// if (!propInfo.isComputedName) {\n// \t\t\t\t// \tthis.checkClassMethodName(propInfo.name, PropertyKind.Method,propInfo.functionFlags, propInfo.isStatic,classInfo . hasSeenConstructor);\n// \t\t\t\t// }\n\n// \t\t\t\tlet kind: FunctionKind = this.methodKindFor(propInfo.isStatic, propInfo.funcFlag);\n\n// \t\t\t\tif (!propInfo.isStatic && propInfo.name.toString() === 'constructor') {\n// \t\t\t\t\tclassInfo.hasSeenConstructor = true;\n// \t\t\t\t\tkind = hasExtends ? FunctionKind.DERIVED_CONSTRUCTOR : FunctionKind.BASE_CONSTRUCTOR;\n// \t\t\t\t}\n\n// \t\t\t\tconst value = this.parseFunctionLiteral(\n// \t\t\t\t\tkind,\n// \t\t\t\t\tpropInfo.name\n// \t\t\t\t\t// ,kSkipFunctionNameCheck, kind, FunctionSyntaxKind.kAccessorOrMethod\n// \t\t\t\t);\n\n// \t\t\t\tClassLiteralPropertyT result = factory() -> NewClassLiteralProperty(\n// \t\t\t\t\tname_expression, value, ClassLiteralProperty.METHOD,\n// \t\t\t\t\tpropInfo.is_static, propInfo.is_computed_name,\n// \t\t\t\t\tpropInfo.is_private);\n// \t\t\t\tthis.setFunctionNameFromPropertyName(result, propInfo.name);\n// \t\t\t\treturn result;\n// \t\t\t}\n\n// \t\t\tcase PropertyKind.AccessorGetter:\n// \t\t\tcase PropertyKind.AccessorSetter: {\n// \t\t\t\tDCHECK_EQ(propInfo.function_flags, ParseFunctionFlag.kIsNormal);\n// \t\t\t\tbool is_get = propInfo.kind == PropertyKind.kAccessorGetter;\n\n// \t\t\t\tif (!propInfo.is_computed_name) {\n// \t\t\t\t\tCheckClassMethodName(propInfo.name, propInfo.kind,\n// \t\t\t\t\t\tParseFunctionFlag.kIsNormal, propInfo.is_static,\n// & class_info -> has_seen_constructor);\n// \t\t\t\t\t// Make sure the name expression is a string since we need a Name for\n// \t\t\t\t\t// Runtime_DefineAccessorPropertyUnchecked and since we can determine\n// \t\t\t\t\t// this statically we can skip the extra runtime check.\n// \t\t\t\t\tname_expression = factory() -> NewStringLiteral(\n// \t\t\t\t\t\tpropInfo.name, name_expression -> position());\n// \t\t\t\t}\n\n// \t\t\t\tlet kind: FunctionKind;\n// \t\t\t\tif (propInfo.is_static) {\n// \t\t\t\t\tkind = is_get ? FunctionKind.StaticGetterFunction\n// \t\t\t\t\t\t: FunctionKind.StaticSetterFunction;\n// \t\t\t\t} else {\n// \t\t\t\t\tkind = is_get ? FunctionKind.GetterFunction\n// \t\t\t\t\t\t: FunctionKind.SetterFunction;\n// \t\t\t\t}\n\n// \t\t\t\tFunctionLiteralT value = impl() -> ParseFunctionLiteral(\n// \t\t\t\t\tpropInfo.name, scanner() -> location(), kSkipFunctionNameCheck, kind,\n// \t\t\t\t\tname_token_position, FunctionSyntaxKind.kAccessorOrMethod,\n// \t\t\t\t\tlanguage_mode(), nullptr);\n\n// \t\t\t\tClassLiteralPropertyKind property_kind =\n// \t\t\t\t\tis_get ? ClassLiteralProperty.GETTER : ClassLiteralProperty.SETTER;\n// \t\t\t\tClassLiteralPropertyT result = factory() -> NewClassLiteralProperty(\n// \t\t\t\t\t\tname_expression, value, property_kind, propInfo.is_static,\n// \t\t\t\t\t\tpropInfo.is_computed_name, propInfo.is_private);\n// \t\t\t\tconst AstRawString* prefix =\n// \t\t\t\tis_get ? ast_value_factory() -> get_space_string()\n// \t\t\t\t\t: ast_value_factory() -> set_space_string();\n// \t\t\t\tthis.setFunctionNameFromPropertyName(result, propInfo.name, prefix);\n// \t\t\t\treturn result;\n// \t\t\t}\n// \t\t\tcase PropertyKind.Value:\n// \t\t\tcase PropertyKind.Shorthand:\n// \t\t\tcase PropertyKind.Spread:\n// \t\t\t\t// throw new Error(this.errorMessage('Report Unexpected Token'));\n// \t\t\t\treturn NullNode;\n// \t\t}\n// \t\tthrow new Error(this.errorMessage('UNREACHABLE'));\n// \t}\n// \tsetFunctionNameFromPropertyName(property: LiteralProperty, name: string, prefix?: string): void {\n// \t\t// Ignore \"__proto__\" as a name when it's being used to set the [[Prototype]]\n// \t\t// of an object literal.\n// \t\t// See ES #sec-__proto__-property-names-in-object-initializers.\n\n// \t\tif (property instanceof Identifier && property.getName() === '__proto__') {\n// \t\t\treturn;\n// \t\t}\n\n// \t\t// if (property -> IsPrototype() || has_error()) return;\n\n// \t\t// DCHECK(!property -> value() -> IsAnonymousFunctionDefinition() ||\n// \t\t// \tproperty -> kind() == ObjectLiteralProperty:: COMPUTED);\n\n// \t\t// SetFunctionNameFromPropertyName(static_cast < LiteralProperty *> (property), name,\n// \t\t// \tprefix);\n// \t}\n// \tprotected methodKindFor(isStatic: boolean, functionFlags: FunctionKind): FunctionKind {\n// \t\tconst isGenerator = functionFlags.includes('GENERATOR');\n// \t\tconst isAsync = functionFlags.includes('ASYNC');\n// \t\treturn functionKindForImpl(\n// \t\t\tisStatic ? SubFunctionKind.StaticMethod : SubFunctionKind.NonStaticMethod,\n// \t\t\tisGenerator,\n// \t\t\tisAsync\n// \t\t);\n// \t}\n// \tnewClassLiteralProperty(nameExpression: ExpressionNode, initializer: ExpressionNode, FIELD: ClassLiteralPropertyKind, isStatic: boolean, isComputedName: boolean, isPrivate: boolean): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tparseMemberInitializer(classInfo: ClassInfo, isStatic: boolean): ExpressionNode {\n// \t\tthrow new Error('Method not implemented.');\n// \t}\n// \tprotected parseClassStaticBlock(classInfo: ClassInfo): ExpressionNode {\n// \t\tthis.consume(Token.STATIC);\n// \t\t// Each static block has its own var and lexical scope, so make a new var\n// \t\t// block scope instead of using the synthetic members initializer function\n// \t\t// scope.\n// \t\tconst staticBlock = this.parseBlock();\n// \t\tclassInfo.hasStaticElements = true;\n// \t\treturn staticBlock;\n\n// \t}\n// \tprotected declareClass(variableName: ExpressionNode | undefined, value: ExpressionNode, names: ExpressionNode[] | undefined): ExpressionNode {\n// \t\tif (names && variableName) {\n// \t\t\tconst proxy = this.declareVariable(variableName, 'let');\n// \t\t\tnames.push(variableName);\n// \t\t\treturn new AssignmentExpression('=', proxy, value);\n// \t\t}\n// \t\treturn value;\n// \t}\n// \tprotected parseSuperExpression(): ExpressionNode {\n// \t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n// \t}\n// \tprotected parseImportExpressions(): ExpressionNode {\n// \t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n// \t}\n// \tprotected declareVariable(name: ExpressionNode | undefined, mode: 'let' | 'const' | 'var') {\n// \t\tif (!name) {\n// \t\t\tthrow new Error(this.errorMessage('Variable name is undefined'));\n// \t\t}\n// \t\tswitch (mode) {\n// \t\t\tcase 'const':\n// \t\t\t\treturn new VariableDeclarationNode([new VariableNode(name as CanDeclareExpression)], 'const');\n// \t\t\tdefault:\n// \t\t\tcase 'var':\n// \t\t\t\treturn new VariableDeclarationNode([new VariableNode(name as CanDeclareExpression)], 'var');\n// \t\t\tcase 'let':\n// \t\t\t\treturn new VariableDeclarationNode([new VariableNode(name as CanDeclareExpression)], 'let');\n// \t\t}\n// \t}\n// }\n"]}
|
package/v8/parser.d.ts
CHANGED
|
@@ -106,7 +106,7 @@ export declare class JavaScriptParser extends AbstractParser {
|
|
|
106
106
|
protected parseFunctionDeclaration(): ExpressionNode;
|
|
107
107
|
protected parseFunctionDeclarationAndGenerator(): ExpressionNode;
|
|
108
108
|
protected parseHoistableDeclaration(flag: FunctionKind): ExpressionNode;
|
|
109
|
-
protected parseIdentifier(): ExpressionNode
|
|
109
|
+
protected parseIdentifier(): ExpressionNode;
|
|
110
110
|
protected getIdentifier(): ExpressionNode;
|
|
111
111
|
protected parseFunctionLiteral(flag: FunctionKind, name?: ExpressionNode): ExpressionNode;
|
|
112
112
|
protected parseArrowFunctionBody(): ExpressionNode | ExpressionNode[];
|
package/v8/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/expressions/v8/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CanDeclareExpression, ExpressionNode } from '../api/expression.js';\nimport { Token, TokenExpression } from './token.js';\nimport { PreTemplateLiteral, TokenStream } from './stream.js';\nimport {\n\tOfNode, Identifier, ThisNode,\n\tGetIdentifier, SetIdentifier, AsyncIdentifier,\n\tNullNode, StringLiteral, AwaitIdentifier,\n\tConstructorIdentifier, NameIdentifier,\n\tEvalIdentifier, ArgumentsIdentifier, TaggedTemplateExpression, TemplateLiteral\n} from '../api/definition/values.js';\nimport { EmptyStatement } from '../api/statement/control/empty.js';\nimport { BlockStatement } from '../api/statement/control/block.js';\nimport {\n\tArrowFunctionExpression, ArrowFunctionType, FunctionKind,\n\tParam, FunctionExpression, FunctionDeclaration\n} from '../api/definition/function.js';\nimport { IfStatement } from '../api/statement/control/if.js';\nimport { NewExpression } from '../api/computing/new.js';\nimport { SpreadElement } from '../api/computing/spread.js';\nimport { RestElement } from '../api/computing/rest.js';\nimport { AssignmentExpression, AssignmentOperator } from '../api/operators/assignment.js';\nimport { GroupingExpression } from '../api/operators/grouping.js';\nimport { MemberExpression } from '../api/definition/member.js';\nimport { BindExpression } from '../api/definition/bind.js';\nimport { ObjectExpression, Property, ObjectPattern } from '../api/definition/object.js';\nimport { ArrayExpression, ArrayPattern } from '../api/definition/array.js';\nimport { CallExpression } from '../api/computing/call.js';\nimport { DoWhileNode, WhileNode } from '../api/statement/iterations/while.js';\nimport { CatchClauseNode, ThrowStatement, TryCatchNode } from '../api/computing/throw.js';\nimport { SwitchCase, DefaultExpression, SwitchStatement } from '../api/statement/control/switch.js';\nimport { BreakStatement, ContinueStatement } from '../api/statement/control/terminate.js';\nimport { ReturnStatement } from '../api/computing/return.js';\nimport { YieldExpression } from '../api/computing/yield.js';\nimport { VariableNode, VariableDeclarationNode } from '../api/statement/declarations/declares.js';\nimport { ForNode, ForOfNode, ForInNode, ForAwaitOfNode, ForDeclaration } from '../api/statement/iterations/for.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { PipelineExpression } from '../api/operators/pipeline.js';\nimport { LogicalExpression, LogicalOperator } from '../api/operators/logical.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport { ChainExpression } from '../api/operators/chaining.js';\nimport { ExpressionStatement } from '../api/definition/statement.js';\nimport {\n\tbuildPostfixExpression, buildUnaryExpression,\n\texpressionFromLiteral, shortcutNumericLiteralBinaryExpression\n} from './nodes.js';\nimport { BinaryExpression } from '../api/operators/binary.js';\n\nexport enum ParsingArrowHeadFlag { CertainlyNotArrowHead, MaybeArrowHead, AsyncArrowFunction }\nexport enum PropertyKind {\n\tValue, Shorthand, ShorthandOrClassField,\n\tAssign, Method, ClassField, AccessorGetter, AccessorSetter,\n\tSpread, NotSet\n}\nexport type PropertyKindInfo = { kind?: PropertyKind, funcFlag?: FunctionKind, name: string };\nexport type FunctionInfo = { rest?: boolean };\nexport function parsePropertyKindFromToken(token: Token, info: PropertyKindInfo) {\n\tswitch (token) {\n\t\tcase Token.COLON:\n\t\t\tinfo.kind = PropertyKind.Value;\n\t\t\treturn true;\n\t\tcase Token.COMMA:\n\t\t\tinfo.kind = PropertyKind.Shorthand;\n\t\t\treturn true;\n\t\tcase Token.R_CURLY:\n\t\t\tinfo.kind = PropertyKind.ShorthandOrClassField;\n\t\t\treturn true;\n\t\tcase Token.ASSIGN:\n\t\t\tinfo.kind = PropertyKind.Assign;\n\t\t\treturn true;\n\t\tcase Token.L_PARENTHESES:\n\t\t\tinfo.kind = PropertyKind.Method;\n\t\t\treturn true;\n\t\tcase Token.MUL:\n\t\tcase Token.SEMICOLON:\n\t\t\tinfo.kind = PropertyKind.ClassField;\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn false;\n}\n\nexport enum PreParserIdentifierType {\n\tNullIdentifier = 'NullIdentifier',\n\tUnknownIdentifier = 'UnknownIdentifier',\n\tEvalIdentifier = 'EvalIdentifier',\n\tArgumentsIdentifier = 'ArgumentsIdentifier',\n\tConstructorIdentifier = 'ConstructorIdentifier',\n\tAwaitIdentifier = 'AwaitIdentifier',\n\tAsyncIdentifier = 'AsyncIdentifier',\n\tNameIdentifier = 'NameIdentifier',\n\tPrivateNameIdentifier = 'PrivateNameIdentifier'\n}\n\nexport abstract class AbstractParser {\n\tconstructor(protected scanner: TokenStream) { }\n\tabstract scan(): ExpressionNode;\n\tprotected position() {\n\t\treturn this.scanner.getPos();\n\t}\n\tprotected current() {\n\t\treturn this.scanner.currentToken();\n\t}\n\tprotected next() {\n\t\treturn this.scanner.next();\n\t}\n\tprotected peek(): TokenExpression {\n\t\treturn this.scanner.peek();\n\t}\n\tprotected peekAhead(): TokenExpression {\n\t\treturn this.scanner.peekAhead();\n\t}\n\tprotected peekAheadPosition() {\n\t\treturn this.scanner.peekAheadPosition();\n\t}\n\tprotected peekPosition() {\n\t\treturn this.scanner.peekPosition();\n\t}\n\tprotected consume(token: Token) {\n\t\tif (this.scanner.next().isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t}\n\tprotected check(token: Token): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.isType(token)) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected checkValue(value: ExpressionNode): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.value == value) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected expect(token: Token) {\n\t\tconst current = this.scanner.next();\n\t\tif (current.isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(token)}, current is ${JSON.stringify(current)}`));\n\t\t}\n\t}\n\tprotected checkInOrOf(): 'IN' | 'OF' | false {\n\t\tif (this.check(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (this.checkValue(OfNode)) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected peekInOrOf(): 'IN' | 'OF' | false {\n\t\tvar next = this.peek();\n\t\tif (next.isType(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (next.value === OfNode) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isEvalOrArguments(name: ExpressionNode): boolean {\n\t\tif (name.toString() === 'eval') {\n\t\t\treturn true;\n\t\t} else if (name.toString() === 'arguments') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isNextLetKeyword() {\n\t\tif (this.peek().isNotType(Token.LET)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst nextNextToken = this.peekAhead().token;\n\t\tswitch (nextNextToken) {\n\t\t\tcase Token.L_CURLY:\n\t\t\tcase Token.L_BRACKETS:\n\t\t\tcase Token.IDENTIFIER:\n\t\t\tcase Token.STATIC:\n\t\t\tcase Token.LET: // `let let;` is disallowed by static semantics, but the\n\t\t\t// token must be first interpreted as a keyword in order\n\t\t\t// for those semantics to apply. This ensures that ASI is\n\t\t\t// not honored when a LineTerminator separates the\n\t\t\t// tokens.\n\t\t\tcase Token.YIELD:\n\t\t\tcase Token.AWAIT:\n\t\t\tcase Token.GET:\n\t\t\tcase Token.SET:\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tprotected isIdentifier(expression: ExpressionNode): expression is Identifier {\n\t\treturn expression instanceof Identifier;\n\t}\n\tprotected isParenthesized(expression: ExpressionNode): expression is (GroupingExpression | SequenceExpression) {\n\t\treturn expression instanceof GroupingExpression || expression instanceof SequenceExpression;\n\t}\n\tprotected isAssignableIdentifier(expression: ExpressionNode): boolean {\n\t\t// return expression instanceof AssignmentNode;\n\t\tif (!(expression instanceof Identifier)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isEvalOrArguments(expression)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tprotected isPattern(expression: ExpressionNode): expression is (ObjectPattern | ArrayPattern) {\n\t\treturn expression instanceof ObjectPattern || expression instanceof ArrayPattern;\n\t}\n\tprotected isProperty(expression: ExpressionNode): expression is MemberExpression {\n\t\treturn expression instanceof MemberExpression;\n\t}\n\tprotected isCallNew(expression: ExpressionNode): expression is NewExpression {\n\t\treturn expression instanceof NewExpression;\n\t}\n\tprotected isCall(expression: ExpressionNode): expression is CallExpression {\n\t\treturn expression instanceof CallExpression;\n\t}\n\tprotected isEmptyStatement(expression: ExpressionNode): expression is EmptyStatement {\n\t\treturn expression instanceof EmptyStatement;\n\t}\n\tprotected isThisProperty(expression: ExpressionNode): boolean {\n\t\tif (this.isProperty(expression)) {\n\t\t\tif (expression.getObject() === ThisNode || expression.getObject().toString() === 'this') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isValidReferenceExpression(expression: ExpressionNode): boolean {\n\t\treturn this.isAssignableIdentifier(expression) || this.isProperty(expression);\n\t}\n\tprotected expectSemicolon() {\n\t\tconst tok = this.peek();\n\t\tif (tok.isType(Token.SEMICOLON)) {\n\t\t\tthis.next();\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tok.token)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.currentToken().isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`Await Not In Async Context/Function`));\n\t\t}\n\t}\n\tprotected peekAnyIdentifier() {\n\t\treturn Token.isAnyIdentifier(this.peek().token);\n\t}\n\tprotected errorMessage(message: string): string {\n\t\treturn this.scanner.createError(message);\n\t}\n}\n\nexport class JavaScriptParser extends AbstractParser {\n\tstatic parse(source: string | TokenExpression[] | TokenStream) {\n\t\tconst stream = (typeof source === 'string' || Array.isArray(source))\n\t\t\t? TokenStream.getTokenStream(source)\n\t\t\t: source;\n\t\tconst parser = new JavaScriptParser(stream);\n\t\treturn parser.scan();\n\t}\n\tscan(): ExpressionNode {\n\t\tconst list: ExpressionNode[] = this.parseStatementList(Token.EOS);\n\t\tif (list.length === 1) {\n\t\t\treturn list[0];\n\t\t}\n\t\treturn new ExpressionStatement(list);\n\t}\n\n\t/**\n\t * Statement ::\n\t * Block\n\t * VariableStatement\n\t * EmptyStatement\n\t * ExpressionStatement\n\t * IfStatement\n\t * IterationStatement\n\t * ContinueStatement\n\t * BreakStatement\n\t * ReturnStatement\n\t * WithStatement\n\t * LabelledStatement\n\t * SwitchStatement\n\t * ThrowStatement\n\t * TryStatement\n\t * DebuggerStatement\n\t */\n\tprotected parseStatement(): ExpressionNode {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseBlock();\n\t\t\tcase Token.SEMICOLON:\n\t\t\t\tthis.consume(Token.SEMICOLON);\n\t\t\t\treturn EmptyStatement.INSTANCE;\n\t\t\tcase Token.IF:\n\t\t\t\treturn this.parseIfStatement();\n\t\t\tcase Token.DO:\n\t\t\t\treturn this.parseDoWhileStatement();\n\t\t\tcase Token.WHILE:\n\t\t\t\treturn this.parseWhileStatement();\n\t\t\tcase Token.FOR:\n\t\t\t\t// if (this.peekAhead().isType(Token.AWAIT)) {\n\t\t\t\t// \treturn this.parseForAwaitStatement();\n\t\t\t\t// }\n\t\t\t\treturn this.parseForStatement();\n\t\t\tcase Token.CONTINUE:\n\t\t\t\treturn this.parseContinueStatement();\n\t\t\tcase Token.BREAK:\n\t\t\t\treturn this.parseBreakStatement();\n\t\t\tcase Token.RETURN:\n\t\t\t\treturn this.parseReturnStatement();\n\t\t\tcase Token.THROW:\n\t\t\t\treturn this.parseThrowStatement();\n\t\t\tcase Token.TRY:\n\t\t\t\treturn this.parseTryStatement();\n\t\t\tcase Token.SWITCH:\n\t\t\t\treturn this.parseSwitchStatement();\n\t\t\t// case Token.FUNCTION:\n\t\t\t// \t// FunctionDeclaration only allowed as a StatementListItem, not in\n\t\t\t// \t// an arbitrary Statement position. Exceptions such as\n\t\t\t// \t// ES#sec-functiondeclarations-in-ifstatement-statement-clauses\n\t\t\t// \t// are handled by calling ParseScopedStatement rather than\n\t\t\t// \t// ParseStatement directly.\n\t\t\t// \timpl() -> ReportMessageAt(scanner() -> peek_location(),\n\t\t\t// \t\tis_strict(language_mode())\n\t\t\t// \t\t\t? MessageTemplate.kStrictFunction\n\t\t\t// \t\t\t: MessageTemplate.kSloppyFunction);\n\t\t\t// \treturn impl() -> NullStatement();\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.parseExpressionOrLabelledStatement();\n\t\t}\n\t}\n\tprotected parseTryStatement(): ExpressionNode {\n\t\t// TryStatement ::\n\t\t// 'try' Block Catch\n\t\t// 'try' Block Finally\n\t\t// 'try' Block Catch Finally\n\t\t//\n\t\t// Catch ::\n\t\t// 'catch' '(' Identifier ')' Block\n\t\t//\n\t\t// Finally ::\n\t\t// 'finally' Block\n\n\t\tthis.consume(Token.TRY);\n\t\tconst tryBlock = this.parseBlock();\n\t\tif (tryBlock instanceof BlockStatement) {\n\t\t\ttryBlock.isStatement = true;\n\t\t}\n\t\tlet peek = this.peek();\n\t\tif (peek.isNotType(Token.CATCH) && peek.isNotType(Token.FINALLY)) {\n\t\t\tthrow new Error(this.errorMessage(`Uncaught SyntaxError: Missing catch or finally after try`));\n\t\t}\n\t\tlet catchBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.CATCH)) {\n\t\t\t// bool has_binding;\n\t\t\tlet catchVar: ExpressionNode | undefined;\n\t\t\tconst hasBinding = this.check(Token.L_PARENTHESES);\n\t\t\tif (hasBinding) {\n\t\t\t\tcatchVar = this.parseIdentifier();\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t}\n\t\t\tconst block = this.parseBlock();\n\t\t\tif (block instanceof BlockStatement) {\n\t\t\t\tblock.isStatement = true;\n\t\t\t}\n\t\t\tcatchBlock = new CatchClauseNode(block, catchVar);\n\t\t}\n\t\tlet finallyBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.FINALLY)) {\n\t\t\tfinallyBlock = this.parseBlock();\n\t\t\tif (finallyBlock instanceof BlockStatement) {\n\t\t\t\tfinallyBlock.isStatement = true;\n\t\t\t}\n\t\t}\n\t\treturn new TryCatchNode(tryBlock, catchBlock, finallyBlock);\n\t}\n\tprotected parseBlock(): ExpressionNode {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst statements: ExpressionNode[] = [];\n\t\tconst block = new BlockStatement(statements, false);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\treturn block;\n\t\t\t} else if (stat instanceof EmptyStatement) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstatements.push(stat);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn block;\n\t}\n\t/**\n\t * ECMA 262 6th Edition\n\t * \tStatementListItem[Yield, Return] :\n\t * \tStatement[?Yield, ?Return]\n\t * \tDeclaration[?Yield]\n\t * //\n\t * Declaration[Yield] :\n\t * \tHoistableDeclaration[?Yield]\n\t * \tClassDeclaration[?Yield]\n\t * \tLexicalDeclaration[In, ?Yield]\n\t * //\n\t * HoistableDeclaration[Yield, Default] :\n\t * \tFunctionDeclaration[?Yield, ?Default]\n\t * \tGeneratorDeclaration[?Yield, ?Default]\n\t * //\n\t * LexicalDeclaration[In, Yield] :\n\t * \tLetOrConst BindingList[?In, ?Yield] ;\n\t */\n\tprotected parseStatementListItem(): ExpressionNode | undefined {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.CLASS:\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\treturn this.parseClassDeclaration(undefined, false);\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this.parseStatement();\n\t}\n\tprotected parseFunctionExpression(type: FunctionKind): ExpressionNode {\n\t\tlet funcName: ExpressionNode | undefined;\n\t\tconst peek = this.peek();\n\t\tif (peek.isNotType(Token.L_PARENTHESES)) {\n\t\t\tif (peek.isType(Token.L_BRACKETS)) {\n\t\t\t\t// [Symbol.iterator]() {}\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tfuncName = this.parseMemberExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t} else {\n\t\t\t\tfuncName = this.parseIdentifier();\n\t\t\t}\n\t\t}\n\t\treturn this.parseFunctionLiteral(type, funcName);\n\t}\n\tprotected parseIfStatement(): ExpressionNode {\n\t\tthis.consume(Token.IF);\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.consume(Token.R_PARENTHESES);\n\t\tconst thenStatement = this.parseStatement();\n\t\tif (thenStatement instanceof BlockStatement) {\n\t\t\tthenStatement.isStatement = true;\n\t\t}\n\t\tlet elseStatement;\n\t\tif (this.peek().isType(Token.ELSE)) {\n\t\t\tthis.consume(Token.ELSE);\n\t\t\telseStatement = this.parseStatement();\n\t\t}\n\t\treturn new IfStatement(condition, thenStatement, elseStatement);\n\t}\n\tprotected parseDoWhileStatement(): ExpressionNode {\n\t\t// DoStatement ::\n\t\t// 'do' Statement 'while' '(' Expression ')' ';'\n\t\tthis.consume(Token.DO);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\tthis.expect(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tthis.check(Token.SEMICOLON);\n\t\treturn new DoWhileNode(condition, body);\n\t}\n\tprotected parseWhileStatement(): ExpressionNode {\n\t\t// WhileStatement ::\n\t\t// 'while' '(' Expression ')' Statement\n\t\tthis.consume(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new WhileNode(condition, body);\n\t}\n\tprotected parseThrowStatement(): ExpressionNode {\n\t\t// ThrowStatement ::\n\t\t// 'throw' Expression ';'\n\t\tthis.consume(Token.THROW);\n\t\tif (this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tthrow new Error(this.scanner.createError(`New line After Throw`));\n\t\t}\n\t\tconst exception = this.parseExpression();\n\t\tthis.expectSemicolon();\n\t\treturn new ThrowStatement(exception);\n\t}\n\tprotected parseSwitchStatement(): ExpressionNode {\n\t\t// SwitchStatement ::\n\t\t// 'switch' '(' Expression ')' '{' CaseClause* '}'\n\t\t// CaseClause ::\n\t\t// 'case' Expression ':' StatementList\n\t\t// 'default' ':' StatementList\n\n\t\tthis.consume(Token.SWITCH);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst tag = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\n\t\tconst cases: SwitchCase[] = [];\n\t\tconst switchStatement = new SwitchStatement(tag, cases);\n\n\t\tlet defaultSeen = false;\n\t\tthis.expect(Token.L_CURLY);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst statements: ExpressionNode[] = [];\n\t\t\tlet label: ExpressionNode;\n\t\t\tif (this.check(Token.CASE)) {\n\t\t\t\tlabel = this.parseExpression();\n\t\t\t} else {\n\t\t\t\tthis.expect(Token.DEFAULT);\n\t\t\t\tif (defaultSeen) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Multiple Defaults In Switch`));\n\t\t\t\t}\n\t\t\t\tdefaultSeen = true;\n\t\t\t}\n\t\t\tthis.expect(Token.COLON);\n\t\t\twhile (this.peek().isNotType(Token.CASE)\n\t\t\t\t&& this.peek().isNotType(Token.DEFAULT)\n\t\t\t\t&& this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tconst statement = this.parseStatementListItem();\n\t\t\t\tif (!statement || this.isEmptyStatement(statement)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstatements.push(statement);\n\t\t\t}\n\t\t\tconst block = new BlockStatement(statements, true);\n\t\t\tconst clause = defaultSeen ? new DefaultExpression(block) : new SwitchCase(label!, block);\n\t\t\tcases.push(clause);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn switchStatement;\n\t}\n\tprotected parseForStatement(): ExpressionNode {\n\t\t// Either a standard for loop\n\t\t// for (<init>; <cond>; <next>) { ... }\n\t\t// or a for-each loop\n\t\t// for (<each> of|in <iterable>) { ... }\n\t\t//\n\n\t\tthis.consume(Token.FOR);\n\t\tconst isAwait = this.check(Token.AWAIT);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst peek = this.peek();\n\t\tconst startsWithLet = peek.isType(Token.LET) || peek.isType(Token.VAR);\n\t\tlet initializer: ExpressionNode;\n\t\tif (peek.isType(Token.CONST) || (startsWithLet && this.isNextLetKeyword())) {\n\t\t\tinitializer = this.parseVariableDeclarations();\n\t\t} else if (peek.isType(Token.SEMICOLON)) {\n\t\t\tinitializer = EmptyStatement.INSTANCE;\n\t\t} else {\n\t\t\tinitializer = this.parseExpressionCoverGrammar();\n\t\t}\n\t\tif (initializer instanceof BinaryExpression) {\n\t\t\t// x in y \n\t\t\tconst objectNode = initializer.getRight();\n\t\t\tinitializer = initializer.getLeft();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\treturn new ForInNode(initializer as ForDeclaration, objectNode, statement);\n\t\t}\n\t\tconst forMode = this.checkInOrOf();\n\t\tif (forMode) {\n\t\t\tconst object = forMode === 'IN' ? this.parseAssignmentExpression() : this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\tif (statement instanceof BlockStatement) {\n\t\t\t\tstatement.isStatement = true;\n\t\t\t}\n\t\t\tif (isAwait && forMode === 'OF') {\n\t\t\t\treturn new ForAwaitOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'OF') {\n\t\t\t\treturn new ForOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'IN') {\n\t\t\t\treturn new ForInNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else {\n\t\t\t\tthrow new Error(this.errorMessage(`parsing for loop: ${this.position()}`));\n\t\t\t}\n\t\t}\n\t\tthis.expect(Token.SEMICOLON);\n\t\tlet condition: ExpressionNode | undefined;\n\t\tif (!this.check(Token.SEMICOLON)) {\n\t\t\tcondition = this.parseExpression();\n\t\t\tthis.expect(Token.SEMICOLON);\n\t\t}\n\t\tlet finalExpression: ExpressionNode | undefined;\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tfinalExpression = this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t}\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new ForNode(body, initializer, condition, finalExpression);\n\t}\n\tprotected parseVariableDeclarations(): ExpressionNode {\n\t\t// VariableDeclarations ::\n\t\t// ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']\n\t\t// var converted into ==> 'let' by parser\n\n\t\tlet mode: 'const' | 'let' | 'var';\n\t\tconst token = this.peek().token;\n\t\tswitch (token) {\n\t\t\tcase Token.CONST:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'const';\n\t\t\t\tbreak;\n\t\t\tcase Token.VAR:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'var';\n\t\t\tcase Token.LET:\n\t\t\tdefault:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'let';\n\t\t\t\tbreak;\n\t\t}\n\t\tconst variables: VariableNode[] = [];\n\t\tdo {\n\n\t\t\tlet name: ExpressionNode;\n\t\t\tlet value: ExpressionNode | undefined;\n\t\t\t// Check for an identifier first, so that we can elide the pattern in cases\n\t\t\t// where there is no initializer (and so no proxy needs to be created).\n\t\t\tif (Token.isAnyIdentifier(this.peek().token)) {\n\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t\t}\n\t\t\t\t// if (this.peekInOrOf()) {\n\t\t\t\t// \t// // Assignments need the variable expression for the assignment LHS, and\n\t\t\t\t// \t// // for of/in will need it later, so create the expression now.\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tname = this.parseBindingPattern(true);\n\t\t\t}\n\n\t\t\tif (this.check(Token.ASSIGN)) {\n\t\t\t\tvalue = this.parseAssignmentExpression();\n\t\t\t} else if (!this.peekInOrOf()) {\n\t\t\t\t// ES6 'const' and binding patterns require initializers.\n\t\t\t\tif (mode === 'const' && (name === undefined || value === undefined)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Declaration Missing Initializer : ${this.position()}`));\n\t\t\t\t}\n\t\t\t\t// value = undefined;\n\t\t\t}\n\t\t\tvariables.push(new VariableNode(name as CanDeclareExpression, value));\n\t\t} while (this.check(Token.COMMA));\n\t\treturn new VariableDeclarationNode(variables, mode);\n\t}\n\tprotected parseBindingPattern(isPattern: boolean): ExpressionNode {\n\t\t// Pattern ::\n\t\t// Identifier\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\n\t\tconst token = this.peek().token;\n\t\tif (Token.isAnyIdentifier(token)) {\n\t\t\tconst name = this.parseAndClassifyIdentifier(this.next());\n\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t}\n\t\t\treturn name;\n\t\t}\n\t\tif (token == Token.L_BRACKETS) {\n\t\t\treturn this.parseArrayLiteral(isPattern);\n\t\t} else if (token == Token.L_CURLY) {\n\t\t\treturn this.parseObjectLiteral(isPattern);\n\t\t} else {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${this.next().getValue()}`));\n\t\t}\n\t}\n\tprotected parseAndClassifyIdentifier(next: TokenExpression): ExpressionNode {\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\telse if (next.isType(Token.SET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'set');\n\t\t}\n\t\telse if (next.isType(Token.GET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'get');\n\t\t}\n\t\telse if (next.isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`un supported expression (await)`));\n\n\t\t}\n\t\treturn next.getValue();\n\t}\n\tprotected parseContinueStatement(): ExpressionNode {\n\t\t// ContinueStatement ::\n\t\t// 'continue' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.CONTINUE);\n\t\tthis.expectSemicolon();\n\t\treturn ContinueStatement.CONTINUE_INSTANCE;\n\t}\n\tprotected parseBreakStatement(): ExpressionNode {\n\t\t// BreakStatement ::\n\t\t// 'break' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.BREAK);\n\t\tthis.expectSemicolon();\n\t\treturn BreakStatement.BREAK_INSTANCE;\n\t}\n\tprotected parseReturnStatement(): ExpressionNode {\n\t\t// ReturnStatement ::\n\t\t// 'return' [no line terminator] Expression? ';'\n\n\t\t// Consume the return token. It is necessary to do that before\n\t\t// reporting any errors on it, because of the way errors are\n\t\t// reported (underlining).\n\t\tthis.consume(Token.RETURN);\n\t\tconst tokenExp = this.peek();\n\t\tlet returnValue: ExpressionNode | undefined;\n\t\t// ExpressionT return_value = impl() -> NullExpression();\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tokenExp.token)) {\n\t\t\t// check if this scope is belong to 'constructor' method to return this at the end;\n\t\t\t// if (this.isDerivedConstructor(function_state_ -> kind())) {\n\t\t\t// \treturnValue = ThisNode;\n\t\t\t// }\n\t\t} else {\n\t\t\treturnValue = this.parseExpression();\n\t\t}\n\t\tthis.expectSemicolon()\n\t\treturn new ReturnStatement(returnValue);\n\t}\n\tprotected parseExpressionOrLabelledStatement(): ExpressionNode {\n\t\t// ExpressionStatement | LabelledStatement ::\n\t\t// Expression ';'\n\t\t// Identifier ':' Statement\n\t\t//\n\t\t// ExpressionStatement[Yield] :\n\t\t// [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;\n\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\tcase Token.L_CURLY:\n\t\t\t\tthrow new Error(this.errorMessage(`Unreachable state`));\n\t\t\tcase Token.CLASS:\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token ${this.next().getValue().toString()}`));\n\t\t\tcase Token.LET: {\n\t\t\t\tconst nextNext = this.peekAhead();\n\t\t\t\t// \"let\" followed by either \"[\", \"{\" or an identifier means a lexical\n\t\t\t\t// declaration, which should not appear here.\n\t\t\t\t// However, ASI may insert a line break before an identifier or a brace.\n\t\t\t\tif (nextNext.isNotType(Token.L_BRACKETS) &&\n\t\t\t\t\t((nextNext.isNotType(Token.L_CURLY) && nextNext.isNotType(Token.IDENTIFIER)))) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Lexical Declaration ${this.position()}`));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tconst startsWithIdentifier = Token.isAnyIdentifier(this.peek().token);\n\t\tconst expression: ExpressionNode = this.parseExpressionCoverGrammar();\n\t\tif (this.peek().isType(Token.COLON) && startsWithIdentifier && this.isIdentifier(expression)) {\n\t\t\t// The whole expression was a single identifier, and not, e.g.,\n\t\t\t// something starting with an identifier or a parenthesized identifier.\n\n\t\t\t// Remove the \"ghost\" variable that turned out to be a label from the top\n\t\t\t// scope. This way, we don't try to resolve it during the scope\n\t\t\t// processing.\n\n\t\t\tthis.consume(Token.COLON);\n\t\t\t// ES#sec-labelled-function-declarations Labelled Function Declarations\n\t\t\tif (this.peek().isType(Token.FUNCTION) /*&& allow_function == kAllowLabelledFunctionStatement */) {\n\t\t\t\treturn this.parseFunctionDeclaration();\n\t\t\t}\n\t\t\treturn this.parseStatement();\n\t\t}\n\t\t// Parsed expression statement, followed by semicolon.\n\t\tthis.expectSemicolon();\n\t\treturn expression;\n\t}\n\tprotected parseExpression(): ExpressionNode {\n\t\treturn this.parseExpressionCoverGrammar();\n\t}\n\tprotected parseFunctionDeclaration(): ExpressionNode {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Generator In Single Statement Context`));\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseFunctionDeclarationAndGenerator() {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\treturn this.parseHoistableDeclaration(FunctionKind.GENERATOR);\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseHoistableDeclaration(flag: FunctionKind): ExpressionNode {\n\t\t// FunctionDeclaration ::\n\t\t// 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// GeneratorDeclaration ::\n\t\t// 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t//\n\t\t// The anonymous forms are allowed iff [default_export] is true.\n\t\t//\n\t\t// 'function' and '*' (if present) have been consumed by the caller.\n\n\t\t// (FunctionType.ASYNC === flag || FunctionType.GENERATOR === flag);\n\n\t\tif (FunctionKind.ASYNC === flag && this.check(Token.MUL)) {\n\t\t\t// Async generator\n\t\t\tflag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\t\tlet name: ExpressionNode | undefined;\n\t\tif (this.peek().isNotType(Token.L_PARENTHESES)) {\n\t\t\tname = this.parseIdentifier();\n\t\t}\n\t\treturn this.parseFunctionLiteral(flag, name);\n\t}\n\tprotected parseIdentifier(): ExpressionNode | undefined {\n\t\tconst next = this.next();\n\t\tif (!Token.isValidIdentifier(next.token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${next.getValue()}`));\n\t\t}\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\treturn this.getIdentifier();\n\t}\n\tprotected getIdentifier(): ExpressionNode {\n\t\tconst current = this.current();\n\t\tconst string = current.getValue().toString();\n\t\tswitch (current.token) {\n\t\t\tcase Token.AWAIT:\n\t\t\t\treturn AwaitIdentifier;\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn AsyncIdentifier;\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\treturn new Identifier(`#${string}`);\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (string == 'constructor') {\n\t\t\treturn ConstructorIdentifier;\n\t\t}\n\t\tif (string == 'name') {\n\t\t\treturn NameIdentifier;\n\t\t}\n\t\tif (string == 'eval') {\n\t\t\treturn EvalIdentifier;\n\t\t}\n\t\telse if (string == 'arguments') {\n\t\t\treturn ArgumentsIdentifier;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`can't identify token ${string}`));\n\t}\n\tprotected parseFunctionLiteral(flag: FunctionKind, name?: ExpressionNode): ExpressionNode {\n\t\t// Function ::\n\t\t// '(' FormalParameterList? ')' '{' FunctionBody '}'\n\n\t\tconst functionInfo: FunctionInfo = {};\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst formals: ExpressionNode[] = this.parseFormalParameterList(functionInfo);\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseFunctionBody();\n\t\tif (name) {\n\t\t\treturn new FunctionDeclaration(formals, body, flag, name as CanDeclareExpression, functionInfo.rest);\n\t\t}\n\t\treturn new FunctionExpression(formals, body, flag, name, functionInfo.rest);\n\t}\n\tprotected parseArrowFunctionBody(): ExpressionNode | ExpressionNode[] {\n\t\tconst isExpression = this.peek().isNotType(Token.L_CURLY);\n\t\tif (isExpression) {\n\t\t\tconst expression = this.parseAssignmentExpression();\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn this.parseFunctionBody();\n\t\t}\n\t}\n\tprotected parseFunctionBody(): ExpressionNode[] {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst list = this.parseStatementList(Token.R_CURLY);\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn list;\n\t}\n\tprotected parseStatementList(endToken: Token): ExpressionNode[] {\n\t\t// StatementList ::\n\t\t// (StatementListItem)* <end_token>\n\t\tconst list: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(endToken)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.isEmptyStatement(stat)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(stat);\n\t\t}\n\t\treturn list;\n\t}\n\tprotected parseFormalParameterList(functionInfo: FunctionInfo): ExpressionNode[] {\n\t\t// FormalParameters[Yield] :\n\t\t// [empty]\n\t\t// FunctionRestParameter[?Yield]\n\t\t// FormalParameterList[?Yield]\n\t\t// FormalParameterList[?Yield] ,\n\t\t// FormalParameterList[?Yield] , FunctionRestParameter[?Yield]\n\t\t//\n\t\t// FormalParameterList[Yield] :\n\t\t// FormalParameter[?Yield]\n\t\t// FormalParameterList[?Yield] , FormalParameter[?Yield]\n\n\t\tconst parameters: ExpressionNode[] = [];\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\twhile (true) {\n\t\t\t\tconst param: ExpressionNode = this.parseFormalParameter(functionInfo);\n\t\t\t\tparameters.push(param);\n\t\t\t\tif (functionInfo.rest) {\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Param After Rest`));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t\t\tif (this.peek().isType(Token.R_PARENTHESES)) {\n\t\t\t\t\t// allow the trailing comma\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parameters;\n\t}\n\tprotected parseFormalParameter(functionInfo: FunctionInfo): ExpressionNode {\n\t\t// FormalParameter[Yield,GeneratorParameter] :\n\t\t// BindingElement[?Yield, ?GeneratorParameter]\n\t\tfunctionInfo.rest = this.check(Token.ELLIPSIS);\n\t\tlet pattern = this.parseBindingPattern(true);\n\t\tlet initializer: Param;\n\t\tif (this.check(Token.ASSIGN)) {\n\t\t\tif (functionInfo.rest) {\n\t\t\t\tthrow new Error(this.errorMessage(`Rest Default Initializer`));\n\t\t\t}\n\t\t\tconst value = this.parseAssignmentExpression();\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression, value);\n\t\t} else {\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression);\n\t\t}\n\t\treturn initializer;\n\t}\n\tprotected parseExpressionCoverGrammar(info?: FunctionInfo): ExpressionNode {\n\t\t// Expression ::\n\t\t// AssignmentExpression\n\t\t// Expression ',' AssignmentExpression\n\n\t\t// ExpressionListT list(pointer_buffer());\n\t\t// ExpressionT expression;\n\t\t// AccumulationScope accumulation_scope(expression_scope());\n\t\tlet variableIndex = 0;\n\t\tconst list: ExpressionNode[] = [];\n\t\tlet expression: ExpressionNode;\n\t\twhile (true) {\n\t\t\tif (this.peek().isType(Token.ELLIPSIS)) {\n\t\t\t\tif (info) {\n\t\t\t\t\tinfo.rest = true;\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowParametersWithRest(list, variableIndex);\n\t\t\t}\n\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tlist.push(expression);\n\n\t\t\tif (!this.check(Token.COMMA)) break;\n\n\t\t\tif (this.peek().isType(Token.R_PARENTHESES) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t// a trailing comma is allowed at the end of an arrow parameter list\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (list.length == 1) return expression;\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected parseArrowParametersWithRest(list: ExpressionNode[], variableIndex: number): ExpressionNode {\n\t\tthis.consume(Token.ELLIPSIS);\n\t\tconst pattern: ExpressionNode = this.parseBindingPattern(true);\n\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter cannot have an initializer`));\n\t\t}\n\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter or binding pattern may not have a trailing comma`));\n\t\t}\n\t\t// 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only\n\t\t// as the formal parameters of'(x, y, ...z) => foo', and is not itself a\n\t\t// valid expression.\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES) || this.peekAhead().isNotType(Token.ARROW)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Unexpected Token At ${this.position()}`));\n\t\t}\n\t\tlist.push(pattern);\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected expressionListToExpression(list: ExpressionNode[]): ExpressionNode {\n\t\tif (list.length === 1) { return list[0]; }\n\t\treturn new SequenceExpression(list);\n\t}\n\tprotected parseMemberExpression(): ExpressionNode {\n\t\t// MemberExpression ::\n\t\t// (PrimaryExpression | FunctionLiteral | ClassLiteral)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// CallExpression ::\n\t\t// (SuperCall | ImportCall)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// The '[' Expression ']' and '.' Identifier parts are parsed by\n\t\t// ParseMemberExpressionContinuation, and everything preceeding it is merged\n\t\t// into ParsePrimaryExpression.\n\n\t\t// Parse the initial primary or function expression.\n\t\tconst result = this.parsePrimaryExpression();\n\t\treturn this.parseMemberExpressionContinuation(result);\n\t}\n\tprotected toParamNode(expression: ExpressionNode): Param {\n\t\tif (expression instanceof AssignmentExpression) {\n\t\t\treturn new Param(expression.getLeft() as CanDeclareExpression, expression.getRight());\n\t\t}\n\t\tif (expression instanceof GroupingExpression) {\n\t\t\treturn new Param(expression.getNode() as CanDeclareExpression);\n\t\t}\n\t\treturn new Param(expression as CanDeclareExpression);\n\t}\n\tprotected parsePrimaryExpression(): ExpressionNode {\n\t\t// PrimaryExpression ::\n\t\t// 'this'\n\t\t// 'null'\n\t\t// 'true'\n\t\t// 'false'\n\t\t// Identifier\n\t\t// Number\n\t\t// String\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\t\t// RegExpLiteral\n\t\t// '(' Expression ')'\n\t\t// do Block\n\t\t// AsyncFunctionLiteral\n\n\t\tlet token = this.peek();\n\t\tif (Token.isAnyIdentifier(token.token)) {\n\t\t\tthis.consume(token.token);\n\t\t\tlet kind: ArrowFunctionType = ArrowFunctionType.NORMAL;\n\t\t\tif (token.isType(Token.ASYNC) && !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\t// async function ...\n\t\t\t\tif (this.peek().isType(Token.FUNCTION)) {\n\t\t\t\t\treturn this.parseFunctionDeclarationAndGenerator();\n\t\t\t\t};\n\t\t\t\t// async Identifier => ...\n\t\t\t\tif (Token.isAnyIdentifier(this.peek().token) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t\ttoken = this.next();\n\t\t\t\t\tkind = ArrowFunctionType.ASYNC;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\tconst name = this.parseAndClassifyIdentifier(token);\n\t\t\t\tconst params: Param[] = [];\n\t\t\t\tif (name instanceof SequenceExpression) {\n\t\t\t\t\tparams.push(...name.getExpressions().map(this.toParamNode));\n\t\t\t\t} else {\n\t\t\t\t\tparams.push(this.toParamNode(name));\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, kind);\n\t\t\t}\n\t\t\treturn this.parseAndClassifyIdentifier(token);\n\t\t}\n\n\t\tif (Token.isLiteral(token.token)) {\n\t\t\treturn expressionFromLiteral(this.next());\n\t\t}\n\n\t\tswitch (token.token) {\n\t\t\tcase Token.NEW:\n\t\t\t\treturn this.parseMemberWithPresentNewPrefixesExpression();\n\t\t\tcase Token.THIS:\n\t\t\t\tthis.consume(Token.THIS);\n\t\t\t\treturn ThisNode;\n\t\t\tcase Token.DIV:\n\t\t\tcase Token.DIV_ASSIGN:\n\t\t\t\t// case Token.REGEXP_LITERAL:\n\t\t\t\t// this.consume(Token.REGEXP_LITERAL);\n\t\t\t\t// return token.value!;\n\t\t\t\treturn this.parseRegExpLiteral();\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.SUPER: {\n\t\t\t\treturn this.parseSuperExpression();\n\t\t\t}\n\t\t\tcase Token.IMPORT:\n\t\t\t\treturn this.parseImportExpressions();\n\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\treturn this.parseArrayLiteral(false);\n\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseObjectLiteral(false);\n\n\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tif (this.check(Token.R_PARENTHESES)) {\n\t\t\t\t\t// ()=>x. The continuation that consumes the => is in\n\t\t\t\t\t// ParseAssignmentExpressionCoverGrammar.\n\n\t\t\t\t\tif (!this.peek().isType(Token.ARROW)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${Token.R_PARENTHESES.getName()}`));\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseArrowFunctionLiteral([], ArrowFunctionType.NORMAL);\n\t\t\t\t}\n\t\t\t\t// Heuristically try to detect immediately called functions before\n\t\t\t\t// seeing the call parentheses.\n\n\t\t\t\tconst peekToken = this.peek();\n\t\t\t\tlet expression: ExpressionNode;\n\t\t\t\tconst info: FunctionInfo = {};\n\t\t\t\tif (peekToken.isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.NORMAL);\n\t\t\t\t} else if (peekToken.isType(Token.ASYNC) && this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.ASYNC);\n\t\t\t\t} else {\n\t\t\t\t\texpression = this.parseExpressionCoverGrammar(info);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral(expression.getExpressions(), ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral([expression], ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tcase Token.CLASS: {\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\tlet name: ExpressionNode | undefined;\n\t\t\t\tlet isStrictReserved = false;\n\t\t\t\tif (this.peekAnyIdentifier()) {\n\t\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\t\tisStrictReserved = Token.isStrictReservedWord(this.current().token);\n\t\t\t\t}\n\t\t\t\treturn this.parseClassLiteral(name, isStrictReserved);\n\t\t\t}\n\t\t\tcase Token.TEMPLATE_LITERALS:\n\t\t\t\treturn this.parseTemplateLiteral();\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(this.next())}`));\n\t}\n\tprotected parseTemplateLiteral(tag?: ExpressionNode): ExpressionNode {\n\t\tconst template = this.next().getValue() as PreTemplateLiteral;\n\t\tconst exprs = template.expressions.map(expr => JavaScriptParser.parse(expr));\n\n\t\tif (tag) {\n\t\t\treturn new TaggedTemplateExpression(tag, template.strings, exprs);\n\t\t} else {\n\t\t\treturn new TemplateLiteral(template.strings, exprs);\n\t\t}\n\t}\n\tprotected parseMemberWithPresentNewPrefixesExpression(): ExpressionNode {\n\t\tthis.consume(Token.NEW);\n\t\tlet classRef: ExpressionNode;\n\t\tif (this.peek().isType(Token.IMPORT) && this.peekAhead().isType(Token.L_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new import (`));\n\t\t} else if (this.peek().isType(Token.SUPER)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new super() is never allowed`));\n\t\t} else if (this.peek().isType(Token.PERIOD)) {\n\t\t\tclassRef = this.parseNewTargetExpression();\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t} else {\n\t\t\tclassRef = this.parseMemberExpression();\n\t\t}\n\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n\t\t\t// NewExpression with arguments.\n\t\t\tconst args: ExpressionNode[] = this.parseArguments();\n\t\t\tclassRef = new NewExpression(classRef, args);\n\t\t\t// The expression can still continue with . or [ after the arguments.\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t}\n\t\tif (this.peek().isType(Token.QUESTION_PERIOD)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new xxx?.yyy at position`));\n\t\t}\n\t\treturn new NewExpression(classRef);\n\t}\n\tprotected parseArguments(maybeArrow?: ParsingArrowHeadFlag): ExpressionNode[] {\n\t\t// Arguments ::\n\t\t// '(' (AssignmentExpression)*[','] ')'\n\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst args: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\tlet argument: ExpressionNode = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tif (ParsingArrowHeadFlag.MaybeArrowHead === maybeArrow) {\n\t\t\t\tif (isSpread) {\n\t\t\t\t\tif (argument instanceof AssignmentExpression) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(` Rest parameter may not have a default initializer'`));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`parsing '...spread,arg =>'`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isSpread) {\n\t\t\t\targument = new SpreadElement(argument);\n\t\t\t}\n\t\t\targs.push(argument);\n\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t}\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing arguments call, expecting ')'`));\n\t\t}\n\t\treturn args;\n\t}\n\tprotected parseAssignmentExpressionCoverGrammar(): ExpressionNode {\n\t\t// AssignmentExpression ::\n\t\t// ConditionalExpression\n\t\t// ArrowFunction\n\t\t// YieldExpression\n\t\t// LeftHandSideExpression AssignmentOperator AssignmentExpression\n\n\t\tif (this.peek().isType(Token.YIELD) /*&& this.isGenerator()*/) {\n\t\t\treturn this.parseYieldExpression();\n\t\t}\n\t\tlet expression: ExpressionNode = this.parseConditionalExpression();\n\t\tconst op = this.peek().token;\n\t\tif (!Token.isArrowOrAssignmentOp(op)) return expression;\n\t\t// Arrow functions.\n\t\tif (op === Token.ARROW) {\n\t\t\tif (!this.isIdentifier(expression) && !this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Malformed Arrow Fun Param List`));\n\t\t\t}\n\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\tconst params = expression.getExpressions().map(expr => new Param(expr as CanDeclareExpression));\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\tif (expression instanceof GroupingExpression) {\n\t\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression.getNode() as CanDeclareExpression)], ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression)], ArrowFunctionType.NORMAL);\n\t\t}\n\t\tif (this.isAssignableIdentifier(expression)) {\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t\t}\n\t\t} else if (this.isProperty(expression)) {\n\t\t\t// throw new Error(this.errorMessage(`Invalid Property Binding Pattern`));\n\t\t} else if (this.isPattern(expression) && Token.isAssignment(op)) {\n\t\t\t// Destructuring assignment.\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\t// Scanner.Location loc(lhs_beg_pos, end_position());\n\t\t\t\t// if (expression_scope() -> IsCertainlyDeclaration()) {\n\t\t\t\t// \timpl() -> ReportMessageAt(loc,\n\t\t\t\t// \t\tMessageTemplate.kInvalidDestructuringTarget);\n\t\t\t\t// } else {\n\t\t\t\t// \t// Syntax Error if LHS is neither object literal nor an array literal\n\t\t\t\t// \t// (Parenthesized literals are\n\t\t\t\t// \t// CoverParenthesizedExpressionAndArrowParameterList).\n\t\t\t\t// \t// #sec-assignment-operators-static-semantics-early-errors\n\t\t\t\t// \timpl() -> ReportMessageAt(loc, MessageTemplate.kInvalidLhsInAssignment);\n\t\t\t\t// }\n\t\t\t}\n\t\t\t// expression_scope() -> ValidateAsPattern(expression, lhs_beg_pos, end_position());\n\t\t} else {\n\t\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Reference Expression`));\n\t\t\t}\n\t\t\tif (Token.isLogicalAssignmentOp(op)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Lhs In Assignment`));\n\t\t\t}\n\t\t}\n\n\t\tthis.consume(op);\n\t\t// const opPosition = this.position();\n\t\tconst right: ExpressionNode = this.parseAssignmentExpression();\n\t\t// Anonymous function name inference applies to =, ||=, &&=, and ??=.\n\n\t\tif (!Token.isAssignment(op)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t}\n\t\treturn new AssignmentExpression(op.getName() as AssignmentOperator, expression, right);\n\t}\n\tprotected parseAssignmentExpression(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseArrowFunctionLiteral(parameters: ExpressionNode[], flag: ArrowFunctionType, rest?: boolean): ExpressionNode {\n\t\tthis.consume(Token.ARROW);\n\t\tconst body = this.parseArrowFunctionBody();\n\t\treturn new ArrowFunctionExpression(parameters, body, flag, rest);\n\t}\n\tprotected parseRegExpLiteral(): ExpressionNode {\n\t\tif (!this.scanner.scanRegExpPattern()) {\n\t\t\tthrow new Error('Unterminated RegExp');\n\t\t}\n\t\treturn this.scanner.currentToken().getValue();\n\t}\n\tprotected parseArrayLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ArrayLiteral ::\n\t\t// '[' Expression? (',' Expression?)* ']'\n\n\t\tthis.consume(Token.L_BRACKETS);\n\t\tconst values: ExpressionNode[] = [];\n\t\tlet firstSpreadIndex = -1;\n\n\t\twhile (!this.check(Token.R_BRACKETS)) {\n\t\t\tlet elem: ExpressionNode;\n\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\tthis.consume(Token.COMMA);\n\t\t\t\tcontinue;\n\t\t\t} else if (this.check(Token.ELLIPSIS)) {\n\t\t\t\tconst argument = this.parsePossibleDestructuringSubPattern();\n\t\t\t\telem = isPattern\n\t\t\t\t\t? new RestElement(argument as CanDeclareExpression)\n\t\t\t\t\t: new SpreadElement(argument)\n\n\t\t\t\tif (firstSpreadIndex < 0) {\n\t\t\t\t\tfirstSpreadIndex = values.length;\n\t\t\t\t}\n\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Element After Rest @${this.position()}`));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telem = this.parsePossibleDestructuringSubPattern();\n\t\t\t}\n\t\t\tvalues.push(elem);\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ArrayPattern(values as CanDeclareExpression[]);\n\t\t}\n\t\treturn new ArrayExpression(values);\n\t}\n\tprotected parsePossibleDestructuringSubPattern(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseObjectLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ObjectLiteral ::\n\t\t// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'\n\n\t\tthis.consume(Token.L_CURLY);\n\t\tconst properties: ExpressionNode[] = [];\n\t\twhile (!this.check(Token.R_CURLY)) {\n\t\t\tconst property: ExpressionNode = this.parseObjectPropertyDefinition(isPattern);\n\t\t\tproperties.push(property);\n\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tthis.expect(Token.COMMA);\n\t\t\t}\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ObjectPattern(properties as (Property | RestElement)[]);\n\t\t}\n\t\treturn new ObjectExpression(properties as Property[]);\n\t}\n\tprotected parseObjectPropertyDefinition(isPattern: boolean): ExpressionNode {\n\t\tconst propInfo = { kind: PropertyKind.NotSet } as Required<PropertyKindInfo>;\n\t\tconst nameExpression = this.parseProperty(propInfo);\n\n\t\tswitch (propInfo.kind) {\n\t\t\tcase PropertyKind.Spread:\n\t\t\t\tlet value: SpreadElement | RestElement = nameExpression as SpreadElement;\n\t\t\t\tif (isPattern) {\n\t\t\t\t\tvalue = new RestElement(value.getArgument() as CanDeclareExpression);\n\t\t\t\t}\n\t\t\t\treturn new Property(value.getArgument(), value, 'init');\n\n\t\t\tcase PropertyKind.Value: {\n\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\tconst value = this.parsePossibleDestructuringSubPattern();\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Assign:\n\t\t\tcase PropertyKind.ShorthandOrClassField:\n\t\t\tcase PropertyKind.Shorthand: {\n\t\t\t\t// PropertyDefinition\n\t\t\t\t// IdentifierReference\n\t\t\t\t// CoverInitializedName\n\t\t\t\t//\n\t\t\t\t// CoverInitializedName\n\t\t\t\t// IdentifierReference Initializer?\n\n\t\t\t\tconst lhs = new Identifier(propInfo.name);\n\t\t\t\tif (!this.isAssignableIdentifier(lhs)) {\n\t\t\t\t\tthrow new Error(this.errorMessage('Strict Eval Arguments'));\n\t\t\t\t}\n\t\t\t\tlet value: ExpressionNode;\n\t\t\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\t\t\tthis.consume(Token.ASSIGN);\n\t\t\t\t\tconst rhs = this.parseAssignmentExpression();\n\t\t\t\t\tvalue = new AssignmentExpression(Token.ASSIGN.getName() as AssignmentOperator, lhs, rhs);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = lhs;\n\t\t\t\t}\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Method: {\n\t\t\t\t// MethodDefinition\n\t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.AccessorGetter:\n\t\t\tcase PropertyKind.AccessorSetter: {\n\t\t\t\tconst isGet = propInfo.kind == PropertyKind.AccessorGetter;\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, isGet ? 'get' : 'set');\n\t\t\t}\n\n\t\t\tcase PropertyKind.ClassField:\n\t\t\tcase PropertyKind.NotSet:\n\t\t\t\treturn NullNode;\n\t\t}\n\t}\n\tprotected parseProperty(propInfo: PropertyKindInfo): ExpressionNode {\n\t\tlet nextToken = this.peek();\n\t\tif (this.check(Token.ASYNC)) {\n\t\t\t// async\n\t\t\tnextToken = this.peek();\n\t\t\tif (nextToken.isNotType(Token.MUL)\n\t\t\t\t&& parsePropertyKindFromToken(nextToken.token, propInfo)\n\t\t\t\t|| this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\treturn AsyncIdentifier;\n\t\t\t}\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC;\n\t\t}\n\n\t\tif (this.check(Token.MUL)) {\n\t\t\t// async*\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\n\t\tnextToken = this.peek();\n\t\tif (propInfo.kind == PropertyKind.NotSet && nextToken.isType(Token.GET) || nextToken.isType(Token.SET)) {\n\t\t\tconst token = this.next();\n\t\t\tif (parsePropertyKindFromToken(this.peek().token, propInfo)) {\n\t\t\t\treturn nextToken.isType(Token.GET) ? GetIdentifier : SetIdentifier;\n\t\t\t}\n\t\t\tif (token.isType(Token.GET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorGetter;\n\t\t\t} else if (token.isType(Token.SET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorSetter;\n\t\t\t}\n\t\t}\n\t\tlet propertyName: ExpressionNode;\n\t\tswitch (nextToken.token) {\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\tthis.consume(Token.PRIVATE_NAME);\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropertyName = this.getIdentifier();\n\t\t\t\tbreak;\n\t\t\tcase Token.STRING:\n\t\t\tcase Token.NUMBER:\n\t\t\tcase Token.BIGINT:\n\t\t\t\t// \"12\" -> 12\n\t\t\t\t// 12.3 -> \"12.3\"\n\t\t\t\t// 12.30 -> \"12.3\"\n\t\t\t\tthis.consume(nextToken.token);\n\t\t\t\tpropertyName = nextToken.getValue();\n\t\t\t\tpropInfo.name = (propertyName as StringLiteral).getValue();\n\t\t\t\tbreak;\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\t// [Symbol.iterator]\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tpropertyName = this.parseAssignmentExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\treturn propertyName;\n\t\t\tcase Token.ELLIPSIS:\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tthis.consume(Token.ELLIPSIS);\n\t\t\t\t\tpropertyName = this.parsePossibleDestructuringSubPattern();\n\t\t\t\t\tpropInfo.kind = PropertyKind.Spread;\n\n\t\t\t\t\tif (!this.isValidReferenceExpression(propertyName)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Invalid Rest Binding/Assignment Pattern'));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Element After Rest'));\n\t\t\t\t\t}\n\t\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\t\treturn propertyName;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpropertyName = new StringLiteral(this.parsePropertyName().toString());\n\t\t\t\t// propertyName = this.parsePropertyName();\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\tbreak;\n\t\t}\n\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t}\n\t\treturn propertyName;\n\t}\n\tprotected parseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) return expression;\n\t\treturn this.doParseMemberExpressionContinuation(expression);\n\t}\n\tprotected doParseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing member expression`));\n\t\t}\n\t\t// Parses this part of MemberExpression:\n\t\t// ('[' Expression ']' | '.' Identifier | TemplateLiteral)*\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\texpression = new MemberExpression(expression, index, true);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key: ExpressionNode = this.parsePropertyName();\n\t\t\t\t\texpression = new MemberExpression(expression, key, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.TEMPLATE_LITERALS: {\n\t\t\t\t\texpression = this.parseTemplateLiteral(expression);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (Token.isMember(this.peek().token));\n\t\treturn expression;\n\t}\n\tprotected parsePropertyName(): ExpressionNode {\n\t\tconst next = this.next();\n\t\tif (next.getValue() instanceof Identifier) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\t// check keyword as identifier\n\t\tif (Token.isPropertyName(next.token)) {\n\t\t\treturn new Identifier(next.token.getName());\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Parsing property expression: Unexpected Token`));\n\t}\n\tprotected parsePipelineExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// expression '|>' function [':' expression [':'? expression] ] *\n\t\t// expression '|>' function '('[expression ','?]* ')'\n\t\t//\n\t\t// expression '|>' function ':' expression [':' expression | '?']*]\n\t\t// expression '|>' function '(' expression [',' expression | '?']* ')'\n\t\t//\n\t\t// [~Await]PipelineExpression[?In, ?Yield, ?Await] |> LogicalORExpression[?In, ?Yield, ?Await]\n\t\t// [+Await]PipelineExpression[? In, ? Yield, ? Await] |> [lookahead ∉ { await }]LogicalORExpression[? In, ? Yield, ? Await]\n\n\t\tlet token: Token;\n\t\twhile (Token.isPipelineOperator(token = this.peek().token)) {\n\t\t\tthis.consume(token);\n\t\t\texpression = this.parsePipelineBody(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parsePipelineBody(lhs: ExpressionNode): ExpressionNode {\n\t\tlet body: ExpressionNode | undefined;\n\t\tlet token = this.peek();\n\t\t// parse function\n\t\tswitch (token.token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\t\tbreak;\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (body) {\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\t\tif (token.isType(Token.L_PARENTHESES)) {\n\t\t\t// parse arrow function\n\t\t\t// x |> ( y => y+1 )\n\t\t\tbody = this.parsePrimaryExpression();\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\n\t\t// parse angular-like and f# and partial operator syntax\n\t\tconst func = this.parseMemberExpression(); //this.parseLogicalExpression();\n\t\tlet args: (ExpressionNode | '?' | '...?')[] = [];\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.COLON:\n\t\t\t\t// support angular pipeline syntax\n\t\t\t\tdo {\n\t\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (this.peek().isType(Token.COLON));\n\t\t\t\tbreak;\n\t\t\tcase Token.L_PARENTHESES:\n\t\t\t\t// es2022 syntax, F# & partial operator\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tlet indexed = false;\n\t\t\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tindexed = true;\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.check(Token.COMMA);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\t// should be indexed, has partial operator\n\t\t\t\tif (!indexed) {\n\t\t\t\t\t// z |> method(x, y) === method(x, y)(z)\n\t\t\t\t\tbody = new CallExpression(func, args as ExpressionNode[]);\n\t\t\t\t\treturn new PipelineExpression(lhs, body);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new PipelineExpression(lhs, func, args);\n\t}\n\tprotected parseConditionalExpression(): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// LogicalExpression '?' AssignmentExpression ':' AssignmentExpression\n\t\t//\n\n\t\tlet expression: ExpressionNode = this.parseLogicalExpression();\n\t\texpression = this.parsePipelineExpression(expression);\n\t\treturn this.peek().isType(Token.CONDITIONAL) ? this.parseConditionalContinuation(expression) : expression;\n\t}\n\tprotected parseLogicalExpression(): ExpressionNode {\n\t\t// LogicalExpression ::\n\t\t// LogicalORExpression\n\t\t// CoalesceExpression\n\n\t\t// Both LogicalORExpression and CoalesceExpression start with BitwiseOR.\n\t\t// Parse for binary expressions >= 6 (BitwiseOR);\n\n\t\tlet expression: ExpressionNode = this.parseBinaryExpression(6);\n\t\tconst peek = this.peek();\n\t\tif (peek.isType(Token.AND) || peek.isType(Token.OR)) {\n\t\t\t// LogicalORExpression, pickup parsing where we left off.\n\t\t\tconst precedence = peek.token.getPrecedence();\n\t\t\texpression = this.parseBinaryContinuation(expression, 4, precedence);\n\t\t} else if (peek.isType(Token.NULLISH)) {\n\t\t\texpression = this.parseNullishExpression(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parseBinaryContinuation(x: ExpressionNode, prec: number, prec1: number): ExpressionNode {\n\t\tdo {\n\t\t\t// prec1 >= 4\n\t\t\twhile (this.peek().token.getPrecedence() === prec1) {\n\t\t\t\tlet y: ExpressionNode;\n\t\t\t\tlet op = this.next();\n\n\t\t\t\tconst is_right_associative = op.isType(Token.EXP);\n\t\t\t\tconst next_prec = is_right_associative ? prec1 : prec1 + 1;\n\t\t\t\ty = this.parseBinaryExpression(next_prec);\n\n\n\t\t\t\t// For now we distinguish between comparisons and other binary\n\t\t\t\t// operations. (We could combine the two and get rid of this\n\t\t\t\t// code and AST node eventually.)\n\n\t\t\t\tif (Token.isCompare(op.token)) {\n\t\t\t\t\t// We have a comparison.\n\t\t\t\t\tlet cmp = op.token;\n\t\t\t\t\tswitch (op.token) {\n\t\t\t\t\t\tcase Token.NE: cmp = Token.EQ; break;\n\t\t\t\t\t\tcase Token.NE_STRICT: cmp = Token.EQ_STRICT; break;\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, cmp);\n\t\t\t\t\tif (op.isNotType(cmp)) {\n\t\t\t\t\t\t// The comparison was negated - add a NOT.\n\t\t\t\t\t\tx = buildUnaryExpression(x, Token.NOT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, op.token);\n\t\t\t\t}\n\t\t\t}\n\t\t\t--prec1;\n\t\t} while (prec1 >= prec);\n\n\t\treturn x;\n\t}\n\tprotected parseBinaryExpression(precedence: number): ExpressionNode {\n\t\tconst x: ExpressionNode = this.parseUnaryExpression();\n\t\tconst precedence1 = this.peek().token.getPrecedence();\n\t\tif (precedence1 >= precedence) {\n\t\t\treturn this.parseBinaryContinuation(x, precedence, precedence1);\n\t\t}\n\t\treturn x;\n\t}\n\tprotected parseUnaryExpression(): ExpressionNode {\n\t\t// UnaryExpression ::\n\t\t// PostfixExpression\n\t\t// 'delete' UnaryExpression\n\t\t// 'void' UnaryExpression\n\t\t// 'typeof' UnaryExpression\n\t\t// '++' UnaryExpression\n\t\t// '--' UnaryExpression\n\t\t// '+' UnaryExpression\n\t\t// '-' UnaryExpression\n\t\t// '~' UnaryExpression\n\t\t// '!' UnaryExpression\n\t\t// [+Await] AwaitExpression[?Yield]\n\n\t\tconst op = this.peek();\n\t\tif (Token.isUnaryOrCount(op.token)) {\n\t\t\treturn this.parseUnaryOrPrefixExpression();\n\t\t}\n\t\tif (op.isType(Token.AWAIT)) {\n\t\t\treturn this.parseAwaitExpression();\n\t\t}\n\t\treturn this.parsePostfixExpression();\n\t}\n\tprotected parseUnaryOrPrefixExpression(): ExpressionNode {\n\t\tconst op = this.next();\n\t\tconst expression = this.parseUnaryExpression();\n\t\tif (Token.isUnary(op.token)) {\n\t\t\tif (op.isType(Token.DELETE)) {\n\t\t\t\tif (this.isIdentifier(expression)) {\n\t\t\t\t\t// \"delete identifier\" is a syntax error in strict mode.\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"delete identifier\" is a syntax error in strict mode`));\n\t\t\t\t}\n\t\t\t\tif (expression instanceof MemberExpression && expression.getProperty().toString().startsWith('#')) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"Delete Private Field\" is a syntax error`));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token Unary Exponentiation`));\n\t\t\t}\n\t\t}\n\n\t\tif (Token.isCount(op.token) || Token.isUnary(op.token)) {\n\t\t\t// Allow the parser to rewrite the expression.\n\t\t\treturn buildUnaryExpression(expression, op.token);\n\t\t}\n\t\tthrow new Error(this.errorMessage(`while rewrite unary operation`));\n\t}\n\tprotected parsePostfixExpression(): ExpressionNode {\n\t\t// PostfixExpression ::\n\t\t// LeftHandSideExpression ('++' | '--')?\n\n\t\tconst expression: ExpressionNode = this.parseLeftHandSideExpression();\n\t\tif (!Token.isCount(this.peek().token) || this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parsePostfixContinuation(expression);\n\t}\n\tprotected parsePostfixContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid LHS In Postfix Op.`));\n\t\t}\n\t\tconst op = this.next();\n\t\treturn buildPostfixExpression(expression, op.token);\n\t}\n\tprotected parseLeftHandSideExpression(): ExpressionNode {\n\t\t// LeftHandSideExpression ::\n\t\t// (NewExpression | MemberExpression) ...\n\t\tconst result = this.parseMemberExpression();\n\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\treturn this.parseLeftHandSideContinuation(result);\n\t}\n\tprotected parseLeftHandSideContinuation(result: ExpressionNode): ExpressionNode {\n\t\tif (this.peek().isType(Token.L_PARENTHESES)\n\t\t\t&& this.isIdentifier(result)\n\t\t\t&& this.scanner.currentToken().isType(Token.ASYNC)\n\t\t\t&& !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tconst args = this.parseArguments(ParsingArrowHeadFlag.AsyncArrowFunction);\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t// async () => ...\n\t\t\t\tif (!args.length) return new EmptyStatement;\n\t\t\t\t// async ( Arguments ) => ...\n\t\t\t\treturn this.expressionListToExpression(args);\n\t\t\t}\n\t\t\tresult = new CallExpression(result, args);\n\t\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\t}\n\n\t\tlet optionalChaining = false;\n\t\tlet isOptional = false;\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\t// chain\n\t\t\t\tcase Token.QUESTION_PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_PERIOD);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tif (Token.isPropertyOrCall(this.peek().token)) continue;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\tresult = new MemberExpression(result, index, true, isOptional);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Call */\n\t\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\t\tconst args = this.parseArguments();\n\t\t\t\t\tif (result.toString() === 'eval') {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`'eval(...)' is not supported.`));\n\t\t\t\t\t}\n\t\t\t\t\tresult = new CallExpression(result, args, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* bind call */\n\t\t\t\tcase Token.BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.BIND);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* chain bind call */\n\t\t\t\tcase Token.QUESTION_BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_BIND);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, true, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Template literals in/after an Optional Chain not supported:\n\t\t\t\t\tif (optionalChaining) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Optional Chaining No Template support`));\n\t\t\t\t\t}\n\t\t\t\t\t/* Tagged Template */\n\t\t\t\t\tresult = this.parseTemplateLiteral(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (isOptional) {\n\t\t\t\tisOptional = false;\n\t\t\t}\n\t\t} while (Token.isPropertyOrCall(this.peek().token));\n\t\tif (optionalChaining) {\n\t\t\tresult = new ChainExpression(result);\n\t\t}\n\t\treturn result;\n\t}\n\tprotected parseAwaitExpression(): ExpressionNode {\n\t\tthis.consume(Token.AWAIT);\n\t\tconst value = this.parseUnaryExpression();\n\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\tthrow new Error(this.scanner.createError(`Unexpected Token Unary Exponentiation`));\n\t\t}\n\t\treturn buildUnaryExpression(value, Token.AWAIT);\n\t}\n\tprotected parseNullishExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// CoalesceExpression ::\n\t\t// CoalesceExpressionHead ?? BitwiseORExpression\n\t\t//\n\t\t// CoalesceExpressionHead ::\n\t\t// CoalesceExpression\n\t\t// BitwiseORExpression\n\n\t\t// We create a binary operation for the first nullish, otherwise collapse\n\t\t// into an nary expression.\n\n\t\tconst list: ExpressionNode[] = [];\n\t\tlist.push(expression);\n\t\twhile (this.peek().isType(Token.NULLISH)) {\n\t\t\tthis.consume(Token.NULLISH);\n\t\t\t// Parse BitwiseOR or higher.\n\t\t\texpression = this.parseBinaryExpression(6);\n\t\t\tlist.push(expression);\n\t\t}\n\t\texpression = list.pop()!;\n\t\texpression = list.reverse()\n\t\t\t.reduce((previous, current) => new LogicalExpression(Token.NULLISH.getName() as LogicalOperator, current, previous), expression);\n\t\treturn expression;\n\t}\n\tprotected parseConditionalContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tthis.consume(Token.CONDITIONAL);\n\t\tconst left: ExpressionNode = this.parseAssignmentExpression();\n\t\tthis.expect(Token.COLON);\n\t\tconst right = this.parseAssignmentExpression();\n\t\treturn new ConditionalExpression(expression, left, right);\n\t}\n\tprotected parseYieldExpression(): ExpressionNode {\n\t\t// YieldExpression ::\n\t\t// 'yield' ([no line terminator] '*'? AssignmentExpression)?\n\t\tthis.consume(Token.YIELD);\n\t\tlet delegating = false; // yield*\n\t\tlet expression: ExpressionNode | undefined;\n\t\tif (this.check(Token.MUL)) {\n\t\t\tdelegating = true;\n\t\t}\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.EOS:\n\t\t\tcase Token.SEMICOLON:\n\t\t\tcase Token.R_CURLY:\n\t\t\tcase Token.R_BRACKETS:\n\t\t\tcase Token.R_PARENTHESES:\n\t\t\tcase Token.COLON:\n\t\t\tcase Token.COMMA:\n\t\t\tcase Token.IN:\n\t\t\t\t// The above set of tokens is the complete set of tokens that can appear\n\t\t\t\t// after an AssignmentExpression, and none of them can start an\n\t\t\t\t// AssignmentExpression. This allows us to avoid looking for an RHS for\n\t\t\t\t// a regular yield, given only one look-ahead token.\n\t\t\t\tif (!delegating) break;\n\t\t\t\t// Delegating yields require an RHS; fall through.\n\t\t\t\t// V8_FALLTHROUGH;\n\t\t\t\tthrow new Error(this.errorMessage(`Delegating yields require an RHS`));\n\t\t\tdefault:\n\t\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new YieldExpression(delegating, expression);\n\t}\n\tprotected parseNewTargetExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (new.target) not supported.'));\n\t}\n\tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseClassLiteral(name: ExpressionNode | undefined, isStrictReserved: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseSuperExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n\t}\n\tprotected parseImportExpressions(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/expressions/v8/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CanDeclareExpression, ExpressionNode } from '../api/expression.js';\nimport { Token, TokenExpression } from './token.js';\nimport { PreTemplateLiteral, TokenStream } from './stream.js';\nimport {\n\tOfNode, Identifier, ThisNode,\n\tGetIdentifier, SetIdentifier, AsyncIdentifier,\n\tNullNode, StringLiteral, AwaitIdentifier,\n\tConstructorIdentifier, NameIdentifier,\n\tEvalIdentifier, ArgumentsIdentifier, TaggedTemplateExpression, TemplateLiteral\n} from '../api/definition/values.js';\nimport { EmptyStatement } from '../api/statement/control/empty.js';\nimport { BlockStatement } from '../api/statement/control/block.js';\nimport {\n\tArrowFunctionExpression, ArrowFunctionType, FunctionKind,\n\tParam, FunctionExpression, FunctionDeclaration\n} from '../api/definition/function.js';\nimport { IfStatement } from '../api/statement/control/if.js';\nimport { NewExpression } from '../api/computing/new.js';\nimport { SpreadElement } from '../api/computing/spread.js';\nimport { RestElement } from '../api/computing/rest.js';\nimport { AssignmentExpression, AssignmentOperator } from '../api/operators/assignment.js';\nimport { GroupingExpression } from '../api/operators/grouping.js';\nimport { MemberExpression } from '../api/definition/member.js';\nimport { BindExpression } from '../api/definition/bind.js';\nimport { ObjectExpression, Property, ObjectPattern } from '../api/definition/object.js';\nimport { ArrayExpression, ArrayPattern } from '../api/definition/array.js';\nimport { CallExpression } from '../api/computing/call.js';\nimport { DoWhileNode, WhileNode } from '../api/statement/iterations/while.js';\nimport { CatchClauseNode, ThrowStatement, TryCatchNode } from '../api/computing/throw.js';\nimport { SwitchCase, DefaultExpression, SwitchStatement } from '../api/statement/control/switch.js';\nimport { BreakStatement, ContinueStatement } from '../api/statement/control/terminate.js';\nimport { ReturnStatement } from '../api/computing/return.js';\nimport { YieldExpression } from '../api/computing/yield.js';\nimport { VariableNode, VariableDeclarationNode } from '../api/statement/declarations/declares.js';\nimport { ForNode, ForOfNode, ForInNode, ForAwaitOfNode, ForDeclaration } from '../api/statement/iterations/for.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { PipelineExpression } from '../api/operators/pipeline.js';\nimport { LogicalExpression, LogicalOperator } from '../api/operators/logical.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport { ChainExpression } from '../api/operators/chaining.js';\nimport { ExpressionStatement } from '../api/definition/statement.js';\nimport {\n\tbuildPostfixExpression, buildUnaryExpression,\n\texpressionFromLiteral, shortcutNumericLiteralBinaryExpression\n} from './nodes.js';\nimport { BinaryExpression } from '../api/operators/binary.js';\n\nexport enum ParsingArrowHeadFlag { CertainlyNotArrowHead, MaybeArrowHead, AsyncArrowFunction }\nexport enum PropertyKind {\n\tValue, Shorthand, ShorthandOrClassField,\n\tAssign, Method, ClassField, AccessorGetter, AccessorSetter,\n\tSpread, NotSet\n}\nexport type PropertyKindInfo = { kind?: PropertyKind, funcFlag?: FunctionKind, name: string };\nexport type FunctionInfo = { rest?: boolean };\nexport function parsePropertyKindFromToken(token: Token, info: PropertyKindInfo) {\n\tswitch (token) {\n\t\tcase Token.COLON:\n\t\t\tinfo.kind = PropertyKind.Value;\n\t\t\treturn true;\n\t\tcase Token.COMMA:\n\t\t\tinfo.kind = PropertyKind.Shorthand;\n\t\t\treturn true;\n\t\tcase Token.R_CURLY:\n\t\t\tinfo.kind = PropertyKind.ShorthandOrClassField;\n\t\t\treturn true;\n\t\tcase Token.ASSIGN:\n\t\t\tinfo.kind = PropertyKind.Assign;\n\t\t\treturn true;\n\t\tcase Token.L_PARENTHESES:\n\t\t\tinfo.kind = PropertyKind.Method;\n\t\t\treturn true;\n\t\tcase Token.MUL:\n\t\tcase Token.SEMICOLON:\n\t\t\tinfo.kind = PropertyKind.ClassField;\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn false;\n}\n\nexport enum PreParserIdentifierType {\n\tNullIdentifier = 'NullIdentifier',\n\tUnknownIdentifier = 'UnknownIdentifier',\n\tEvalIdentifier = 'EvalIdentifier',\n\tArgumentsIdentifier = 'ArgumentsIdentifier',\n\tConstructorIdentifier = 'ConstructorIdentifier',\n\tAwaitIdentifier = 'AwaitIdentifier',\n\tAsyncIdentifier = 'AsyncIdentifier',\n\tNameIdentifier = 'NameIdentifier',\n\tPrivateNameIdentifier = 'PrivateNameIdentifier'\n}\n\nexport abstract class AbstractParser {\n\tconstructor(protected scanner: TokenStream) { }\n\tabstract scan(): ExpressionNode;\n\tprotected position() {\n\t\treturn this.scanner.getPos();\n\t}\n\tprotected current() {\n\t\treturn this.scanner.currentToken();\n\t}\n\tprotected next() {\n\t\treturn this.scanner.next();\n\t}\n\tprotected peek(): TokenExpression {\n\t\treturn this.scanner.peek();\n\t}\n\tprotected peekAhead(): TokenExpression {\n\t\treturn this.scanner.peekAhead();\n\t}\n\tprotected peekAheadPosition() {\n\t\treturn this.scanner.peekAheadPosition();\n\t}\n\tprotected peekPosition() {\n\t\treturn this.scanner.peekPosition();\n\t}\n\tprotected consume(token: Token) {\n\t\tif (this.scanner.next().isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t}\n\tprotected check(token: Token): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.isType(token)) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected checkValue(value: ExpressionNode): boolean {\n\t\tconst next = this.scanner.peek();\n\t\tif (next.value == value) {\n\t\t\tthis.scanner.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected expect(token: Token) {\n\t\tconst current = this.scanner.next();\n\t\tif (current.isNotType(token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(token)}, current is ${JSON.stringify(current)}`));\n\t\t}\n\t}\n\tprotected checkInOrOf(): 'IN' | 'OF' | false {\n\t\tif (this.check(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (this.checkValue(OfNode)) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected peekInOrOf(): 'IN' | 'OF' | false {\n\t\tvar next = this.peek();\n\t\tif (next.isType(Token.IN)) {\n\t\t\treturn 'IN';\n\t\t} else if (next.value === OfNode) {\n\t\t\treturn 'OF';\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isEvalOrArguments(name: ExpressionNode): boolean {\n\t\tif (name.toString() === 'eval') {\n\t\t\treturn true;\n\t\t} else if (name.toString() === 'arguments') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isNextLetKeyword() {\n\t\tif (this.peek().isNotType(Token.LET)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst nextNextToken = this.peekAhead().token;\n\t\tswitch (nextNextToken) {\n\t\t\tcase Token.L_CURLY:\n\t\t\tcase Token.L_BRACKETS:\n\t\t\tcase Token.IDENTIFIER:\n\t\t\tcase Token.STATIC:\n\t\t\tcase Token.LET: // `let let;` is disallowed by static semantics, but the\n\t\t\t// token must be first interpreted as a keyword in order\n\t\t\t// for those semantics to apply. This ensures that ASI is\n\t\t\t// not honored when a LineTerminator separates the\n\t\t\t// tokens.\n\t\t\tcase Token.YIELD:\n\t\t\tcase Token.AWAIT:\n\t\t\tcase Token.GET:\n\t\t\tcase Token.SET:\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tprotected isIdentifier(expression: ExpressionNode): expression is Identifier {\n\t\treturn expression instanceof Identifier;\n\t}\n\tprotected isParenthesized(expression: ExpressionNode): expression is (GroupingExpression | SequenceExpression) {\n\t\treturn expression instanceof GroupingExpression || expression instanceof SequenceExpression;\n\t}\n\tprotected isAssignableIdentifier(expression: ExpressionNode): boolean {\n\t\t// return expression instanceof AssignmentNode;\n\t\tif (!(expression instanceof Identifier)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isEvalOrArguments(expression)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tprotected isPattern(expression: ExpressionNode): expression is (ObjectPattern | ArrayPattern) {\n\t\treturn expression instanceof ObjectPattern || expression instanceof ArrayPattern;\n\t}\n\tprotected isProperty(expression: ExpressionNode): expression is MemberExpression {\n\t\treturn expression instanceof MemberExpression;\n\t}\n\tprotected isCallNew(expression: ExpressionNode): expression is NewExpression {\n\t\treturn expression instanceof NewExpression;\n\t}\n\tprotected isCall(expression: ExpressionNode): expression is CallExpression {\n\t\treturn expression instanceof CallExpression;\n\t}\n\tprotected isEmptyStatement(expression: ExpressionNode): expression is EmptyStatement {\n\t\treturn expression instanceof EmptyStatement;\n\t}\n\tprotected isThisProperty(expression: ExpressionNode): boolean {\n\t\tif (this.isProperty(expression)) {\n\t\t\tif (expression.getObject() === ThisNode || expression.getObject().toString() === 'this') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tprotected isValidReferenceExpression(expression: ExpressionNode): boolean {\n\t\treturn this.isAssignableIdentifier(expression) || this.isProperty(expression);\n\t}\n\tprotected expectSemicolon() {\n\t\tconst tok = this.peek();\n\t\tif (tok.isType(Token.SEMICOLON)) {\n\t\t\tthis.next();\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tok.token)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.scanner.currentToken().isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`Await Not In Async Context/Function`));\n\t\t}\n\t}\n\tprotected peekAnyIdentifier() {\n\t\treturn Token.isAnyIdentifier(this.peek().token);\n\t}\n\tprotected errorMessage(message: string): string {\n\t\treturn this.scanner.createError(message);\n\t}\n}\n\nexport class JavaScriptParser extends AbstractParser {\n\tstatic parse(source: string | TokenExpression[] | TokenStream) {\n\t\tconst stream = (typeof source === 'string' || Array.isArray(source))\n\t\t\t? TokenStream.getTokenStream(source)\n\t\t\t: source;\n\t\tconst parser = new JavaScriptParser(stream);\n\t\treturn parser.scan();\n\t}\n\tscan(): ExpressionNode {\n\t\tconst list: ExpressionNode[] = this.parseStatementList(Token.EOS);\n\t\tif (list.length === 1) {\n\t\t\treturn list[0];\n\t\t}\n\t\treturn new ExpressionStatement(list);\n\t}\n\n\t/**\n\t * Statement ::\n\t * Block\n\t * VariableStatement\n\t * EmptyStatement\n\t * ExpressionStatement\n\t * IfStatement\n\t * IterationStatement\n\t * ContinueStatement\n\t * BreakStatement\n\t * ReturnStatement\n\t * WithStatement\n\t * LabelledStatement\n\t * SwitchStatement\n\t * ThrowStatement\n\t * TryStatement\n\t * DebuggerStatement\n\t */\n\tprotected parseStatement(): ExpressionNode {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseBlock();\n\t\t\tcase Token.SEMICOLON:\n\t\t\t\tthis.consume(Token.SEMICOLON);\n\t\t\t\treturn EmptyStatement.INSTANCE;\n\t\t\tcase Token.IF:\n\t\t\t\treturn this.parseIfStatement();\n\t\t\tcase Token.DO:\n\t\t\t\treturn this.parseDoWhileStatement();\n\t\t\tcase Token.WHILE:\n\t\t\t\treturn this.parseWhileStatement();\n\t\t\tcase Token.FOR:\n\t\t\t\t// if (this.peekAhead().isType(Token.AWAIT)) {\n\t\t\t\t// \treturn this.parseForAwaitStatement();\n\t\t\t\t// }\n\t\t\t\treturn this.parseForStatement();\n\t\t\tcase Token.CONTINUE:\n\t\t\t\treturn this.parseContinueStatement();\n\t\t\tcase Token.BREAK:\n\t\t\t\treturn this.parseBreakStatement();\n\t\t\tcase Token.RETURN:\n\t\t\t\treturn this.parseReturnStatement();\n\t\t\tcase Token.THROW:\n\t\t\t\treturn this.parseThrowStatement();\n\t\t\tcase Token.TRY:\n\t\t\t\treturn this.parseTryStatement();\n\t\t\tcase Token.SWITCH:\n\t\t\t\treturn this.parseSwitchStatement();\n\t\t\t// case Token.FUNCTION:\n\t\t\t// \t// FunctionDeclaration only allowed as a StatementListItem, not in\n\t\t\t// \t// an arbitrary Statement position. Exceptions such as\n\t\t\t// \t// ES#sec-functiondeclarations-in-ifstatement-statement-clauses\n\t\t\t// \t// are handled by calling ParseScopedStatement rather than\n\t\t\t// \t// ParseStatement directly.\n\t\t\t// \timpl() -> ReportMessageAt(scanner() -> peek_location(),\n\t\t\t// \t\tis_strict(language_mode())\n\t\t\t// \t\t\t? MessageTemplate.kStrictFunction\n\t\t\t// \t\t\t: MessageTemplate.kSloppyFunction);\n\t\t\t// \treturn impl() -> NullStatement();\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.parseExpressionOrLabelledStatement();\n\t\t}\n\t}\n\tprotected parseTryStatement(): ExpressionNode {\n\t\t// TryStatement ::\n\t\t// 'try' Block Catch\n\t\t// 'try' Block Finally\n\t\t// 'try' Block Catch Finally\n\t\t//\n\t\t// Catch ::\n\t\t// 'catch' '(' Identifier ')' Block\n\t\t//\n\t\t// Finally ::\n\t\t// 'finally' Block\n\n\t\tthis.consume(Token.TRY);\n\t\tconst tryBlock = this.parseBlock();\n\t\tif (tryBlock instanceof BlockStatement) {\n\t\t\ttryBlock.isStatement = true;\n\t\t}\n\t\tlet peek = this.peek();\n\t\tif (peek.isNotType(Token.CATCH) && peek.isNotType(Token.FINALLY)) {\n\t\t\tthrow new Error(this.errorMessage(`Uncaught SyntaxError: Missing catch or finally after try`));\n\t\t}\n\t\tlet catchBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.CATCH)) {\n\t\t\t// bool has_binding;\n\t\t\tlet catchVar: ExpressionNode | undefined;\n\t\t\tconst hasBinding = this.check(Token.L_PARENTHESES);\n\t\t\tif (hasBinding) {\n\t\t\t\tcatchVar = this.parseIdentifier();\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t}\n\t\t\tconst block = this.parseBlock();\n\t\t\tif (block instanceof BlockStatement) {\n\t\t\t\tblock.isStatement = true;\n\t\t\t}\n\t\t\tcatchBlock = new CatchClauseNode(block, catchVar);\n\t\t}\n\t\tlet finallyBlock: ExpressionNode | undefined;\n\t\tif (this.check(Token.FINALLY)) {\n\t\t\tfinallyBlock = this.parseBlock();\n\t\t\tif (finallyBlock instanceof BlockStatement) {\n\t\t\t\tfinallyBlock.isStatement = true;\n\t\t\t}\n\t\t}\n\t\treturn new TryCatchNode(tryBlock, catchBlock, finallyBlock);\n\t}\n\tprotected parseBlock(): ExpressionNode {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst statements: ExpressionNode[] = [];\n\t\tconst block = new BlockStatement(statements, false);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\treturn block;\n\t\t\t} else if (stat instanceof EmptyStatement) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstatements.push(stat);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn block;\n\t}\n\t/**\n\t * ECMA 262 6th Edition\n\t * \tStatementListItem[Yield, Return] :\n\t * \tStatement[?Yield, ?Return]\n\t * \tDeclaration[?Yield]\n\t * //\n\t * Declaration[Yield] :\n\t * \tHoistableDeclaration[?Yield]\n\t * \tClassDeclaration[?Yield]\n\t * \tLexicalDeclaration[In, ?Yield]\n\t * //\n\t * HoistableDeclaration[Yield, Default] :\n\t * \tFunctionDeclaration[?Yield, ?Default]\n\t * \tGeneratorDeclaration[?Yield, ?Default]\n\t * //\n\t * LexicalDeclaration[In, Yield] :\n\t * \tLetOrConst BindingList[?In, ?Yield] ;\n\t */\n\tprotected parseStatementListItem(): ExpressionNode | undefined {\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.CLASS:\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\treturn this.parseClassDeclaration(undefined, false);\n\t\t\tcase Token.VAR:\n\t\t\tcase Token.LET:\n\t\t\tcase Token.CONST:\n\t\t\t\treturn this.parseVariableDeclarations();\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this.parseStatement();\n\t}\n\tprotected parseFunctionExpression(type: FunctionKind): ExpressionNode {\n\t\tlet funcName: ExpressionNode | undefined;\n\t\tconst peek = this.peek();\n\t\tif (peek.isNotType(Token.L_PARENTHESES)) {\n\t\t\tif (peek.isType(Token.L_BRACKETS)) {\n\t\t\t\t// [Symbol.iterator]() {}\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tfuncName = this.parseMemberExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t} else {\n\t\t\t\tfuncName = this.parseIdentifier();\n\t\t\t}\n\t\t}\n\t\treturn this.parseFunctionLiteral(type, funcName);\n\t}\n\tprotected parseIfStatement(): ExpressionNode {\n\t\tthis.consume(Token.IF);\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.consume(Token.R_PARENTHESES);\n\t\tconst thenStatement = this.parseStatement();\n\t\tif (thenStatement instanceof BlockStatement) {\n\t\t\tthenStatement.isStatement = true;\n\t\t}\n\t\tlet elseStatement;\n\t\tif (this.peek().isType(Token.ELSE)) {\n\t\t\tthis.consume(Token.ELSE);\n\t\t\telseStatement = this.parseStatement();\n\t\t}\n\t\treturn new IfStatement(condition, thenStatement, elseStatement);\n\t}\n\tprotected parseDoWhileStatement(): ExpressionNode {\n\t\t// DoStatement ::\n\t\t// 'do' Statement 'while' '(' Expression ')' ';'\n\t\tthis.consume(Token.DO);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\tthis.expect(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tthis.check(Token.SEMICOLON);\n\t\treturn new DoWhileNode(condition, body);\n\t}\n\tprotected parseWhileStatement(): ExpressionNode {\n\t\t// WhileStatement ::\n\t\t// 'while' '(' Expression ')' Statement\n\t\tthis.consume(Token.WHILE);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst condition = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new WhileNode(condition, body);\n\t}\n\tprotected parseThrowStatement(): ExpressionNode {\n\t\t// ThrowStatement ::\n\t\t// 'throw' Expression ';'\n\t\tthis.consume(Token.THROW);\n\t\tif (this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tthrow new Error(this.scanner.createError(`New line After Throw`));\n\t\t}\n\t\tconst exception = this.parseExpression();\n\t\tthis.expectSemicolon();\n\t\treturn new ThrowStatement(exception);\n\t}\n\tprotected parseSwitchStatement(): ExpressionNode {\n\t\t// SwitchStatement ::\n\t\t// 'switch' '(' Expression ')' '{' CaseClause* '}'\n\t\t// CaseClause ::\n\t\t// 'case' Expression ':' StatementList\n\t\t// 'default' ':' StatementList\n\n\t\tthis.consume(Token.SWITCH);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst tag = this.parseExpression();\n\t\tthis.expect(Token.R_PARENTHESES);\n\n\t\tconst cases: SwitchCase[] = [];\n\t\tconst switchStatement = new SwitchStatement(tag, cases);\n\n\t\tlet defaultSeen = false;\n\t\tthis.expect(Token.L_CURLY);\n\t\twhile (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\tconst statements: ExpressionNode[] = [];\n\t\t\tlet label: ExpressionNode;\n\t\t\tif (this.check(Token.CASE)) {\n\t\t\t\tlabel = this.parseExpression();\n\t\t\t} else {\n\t\t\t\tthis.expect(Token.DEFAULT);\n\t\t\t\tif (defaultSeen) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Multiple Defaults In Switch`));\n\t\t\t\t}\n\t\t\t\tdefaultSeen = true;\n\t\t\t}\n\t\t\tthis.expect(Token.COLON);\n\t\t\twhile (this.peek().isNotType(Token.CASE)\n\t\t\t\t&& this.peek().isNotType(Token.DEFAULT)\n\t\t\t\t&& this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tconst statement = this.parseStatementListItem();\n\t\t\t\tif (!statement || this.isEmptyStatement(statement)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstatements.push(statement);\n\t\t\t}\n\t\t\tconst block = new BlockStatement(statements, true);\n\t\t\tconst clause = defaultSeen ? new DefaultExpression(block) : new SwitchCase(label!, block);\n\t\t\tcases.push(clause);\n\t\t}\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn switchStatement;\n\t}\n\tprotected parseForStatement(): ExpressionNode {\n\t\t// Either a standard for loop\n\t\t// for (<init>; <cond>; <next>) { ... }\n\t\t// or a for-each loop\n\t\t// for (<each> of|in <iterable>) { ... }\n\t\t//\n\n\t\tthis.consume(Token.FOR);\n\t\tconst isAwait = this.check(Token.AWAIT);\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst peek = this.peek();\n\t\tconst startsWithLet = peek.isType(Token.LET) || peek.isType(Token.VAR);\n\t\tlet initializer: ExpressionNode;\n\t\tif (peek.isType(Token.CONST) || (startsWithLet && this.isNextLetKeyword())) {\n\t\t\tinitializer = this.parseVariableDeclarations();\n\t\t} else if (peek.isType(Token.SEMICOLON)) {\n\t\t\tinitializer = EmptyStatement.INSTANCE;\n\t\t} else {\n\t\t\tinitializer = this.parseExpressionCoverGrammar();\n\t\t}\n\t\tif (initializer instanceof BinaryExpression) {\n\t\t\t// x in y \n\t\t\tconst objectNode = initializer.getRight();\n\t\t\tinitializer = initializer.getLeft();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\treturn new ForInNode(initializer as ForDeclaration, objectNode, statement);\n\t\t}\n\t\tconst forMode = this.checkInOrOf();\n\t\tif (forMode) {\n\t\t\tconst object = forMode === 'IN' ? this.parseAssignmentExpression() : this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES)\n\t\t\tconst statement = this.parseStatement();\n\t\t\tif (statement instanceof BlockStatement) {\n\t\t\t\tstatement.isStatement = true;\n\t\t\t}\n\t\t\tif (isAwait && forMode === 'OF') {\n\t\t\t\treturn new ForAwaitOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'OF') {\n\t\t\t\treturn new ForOfNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else if (forMode === 'IN') {\n\t\t\t\treturn new ForInNode(initializer as ForDeclaration, object, statement);\n\t\t\t} else {\n\t\t\t\tthrow new Error(this.errorMessage(`parsing for loop: ${this.position()}`));\n\t\t\t}\n\t\t}\n\t\tthis.expect(Token.SEMICOLON);\n\t\tlet condition: ExpressionNode | undefined;\n\t\tif (!this.check(Token.SEMICOLON)) {\n\t\t\tcondition = this.parseExpression();\n\t\t\tthis.expect(Token.SEMICOLON);\n\t\t}\n\t\tlet finalExpression: ExpressionNode | undefined;\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tfinalExpression = this.parseExpression();\n\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t}\n\t\tconst body = this.parseStatement();\n\t\tif (body instanceof BlockStatement) {\n\t\t\tbody.isStatement = true;\n\t\t}\n\t\treturn new ForNode(body, initializer, condition, finalExpression);\n\t}\n\tprotected parseVariableDeclarations(): ExpressionNode {\n\t\t// VariableDeclarations ::\n\t\t// ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']\n\t\t// var converted into ==> 'let' by parser\n\n\t\tlet mode: 'const' | 'let' | 'var';\n\t\tconst token = this.peek().token;\n\t\tswitch (token) {\n\t\t\tcase Token.CONST:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'const';\n\t\t\t\tbreak;\n\t\t\tcase Token.VAR:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'var';\n\t\t\tcase Token.LET:\n\t\t\tdefault:\n\t\t\t\tthis.consume(token);\n\t\t\t\tmode = 'let';\n\t\t\t\tbreak;\n\t\t}\n\t\tconst variables: VariableNode[] = [];\n\t\tdo {\n\n\t\t\tlet name: ExpressionNode;\n\t\t\tlet value: ExpressionNode | undefined;\n\t\t\t// Check for an identifier first, so that we can elide the pattern in cases\n\t\t\t// where there is no initializer (and so no proxy needs to be created).\n\t\t\tif (Token.isAnyIdentifier(this.peek().token)) {\n\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t\t}\n\t\t\t\t// if (this.peekInOrOf()) {\n\t\t\t\t// \t// // Assignments need the variable expression for the assignment LHS, and\n\t\t\t\t// \t// // for of/in will need it later, so create the expression now.\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tname = this.parseBindingPattern(true);\n\t\t\t}\n\n\t\t\tif (this.check(Token.ASSIGN)) {\n\t\t\t\tvalue = this.parseAssignmentExpression();\n\t\t\t} else if (!this.peekInOrOf()) {\n\t\t\t\t// ES6 'const' and binding patterns require initializers.\n\t\t\t\tif (mode === 'const' && (name === undefined || value === undefined)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Declaration Missing Initializer : ${this.position()}`));\n\t\t\t\t}\n\t\t\t\t// value = undefined;\n\t\t\t}\n\t\t\tvariables.push(new VariableNode(name as CanDeclareExpression, value));\n\t\t} while (this.check(Token.COMMA));\n\t\treturn new VariableDeclarationNode(variables, mode);\n\t}\n\tprotected parseBindingPattern(isPattern: boolean): ExpressionNode {\n\t\t// Pattern ::\n\t\t// Identifier\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\n\t\tconst token = this.peek().token;\n\t\tif (Token.isAnyIdentifier(token)) {\n\t\t\tconst name = this.parseAndClassifyIdentifier(this.next());\n\t\t\tif (this.isEvalOrArguments(name)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Strict Eval Arguments`));\n\t\t\t}\n\t\t\treturn name;\n\t\t}\n\t\tif (token == Token.L_BRACKETS) {\n\t\t\treturn this.parseArrayLiteral(isPattern);\n\t\t} else if (token == Token.L_CURLY) {\n\t\t\treturn this.parseObjectLiteral(isPattern);\n\t\t} else {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${this.next().getValue()}`));\n\t\t}\n\t}\n\tprotected parseAndClassifyIdentifier(next: TokenExpression): ExpressionNode {\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\telse if (next.isType(Token.SET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'set');\n\t\t}\n\t\telse if (next.isType(Token.GET)) {\n\t\t\tconst value = this.parseFunctionDeclaration() as CanDeclareExpression;\n\t\t\treturn new Property(next.getValue(), value, 'get');\n\t\t}\n\t\telse if (next.isType(Token.AWAIT)) {\n\t\t\tthrow new Error(this.errorMessage(`un supported expression (await)`));\n\n\t\t}\n\t\treturn next.getValue();\n\t}\n\tprotected parseContinueStatement(): ExpressionNode {\n\t\t// ContinueStatement ::\n\t\t// 'continue' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.CONTINUE);\n\t\tthis.expectSemicolon();\n\t\treturn ContinueStatement.CONTINUE_INSTANCE;\n\t}\n\tprotected parseBreakStatement(): ExpressionNode {\n\t\t// BreakStatement ::\n\t\t// 'break' ';'\n\t\t// Identifier? is not supported\n\n\t\tthis.consume(Token.BREAK);\n\t\tthis.expectSemicolon();\n\t\treturn BreakStatement.BREAK_INSTANCE;\n\t}\n\tprotected parseReturnStatement(): ExpressionNode {\n\t\t// ReturnStatement ::\n\t\t// 'return' [no line terminator] Expression? ';'\n\n\t\t// Consume the return token. It is necessary to do that before\n\t\t// reporting any errors on it, because of the way errors are\n\t\t// reported (underlining).\n\t\tthis.consume(Token.RETURN);\n\t\tconst tokenExp = this.peek();\n\t\tlet returnValue: ExpressionNode | undefined;\n\t\t// ExpressionT return_value = impl() -> NullExpression();\n\t\tif (this.scanner.hasLineTerminatorBeforeNext() || Token.isAutoSemicolon(tokenExp.token)) {\n\t\t\t// check if this scope is belong to 'constructor' method to return this at the end;\n\t\t\t// if (this.isDerivedConstructor(function_state_ -> kind())) {\n\t\t\t// \treturnValue = ThisNode;\n\t\t\t// }\n\t\t} else {\n\t\t\treturnValue = this.parseExpression();\n\t\t}\n\t\tthis.expectSemicolon()\n\t\treturn new ReturnStatement(returnValue);\n\t}\n\tprotected parseExpressionOrLabelledStatement(): ExpressionNode {\n\t\t// ExpressionStatement | LabelledStatement ::\n\t\t// Expression ';'\n\t\t// Identifier ':' Statement\n\t\t//\n\t\t// ExpressionStatement[Yield] :\n\t\t// [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;\n\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\tcase Token.L_CURLY:\n\t\t\t\tthrow new Error(this.errorMessage(`Unreachable state`));\n\t\t\tcase Token.CLASS:\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token ${this.next().getValue().toString()}`));\n\t\t\tcase Token.LET: {\n\t\t\t\tconst nextNext = this.peekAhead();\n\t\t\t\t// \"let\" followed by either \"[\", \"{\" or an identifier means a lexical\n\t\t\t\t// declaration, which should not appear here.\n\t\t\t\t// However, ASI may insert a line break before an identifier or a brace.\n\t\t\t\tif (nextNext.isNotType(Token.L_BRACKETS) &&\n\t\t\t\t\t((nextNext.isNotType(Token.L_CURLY) && nextNext.isNotType(Token.IDENTIFIER)))) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Lexical Declaration ${this.position()}`));\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tconst startsWithIdentifier = Token.isAnyIdentifier(this.peek().token);\n\t\tconst expression: ExpressionNode = this.parseExpressionCoverGrammar();\n\t\tif (this.peek().isType(Token.COLON) && startsWithIdentifier && this.isIdentifier(expression)) {\n\t\t\t// The whole expression was a single identifier, and not, e.g.,\n\t\t\t// something starting with an identifier or a parenthesized identifier.\n\n\t\t\t// Remove the \"ghost\" variable that turned out to be a label from the top\n\t\t\t// scope. This way, we don't try to resolve it during the scope\n\t\t\t// processing.\n\n\t\t\tthis.consume(Token.COLON);\n\t\t\t// ES#sec-labelled-function-declarations Labelled Function Declarations\n\t\t\tif (this.peek().isType(Token.FUNCTION) /*&& allow_function == kAllowLabelledFunctionStatement */) {\n\t\t\t\treturn this.parseFunctionDeclaration();\n\t\t\t}\n\t\t\treturn this.parseStatement();\n\t\t}\n\t\t// Parsed expression statement, followed by semicolon.\n\t\tthis.expectSemicolon();\n\t\treturn expression;\n\t}\n\tprotected parseExpression(): ExpressionNode {\n\t\treturn this.parseExpressionCoverGrammar();\n\t}\n\tprotected parseFunctionDeclaration(): ExpressionNode {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Generator In Single Statement Context`));\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseFunctionDeclarationAndGenerator() {\n\t\tthis.consume(Token.FUNCTION);\n\t\tif (this.check(Token.MUL)) {\n\t\t\treturn this.parseHoistableDeclaration(FunctionKind.GENERATOR);\n\t\t}\n\t\treturn this.parseHoistableDeclaration(FunctionKind.NORMAL);\n\t}\n\tprotected parseHoistableDeclaration(flag: FunctionKind): ExpressionNode {\n\t\t// FunctionDeclaration ::\n\t\t// 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// GeneratorDeclaration ::\n\t\t// 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t// 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'\n\t\t//\n\t\t// The anonymous forms are allowed iff [default_export] is true.\n\t\t//\n\t\t// 'function' and '*' (if present) have been consumed by the caller.\n\n\t\t// (FunctionType.ASYNC === flag || FunctionType.GENERATOR === flag);\n\n\t\tif (FunctionKind.ASYNC === flag && this.check(Token.MUL)) {\n\t\t\t// Async generator\n\t\t\tflag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\t\tlet name: ExpressionNode | undefined;\n\t\tif (this.peek().isNotType(Token.L_PARENTHESES)) {\n\t\t\tname = this.parseIdentifier();\n\t\t}\n\t\treturn this.parseFunctionLiteral(flag, name);\n\t}\n\tprotected parseIdentifier(): ExpressionNode {\n\t\tconst next = this.next();\n\t\tif (!Token.isValidIdentifier(next.token)) {\n\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${next.getValue()}`));\n\t\t}\n\t\tif (next.isType(Token.IDENTIFIER)) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\treturn this.getIdentifier();\n\t}\n\tprotected getIdentifier(): ExpressionNode {\n\t\tconst current = this.current();\n\t\tconst string = current.getValue().toString();\n\t\tswitch (current.token) {\n\t\t\tcase Token.AWAIT:\n\t\t\t\treturn AwaitIdentifier;\n\t\t\tcase Token.ASYNC:\n\t\t\t\treturn AsyncIdentifier;\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\treturn new Identifier(`#${string}`);\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (string == 'constructor') {\n\t\t\treturn ConstructorIdentifier;\n\t\t}\n\t\tif (string == 'name') {\n\t\t\treturn NameIdentifier;\n\t\t}\n\t\tif (string == 'eval') {\n\t\t\treturn EvalIdentifier;\n\t\t}\n\t\telse if (string == 'arguments') {\n\t\t\treturn ArgumentsIdentifier;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`can't identify token ${string}`));\n\t}\n\tprotected parseFunctionLiteral(flag: FunctionKind, name?: ExpressionNode): ExpressionNode {\n\t\t// Function ::\n\t\t// '(' FormalParameterList? ')' '{' FunctionBody '}'\n\n\t\tconst functionInfo: FunctionInfo = {};\n\t\tthis.expect(Token.L_PARENTHESES);\n\t\tconst formals: ExpressionNode[] = this.parseFormalParameterList(functionInfo);\n\t\tthis.expect(Token.R_PARENTHESES);\n\t\tconst body = this.parseFunctionBody();\n\t\tif (name) {\n\t\t\treturn new FunctionDeclaration(formals, body, flag, name as CanDeclareExpression, functionInfo.rest);\n\t\t}\n\t\treturn new FunctionExpression(formals, body, flag, name, functionInfo.rest);\n\t}\n\tprotected parseArrowFunctionBody(): ExpressionNode | ExpressionNode[] {\n\t\tconst isExpression = this.peek().isNotType(Token.L_CURLY);\n\t\tif (isExpression) {\n\t\t\tconst expression = this.parseAssignmentExpression();\n\t\t\treturn expression;\n\t\t} else {\n\t\t\treturn this.parseFunctionBody();\n\t\t}\n\t}\n\tprotected parseFunctionBody(): ExpressionNode[] {\n\t\tthis.expect(Token.L_CURLY);\n\t\tconst list = this.parseStatementList(Token.R_CURLY);\n\t\tthis.expect(Token.R_CURLY);\n\t\treturn list;\n\t}\n\tprotected parseStatementList(endToken: Token): ExpressionNode[] {\n\t\t// StatementList ::\n\t\t// (StatementListItem)* <end_token>\n\t\tconst list: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(endToken)) {\n\t\t\tconst stat = this.parseStatementListItem();\n\t\t\tif (!stat) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.isEmptyStatement(stat)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlist.push(stat);\n\t\t}\n\t\treturn list;\n\t}\n\tprotected parseFormalParameterList(functionInfo: FunctionInfo): ExpressionNode[] {\n\t\t// FormalParameters[Yield] :\n\t\t// [empty]\n\t\t// FunctionRestParameter[?Yield]\n\t\t// FormalParameterList[?Yield]\n\t\t// FormalParameterList[?Yield] ,\n\t\t// FormalParameterList[?Yield] , FunctionRestParameter[?Yield]\n\t\t//\n\t\t// FormalParameterList[Yield] :\n\t\t// FormalParameter[?Yield]\n\t\t// FormalParameterList[?Yield] , FormalParameter[?Yield]\n\n\t\tconst parameters: ExpressionNode[] = [];\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\twhile (true) {\n\t\t\t\tconst param: ExpressionNode = this.parseFormalParameter(functionInfo);\n\t\t\t\tparameters.push(param);\n\t\t\t\tif (functionInfo.rest) {\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Param After Rest`));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t\t\tif (this.peek().isType(Token.R_PARENTHESES)) {\n\t\t\t\t\t// allow the trailing comma\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parameters;\n\t}\n\tprotected parseFormalParameter(functionInfo: FunctionInfo): ExpressionNode {\n\t\t// FormalParameter[Yield,GeneratorParameter] :\n\t\t// BindingElement[?Yield, ?GeneratorParameter]\n\t\tfunctionInfo.rest = this.check(Token.ELLIPSIS);\n\t\tlet pattern = this.parseBindingPattern(true);\n\t\tlet initializer: Param;\n\t\tif (this.check(Token.ASSIGN)) {\n\t\t\tif (functionInfo.rest) {\n\t\t\t\tthrow new Error(this.errorMessage(`Rest Default Initializer`));\n\t\t\t}\n\t\t\tconst value = this.parseAssignmentExpression();\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression, value);\n\t\t} else {\n\t\t\tinitializer = new Param(pattern as CanDeclareExpression);\n\t\t}\n\t\treturn initializer;\n\t}\n\tprotected parseExpressionCoverGrammar(info?: FunctionInfo): ExpressionNode {\n\t\t// Expression ::\n\t\t// AssignmentExpression\n\t\t// Expression ',' AssignmentExpression\n\n\t\t// ExpressionListT list(pointer_buffer());\n\t\t// ExpressionT expression;\n\t\t// AccumulationScope accumulation_scope(expression_scope());\n\t\tlet variableIndex = 0;\n\t\tconst list: ExpressionNode[] = [];\n\t\tlet expression: ExpressionNode;\n\t\twhile (true) {\n\t\t\tif (this.peek().isType(Token.ELLIPSIS)) {\n\t\t\t\tif (info) {\n\t\t\t\t\tinfo.rest = true;\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowParametersWithRest(list, variableIndex);\n\t\t\t}\n\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tlist.push(expression);\n\n\t\t\tif (!this.check(Token.COMMA)) break;\n\n\t\t\tif (this.peek().isType(Token.R_PARENTHESES) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t// a trailing comma is allowed at the end of an arrow parameter list\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (list.length == 1) return expression;\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected parseArrowParametersWithRest(list: ExpressionNode[], variableIndex: number): ExpressionNode {\n\t\tthis.consume(Token.ELLIPSIS);\n\t\tconst pattern: ExpressionNode = this.parseBindingPattern(true);\n\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter cannot have an initializer`));\n\t\t}\n\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\tthrow new Error(this.errorMessage(`Error A rest parameter or binding pattern may not have a trailing comma`));\n\t\t}\n\t\t// 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only\n\t\t// as the formal parameters of'(x, y, ...z) => foo', and is not itself a\n\t\t// valid expression.\n\t\tif (this.peek().isNotType(Token.R_PARENTHESES) || this.peekAhead().isNotType(Token.ARROW)) {\n\t\t\tthrow new Error(this.errorMessage(`Error Unexpected Token At ${this.position()}`));\n\t\t}\n\t\tlist.push(pattern);\n\t\treturn this.expressionListToExpression(list);\n\t}\n\tprotected expressionListToExpression(list: ExpressionNode[]): ExpressionNode {\n\t\tif (list.length === 1) { return list[0]; }\n\t\treturn new SequenceExpression(list);\n\t}\n\tprotected parseMemberExpression(): ExpressionNode {\n\t\t// MemberExpression ::\n\t\t// (PrimaryExpression | FunctionLiteral | ClassLiteral)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// CallExpression ::\n\t\t// (SuperCall | ImportCall)\n\t\t// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*\n\t\t//\n\t\t// The '[' Expression ']' and '.' Identifier parts are parsed by\n\t\t// ParseMemberExpressionContinuation, and everything preceeding it is merged\n\t\t// into ParsePrimaryExpression.\n\n\t\t// Parse the initial primary or function expression.\n\t\tconst result = this.parsePrimaryExpression();\n\t\treturn this.parseMemberExpressionContinuation(result);\n\t}\n\tprotected toParamNode(expression: ExpressionNode): Param {\n\t\tif (expression instanceof AssignmentExpression) {\n\t\t\treturn new Param(expression.getLeft() as CanDeclareExpression, expression.getRight());\n\t\t}\n\t\tif (expression instanceof GroupingExpression) {\n\t\t\treturn new Param(expression.getNode() as CanDeclareExpression);\n\t\t}\n\t\treturn new Param(expression as CanDeclareExpression);\n\t}\n\tprotected parsePrimaryExpression(): ExpressionNode {\n\t\t// PrimaryExpression ::\n\t\t// 'this'\n\t\t// 'null'\n\t\t// 'true'\n\t\t// 'false'\n\t\t// Identifier\n\t\t// Number\n\t\t// String\n\t\t// ArrayLiteral\n\t\t// ObjectLiteral\n\t\t// RegExpLiteral\n\t\t// '(' Expression ')'\n\t\t// do Block\n\t\t// AsyncFunctionLiteral\n\n\t\tlet token = this.peek();\n\t\tif (Token.isAnyIdentifier(token.token)) {\n\t\t\tthis.consume(token.token);\n\t\t\tlet kind: ArrowFunctionType = ArrowFunctionType.NORMAL;\n\t\t\tif (token.isType(Token.ASYNC) && !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\t// async function ...\n\t\t\t\tif (this.peek().isType(Token.FUNCTION)) {\n\t\t\t\t\treturn this.parseFunctionDeclarationAndGenerator();\n\t\t\t\t};\n\t\t\t\t// async Identifier => ...\n\t\t\t\tif (Token.isAnyIdentifier(this.peek().token) && this.peekAhead().isType(Token.ARROW)) {\n\t\t\t\t\ttoken = this.next();\n\t\t\t\t\tkind = ArrowFunctionType.ASYNC;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\tconst name = this.parseAndClassifyIdentifier(token);\n\t\t\t\tconst params: Param[] = [];\n\t\t\t\tif (name instanceof SequenceExpression) {\n\t\t\t\t\tparams.push(...name.getExpressions().map(this.toParamNode));\n\t\t\t\t} else {\n\t\t\t\t\tparams.push(this.toParamNode(name));\n\t\t\t\t}\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, kind);\n\t\t\t}\n\t\t\treturn this.parseAndClassifyIdentifier(token);\n\t\t}\n\n\t\tif (Token.isLiteral(token.token)) {\n\t\t\treturn expressionFromLiteral(this.next());\n\t\t}\n\n\t\tswitch (token.token) {\n\t\t\tcase Token.NEW:\n\t\t\t\treturn this.parseMemberWithPresentNewPrefixesExpression();\n\t\t\tcase Token.THIS:\n\t\t\t\tthis.consume(Token.THIS);\n\t\t\t\treturn ThisNode;\n\t\t\tcase Token.DIV:\n\t\t\tcase Token.DIV_ASSIGN:\n\t\t\t\t// case Token.REGEXP_LITERAL:\n\t\t\t\t// this.consume(Token.REGEXP_LITERAL);\n\t\t\t\t// return token.value!;\n\t\t\t\treturn this.parseRegExpLiteral();\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\treturn this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t}\n\t\t\t\treturn this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\tcase Token.SUPER: {\n\t\t\t\treturn this.parseSuperExpression();\n\t\t\t}\n\t\t\tcase Token.IMPORT:\n\t\t\t\treturn this.parseImportExpressions();\n\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\treturn this.parseArrayLiteral(false);\n\n\t\t\tcase Token.L_CURLY:\n\t\t\t\treturn this.parseObjectLiteral(false);\n\n\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tif (this.check(Token.R_PARENTHESES)) {\n\t\t\t\t\t// ()=>x. The continuation that consumes the => is in\n\t\t\t\t\t// ParseAssignmentExpressionCoverGrammar.\n\n\t\t\t\t\tif (!this.peek().isType(Token.ARROW)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${Token.R_PARENTHESES.getName()}`));\n\t\t\t\t\t}\n\t\t\t\t\treturn this.parseArrowFunctionLiteral([], ArrowFunctionType.NORMAL);\n\t\t\t\t}\n\t\t\t\t// Heuristically try to detect immediately called functions before\n\t\t\t\t// seeing the call parentheses.\n\n\t\t\t\tconst peekToken = this.peek();\n\t\t\t\tlet expression: ExpressionNode;\n\t\t\t\tconst info: FunctionInfo = {};\n\t\t\t\tif (peekToken.isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.NORMAL);\n\t\t\t\t} else if (peekToken.isType(Token.ASYNC) && this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\texpression = this.parseFunctionLiteral(FunctionKind.ASYNC);\n\t\t\t\t} else {\n\t\t\t\t\texpression = this.parseExpressionCoverGrammar(info);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral(expression.getExpressions(), ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\texpression = this.parseArrowFunctionLiteral([expression], ArrowFunctionType.NORMAL, info.rest);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t\tcase Token.CLASS: {\n\t\t\t\tthis.consume(Token.CLASS);\n\t\t\t\tlet name: ExpressionNode | undefined;\n\t\t\t\tlet isStrictReserved = false;\n\t\t\t\tif (this.peekAnyIdentifier()) {\n\t\t\t\t\tname = this.parseAndClassifyIdentifier(this.next());\n\t\t\t\t\tisStrictReserved = Token.isStrictReservedWord(this.current().token);\n\t\t\t\t}\n\t\t\t\treturn this.parseClassLiteral(name, isStrictReserved);\n\t\t\t}\n\t\t\tcase Token.TEMPLATE_LITERALS:\n\t\t\t\treturn this.parseTemplateLiteral();\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Unexpected Token: ${JSON.stringify(this.next())}`));\n\t}\n\tprotected parseTemplateLiteral(tag?: ExpressionNode): ExpressionNode {\n\t\tconst template = this.next().getValue() as PreTemplateLiteral;\n\t\tconst exprs = template.expressions.map(expr => JavaScriptParser.parse(expr));\n\n\t\tif (tag) {\n\t\t\treturn new TaggedTemplateExpression(tag, template.strings, exprs);\n\t\t} else {\n\t\t\treturn new TemplateLiteral(template.strings, exprs);\n\t\t}\n\t}\n\tprotected parseMemberWithPresentNewPrefixesExpression(): ExpressionNode {\n\t\tthis.consume(Token.NEW);\n\t\tlet classRef: ExpressionNode;\n\t\tif (this.peek().isType(Token.IMPORT) && this.peekAhead().isType(Token.L_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new import (`));\n\t\t} else if (this.peek().isType(Token.SUPER)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new super() is never allowed`));\n\t\t} else if (this.peek().isType(Token.PERIOD)) {\n\t\t\tclassRef = this.parseNewTargetExpression();\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t} else {\n\t\t\tclassRef = this.parseMemberExpression();\n\t\t}\n\t\tif (this.peek().isType(Token.L_PARENTHESES)) {\n\t\t\t// NewExpression with arguments.\n\t\t\tconst args: ExpressionNode[] = this.parseArguments();\n\t\t\tclassRef = new NewExpression(classRef, args);\n\t\t\t// The expression can still continue with . or [ after the arguments.\n\t\t\treturn this.parseMemberExpressionContinuation(classRef);\n\t\t}\n\t\tif (this.peek().isType(Token.QUESTION_PERIOD)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing new xxx?.yyy at position`));\n\t\t}\n\t\treturn new NewExpression(classRef);\n\t}\n\tprotected parseArguments(maybeArrow?: ParsingArrowHeadFlag): ExpressionNode[] {\n\t\t// Arguments ::\n\t\t// '(' (AssignmentExpression)*[','] ')'\n\n\t\tthis.consume(Token.L_PARENTHESES);\n\t\tconst args: ExpressionNode[] = [];\n\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\tlet argument: ExpressionNode = this.parseAssignmentExpressionCoverGrammar();\n\t\t\tif (ParsingArrowHeadFlag.MaybeArrowHead === maybeArrow) {\n\t\t\t\tif (isSpread) {\n\t\t\t\t\tif (argument instanceof AssignmentExpression) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(` Rest parameter may not have a default initializer'`));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`parsing '...spread,arg =>'`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isSpread) {\n\t\t\t\targument = new SpreadElement(argument);\n\t\t\t}\n\t\t\targs.push(argument);\n\t\t\tif (!this.check(Token.COMMA)) break;\n\t\t}\n\t\tif (!this.check(Token.R_PARENTHESES)) {\n\t\t\tthrow new Error(this.errorMessage(`parsing arguments call, expecting ')'`));\n\t\t}\n\t\treturn args;\n\t}\n\tprotected parseAssignmentExpressionCoverGrammar(): ExpressionNode {\n\t\t// AssignmentExpression ::\n\t\t// ConditionalExpression\n\t\t// ArrowFunction\n\t\t// YieldExpression\n\t\t// LeftHandSideExpression AssignmentOperator AssignmentExpression\n\n\t\tif (this.peek().isType(Token.YIELD) /*&& this.isGenerator()*/) {\n\t\t\treturn this.parseYieldExpression();\n\t\t}\n\t\tlet expression: ExpressionNode = this.parseConditionalExpression();\n\t\tconst op = this.peek().token;\n\t\tif (!Token.isArrowOrAssignmentOp(op)) return expression;\n\t\t// Arrow functions.\n\t\tif (op === Token.ARROW) {\n\t\t\tif (!this.isIdentifier(expression) && !this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Malformed Arrow Fun Param List`));\n\t\t\t}\n\t\t\tif (expression instanceof SequenceExpression) {\n\t\t\t\tconst params = expression.getExpressions().map(expr => new Param(expr as CanDeclareExpression));\n\t\t\t\treturn this.parseArrowFunctionLiteral(params, ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\tif (expression instanceof GroupingExpression) {\n\t\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression.getNode() as CanDeclareExpression)], ArrowFunctionType.NORMAL);\n\t\t\t}\n\t\t\treturn this.parseArrowFunctionLiteral([new Param(expression)], ArrowFunctionType.NORMAL);\n\t\t}\n\t\tif (this.isAssignableIdentifier(expression)) {\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t\t}\n\t\t} else if (this.isProperty(expression)) {\n\t\t\t// throw new Error(this.errorMessage(`Invalid Property Binding Pattern`));\n\t\t} else if (this.isPattern(expression) && Token.isAssignment(op)) {\n\t\t\t// Destructuring assignment.\n\t\t\tif (this.isParenthesized(expression)) {\n\t\t\t\t// Scanner.Location loc(lhs_beg_pos, end_position());\n\t\t\t\t// if (expression_scope() -> IsCertainlyDeclaration()) {\n\t\t\t\t// \timpl() -> ReportMessageAt(loc,\n\t\t\t\t// \t\tMessageTemplate.kInvalidDestructuringTarget);\n\t\t\t\t// } else {\n\t\t\t\t// \t// Syntax Error if LHS is neither object literal nor an array literal\n\t\t\t\t// \t// (Parenthesized literals are\n\t\t\t\t// \t// CoverParenthesizedExpressionAndArrowParameterList).\n\t\t\t\t// \t// #sec-assignment-operators-static-semantics-early-errors\n\t\t\t\t// \timpl() -> ReportMessageAt(loc, MessageTemplate.kInvalidLhsInAssignment);\n\t\t\t\t// }\n\t\t\t}\n\t\t\t// expression_scope() -> ValidateAsPattern(expression, lhs_beg_pos, end_position());\n\t\t} else {\n\t\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Reference Expression`));\n\t\t\t}\n\t\t\tif (Token.isLogicalAssignmentOp(op)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Invalid Lhs In Assignment`));\n\t\t\t}\n\t\t}\n\n\t\tthis.consume(op);\n\t\t// const opPosition = this.position();\n\t\tconst right: ExpressionNode = this.parseAssignmentExpression();\n\t\t// Anonymous function name inference applies to =, ||=, &&=, and ??=.\n\n\t\tif (!Token.isAssignment(op)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid Destructuring Target`));\n\t\t}\n\t\treturn new AssignmentExpression(op.getName() as AssignmentOperator, expression, right);\n\t}\n\tprotected parseAssignmentExpression(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseArrowFunctionLiteral(parameters: ExpressionNode[], flag: ArrowFunctionType, rest?: boolean): ExpressionNode {\n\t\tthis.consume(Token.ARROW);\n\t\tconst body = this.parseArrowFunctionBody();\n\t\treturn new ArrowFunctionExpression(parameters, body, flag, rest);\n\t}\n\tprotected parseRegExpLiteral(): ExpressionNode {\n\t\tif (!this.scanner.scanRegExpPattern()) {\n\t\t\tthrow new Error('Unterminated RegExp');\n\t\t}\n\t\treturn this.scanner.currentToken().getValue();\n\t}\n\tprotected parseArrayLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ArrayLiteral ::\n\t\t// '[' Expression? (',' Expression?)* ']'\n\n\t\tthis.consume(Token.L_BRACKETS);\n\t\tconst values: ExpressionNode[] = [];\n\t\tlet firstSpreadIndex = -1;\n\n\t\twhile (!this.check(Token.R_BRACKETS)) {\n\t\t\tlet elem: ExpressionNode;\n\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\tthis.consume(Token.COMMA);\n\t\t\t\tcontinue;\n\t\t\t} else if (this.check(Token.ELLIPSIS)) {\n\t\t\t\tconst argument = this.parsePossibleDestructuringSubPattern();\n\t\t\t\telem = isPattern\n\t\t\t\t\t? new RestElement(argument as CanDeclareExpression)\n\t\t\t\t\t: new SpreadElement(argument)\n\n\t\t\t\tif (firstSpreadIndex < 0) {\n\t\t\t\t\tfirstSpreadIndex = values.length;\n\t\t\t\t}\n\t\t\t\tif (this.peek().isType(Token.COMMA)) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`Element After Rest @${this.position()}`));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telem = this.parsePossibleDestructuringSubPattern();\n\t\t\t}\n\t\t\tvalues.push(elem);\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ArrayPattern(values as CanDeclareExpression[]);\n\t\t}\n\t\treturn new ArrayExpression(values);\n\t}\n\tprotected parsePossibleDestructuringSubPattern(): ExpressionNode {\n\t\treturn this.parseAssignmentExpressionCoverGrammar();\n\t}\n\tprotected parseObjectLiteral(isPattern: boolean): ExpressionNode {\n\t\t// ObjectLiteral ::\n\t\t// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'\n\n\t\tthis.consume(Token.L_CURLY);\n\t\tconst properties: ExpressionNode[] = [];\n\t\twhile (!this.check(Token.R_CURLY)) {\n\t\t\tconst property: ExpressionNode = this.parseObjectPropertyDefinition(isPattern);\n\t\t\tproperties.push(property);\n\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\tthis.expect(Token.COMMA);\n\t\t\t}\n\t\t}\n\t\tif (isPattern) {\n\t\t\treturn new ObjectPattern(properties as (Property | RestElement)[]);\n\t\t}\n\t\treturn new ObjectExpression(properties as Property[]);\n\t}\n\tprotected parseObjectPropertyDefinition(isPattern: boolean): ExpressionNode {\n\t\tconst propInfo = { kind: PropertyKind.NotSet } as Required<PropertyKindInfo>;\n\t\tconst nameExpression = this.parseProperty(propInfo);\n\n\t\tswitch (propInfo.kind) {\n\t\t\tcase PropertyKind.Spread:\n\t\t\t\tlet value: SpreadElement | RestElement = nameExpression as SpreadElement;\n\t\t\t\tif (isPattern) {\n\t\t\t\t\tvalue = new RestElement(value.getArgument() as CanDeclareExpression);\n\t\t\t\t}\n\t\t\t\treturn new Property(value.getArgument(), value, 'init');\n\n\t\t\tcase PropertyKind.Value: {\n\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\tconst value = this.parsePossibleDestructuringSubPattern();\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Assign:\n\t\t\tcase PropertyKind.ShorthandOrClassField:\n\t\t\tcase PropertyKind.Shorthand: {\n\t\t\t\t// PropertyDefinition\n\t\t\t\t// IdentifierReference\n\t\t\t\t// CoverInitializedName\n\t\t\t\t//\n\t\t\t\t// CoverInitializedName\n\t\t\t\t// IdentifierReference Initializer?\n\n\t\t\t\tconst lhs = new Identifier(propInfo.name);\n\t\t\t\tif (!this.isAssignableIdentifier(lhs)) {\n\t\t\t\t\tthrow new Error(this.errorMessage('Strict Eval Arguments'));\n\t\t\t\t}\n\t\t\t\tlet value: ExpressionNode;\n\t\t\t\tif (this.peek().isType(Token.ASSIGN)) {\n\t\t\t\t\tthis.consume(Token.ASSIGN);\n\t\t\t\t\tconst rhs = this.parseAssignmentExpression();\n\t\t\t\t\tvalue = new AssignmentExpression(Token.ASSIGN.getName() as AssignmentOperator, lhs, rhs);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = lhs;\n\t\t\t\t}\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.Method: {\n\t\t\t\t// MethodDefinition\n\t\t\t\t// PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\t\t\t\t// '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'\n\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, 'init');\n\t\t\t}\n\n\t\t\tcase PropertyKind.AccessorGetter:\n\t\t\tcase PropertyKind.AccessorSetter: {\n\t\t\t\tconst isGet = propInfo.kind == PropertyKind.AccessorGetter;\n\t\t\t\tconst value = this.parseFunctionLiteral(propInfo.funcFlag);\n\t\t\t\treturn new Property(nameExpression, value, isGet ? 'get' : 'set');\n\t\t\t}\n\n\t\t\tcase PropertyKind.ClassField:\n\t\t\tcase PropertyKind.NotSet:\n\t\t\t\treturn NullNode;\n\t\t}\n\t}\n\tprotected parseProperty(propInfo: PropertyKindInfo): ExpressionNode {\n\t\tlet nextToken = this.peek();\n\t\tif (this.check(Token.ASYNC)) {\n\t\t\t// async\n\t\t\tnextToken = this.peek();\n\t\t\tif (nextToken.isNotType(Token.MUL)\n\t\t\t\t&& parsePropertyKindFromToken(nextToken.token, propInfo)\n\t\t\t\t|| this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\t\treturn AsyncIdentifier;\n\t\t\t}\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC;\n\t\t}\n\n\t\tif (this.check(Token.MUL)) {\n\t\t\t// async*\n\t\t\tpropInfo.kind = PropertyKind.Method;\n\t\t\tpropInfo.funcFlag = FunctionKind.ASYNC_GENERATOR;\n\t\t}\n\n\t\tnextToken = this.peek();\n\t\tif (propInfo.kind == PropertyKind.NotSet && nextToken.isType(Token.GET) || nextToken.isType(Token.SET)) {\n\t\t\tconst token = this.next();\n\t\t\tif (parsePropertyKindFromToken(this.peek().token, propInfo)) {\n\t\t\t\treturn nextToken.isType(Token.GET) ? GetIdentifier : SetIdentifier;\n\t\t\t}\n\t\t\tif (token.isType(Token.GET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorGetter;\n\t\t\t} else if (token.isType(Token.SET)) {\n\t\t\t\tpropInfo.kind = PropertyKind.AccessorSetter;\n\t\t\t}\n\t\t}\n\t\tlet propertyName: ExpressionNode;\n\t\tswitch (nextToken.token) {\n\t\t\tcase Token.PRIVATE_NAME:\n\t\t\t\tthis.consume(Token.PRIVATE_NAME);\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropertyName = this.getIdentifier();\n\t\t\t\tbreak;\n\t\t\tcase Token.STRING:\n\t\t\tcase Token.NUMBER:\n\t\t\tcase Token.BIGINT:\n\t\t\t\t// \"12\" -> 12\n\t\t\t\t// 12.3 -> \"12.3\"\n\t\t\t\t// 12.30 -> \"12.3\"\n\t\t\t\tthis.consume(nextToken.token);\n\t\t\t\tpropertyName = nextToken.getValue();\n\t\t\t\tpropInfo.name = (propertyName as StringLiteral).getValue();\n\t\t\t\tbreak;\n\t\t\tcase Token.L_BRACKETS:\n\t\t\t\t// [Symbol.iterator]\n\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\tpropertyName = this.parseAssignmentExpression();\n\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t\t\t}\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\treturn propertyName;\n\t\t\tcase Token.ELLIPSIS:\n\t\t\t\tif (propInfo.kind == PropertyKind.NotSet) {\n\t\t\t\t\tthis.consume(Token.ELLIPSIS);\n\t\t\t\t\tpropertyName = this.parsePossibleDestructuringSubPattern();\n\t\t\t\t\tpropInfo.kind = PropertyKind.Spread;\n\n\t\t\t\t\tif (!this.isValidReferenceExpression(propertyName)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Invalid Rest Binding/Assignment Pattern'));\n\t\t\t\t\t}\n\t\t\t\t\tif (this.peek().isNotType(Token.R_CURLY)) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage('Element After Rest'));\n\t\t\t\t\t}\n\t\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\t\treturn propertyName;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpropertyName = new StringLiteral(this.parsePropertyName().toString());\n\t\t\t\t// propertyName = this.parsePropertyName();\n\t\t\t\tpropInfo.name = propertyName.toString();\n\t\t\t\tbreak;\n\t\t}\n\t\tif (propInfo.kind === PropertyKind.NotSet) {\n\t\t\tparsePropertyKindFromToken(this.peek().token, propInfo);\n\t\t}\n\t\treturn propertyName;\n\t}\n\tprotected parseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) return expression;\n\t\treturn this.doParseMemberExpressionContinuation(expression);\n\t}\n\tprotected doParseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!Token.isMember(this.peek().token)) {\n\t\t\tthrow new Error(this.errorMessage(`Parsing member expression`));\n\t\t}\n\t\t// Parses this part of MemberExpression:\n\t\t// ('[' Expression ']' | '.' Identifier | TemplateLiteral)*\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\texpression = new MemberExpression(expression, index, true);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key: ExpressionNode = this.parsePropertyName();\n\t\t\t\t\texpression = new MemberExpression(expression, key, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase Token.TEMPLATE_LITERALS: {\n\t\t\t\t\texpression = this.parseTemplateLiteral(expression);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (Token.isMember(this.peek().token));\n\t\treturn expression;\n\t}\n\tprotected parsePropertyName(): ExpressionNode {\n\t\tconst next = this.next();\n\t\tif (next.getValue() instanceof Identifier) {\n\t\t\treturn next.getValue();\n\t\t}\n\t\t// check keyword as identifier\n\t\tif (Token.isPropertyName(next.token)) {\n\t\t\treturn new Identifier(next.token.getName());\n\t\t}\n\t\tthrow new Error(this.errorMessage(`Parsing property expression: Unexpected Token`));\n\t}\n\tprotected parsePipelineExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// expression '|>' function [':' expression [':'? expression] ] *\n\t\t// expression '|>' function '('[expression ','?]* ')'\n\t\t//\n\t\t// expression '|>' function ':' expression [':' expression | '?']*]\n\t\t// expression '|>' function '(' expression [',' expression | '?']* ')'\n\t\t//\n\t\t// [~Await]PipelineExpression[?In, ?Yield, ?Await] |> LogicalORExpression[?In, ?Yield, ?Await]\n\t\t// [+Await]PipelineExpression[? In, ? Yield, ? Await] |> [lookahead ∉ { await }]LogicalORExpression[? In, ? Yield, ? Await]\n\n\t\tlet token: Token;\n\t\twhile (Token.isPipelineOperator(token = this.peek().token)) {\n\t\t\tthis.consume(token);\n\t\t\texpression = this.parsePipelineBody(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parsePipelineBody(lhs: ExpressionNode): ExpressionNode {\n\t\tlet body: ExpressionNode | undefined;\n\t\tlet token = this.peek();\n\t\t// parse function\n\t\tswitch (token.token) {\n\t\t\tcase Token.FUNCTION:\n\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.GENERATOR);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.NORMAL);\n\t\t\t\tbreak;\n\t\t\tcase Token.ASYNC:\n\t\t\t\tif (this.peekAhead().isType(Token.FUNCTION)) {\n\t\t\t\t\tthis.consume(Token.ASYNC);\n\t\t\t\t\tthis.consume(Token.FUNCTION);\n\t\t\t\t\tif (this.peek().isType(Token.MUL)) {\n\t\t\t\t\t\tthis.consume(Token.MUL);\n\t\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC_GENERATOR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbody = this.parseFunctionExpression(FunctionKind.ASYNC);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (body) {\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\t\tif (token.isType(Token.L_PARENTHESES)) {\n\t\t\t// parse arrow function\n\t\t\t// x |> ( y => y+1 )\n\t\t\tbody = this.parsePrimaryExpression();\n\t\t\treturn new PipelineExpression(lhs, body);\n\t\t}\n\n\t\t// parse angular-like and f# and partial operator syntax\n\t\tconst func = this.parseMemberExpression(); //this.parseLogicalExpression();\n\t\tlet args: (ExpressionNode | '?' | '...?')[] = [];\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.COLON:\n\t\t\t\t// support angular pipeline syntax\n\t\t\t\tdo {\n\t\t\t\t\tthis.consume(Token.COLON);\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (this.peek().isType(Token.COLON));\n\t\t\t\tbreak;\n\t\t\tcase Token.L_PARENTHESES:\n\t\t\t\t// es2022 syntax, F# & partial operator\n\t\t\t\tthis.consume(Token.L_PARENTHESES);\n\t\t\t\tlet indexed = false;\n\t\t\t\twhile (this.peek().isNotType(Token.R_PARENTHESES)) {\n\t\t\t\t\tconst isSpread = this.check(Token.ELLIPSIS);\n\t\t\t\t\tif (this.peek().isType(Token.CONDITIONAL)) {\n\t\t\t\t\t\tthis.consume(Token.CONDITIONAL);\n\t\t\t\t\t\tindexed = true;\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push('...?');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push('?');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst arg = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\t\t\tif (isSpread) {\n\t\t\t\t\t\t\targs.push(new SpreadElement(arg));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\targs.push(arg);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.check(Token.COMMA);\n\t\t\t\t}\n\t\t\t\tthis.expect(Token.R_PARENTHESES);\n\t\t\t\t// should be indexed, has partial operator\n\t\t\t\tif (!indexed) {\n\t\t\t\t\t// z |> method(x, y) === method(x, y)(z)\n\t\t\t\t\tbody = new CallExpression(func, args as ExpressionNode[]);\n\t\t\t\t\treturn new PipelineExpression(lhs, body);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new PipelineExpression(lhs, func, args);\n\t}\n\tprotected parseConditionalExpression(): ExpressionNode {\n\t\t// ConditionalExpression ::\n\t\t// LogicalExpression\n\t\t// LogicalExpression '?' AssignmentExpression ':' AssignmentExpression\n\t\t//\n\n\t\tlet expression: ExpressionNode = this.parseLogicalExpression();\n\t\texpression = this.parsePipelineExpression(expression);\n\t\treturn this.peek().isType(Token.CONDITIONAL) ? this.parseConditionalContinuation(expression) : expression;\n\t}\n\tprotected parseLogicalExpression(): ExpressionNode {\n\t\t// LogicalExpression ::\n\t\t// LogicalORExpression\n\t\t// CoalesceExpression\n\n\t\t// Both LogicalORExpression and CoalesceExpression start with BitwiseOR.\n\t\t// Parse for binary expressions >= 6 (BitwiseOR);\n\n\t\tlet expression: ExpressionNode = this.parseBinaryExpression(6);\n\t\tconst peek = this.peek();\n\t\tif (peek.isType(Token.AND) || peek.isType(Token.OR)) {\n\t\t\t// LogicalORExpression, pickup parsing where we left off.\n\t\t\tconst precedence = peek.token.getPrecedence();\n\t\t\texpression = this.parseBinaryContinuation(expression, 4, precedence);\n\t\t} else if (peek.isType(Token.NULLISH)) {\n\t\t\texpression = this.parseNullishExpression(expression);\n\t\t}\n\t\treturn expression;\n\t}\n\tprotected parseBinaryContinuation(x: ExpressionNode, prec: number, prec1: number): ExpressionNode {\n\t\tdo {\n\t\t\t// prec1 >= 4\n\t\t\twhile (this.peek().token.getPrecedence() === prec1) {\n\t\t\t\tlet y: ExpressionNode;\n\t\t\t\tlet op = this.next();\n\n\t\t\t\tconst is_right_associative = op.isType(Token.EXP);\n\t\t\t\tconst next_prec = is_right_associative ? prec1 : prec1 + 1;\n\t\t\t\ty = this.parseBinaryExpression(next_prec);\n\n\n\t\t\t\t// For now we distinguish between comparisons and other binary\n\t\t\t\t// operations. (We could combine the two and get rid of this\n\t\t\t\t// code and AST node eventually.)\n\n\t\t\t\tif (Token.isCompare(op.token)) {\n\t\t\t\t\t// We have a comparison.\n\t\t\t\t\tlet cmp = op.token;\n\t\t\t\t\tswitch (op.token) {\n\t\t\t\t\t\tcase Token.NE: cmp = Token.EQ; break;\n\t\t\t\t\t\tcase Token.NE_STRICT: cmp = Token.EQ_STRICT; break;\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, cmp);\n\t\t\t\t\tif (op.isNotType(cmp)) {\n\t\t\t\t\t\t// The comparison was negated - add a NOT.\n\t\t\t\t\t\tx = buildUnaryExpression(x, Token.NOT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tx = shortcutNumericLiteralBinaryExpression(x, y, op.token);\n\t\t\t\t}\n\t\t\t}\n\t\t\t--prec1;\n\t\t} while (prec1 >= prec);\n\n\t\treturn x;\n\t}\n\tprotected parseBinaryExpression(precedence: number): ExpressionNode {\n\t\tconst x: ExpressionNode = this.parseUnaryExpression();\n\t\tconst precedence1 = this.peek().token.getPrecedence();\n\t\tif (precedence1 >= precedence) {\n\t\t\treturn this.parseBinaryContinuation(x, precedence, precedence1);\n\t\t}\n\t\treturn x;\n\t}\n\tprotected parseUnaryExpression(): ExpressionNode {\n\t\t// UnaryExpression ::\n\t\t// PostfixExpression\n\t\t// 'delete' UnaryExpression\n\t\t// 'void' UnaryExpression\n\t\t// 'typeof' UnaryExpression\n\t\t// '++' UnaryExpression\n\t\t// '--' UnaryExpression\n\t\t// '+' UnaryExpression\n\t\t// '-' UnaryExpression\n\t\t// '~' UnaryExpression\n\t\t// '!' UnaryExpression\n\t\t// [+Await] AwaitExpression[?Yield]\n\n\t\tconst op = this.peek();\n\t\tif (Token.isUnaryOrCount(op.token)) {\n\t\t\treturn this.parseUnaryOrPrefixExpression();\n\t\t}\n\t\tif (op.isType(Token.AWAIT)) {\n\t\t\treturn this.parseAwaitExpression();\n\t\t}\n\t\treturn this.parsePostfixExpression();\n\t}\n\tprotected parseUnaryOrPrefixExpression(): ExpressionNode {\n\t\tconst op = this.next();\n\t\tconst expression = this.parseUnaryExpression();\n\t\tif (Token.isUnary(op.token)) {\n\t\t\tif (op.isType(Token.DELETE)) {\n\t\t\t\tif (this.isIdentifier(expression)) {\n\t\t\t\t\t// \"delete identifier\" is a syntax error in strict mode.\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"delete identifier\" is a syntax error in strict mode`));\n\t\t\t\t}\n\t\t\t\tif (expression instanceof MemberExpression && expression.getProperty().toString().startsWith('#')) {\n\t\t\t\t\tthrow new Error(this.errorMessage(`\"Delete Private Field\" is a syntax error`));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token Unary Exponentiation`));\n\t\t\t}\n\t\t}\n\n\t\tif (Token.isCount(op.token) || Token.isUnary(op.token)) {\n\t\t\t// Allow the parser to rewrite the expression.\n\t\t\treturn buildUnaryExpression(expression, op.token);\n\t\t}\n\t\tthrow new Error(this.errorMessage(`while rewrite unary operation`));\n\t}\n\tprotected parsePostfixExpression(): ExpressionNode {\n\t\t// PostfixExpression ::\n\t\t// LeftHandSideExpression ('++' | '--')?\n\n\t\tconst expression: ExpressionNode = this.parseLeftHandSideExpression();\n\t\tif (!Token.isCount(this.peek().token) || this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\treturn expression;\n\t\t}\n\t\treturn this.parsePostfixContinuation(expression);\n\t}\n\tprotected parsePostfixContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tif (!this.isValidReferenceExpression(expression)) {\n\t\t\tthrow new Error(this.errorMessage(`Invalid LHS In Postfix Op.`));\n\t\t}\n\t\tconst op = this.next();\n\t\treturn buildPostfixExpression(expression, op.token);\n\t}\n\tprotected parseLeftHandSideExpression(): ExpressionNode {\n\t\t// LeftHandSideExpression ::\n\t\t// (NewExpression | MemberExpression) ...\n\t\tconst result = this.parseMemberExpression();\n\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\treturn this.parseLeftHandSideContinuation(result);\n\t}\n\tprotected parseLeftHandSideContinuation(result: ExpressionNode): ExpressionNode {\n\t\tif (this.peek().isType(Token.L_PARENTHESES)\n\t\t\t&& this.isIdentifier(result)\n\t\t\t&& this.scanner.currentToken().isType(Token.ASYNC)\n\t\t\t&& !this.scanner.hasLineTerminatorBeforeNext()) {\n\t\t\tconst args = this.parseArguments(ParsingArrowHeadFlag.AsyncArrowFunction);\n\t\t\tif (this.peek().isType(Token.ARROW)) {\n\t\t\t\t// async () => ...\n\t\t\t\tif (!args.length) return new EmptyStatement;\n\t\t\t\t// async ( Arguments ) => ...\n\t\t\t\treturn this.expressionListToExpression(args);\n\t\t\t}\n\t\t\tresult = new CallExpression(result, args);\n\t\t\tif (!Token.isPropertyOrCall(this.peek().token)) return result;\n\t\t}\n\n\t\tlet optionalChaining = false;\n\t\tlet isOptional = false;\n\t\tdo {\n\t\t\tswitch (this.peek().token) {\n\t\t\t\t// chain\n\t\t\t\tcase Token.QUESTION_PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_PERIOD);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tif (Token.isPropertyOrCall(this.peek().token)) continue;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.L_BRACKETS: {\n\t\t\t\t\tthis.consume(Token.L_BRACKETS);\n\t\t\t\t\tconst index = this.parseExpressionCoverGrammar();\n\t\t\t\t\tresult = new MemberExpression(result, index, true, isOptional);\n\t\t\t\t\tthis.expect(Token.R_BRACKETS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Property */\n\t\t\t\tcase Token.PERIOD: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.PERIOD);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new MemberExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Call */\n\t\t\t\tcase Token.L_PARENTHESES: {\n\t\t\t\t\tconst args = this.parseArguments();\n\t\t\t\t\tif (result.toString() === 'eval') {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`'eval(...)' is not supported.`));\n\t\t\t\t\t}\n\t\t\t\t\tresult = new CallExpression(result, args, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* bind call */\n\t\t\t\tcase Token.BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Unexpected Token:${this.position()}`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.BIND);\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, false, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* chain bind call */\n\t\t\t\tcase Token.QUESTION_BIND: {\n\t\t\t\t\tif (isOptional) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Failure Expression`));\n\t\t\t\t\t}\n\t\t\t\t\tthis.consume(Token.QUESTION_BIND);\n\t\t\t\t\tisOptional = true;\n\t\t\t\t\toptionalChaining = true;\n\t\t\t\t\tconst key = this.parsePropertyName();\n\t\t\t\t\tresult = new BindExpression(result, key, true, isOptional);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Template literals in/after an Optional Chain not supported:\n\t\t\t\t\tif (optionalChaining) {\n\t\t\t\t\t\tthrow new Error(this.errorMessage(`Optional Chaining No Template support`));\n\t\t\t\t\t}\n\t\t\t\t\t/* Tagged Template */\n\t\t\t\t\tresult = this.parseTemplateLiteral(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (isOptional) {\n\t\t\t\tisOptional = false;\n\t\t\t}\n\t\t} while (Token.isPropertyOrCall(this.peek().token));\n\t\tif (optionalChaining) {\n\t\t\tresult = new ChainExpression(result);\n\t\t}\n\t\treturn result;\n\t}\n\tprotected parseAwaitExpression(): ExpressionNode {\n\t\tthis.consume(Token.AWAIT);\n\t\tconst value = this.parseUnaryExpression();\n\t\tif (this.peek().isType(Token.EXP)) {\n\t\t\tthrow new Error(this.scanner.createError(`Unexpected Token Unary Exponentiation`));\n\t\t}\n\t\treturn buildUnaryExpression(value, Token.AWAIT);\n\t}\n\tprotected parseNullishExpression(expression: ExpressionNode): ExpressionNode {\n\t\t// CoalesceExpression ::\n\t\t// CoalesceExpressionHead ?? BitwiseORExpression\n\t\t//\n\t\t// CoalesceExpressionHead ::\n\t\t// CoalesceExpression\n\t\t// BitwiseORExpression\n\n\t\t// We create a binary operation for the first nullish, otherwise collapse\n\t\t// into an nary expression.\n\n\t\tconst list: ExpressionNode[] = [];\n\t\tlist.push(expression);\n\t\twhile (this.peek().isType(Token.NULLISH)) {\n\t\t\tthis.consume(Token.NULLISH);\n\t\t\t// Parse BitwiseOR or higher.\n\t\t\texpression = this.parseBinaryExpression(6);\n\t\t\tlist.push(expression);\n\t\t}\n\t\texpression = list.pop()!;\n\t\texpression = list.reverse()\n\t\t\t.reduce((previous, current) => new LogicalExpression(Token.NULLISH.getName() as LogicalOperator, current, previous), expression);\n\t\treturn expression;\n\t}\n\tprotected parseConditionalContinuation(expression: ExpressionNode): ExpressionNode {\n\t\tthis.consume(Token.CONDITIONAL);\n\t\tconst left: ExpressionNode = this.parseAssignmentExpression();\n\t\tthis.expect(Token.COLON);\n\t\tconst right = this.parseAssignmentExpression();\n\t\treturn new ConditionalExpression(expression, left, right);\n\t}\n\tprotected parseYieldExpression(): ExpressionNode {\n\t\t// YieldExpression ::\n\t\t// 'yield' ([no line terminator] '*'? AssignmentExpression)?\n\t\tthis.consume(Token.YIELD);\n\t\tlet delegating = false; // yield*\n\t\tlet expression: ExpressionNode | undefined;\n\t\tif (this.check(Token.MUL)) {\n\t\t\tdelegating = true;\n\t\t}\n\t\tswitch (this.peek().token) {\n\t\t\tcase Token.EOS:\n\t\t\tcase Token.SEMICOLON:\n\t\t\tcase Token.R_CURLY:\n\t\t\tcase Token.R_BRACKETS:\n\t\t\tcase Token.R_PARENTHESES:\n\t\t\tcase Token.COLON:\n\t\t\tcase Token.COMMA:\n\t\t\tcase Token.IN:\n\t\t\t\t// The above set of tokens is the complete set of tokens that can appear\n\t\t\t\t// after an AssignmentExpression, and none of them can start an\n\t\t\t\t// AssignmentExpression. This allows us to avoid looking for an RHS for\n\t\t\t\t// a regular yield, given only one look-ahead token.\n\t\t\t\tif (!delegating) break;\n\t\t\t\t// Delegating yields require an RHS; fall through.\n\t\t\t\t// V8_FALLTHROUGH;\n\t\t\t\tthrow new Error(this.errorMessage(`Delegating yields require an RHS`));\n\t\t\tdefault:\n\t\t\t\texpression = this.parseAssignmentExpressionCoverGrammar();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn new YieldExpression(delegating, expression);\n\t}\n\tprotected parseNewTargetExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (new.target) not supported.'));\n\t}\n\tprotected parseClassDeclaration(names: ExpressionNode[] | undefined, defaultExport: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseClassLiteral(name: ExpressionNode | undefined, isStrictReserved: boolean): ExpressionNode {\n\t\tthrow new Error(this.errorMessage(`Expression (class) not supported.`));\n\t}\n\tprotected parseSuperExpression(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (supper) not supported.'));\n\t}\n\tprotected parseImportExpressions(): ExpressionNode {\n\t\tthrow new Error(this.errorMessage('Expression (import) not supported.'));\n\t}\n}\n"]}
|