@ibyar/expressions 0.3.0 → 0.3.8
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/LICENSE +1 -1
- package/README.md +79 -6
- package/api/abstract.d.ts +5 -7
- package/api/abstract.js +2 -5
- package/api/abstract.js.map +1 -1
- package/api/app/class.d.ts +99 -8
- package/api/app/class.js +250 -29
- package/api/app/class.js.map +1 -1
- package/api/app/program.d.ts +1 -2
- package/api/app/program.js +1 -4
- package/api/app/program.js.map +1 -1
- package/api/computing/call.d.ts +4 -4
- package/api/computing/call.js +20 -22
- package/api/computing/call.js.map +1 -1
- package/api/computing/new.d.ts +1 -2
- package/api/computing/new.js +4 -7
- package/api/computing/new.js.map +1 -1
- package/api/computing/rest.d.ts +16 -0
- package/api/computing/rest.js +40 -0
- package/api/computing/rest.js.map +1 -0
- package/api/computing/return.d.ts +1 -2
- package/api/computing/return.js +2 -5
- package/api/computing/return.js.map +1 -1
- package/api/computing/spread.d.ts +1 -2
- package/api/computing/spread.js +3 -9
- package/api/computing/spread.js.map +1 -1
- package/api/computing/throw.d.ts +3 -6
- package/api/computing/throw.js +5 -14
- package/api/computing/throw.js.map +1 -1
- package/api/definition/array.d.ts +12 -10
- package/api/definition/array.js +44 -16
- package/api/definition/array.js.map +1 -1
- package/api/definition/bind.d.ts +21 -0
- package/api/definition/bind.js +81 -0
- package/api/definition/bind.js.map +1 -0
- package/api/definition/comment.d.ts +1 -2
- package/api/definition/comment.js +1 -4
- package/api/definition/comment.js.map +1 -1
- package/api/definition/function.d.ts +12 -15
- package/api/definition/function.js +49 -58
- package/api/definition/function.js.map +1 -1
- package/api/definition/member.d.ts +8 -5
- package/api/definition/member.js +40 -31
- package/api/definition/member.js.map +1 -1
- package/api/definition/object.d.ts +16 -17
- package/api/definition/object.js +24 -16
- package/api/definition/object.js.map +1 -1
- package/api/definition/statement.d.ts +1 -2
- package/api/definition/statement.js +2 -5
- package/api/definition/statement.js.map +1 -1
- package/api/definition/values.d.ts +12 -11
- package/api/definition/values.js +17 -12
- package/api/definition/values.js.map +1 -1
- package/api/expression.d.ts +8 -4
- package/api/expression.js.map +1 -1
- package/api/index.d.ts +7 -6
- package/api/index.js +7 -6
- package/api/index.js.map +1 -1
- package/api/module/export.d.ts +1 -2
- package/api/module/export.js +1 -4
- package/api/module/export.js.map +1 -1
- package/api/module/import.d.ts +1 -2
- package/api/module/import.js +1 -4
- package/api/module/import.js.map +1 -1
- package/api/module/module.d.ts +1 -2
- package/api/module/module.js +2 -5
- package/api/module/module.js.map +1 -1
- package/api/operators/assignment.js +2 -2
- package/api/operators/assignment.js.map +1 -1
- package/api/operators/await.d.ts +1 -2
- package/api/operators/await.js +2 -5
- package/api/operators/await.js.map +1 -1
- package/api/operators/binary.js +4 -4
- package/api/operators/binary.js.map +1 -1
- package/api/operators/chaining.d.ts +9 -13
- package/api/operators/chaining.js +14 -48
- package/api/operators/chaining.js.map +1 -1
- package/api/operators/comma.d.ts +1 -2
- package/api/operators/comma.js +2 -5
- package/api/operators/comma.js.map +1 -1
- package/api/operators/grouping.d.ts +1 -2
- package/api/operators/grouping.js +2 -5
- package/api/operators/grouping.js.map +1 -1
- package/api/operators/logical.js.map +1 -1
- package/api/operators/pipeline.d.ts +4 -5
- package/api/operators/pipeline.js +23 -25
- package/api/operators/pipeline.js.map +1 -1
- package/api/operators/ternary.d.ts +1 -2
- package/api/operators/ternary.js +1 -4
- package/api/operators/ternary.js.map +1 -1
- package/api/operators/unary.d.ts +1 -2
- package/api/operators/unary.js +2 -5
- package/api/operators/unary.js.map +1 -1
- package/api/operators/update.d.ts +1 -2
- package/api/operators/update.js +2 -5
- package/api/operators/update.js.map +1 -1
- package/api/statement/{controlflow → control}/block.d.ts +1 -2
- package/api/statement/{controlflow → control}/block.js +2 -5
- package/api/statement/control/block.js.map +1 -0
- package/api/statement/{controlflow → control}/empty.d.ts +1 -2
- package/api/statement/{controlflow → control}/empty.js +1 -4
- package/api/statement/control/empty.js.map +1 -0
- package/api/statement/{controlflow → control}/if.d.ts +1 -2
- package/api/statement/{controlflow → control}/if.js +2 -5
- package/api/statement/control/if.js.map +1 -0
- package/api/statement/{controlflow → control}/switch.d.ts +2 -4
- package/api/statement/{controlflow → control}/switch.js +5 -11
- package/api/statement/control/switch.js.map +1 -0
- package/api/statement/{controlflow → control}/terminate.d.ts +1 -2
- package/api/statement/{controlflow → control}/terminate.js +1 -4
- package/api/statement/control/terminate.js.map +1 -0
- package/api/statement/declarations/declares.d.ts +13 -14
- package/api/statement/declarations/declares.js +10 -9
- package/api/statement/declarations/declares.js.map +1 -1
- package/api/statement/iterations/for.d.ts +14 -14
- package/api/statement/iterations/for.js +12 -24
- package/api/statement/iterations/for.js.map +1 -1
- package/api/statement/iterations/while.d.ts +2 -4
- package/api/statement/iterations/while.js +4 -10
- package/api/statement/iterations/while.js.map +1 -1
- package/package.json +18 -4
- package/scope/scope.d.ts +23 -3
- package/scope/scope.js +67 -1
- package/scope/scope.js.map +1 -1
- package/scope/stack.d.ts +14 -3
- package/scope/stack.js +61 -1
- package/scope/stack.js.map +1 -1
- package/v8/app.js.map +1 -1
- package/v8/nodes.d.ts +1 -2
- package/v8/nodes.js +2 -11
- package/v8/nodes.js.map +1 -1
- package/v8/parser.d.ts +5 -4
- package/v8/parser.js +165 -69
- package/v8/parser.js.map +1 -1
- package/v8/stream.js +20 -6
- package/v8/stream.js.map +1 -1
- package/v8/token.d.ts +3 -0
- package/v8/token.js +9 -0
- package/v8/token.js.map +1 -1
- package/api/operators/destruct.d.ts +0 -19
- package/api/operators/destruct.js +0 -95
- package/api/operators/destruct.js.map +0 -1
- package/api/statement/controlflow/block.js.map +0 -1
- package/api/statement/controlflow/empty.js.map +0 -1
- package/api/statement/controlflow/if.js.map +0 -1
- package/api/statement/controlflow/switch.js.map +0 -1
- package/api/statement/controlflow/terminate.js.map +0 -1
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\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\tthrow new Error(this.errorMessage('Expression (new.target) not supported.'));\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 { 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"]}
|
package/v8/nodes.d.ts
CHANGED
|
@@ -3,12 +3,11 @@ import { Token, TokenExpression } from './token.js';
|
|
|
3
3
|
import { BigIntLiteral, NumberLiteral, BooleanLiteral, StringLiteral } from '../api/definition/values.js';
|
|
4
4
|
export declare function creteInfixExpression(op: string, left: ExpressionNode, right: ExpressionNode): ExpressionNode;
|
|
5
5
|
export declare function createTernaryExpression(op: string, logical: ExpressionNode, ifTrue: ExpressionNode, ifFalse: ExpressionNode): ExpressionNode;
|
|
6
|
-
export declare function createPipelineExpression(op: string, param: ExpressionNode, func: ExpressionNode, args?: ('?' | ExpressionNode)[]): ExpressionNode;
|
|
7
6
|
export declare function cretePrefixExpression(op: string, node: ExpressionNode): ExpressionNode;
|
|
8
7
|
export declare function cretePostfixExpression(op: string, node: ExpressionNode): ExpressionNode;
|
|
9
8
|
export declare function creteCommaExpression(nodes: ExpressionNode[]): ExpressionNode;
|
|
10
9
|
export declare function shortcutNumericLiteralBinaryExpression(x: ExpressionNode, y: ExpressionNode, op: Token): ExpressionNode;
|
|
11
|
-
export declare function coverValue(value: any): false | StringLiteral | NumberLiteral | BigIntLiteral | BooleanLiteral | import("../api/
|
|
10
|
+
export declare function coverValue(value: any): false | StringLiteral | NumberLiteral | BigIntLiteral | BooleanLiteral | import("../api/definition/values.js").NullishLiteral;
|
|
12
11
|
export declare function buildUnaryExpression(expression: ExpressionNode, op: Token): ExpressionNode;
|
|
13
12
|
export declare function buildPostfixExpression(expression: ExpressionNode, op: Token): ExpressionNode;
|
|
14
13
|
export declare function expressionFromLiteral(te: TokenExpression): ExpressionNode;
|
package/v8/nodes.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
+
import { Token } from './token.js';
|
|
1
2
|
import { AssignmentExpression } from '../api/operators/assignment.js';
|
|
2
3
|
import { LogicalExpression } from '../api/operators/logical.js';
|
|
3
4
|
import { UnaryExpression } from '../api/operators/unary.js';
|
|
4
5
|
import { ConditionalExpression } from '../api/operators/ternary.js';
|
|
5
|
-
import { PipelineExpression } from '../api/operators/pipeline.js';
|
|
6
6
|
import { SequenceExpression } from '../api/operators/comma.js';
|
|
7
|
-
import { Token } from './token.js';
|
|
8
7
|
import { Literal, BigIntLiteral, NumberLiteral, BooleanLiteral, TrueNode, FalseNode, NullNode, StringLiteral, UndefinedNode } from '../api/definition/values.js';
|
|
9
8
|
import { AwaitExpression } from '../api/operators/await.js';
|
|
10
9
|
import { UpdateExpression } from '../api/operators/update.js';
|
|
11
|
-
import { BinaryExpression } from '../api/
|
|
10
|
+
import { BinaryExpression } from '../api/operators/binary.js';
|
|
12
11
|
export function creteInfixExpression(op, left, right) {
|
|
13
12
|
switch (op) {
|
|
14
13
|
case '=':
|
|
@@ -69,14 +68,6 @@ export function createTernaryExpression(op, logical, ifTrue, ifFalse) {
|
|
|
69
68
|
throw new Error(`${op} is not ternary operator`);
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
|
-
export function createPipelineExpression(op, param, func, args) {
|
|
73
|
-
switch (op) {
|
|
74
|
-
case '|>':
|
|
75
|
-
return new PipelineExpression(param, func, args);
|
|
76
|
-
default:
|
|
77
|
-
throw new Error(`${op} is not pipeline operator`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
71
|
export function cretePrefixExpression(op, node) {
|
|
81
72
|
switch (op) {
|
|
82
73
|
case '++':
|
package/v8/nodes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/expressions/v8/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExpressionNode } from '../api/expression.js';\nimport type { Stack } from '../scope/stack.js';\nimport { AssignmentExpression } from '../api/operators/assignment.js';\nimport { LogicalExpression } from '../api/operators/logical.js';\nimport { UnaryExpression } from '../api/operators/unary.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { PipelineExpression } from '../api/operators/pipeline.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport { Token, TokenExpression } from './token.js';\nimport {\n\tLiteral, BigIntLiteral, NumberLiteral,\n\tBooleanLiteral, TrueNode, FalseNode,\n\tNullNode, StringLiteral, UndefinedNode\n} from '../api/definition/values.js';\nimport { AwaitExpression } from '../api/operators/await.js';\nimport { UpdateExpression } from '../api/operators/update.js';\nimport { BinaryExpression } from '../api/index.js';\n\nexport function creteInfixExpression(op: string, left: ExpressionNode, right: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '=':\n\t\tcase '+=':\n\t\tcase '-=':\n\t\tcase '**=':\n\t\tcase '/=':\n\t\tcase '%=':\n\t\tcase '<<=':\n\t\tcase '>>=':\n\t\tcase '>>>=':\n\t\tcase '&=':\n\t\tcase '^=':\n\t\tcase '|=':\n\t\tcase '&&=':\n\t\tcase '||=':\n\t\tcase '??=':\n\t\t\treturn new AssignmentExpression(op, left, right);\n\t\tcase '&&':\n\t\tcase '||':\n\t\tcase '??':\n\t\t\treturn new LogicalExpression(op, left, right);\n\t\tcase '**':\n\t\tcase '*':\n\t\tcase '/':\n\t\tcase '%':\n\t\tcase '+':\n\t\tcase '-':\n\t\tcase '<':\n\t\tcase '<=':\n\t\tcase '>':\n\t\tcase '>=':\n\t\tcase 'in':\n\t\tcase 'instanceof':\n\t\tcase '==':\n\t\tcase '!=':\n\t\tcase '===':\n\t\tcase '!==':\n\t\tcase '<<':\n\t\tcase '>>':\n\t\tcase '>>>':\n\t\tcase '&':\n\t\tcase '^':\n\t\tcase '|':\n\t\tcase '>?':\n\t\tcase '<?':\n\t\tcase '<=>':\n\t\t\treturn new BinaryExpression(op, left, right);\n\t\tdefault:\n\t\t\tthrow new Error(`Not Supported Operator: ${op}`);\n\t}\n}\n\nexport function createTernaryExpression(op: string, logical: ExpressionNode, ifTrue: ExpressionNode, ifFalse: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '?':\n\t\t\treturn new ConditionalExpression(logical, ifTrue, ifFalse);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not ternary operator`);\n\n\t}\n}\n\nexport function createPipelineExpression(op: string, param: ExpressionNode, func: ExpressionNode, args?: ('?' | ExpressionNode)[]): ExpressionNode {\n\tswitch (op) {\n\t\tcase '|>':\n\t\t\treturn new PipelineExpression(param, func, args);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not pipeline operator`);\n\n\t}\n}\n\nexport function cretePrefixExpression(op: string, node: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '++':\n\t\tcase '--':\n\t\t\treturn new UpdateExpression(op, node, true);\n\t\tcase '+':\n\t\tcase '-':\n\t\tcase '!':\n\t\tcase '~':\n\t\tcase 'typeof':\n\t\tcase 'void':\n\t\tcase 'delete':\n\t\t\treturn new UnaryExpression(op, node);\n\t\tcase 'await':\n\t\t\treturn new AwaitExpression(node);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not prefix operator`);\n\t}\n}\n\nexport function cretePostfixExpression(op: string, node: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '++':\n\t\tcase '--':\n\t\t\treturn new UpdateExpression(op, node, false);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not postfix operator`);\n\t}\n}\n\nexport function creteCommaExpression(nodes: ExpressionNode[]): ExpressionNode {\n\treturn new SequenceExpression(nodes);\n}\n\nconst USELESS_STACK: Stack = null as unknown as Stack;//Object.create(null);\n\nexport function shortcutNumericLiteralBinaryExpression(x: ExpressionNode, y: ExpressionNode, op: Token): ExpressionNode {\n\tconst expression = creteInfixExpression(op.getName(), x, y);\n\tif (expression\n\t\t&& (\n\t\t\t(x instanceof NumberLiteral && y instanceof NumberLiteral)\n\t\t\t|| (x instanceof StringLiteral && y instanceof StringLiteral)\n\t\t\t|| (x instanceof BigIntLiteral && y instanceof BigIntLiteral)\n\t\t\t|| (x instanceof BooleanLiteral && y instanceof BooleanLiteral)\n\t\t)) {\n\t\tconst result = expression.get(USELESS_STACK);\n\t\tif (result !== false) {\n\t\t\tswitch (true) {\n\t\t\t\tcase typeof result === 'number': return new NumberLiteral(result);\n\t\t\t\tcase typeof result === 'string': return new StringLiteral(result);\n\t\t\t\tcase typeof result === 'bigint': return new BigIntLiteral(result);\n\t\t\t\tcase typeof result === 'boolean': return result ? TrueNode : FalseNode;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn expression!;\n}\nexport function coverValue(value: any) {\n\tswitch (typeof value) {\n\t\tcase 'undefined': return UndefinedNode;\n\t\tcase 'boolean': return value ? TrueNode : FalseNode;\n\t\tcase 'number': return new NumberLiteral(value);\n\t\tcase 'bigint': return new BigIntLiteral(value);\n\t\tcase 'string': return new StringLiteral(value);\n\t\tcase 'object':\n\t\t\tif (value === null) {\n\t\t\t\treturn NullNode;\n\t\t\t}\n\t\t// never reach\n\t\tcase 'function':\n\t\tcase 'symbol':\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function buildUnaryExpression(expression: ExpressionNode, op: Token) {\n\tlet result = cretePrefixExpression(op.getName(), expression);\n\tif (expression instanceof Literal) {\n\t\tconst value = result.get(USELESS_STACK);\n\t\tconst temp = coverValue(value);\n\t\tif (temp !== false) {\n\t\t\tresult = temp;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function buildPostfixExpression(expression: ExpressionNode, op: Token) {\n\tlet result = cretePostfixExpression(op.getName(), expression);\n\tif (expression instanceof Literal) {\n\t\tconst value = result.get(USELESS_STACK);\n\t\tconst temp = coverValue(value);\n\t\tif (temp !== false) {\n\t\t\tresult = temp;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function expressionFromLiteral(te: TokenExpression) {\n\tswitch (te.token) {\n\t\tcase Token.NUMBER:\n\t\tcase Token.BIGINT:\n\t\tcase Token.STRING:\n\t\tcase Token.REGEXP_LITERAL:\n\t\tcase Token.IDENTIFIER:\n\t\t\treturn te.getValue();\n\n\t\tcase Token.NULL_LITERAL: return NullNode;\n\t\tcase Token.TRUE_LITERAL: return TrueNode;\n\t\tcase Token.FALSE_LITERAL: return FalseNode;\n\t\tdefault:\n\t\tcase Token.UNDEFINED_LITERAL: return UndefinedNode;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/expressions/v8/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExpressionNode } from '../api/expression.js';\nimport type { Stack } from '../scope/stack.js';\nimport { Token, TokenExpression } from './token.js';\nimport { AssignmentExpression } from '../api/operators/assignment.js';\nimport { LogicalExpression } from '../api/operators/logical.js';\nimport { UnaryExpression } from '../api/operators/unary.js';\nimport { ConditionalExpression } from '../api/operators/ternary.js';\nimport { SequenceExpression } from '../api/operators/comma.js';\nimport {\n\tLiteral, BigIntLiteral, NumberLiteral,\n\tBooleanLiteral, TrueNode, FalseNode,\n\tNullNode, StringLiteral, UndefinedNode\n} from '../api/definition/values.js';\nimport { AwaitExpression } from '../api/operators/await.js';\nimport { UpdateExpression } from '../api/operators/update.js';\nimport { BinaryExpression } from '../api/operators/binary.js';\n\nexport function creteInfixExpression(op: string, left: ExpressionNode, right: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '=':\n\t\tcase '+=':\n\t\tcase '-=':\n\t\tcase '**=':\n\t\tcase '/=':\n\t\tcase '%=':\n\t\tcase '<<=':\n\t\tcase '>>=':\n\t\tcase '>>>=':\n\t\tcase '&=':\n\t\tcase '^=':\n\t\tcase '|=':\n\t\tcase '&&=':\n\t\tcase '||=':\n\t\tcase '??=':\n\t\t\treturn new AssignmentExpression(op, left, right);\n\t\tcase '&&':\n\t\tcase '||':\n\t\tcase '??':\n\t\t\treturn new LogicalExpression(op, left, right);\n\t\tcase '**':\n\t\tcase '*':\n\t\tcase '/':\n\t\tcase '%':\n\t\tcase '+':\n\t\tcase '-':\n\t\tcase '<':\n\t\tcase '<=':\n\t\tcase '>':\n\t\tcase '>=':\n\t\tcase 'in':\n\t\tcase 'instanceof':\n\t\tcase '==':\n\t\tcase '!=':\n\t\tcase '===':\n\t\tcase '!==':\n\t\tcase '<<':\n\t\tcase '>>':\n\t\tcase '>>>':\n\t\tcase '&':\n\t\tcase '^':\n\t\tcase '|':\n\t\tcase '>?':\n\t\tcase '<?':\n\t\tcase '<=>':\n\t\t\treturn new BinaryExpression(op, left, right);\n\t\tdefault:\n\t\t\tthrow new Error(`Not Supported Operator: ${op}`);\n\t}\n}\n\nexport function createTernaryExpression(op: string, logical: ExpressionNode, ifTrue: ExpressionNode, ifFalse: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '?':\n\t\t\treturn new ConditionalExpression(logical, ifTrue, ifFalse);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not ternary operator`);\n\n\t}\n}\n\nexport function cretePrefixExpression(op: string, node: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '++':\n\t\tcase '--':\n\t\t\treturn new UpdateExpression(op, node, true);\n\t\tcase '+':\n\t\tcase '-':\n\t\tcase '!':\n\t\tcase '~':\n\t\tcase 'typeof':\n\t\tcase 'void':\n\t\tcase 'delete':\n\t\t\treturn new UnaryExpression(op, node);\n\t\tcase 'await':\n\t\t\treturn new AwaitExpression(node);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not prefix operator`);\n\t}\n}\n\nexport function cretePostfixExpression(op: string, node: ExpressionNode): ExpressionNode {\n\tswitch (op) {\n\t\tcase '++':\n\t\tcase '--':\n\t\t\treturn new UpdateExpression(op, node, false);\n\t\tdefault:\n\t\t\tthrow new Error(`${op} is not postfix operator`);\n\t}\n}\n\nexport function creteCommaExpression(nodes: ExpressionNode[]): ExpressionNode {\n\treturn new SequenceExpression(nodes);\n}\n\nconst USELESS_STACK: Stack = null as unknown as Stack;//Object.create(null);\n\nexport function shortcutNumericLiteralBinaryExpression(x: ExpressionNode, y: ExpressionNode, op: Token): ExpressionNode {\n\tconst expression = creteInfixExpression(op.getName(), x, y);\n\tif (expression\n\t\t&& (\n\t\t\t(x instanceof NumberLiteral && y instanceof NumberLiteral)\n\t\t\t|| (x instanceof StringLiteral && y instanceof StringLiteral)\n\t\t\t|| (x instanceof BigIntLiteral && y instanceof BigIntLiteral)\n\t\t\t|| (x instanceof BooleanLiteral && y instanceof BooleanLiteral)\n\t\t)) {\n\t\tconst result = expression.get(USELESS_STACK);\n\t\tif (result !== false) {\n\t\t\tswitch (true) {\n\t\t\t\tcase typeof result === 'number': return new NumberLiteral(result);\n\t\t\t\tcase typeof result === 'string': return new StringLiteral(result);\n\t\t\t\tcase typeof result === 'bigint': return new BigIntLiteral(result);\n\t\t\t\tcase typeof result === 'boolean': return result ? TrueNode : FalseNode;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn expression!;\n}\nexport function coverValue(value: any) {\n\tswitch (typeof value) {\n\t\tcase 'undefined': return UndefinedNode;\n\t\tcase 'boolean': return value ? TrueNode : FalseNode;\n\t\tcase 'number': return new NumberLiteral(value);\n\t\tcase 'bigint': return new BigIntLiteral(value);\n\t\tcase 'string': return new StringLiteral(value);\n\t\tcase 'object':\n\t\t\tif (value === null) {\n\t\t\t\treturn NullNode;\n\t\t\t}\n\t\t// never reach\n\t\tcase 'function':\n\t\tcase 'symbol':\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function buildUnaryExpression(expression: ExpressionNode, op: Token) {\n\tlet result = cretePrefixExpression(op.getName(), expression);\n\tif (expression instanceof Literal) {\n\t\tconst value = result.get(USELESS_STACK);\n\t\tconst temp = coverValue(value);\n\t\tif (temp !== false) {\n\t\t\tresult = temp;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function buildPostfixExpression(expression: ExpressionNode, op: Token) {\n\tlet result = cretePostfixExpression(op.getName(), expression);\n\tif (expression instanceof Literal) {\n\t\tconst value = result.get(USELESS_STACK);\n\t\tconst temp = coverValue(value);\n\t\tif (temp !== false) {\n\t\t\tresult = temp;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function expressionFromLiteral(te: TokenExpression) {\n\tswitch (te.token) {\n\t\tcase Token.NUMBER:\n\t\tcase Token.BIGINT:\n\t\tcase Token.STRING:\n\t\tcase Token.REGEXP_LITERAL:\n\t\tcase Token.IDENTIFIER:\n\t\t\treturn te.getValue();\n\n\t\tcase Token.NULL_LITERAL: return NullNode;\n\t\tcase Token.TRUE_LITERAL: return TrueNode;\n\t\tcase Token.FALSE_LITERAL: return FalseNode;\n\t\tdefault:\n\t\tcase Token.UNDEFINED_LITERAL: return UndefinedNode;\n\t}\n}\n"]}
|
package/v8/parser.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import type { ExpressionNode } from '../api/expression.js';
|
|
|
2
2
|
import { Token, TokenExpression } from './token.js';
|
|
3
3
|
import { TokenStream } from './stream.js';
|
|
4
4
|
import { Identifier } from '../api/definition/values.js';
|
|
5
|
-
import { EmptyStatement } from '../api/statement/
|
|
6
|
-
import { ArrowFunctionType, FunctionKind,
|
|
5
|
+
import { EmptyStatement } from '../api/statement/control/empty.js';
|
|
6
|
+
import { ArrowFunctionType, FunctionKind, Param } from '../api/definition/function.js';
|
|
7
7
|
import { NewExpression } from '../api/computing/new.js';
|
|
8
8
|
import { GroupingExpression } from '../api/operators/grouping.js';
|
|
9
9
|
import { MemberExpression } from '../api/definition/member.js';
|
|
@@ -117,7 +117,7 @@ export declare class JavaScriptParser extends AbstractParser {
|
|
|
117
117
|
protected parseArrowParametersWithRest(list: ExpressionNode[], variableIndex: number): ExpressionNode;
|
|
118
118
|
protected expressionListToExpression(list: ExpressionNode[]): ExpressionNode;
|
|
119
119
|
protected parseMemberExpression(): ExpressionNode;
|
|
120
|
-
protected
|
|
120
|
+
protected toParamNode(expression: ExpressionNode): Param;
|
|
121
121
|
protected parsePrimaryExpression(): ExpressionNode;
|
|
122
122
|
protected parseTemplateLiteral(tag?: ExpressionNode): ExpressionNode;
|
|
123
123
|
protected parseMemberWithPresentNewPrefixesExpression(): ExpressionNode;
|
|
@@ -129,12 +129,13 @@ export declare class JavaScriptParser extends AbstractParser {
|
|
|
129
129
|
protected parseArrayLiteral(isPattern: boolean): ExpressionNode;
|
|
130
130
|
protected parsePossibleDestructuringSubPattern(): ExpressionNode;
|
|
131
131
|
protected parseObjectLiteral(isPattern: boolean): ExpressionNode;
|
|
132
|
-
protected parseObjectPropertyDefinition(): ExpressionNode;
|
|
132
|
+
protected parseObjectPropertyDefinition(isPattern: boolean): ExpressionNode;
|
|
133
133
|
protected parseProperty(propInfo: PropertyKindInfo): ExpressionNode;
|
|
134
134
|
protected parseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode;
|
|
135
135
|
protected doParseMemberExpressionContinuation(expression: ExpressionNode): ExpressionNode;
|
|
136
136
|
protected parsePropertyName(): ExpressionNode;
|
|
137
137
|
protected parsePipelineExpression(expression: ExpressionNode): ExpressionNode;
|
|
138
|
+
protected parsePipelineBody(lhs: ExpressionNode): ExpressionNode;
|
|
138
139
|
protected parseConditionalExpression(): ExpressionNode;
|
|
139
140
|
protected parseLogicalExpression(): ExpressionNode;
|
|
140
141
|
protected parseBinaryContinuation(x: ExpressionNode, prec: number, prec1: number): ExpressionNode;
|