From 7e099afe0cec780955e2b8ba5bd05905a4edcdad Mon Sep 17 00:00:00 2001 From: zhuoli Date: Mon, 20 Dec 2021 14:30:16 +0800 Subject: [PATCH 01/21] Update w_ts-dev/local_test/patches Change-Id: I85fcf08872c553f6ac6f7937a633488af7c21382 Signed-off-by: zhuoli --- local_test/buffer.txt | 99 + local_test/constructor.txt | 425 ++++ local_test/import_test/.out.txt.swp | Bin 0 -> 16384 bytes local_test/import_test/out.txt | 226 ++ local_test/import_test/package.json | 12 + .../import_test/test_another_export.abc | Bin 0 -> 1500 bytes local_test/import_test/test_another_export.ts | 13 + .../test_another_simpler_export.abc | Bin 0 -> 816 bytes .../test_another_simpler_export.ts | 3 + local_test/import_test/test_export.abc | Bin 0 -> 2056 bytes local_test/import_test/test_export.ts | 47 + local_test/import_test/test_import.abc | Bin 0 -> 1100 bytes local_test/import_test/test_import.ts | 43 + .../import_test/test_simpler_export.abc | Bin 0 -> 800 bytes local_test/import_test/test_simpler_export.ts | 3 + local_test/out_full_standartd.txt | 548 ++++ local_test/test.abc | Bin 0 -> 852 bytes local_test/test.ts | 9 + local_test/test_after.txt | 142 ++ local_test/test_before.txt | 116 + local_test/test_c.abc | Bin 0 -> 896 bytes local_test/test_c.ts | 10 + local_test/test_classExpression.abc | Bin 0 -> 724 bytes local_test/test_classExpression.ts | 13 + local_test/test_engine.abc | Bin 0 -> 1908 bytes local_test/test_engine.ts | 51 + local_test/test_full.abc | Bin 0 -> 1916 bytes local_test/test_full.ts | 34 + local_test/test_full.txt | 548 ++++ local_test/test_full_alt.ts | 33 + local_test/test_full_non-type.abc | Bin 0 -> 1336 bytes local_test/test_primi.abc | Bin 0 -> 1056 bytes local_test/test_primi.ts | 19 + local_test/test_try/export.abc | Bin 0 -> 424 bytes local_test/test_try/export.ts | 1 + local_test/test_try/import.ts | 3 + local_test/tmp/build/test_another_export.js | 19 + .../tmp/build/test_another_simpler_export.js | 6 + local_test/tmp/build/test_export.js | 42 + local_test/tmp/build/test_import.js | 29 + local_test/tmp/build/test_simpler_export.js | 6 + patches/AppPackage/ace-loader.diff.zip | Bin 0 -> 1051 bytes patches/AppPackage/build.diff.zip | Bin 0 -> 2671 bytes patches/AppPackage/ets-loader.diff.zip | Bin 0 -> 2137 bytes patches/DebugInfo/runtime.patch | 160 ++ patches/DebugInfo/ts2abc.patch | 15 + patches/ModulesSupport/ESM.patch | 2235 +++++++++++++++++ test262/config.py | 18 +- test262/run_sunspider.py | 11 +- test262/skip_tests.json | 3 +- ts2panda/.gitignore | 3 - ts2panda/BUILD.gn | 14 +- ts2panda/package-lock.json | 6 +- ts2panda/package.json | 2 +- ts2panda/scripts/npm-install.sh | 40 + ts2panda/scripts/run_tests.py | 13 +- ts2panda/scripts/run_tests_executable.sh | 25 + ts2panda/src/addVariable2Scope.ts | 80 +- ts2panda/src/base/typeSystem.ts | 568 +++++ ts2panda/src/base/util.ts | 2 +- ts2panda/src/cmdOptions.ts | 49 +- ts2panda/src/compiler.ts | 28 +- ts2panda/src/compilerDriver.ts | 25 +- ts2panda/src/debuginfo.ts | 49 +- ts2panda/src/index.ts | 46 +- ts2panda/src/jshelpers.d.ts | 7 +- ts2panda/src/jshelpers.js | 11 +- ts2panda/src/modules.ts | 9 + ts2panda/src/pandagen.ts | 22 +- ts2panda/src/pandasm.ts | 28 +- ts2panda/src/recorder.ts | 77 +- ts2panda/src/statement/classStatement.ts | 143 +- ts2panda/src/statement/returnStatement.ts | 4 +- ts2panda/src/statement/tryStatement.ts | 19 +- ts2panda/src/syntaxCheckHelper.ts | 4 + ts2panda/src/syntaxChecker.ts | 26 +- ts2panda/src/ts2panda.ts | 52 +- ts2panda/src/typeChecker.ts | 200 ++ ts2panda/src/typeRecorder.ts | 260 ++ ts2panda/src/variable.ts | 11 + ts2panda/templates/diagnostic.ts.erb | 12 +- ts2panda/templates/irnodes.ts.erb | 10 + ts2panda/tests/BUILD.gn | 1 - .../expression/functionExpression.test.ts | 3 + ts2panda/tests/lexenv.test.ts | 10 +- ts2panda/ts2abc/BUILD.gn | 3 +- ts2panda/ts2abc/main.cpp | 92 + ts2panda/ts2abc/tests/BUILD.gn | 41 + ts2panda/ts2abc/tests/debuglog_test.cpp | 51 + ts2panda/ts2abc/tests/debugmode_test.cpp | 51 + ts2panda/ts2abc/tests/functions_test.cpp | 60 + ts2panda/ts2abc/tests/sources/add.json | 157 ++ ts2panda/ts2abc/tests/stringarr_test.cpp | 51 + ts2panda/ts2abc/ts2abc.cpp | 278 +- ts2panda/ts2abc/ts2abc.h | 60 + ts2panda/ts2abc/ts2abc_options.h | 203 +- ts2panda/ts2abc_config.gni | 80 +- 97 files changed, 7577 insertions(+), 351 deletions(-) create mode 100644 local_test/buffer.txt create mode 100644 local_test/constructor.txt create mode 100644 local_test/import_test/.out.txt.swp create mode 100644 local_test/import_test/out.txt create mode 100644 local_test/import_test/package.json create mode 100644 local_test/import_test/test_another_export.abc create mode 100644 local_test/import_test/test_another_export.ts create mode 100644 local_test/import_test/test_another_simpler_export.abc create mode 100644 local_test/import_test/test_another_simpler_export.ts create mode 100644 local_test/import_test/test_export.abc create mode 100644 local_test/import_test/test_export.ts create mode 100644 local_test/import_test/test_import.abc create mode 100644 local_test/import_test/test_import.ts create mode 100644 local_test/import_test/test_simpler_export.abc create mode 100644 local_test/import_test/test_simpler_export.ts create mode 100644 local_test/out_full_standartd.txt create mode 100644 local_test/test.abc create mode 100644 local_test/test.ts create mode 100644 local_test/test_after.txt create mode 100644 local_test/test_before.txt create mode 100644 local_test/test_c.abc create mode 100644 local_test/test_c.ts create mode 100644 local_test/test_classExpression.abc create mode 100644 local_test/test_classExpression.ts create mode 100644 local_test/test_engine.abc create mode 100644 local_test/test_engine.ts create mode 100644 local_test/test_full.abc create mode 100644 local_test/test_full.ts create mode 100644 local_test/test_full.txt create mode 100644 local_test/test_full_alt.ts create mode 100644 local_test/test_full_non-type.abc create mode 100644 local_test/test_primi.abc create mode 100644 local_test/test_primi.ts create mode 100644 local_test/test_try/export.abc create mode 100644 local_test/test_try/export.ts create mode 100644 local_test/test_try/import.ts create mode 100644 local_test/tmp/build/test_another_export.js create mode 100644 local_test/tmp/build/test_another_simpler_export.js create mode 100644 local_test/tmp/build/test_export.js create mode 100644 local_test/tmp/build/test_import.js create mode 100644 local_test/tmp/build/test_simpler_export.js create mode 100755 patches/AppPackage/ace-loader.diff.zip create mode 100755 patches/AppPackage/build.diff.zip create mode 100755 patches/AppPackage/ets-loader.diff.zip create mode 100755 patches/DebugInfo/runtime.patch create mode 100755 patches/DebugInfo/ts2abc.patch create mode 100755 patches/ModulesSupport/ESM.patch create mode 100755 ts2panda/scripts/npm-install.sh create mode 100755 ts2panda/scripts/run_tests_executable.sh create mode 100755 ts2panda/src/base/typeSystem.ts create mode 100755 ts2panda/src/typeChecker.ts create mode 100755 ts2panda/src/typeRecorder.ts create mode 100644 ts2panda/ts2abc/main.cpp create mode 100644 ts2panda/ts2abc/tests/BUILD.gn create mode 100644 ts2panda/ts2abc/tests/debuglog_test.cpp create mode 100644 ts2panda/ts2abc/tests/debugmode_test.cpp create mode 100644 ts2panda/ts2abc/tests/functions_test.cpp create mode 100644 ts2panda/ts2abc/tests/sources/add.json create mode 100644 ts2panda/ts2abc/tests/stringarr_test.cpp create mode 100644 ts2panda/ts2abc/ts2abc.h diff --git a/local_test/buffer.txt b/local_test/buffer.txt new file mode 100644 index 0000000000..9841813e42 --- /dev/null +++ b/local_test/buffer.txt @@ -0,0 +1,99 @@ +{ literalBuffer: [ { tag: 2, value: 4 }, { tag: 2, value: 10 } ] } +{ + literalBuffer: [ + { tag: 2, value: 0 }, { tag: 2, value: 0 }, + { tag: 2, value: 3 }, { tag: 2, value: 52 }, + { tag: 2, value: 54 }, { tag: 2, value: 56 }, + { tag: 2, value: 2 }, { tag: 5, value: 'c' }, + { tag: 2, value: 3 }, { tag: 2, value: 2 }, + { tag: 2, value: 0 }, { tag: 5, value: 'd' }, + { tag: 2, value: 54 }, { tag: 2, value: 1 }, + { tag: 2, value: 0 }, { tag: 2, value: 2 }, + { tag: 5, value: 'a' }, { tag: 2, value: 1 }, + { tag: 2, value: 0 }, { tag: 2, value: 0 }, + { tag: 5, value: 'b' }, { tag: 2, value: 3 }, + { tag: 2, value: 1 }, { tag: 2, value: 1 }, + { tag: 2, value: 2 }, { tag: 2, value: 57 }, + { tag: 2, value: 58 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 }, + { tag: 2, value: 53 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 2 }, + { tag: 2, value: 0 }, + { tag: 5, value: 'constructor' }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 }, + { tag: 2, value: 55 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 2 }, + { tag: 2, value: 0 }, + { tag: 5, value: 'constructor' }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 2 }, + { tag: 2, value: 0 }, + { tag: 5, value: 'constructor' }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 2 }, + { tag: 2, value: 0 }, + { tag: 5, value: 'getA' }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 } + ] +} +{ + literalBuffer: [ + { tag: 2, value: 2 }, + { tag: 2, value: 1 }, + { tag: 5, value: 'calSqur' }, + { tag: 2, value: 2 }, + { tag: 2, value: 1 }, + { tag: 2, value: 3 }, + { tag: 2, value: 54 } + ] +} +{ literalBuffer: [ { tag: 2, value: 1 }, { tag: 2, value: 51 } ] } diff --git a/local_test/constructor.txt b/local_test/constructor.txt new file mode 100644 index 0000000000..d7d93edc9f --- /dev/null +++ b/local_test/constructor.txt @@ -0,0 +1,425 @@ +-------- source file -------- +"use strict"; +class AA { + constructor() { + this.a = 4; + } +} +function newYigeClass() { + let bigC = new AA(); +} + +*>*>*>*>*>*>**>* js constru <*<*<*<*<*<*<*<* +NodeObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536870912, + parent: SourceFileObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536871168, + parent: undefined, + kind: 290, + statements: [ + [Circular], + [NodeObject], + [NodeObject], + pos: 0, + end: 91, + hasTrailingComma: undefined, + transformFlags: 537985280 + ], + endOfFileToken: TokenObject { + pos: 91, + end: 92, + flags: 0, + modifierFlagsCache: 0, + transformFlags: 536870912, + parent: [SourceFileObject], + kind: 1 + }, + fileName: 'test.ts', + path: '/home/zhuoli/code/L2_up2date/ark/ts2abc/local_test/test.ts', + text: 'class AA {\n' + + ' public a:number = 4;\n' + + '}\n' + + '\n' + + 'function newYigeClass() {\n' + + ' let bigC = new AA();\n' + + '}\n', + isDeclarationFile: false, + referencedFiles: [], + typeReferenceDirectives: [], + hasNoDefaultLib: false, + libReferenceDirectives: [], + amdDependencies: [], + languageVariant: 0, + languageVersion: 2, + scriptKind: 3, + identifiers: Map { + 'AA' => 'AA', + 'a' => 'a', + 'newYigeClass' => 'newYigeClass', + 'bigC' => 'bigC' + }, + nodeCount: 18, + identifierCount: 5, + symbolCount: 5, + parseDiagnostics: [], + bindDiagnostics: [], + classifiableNames: Map { 'AA' => true }, + imports: [], + moduleAugmentations: [], + pragmas: Map {}, + original: SourceFileObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 541065472, + parent: undefined, + kind: 290, + statements: [Array], + endOfFileToken: [TokenObject], + fileName: 'test.ts', + path: '/home/zhuoli/code/L2_up2date/ark/ts2abc/local_test/test.ts', + text: 'class AA {\n' + + ' public a:number = 4;\n' + + '}\n' + + '\n' + + 'function newYigeClass() {\n' + + ' let bigC = new AA();\n' + + '}\n', + isDeclarationFile: false, + referencedFiles: [], + typeReferenceDirectives: [], + hasNoDefaultLib: false, + libReferenceDirectives: [], + amdDependencies: [], + languageVariant: 0, + languageVersion: 2, + scriptKind: 3, + identifiers: [Map], + nodeCount: 18, + identifierCount: 5, + symbolCount: 5, + parseDiagnostics: [], + bindDiagnostics: [], + classifiableNames: [Map], + imports: [], + moduleAugmentations: [], + pragmas: Map {}, + original: [SourceFileObject] + }, + lineMap: [ + 0, 11, 36, 38, + 39, 65, 90, 92 + ] + }, + kind: 226, + expression: TokenObject { + pos: -1, + end: -1, + flags: 8, + modifierFlagsCache: 0, + transformFlags: 536870912, + parent: undefined, + kind: 10, + text: 'use strict' + }, + emitNode: { startsOnNewLine: true } +} +*>*>*>*>*>*>**>* js constru <*<*<*<*<*<*<*<* +NodeObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536875008, + parent: NodeObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536875008, + parent: NodeObject { + pos: 0, + end: 92, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536875008, + parent: [NodeObject], + kind: 162, + decorators: undefined, + modifiers: undefined, + typeParameters: undefined, + parameters: [Array], + type: undefined, + body: [Circular], + original: undefined, + emitNode: [Object] + }, + kind: 223, + statements: [ + [Circular], + pos: 10, + end: 35, + hasTrailingComma: undefined, + transformFlags: 536875008 + ], + multiLine: true + }, + kind: 226, + expression: NodeObject { + pos: -1, + end: -1, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536875008, + parent: undefined, + kind: 209, + left: NodeObject { + pos: 21, + end: 23, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 536875008, + parent: undefined, + kind: 194, + expression: [TokenObject], + name: [IdentifierObject], + emitNode: [Object] + }, + operatorToken: TokenObject { + pos: -1, + end: -1, + flags: 8, + modifierFlagsCache: 0, + transformFlags: 0, + parent: undefined, + kind: 62 + }, + right: TokenObject { + pos: 32, + end: 34, + flags: 0, + modifierFlagsCache: 0, + transformFlags: 536870912, + parent: [NodeObject], + kind: 8, + text: '4', + numericLiteralFlags: 0, + id: 16 + } + }, + emitNode: { + sourceMapRange: NodeObject { + pos: 10, + end: 35, + flags: 0, + modifierFlagsCache: 536870916, + transformFlags: 541065217, + parent: [NodeObject], + kind: 159, + decorators: undefined, + modifiers: [Array], + name: [IdentifierObject], + questionToken: undefined, + type: [TokenObject], + initializer: [TokenObject], + symbol: [SymbolObject] + }, + commentRange: NodeObject { + pos: 10, + end: 35, + flags: 0, + modifierFlagsCache: 536870916, + transformFlags: 541065217, + parent: [NodeObject], + kind: 159, + decorators: undefined, + modifiers: [Array], + name: [IdentifierObject], + questionToken: undefined, + type: [TokenObject], + initializer: [TokenObject], + symbol: [SymbolObject] + } + }, + original: NodeObject { + pos: 10, + end: 35, + flags: 8, + modifierFlagsCache: 536870912, + transformFlags: 541065216, + parent: undefined, + kind: 159, + decorators: undefined, + modifiers: [ + pos: 10, + end: 21, + hasTrailingComma: undefined, + transformFlags: 536870912 + ], + name: IdentifierObject { + pos: 21, + end: 23, + flags: 0, + modifierFlagsCache: 0, + transformFlags: 536870912, + parent: [NodeObject], + kind: 75, + escapedText: 'a', + flowNode: [Object] + }, + questionToken: undefined, + exclamationToken: undefined, + type: undefined, + initializer: TokenObject { + pos: 32, + end: 34, + flags: 0, + modifierFlagsCache: 0, + transformFlags: 536870912, + parent: [NodeObject], + kind: 8, + text: '4', + numericLiteralFlags: 0, + id: 16 + }, + original: NodeObject { + pos: 10, + end: 35, + flags: 0, + modifierFlagsCache: 536870916, + transformFlags: 541065217, + parent: [NodeObject], + kind: 159, + decorators: undefined, + modifiers: [Array], + name: [IdentifierObject], + questionToken: undefined, + type: [TokenObject], + initializer: [TokenObject], + symbol: [SymbolObject] + }, + emitNode: { commentRange: [NodeObject], sourceMapRange: [NodeObject] } + } +} +=========== NodeKind ===========: 245 +class AA { + public a:number = 4; +} +=========== currIndex ===========: 0 +LiteralBuffer { + literalBuffer: [ + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 1 }, + Literal { tag: 5, value: 'a' }, + Literal { tag: 2, value: 1 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 } + ] +} +============================== +type2Index: Map { 0 => 0 } +variable2Type: Map { 21 => 1, 72 => 0 } +============================== +bigC +/////// hoist pos ////////// - +37 +--node.text-- function newYigeClass() { + let bigC = new AA(); +} +--node.pos-- 37 +--node.type-- 77 +/////// decls pos ////////// - +0 +//// class decl //// +--node.text-- class AA { + public a:number = 4; +} + +function newYigeClass() { + let bigC = new AA(); +} + +--node.pos-- 0 +--node.type-- 50 +////////// methods ////////// +0 +////////// methods ////////// +37 +/////// decls pos ////////// - +72 +//// let decl //// +--node.text-- bigC +--node.pos-- 72 +--node.type-- 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - #1#AA +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: bigC +==== bindVreg typeIndex ====: 50 +\\\-= funcNmae =-\\\ - newYigeClass +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 3 +\\\\\\ vreg type \\\\\ 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - func_main_0 +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +-=-=-=-length=-=-=-=-=-= +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 }, + { tag: 5, value: 'a' }, + { tag: 2, value: 1 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/import_test/.out.txt.swp b/local_test/import_test/.out.txt.swp new file mode 100644 index 0000000000000000000000000000000000000000..d4370267716e8bc7aecf93677da99d9601a9c6b4 GIT binary patch literal 16384 zcmeI3TWl0n7{?EYpeUDA2qY#l79Wt%-Cjae3XyG#h!lzx8;uX^ba&dW?4|C`0;Q=& zq8RA|UP6co5np^zykIbj#sqvYMu}V`CPJbw3J(TCKr2u|fhnS)zOL3OG`IRrYX!6dS^=$q zRzNGD70?Q31+)VHCk5=@@!}a8G+s7poBSL%VPSOhcS_gjTH4aeXecm=jV z79NB9Aq;b1BAmGe+i(;k!gk0* z9NJ($Oos_@j@bAb_QD%52wmXB%t}y4O}RtZeZAHq!>~3v?{gTjq?yYZk#xrHv9it1 zNt4k(pb8aT7ir!V;ZC)c+Fy~**=9OsHH~E@iO$N_J^fut zBR=813rcb2ZDf?}CCti(%J!Y#O@Dkul()qf%Lj?9A#Qb<`Q(sDZ1FC-GV~8Lif~v3 zY;p0pg@9SpPGr(KAB$rEcr&Cti zHfmHM87xdoSI14OFX6Qe2{RcRNy|3Wm}@eY7-?%`af+OGccW^PzidR7^+vB#$aCF0 zmyXwm>WxG?nMhkk+Dut->1z(}JIrjt>`YqiwrN{Vi-_qGEpX*Pg`!Ay>sVH(qpn;X zZn>5#!^WwgUTL|~>f4yf#tS2<-|HXMPtAszlj+|WXf(J}I&T?f+VI{Gq(N?@9lLcj z)!)WMy4%>0Fb&fwlFwPbdSvf970AKi@0$UmE1O9f)uC{yQB~-R{-R!r7y)ma@2k~| zsS4G(O{+7qR*lyMURz~6`n466JTN%?qo}E%aI?7Ty9H`q^^`XH)%j>;E3Y+$Eajyq z>v|?)e@^wcvoKjC>;Q97iF_fSVxrMZ=aW{ zxaJv?!=l+|PF+$>E}WO2X{A_WV6rF$`8(J@;}%_4ZWmvy==;bkDkSpCGvOF?px52L z?(;4v6_j&<1EPXGX?=Kdx;ME~hYS?&g7Q(G1+^*T(VGQSa%(A?XjR^lMO8&IB>ZJ7 z_u0q;W3(c$Vvh4ybghnd*8g9yevGgdb=Lpt_x($(?@z%Y_yBgpcF4oy&<0CkDqLiJ z{{tL`UEu5iY=mxD1r2ZqOofZA?N7otupeH9KInpJ@VB#;hoi6;-iMvA6;{J6aMt)o zU=Q>_H?+fDFa^%DcK;O)!d@7JDAYn2Cc!1v@F(D7_y~5v3y_6X&;avbHvGjp{%1G> z2jER`*8I;x5}Y-E4a|Yba0)FC!RN3Kc0fO*APSDwOFmKr8ScR-n|@=IB1$ z#N4%a1)H(!Sus_7aCR$i9?J)#Sgf-3;43Hp<6Ho@gBy+q@w4pX;ix^escjhfFl&@( z0Q&{f4^>EhHme;XbuRaB^yZdQb?AUY%KDJr+{)?AtzrDXvb$;Mjlja@mfEe1B<;%C zZsb{n{jDGslt>x@cDMrkdKKJoJQm>Rsv&928=WQA?N@$6l$lMf@j1<-h&zc5M|x>y Z1iK3Hm>HmlhoO_Vl@ZAKVOYh;Aa!M6U?^f>Vk`p#Q)SMxleR{v#mag2`rPlkd4BWi?37AGsSW8B z1piGW+Je#r2*5=^0=B?6LtX_qpaMLF!hAnLe&>mHfMEpP16F|z;0y2@=#3GL0e#Si z02aq;fg%rJauZA0qqZM@cf0^=kNq{q@xM$qYW`dovIq#8&MH~1i2rBl}i z3;m|muZM;EjY`ojxg@U`u1d0{7YtMwPao2PN_}iAGxkzBZ(ubhuzSpcV`IRN-mtOY zwZn8mCrT}st*lniO-nmVof+*)W^Pi=)Z<7(P%ud>3GNbx%#-*QLi)i5&P)S==~rlK z!#}cbvI0{NI7D5Kn3@kpEksNg0@K|v>UqSp7?@s!ruTcMogJdroRYH(hVm#^w)3Wv z#padFh*mC+Ea|SH=%xFL>x}4&StW00^}Oa9j;ojjHsMfbgjOHD7LNXm>jdYDMSb-%rUKw%#NA2>k?^N0&L(0g8#%G#FWmdaVzE(PDr-|lP-`|hoc zH2c)QwDzOjke2xKSdQ-TKZ_=iOl0j!CVG;QKB&=XB_Y`4@kx)9JxcgZwYcA2lf0PZ z7dc{~@mNh*6a3Z3hze+d<=CTlp$9Zk@&Jv~5Yjv~9iX?N`yDdZ#kF(Cp^H^x@Y@JSMwb+z4~aw@bzfZZeL(;)s6)Zi+%Dx{iCC#h zjbc@?rG-lfC!@Pt<7=WPh}}0(%CF?G3iZ&>nV;A&Uln4e-6n?XFyLT5MCd80JP$Yt>+<1^GY4)O+Vq+A=Dln{FO9gYio4G_R4@Ds4W5(gZjNni=s1T?@J_iKRn>J)kn=5HV1GG?S!JuH}e zzJ#EGec(o@?mT?-e5ivo%}iwCEM2C{0qnlcSCgnHR_WS&Xa4WVt#gs?`I0VO<+khD z)+o_f^)hzFJc38zzrMnw!JUqaI*I1CM`=$DqBvEHG!v@3;YK$IPwGgbj!PD>v_uNe zA@?1~`-Y{GzJOceM=ecYlQZe#pVHi^M90TO?}gvb2HJnoA7x4G_b{vY<=`7Kc9DIb~7s;BIuVq-~0db z{movq&d*px^d$ccW|Fg6qGw>rfC8L|=^q&)4g48E0&W5O<;eFk=n|Y=;1@su2U0}y z!27@^@Fj2$_yo2N@D*?u_zw6U_z8H1oLnDnbQeHLdI0cv0&rcXC>Q#2UGCu!VynQP z;GY6N0AB;Qfs4?O*XpwiZ(U!rEyrnj4X@d9j+0>?HJ9w=#`=nPibfY&tM;jtM!S91 zX?v70kC>$QbfmMk;VjxGY1BfBtF{|DL!4>0y{5D1g>t{uqC#ANMjKJo?6tL)>(RvI zlxMfSdaSM6kviuzR&COHUFE~1vos$2&BX0;pA;D_+Gid#`IZzh0W;=2s zV|m?KtgkkjPJNp6TK#nG!bz(Z$59sk9P&1%tn?VCEmQiYN~BKliL>cW!}H5pF@x^l_i5oHX6(Gu;nO9q5qoVV~*OWYo`nrfS$>+{V*B6SvuG<3-Oz&z}?R z2@f~g^GUBA-e)<@OUq#zVg}g3)N}jy%nqykw{HA!Wo#$OhcW$MxsUBUx1nq*5~R9JI<}}mCg!rjU4~CA<;2E$NIBs$5gQy1fr;37 zGZL7@?gL`u14skH{T#$Emc^Pv1L%IF7-$_$Y_e~tPSapQ{aIHn)2@X2x2{^Ed_w&# z)SYsmSC|P(VoomwnqSn!dopRkF5wR0_Hti3$G8k`5{Q1BV>NEp=kB zGFA4BVZ$)?m8zy8y$n6g14t24egrJ@H-`t`HkSEiF~t`oq>R7r{lu%JFa~Ny+~xDz^5p7DXr+ZTp3?deM;kU zrF=#1C|~euNnjKxwWa1?4I2w9{Cy?eY)i;^X**&h5xt+X$^ldv@THtjSyah%B?i?+iSNlD{jQjvX>Ic#uB_qw1BcU7V;zLU+IKgX#fBK literal 0 HcmV?d00001 diff --git a/local_test/import_test/test_export.ts b/local_test/import_test/test_export.ts new file mode 100644 index 0000000000..31db216ab2 --- /dev/null +++ b/local_test/import_test/test_export.ts @@ -0,0 +1,47 @@ +import { + AnotherClassB, + AnotherClassB as ClassC +} from "./test_another_export"; + +class DistinctClass{ + name: string = "I'm in export"; +} + +// --- 1. ExportDeclaration --- +// 1.1 re-export +export * as anotherExport from "./test_another_export"; +export { + AnotherClassA, + AnotherClassB, + DistinctClass +} from "./test_another_export"; +export { default as anotherDefaultClass} from "./test_another_export"; + + +// 1.2 named exporting via a clause +class ClassE{}; +export { ClassE }; +export { ClassC, ClassC as ClassD }; // exporte an imported class + +// --- 2. ExportKeyword --- +// 2.1 inline named exports - ClassDeclaration +export class ClassF {}; +// export default class {} + +// 2.2 inline named exports - VariableStatements +class ClassA {}; +export let InstanceA = new ClassA(); +export let InstanceB = new AnotherClassB(); +export let SomeClass = class {}; +export let SomeClassInst = new class {}; +// export default cLass AnotherDefaultClass{}; + +// --- 3. ExportAssignment - default export --- +class defaultC {} +export default defaultC; + +// 4. VariableStatement/ClassExpression + + +//// export class as member of obj +// export default {defaultC, ClassA} diff --git a/local_test/import_test/test_import.abc b/local_test/import_test/test_import.abc new file mode 100644 index 0000000000000000000000000000000000000000..eecdb5cc3dfd282fbd19345b01c1b32982d440d2 GIT binary patch literal 1100 zcmd^8zl+pB6n>Mv>?XH+xH(x46cMoyMb;}UgtLi1P$B0jij75x$($zaWzWqVYPs!# zV&NaK8ab}Eun;Un1+}rUwiK%qv9J(~-3-j7UX-(K*~pYn<5?N7M~ zv4R<*Ei8IK12_%{;4JoCR^tz#M-kxM5%ekW3it##7SSOf0CM0y@C4vo?vIBa0BnzI z(TY;7Nd2q#BLofv;pt14@2pEd&xa~f=`dd+J5GR@T1kA3DW=^%qBrE|%)XEp%xmDo5V=j z%V$|0CL03@mP`5*gdm)oKjA79TrVx^BwASA$m4J=O7n1$b_U^@VC94#m^u=u%sEwY^QWM<1y^Z(kMq1}zR+{F`)m0sNc(uZ(Wvji9MDKNa4Tx>dW} zQQh=#xn;xXOlg}{(`d`6W7IV|Tei)rQ;omiimT!yxSXqQy@$?K5E=ggif<~JvI?@hKQndpAaw25w(Vbtu+Mz7bS zUC5(l0L``XEU?c*#m0leW&^z6WCzx&g&dXnhaj!_eI O7>!@zB^MEU2>k{1G^uR> literal 0 HcmV?d00001 diff --git a/local_test/import_test/test_import.ts b/local_test/import_test/test_import.ts new file mode 100644 index 0000000000..7e508de8fa --- /dev/null +++ b/local_test/import_test/test_import.ts @@ -0,0 +1,43 @@ +// 1. default import +import DefaultClassA from "./test_export.js"; + +// 2. namespace import +import * as Imported from "./test_export.js"; +import { anotherExport as anotherImport } from "./test_export.js"; + +// 3. named import +import { + InstanceA, + InstanceB, +} from "./test_export.js"; + +// 3.1 rename imports: +import { + ClassD as ClassDDD, + default as defaultAlt, + anotherDefaultClass as defualtClassAlt +} from "./test_export.js"; + +// 4. empty import +import "./test_export.js"; + +// 5. combining default import with namespace: +import DefaultClassB, * as importedAlt from "./test_export.js"; + +// 6. combining default with named imports: +import DefaultClassC, {ClassC, ClassE} from "./test_export.js"; + +///////////// +let da = DefaultClassA; +let ita = Imported.AnotherClassA; +let ae = anotherImport.AnotherClassA +let ia = InstanceA; +let ib = InstanceB; +let cddd = ClassDDD; +let dat = defaultAlt; +let dcat = defualtClassAlt; +let dcb = DefaultClassB +let italt = importedAlt.AnotherClassA; +let dcc = DefaultClassC; +let cc = ClassC; +let cd = ClassE; \ No newline at end of file diff --git a/local_test/import_test/test_simpler_export.abc b/local_test/import_test/test_simpler_export.abc new file mode 100644 index 0000000000000000000000000000000000000000..3e8c3ea58a07cd0bc982f69b358f818400af5a5e GIT binary patch literal 800 zcmaiyziSjh6vyAp-2S>my>JGTA}C&=jXx6YVzX-0;^HY03lWyXO!V+>_t@QlTB?77 zSOkmVR;)#^4A|HU31}r)iA})5#=`OYb}vS-aN#rW*Szn%-Pvp5)r%n!Eq&U20wa$o zA_Hd{z@>9zdk}#G{|XS`Huw$rIi~GhdPYoB=6?EBwnPsm1Lkh`8}Op=y$V>njBZ|Y-^#l7d2b+tui0d zzOg;bg3HP3dS7GJi#QvT2p*2-n8BGGPW7^C6CGMxkMBf-ZZD2bQ?ngiZg^bKHMt?PjX)VvnGgXvn~IM>R3EXM}6W!PGUQcxv!LGY;1yNC#a^y00T@q0-Nf(E|%-n{Sq%1dsyZe42;(f9o~_ds$* z5g8bD047}qB+$mC1ilFfU=8>M7~mWnPl4yaXBLq#2C&BU9Pl2%(ldac7Xa5iW&@k+ zajjKg2iOD7wmaAFtn6+Fttg81y6(l%JdK3$7S+0Ol*VB|Dy4cq4VtM=dRRh17cIQTW>1wNelt&UtyrLQ8c%qS4DZK)@`&>?;)>p76z7LW38llYUpnNzpgg zFCFQ5UPV17BS(#>8mibzR<7{{~Q{Cx$LolFgteex4-oAQ|{ zR8QW l965Ae`(pF~KAt+1P2s`&-)_A9Vv3^EX*iZ&qTLA?e*ikijH& 0 } +variable2Type: Map { 72 => 0 } +============================== +bigC +/////// hoist pos ////////// - +37 +--node.text-- function newYigeClass() { + let bigC = new AA(); +} +--node.pos-- 37 +--node.type-- 77 +/////// decls pos ////////// - +0 +//// class decl //// +--node.text-- class AA { + public a:number = 4; +} + +function newYigeClass() { + let bigC = new AA(); +} + +--node.pos-- 0 +--node.type-- 50 +////////// methods ////////// +0 +////////// methods ////////// +37 +/////// decls pos ////////// - +72 +//// let decl //// +--node.text-- bigC +--node.pos-- 72 +--node.type-- 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - #1#AA +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: bigC +==== bindVreg typeIndex ====: 50 +\\\-= funcNmae =-\\\ - newYigeClass +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 3 +\\\\\\ vreg type \\\\\ 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - func_main_0 +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +-=-=-=-length=-=-=-=-=-= +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 }, + { + tag: 5, + value: 'class AA {\n' + + ' public a:number = 4;\n' + + '}\n' + + '\n' + + 'function newYigeClass() {\n' + + ' let bigC = new AA();\n' + + '}\n' + }, + { tag: 2, value: 1 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/test_before.txt b/local_test/test_before.txt new file mode 100644 index 0000000000..26c7825a76 --- /dev/null +++ b/local_test/test_before.txt @@ -0,0 +1,116 @@ +-------- source file -------- +class AA { + public a: number = 4; +} +function newYigeClass() { + let bigC = new AA(); +} + +=========== NodeKind ===========: 245 +class AA { + public a:number = 4; +} +=========== currIndex ===========: 0 +LiteralBuffer { + literalBuffer: [ + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 1 }, + Literal { tag: 5, value: 'a' }, + Literal { tag: 2, value: 1 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 }, + Literal { tag: 2, value: 0 } + ] +} +============================== +type2Index: Map { 0 => 0 } +variable2Type: Map { 21 => 1, 72 => 0 } +============================== +bigC +/////// hoist pos ////////// - +37 +--node.text-- function newYigeClass() { + let bigC = new AA(); +} +--node.pos-- 37 +--node.type-- 77 +/////// decls pos ////////// - +0 +//// class decl //// +--node.text-- class AA { + public a:number = 4; +} +--node.pos-- 0 +--node.type-- 50 +////////// methods ////////// +0 +////////// methods ////////// +37 +/////// decls pos ////////// - +72 +//// let decl //// +--node.text-- bigC +--node.pos-- 72 +--node.type-- 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - #1#AA +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: bigC +==== bindVreg typeIndex ====: 50 +\\\-= funcNmae =-\\\ - newYigeClass +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 3 +\\\\\\ vreg type \\\\\ 50 +==== bindVreg var Name ====: 4funcObj +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: 4newTarget +==== bindVreg typeIndex ====: 77 +==== bindVreg var Name ====: this +==== bindVreg typeIndex ====: 77 +\\\-= funcNmae =-\\\ - func_main_0 +\\\\\\ vreg num \\\\\ 0 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 1 +\\\\\\ vreg type \\\\\ 77 +\\\\\\ vreg num \\\\\ 2 +\\\\\\ vreg type \\\\\ 77 +-=-=-=-length=-=-=-=-=-= +{ + literalBuffer: [ + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 1 }, + { tag: 5, value: 'a' }, + { tag: 2, value: 1 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 }, + { tag: 2, value: 0 } + ] +} +{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/test_c.abc b/local_test/test_c.abc new file mode 100644 index 0000000000000000000000000000000000000000..ac212629cfe4d8575bd2187f1600215bdb145f20 GIT binary patch literal 896 zcmaJ;J#Q015S`t<&p3Qo!6d1$l7a#Y1p!sk7=r-GNeCbcgmj87=ip%9MZPnH4j~E( zmlP>doP0pRKcJ%F2c$s=3ZzJ(&0kpFtYaxf#7S@7?!KLQGkXu}E4S-J^lSfT4J6+v zqK{Zq04!;V4}l$QZ16om0MCF!fbY)XU=R2L`~@x`VGdx8>sjD;0N42d@V5u>e$3-K zhdAq^#zSBicn@4|26rAke!U&l<2cFIvvv|Ml0ScKzCms)NvP6KqiUM<+F?es&!bK! zsa0Pkz0L-ylvIN*asG0$(eFfv(IPA`gkXOju>=dAsoYLSmuR}xkHet5-j0I>nra4j zo2$3#&Eq^$$dgE@AjcC|%+BtDoLvMn)mN}5K8>W`EJ=3atZzm-hpi;L0dlrjIyxen z%Azz2!mC-z`?KcVBtM=>zGw=Z61aW)&-fa*V0s|Qg1mt+$%}DsWV_s#5l2lyoeq;2 zFW3*Wq&M<4`gKk`26<|UaygL;KPOL@3Rj;m934O=SHI-BX1*ijmZP@?iU@M8LJgIE zdw^qI_7UYkkpre>fGwEWfw_|5AFsBa^rB5@f(8&$V9mE`l&i^HmU1zXlMi!mC<_Nx zD8IwATRLOPEjhG4`{K+Neytj)s_<}nsvFPF7&{#pC$)eXPuOTxxI?#4I^`h>E4Qtg eeO@{GsUpm$%buC)zdkol_}qu-8ohwq58xk#y@gx= literal 0 HcmV?d00001 diff --git a/local_test/test_c.ts b/local_test/test_c.ts new file mode 100644 index 0000000000..77f80c02eb --- /dev/null +++ b/local_test/test_c.ts @@ -0,0 +1,10 @@ +class C { + s: string; + constructor(input: string) { + this.s = input; + } +} + +function foo() : void { + var c = new C("hello, world"); +} diff --git a/local_test/test_classExpression.abc b/local_test/test_classExpression.abc new file mode 100644 index 0000000000000000000000000000000000000000..8144bba121ae68ffd7a7358ae2ace05c61a3bb98 GIT binary patch literal 724 zcmZuuJ!=$E6us}g`OHEv42!W4g&=ln>?9#DYS3b15){E|Sl5?zV4YcZ-X@zSkj}zF ztF(`u#M)lLLJSCk7XAVMKoA?Z8_%6htQ6p&-IQ8SMxTQ08N>%M2 zp-|0XnB+v(lC*|^m6+LxnZFWq)8HqpZ#^F9E^2}Xfbb?OtRtde8(HvA?cF^lz_iHsuQq4M8boH_2nb<wliiQ7x5$! zWXGUla-$*$3JOZ1OWis|bg4rpGpN8rbcvwp_x`gV3Sp-H-uusc|M&g=9_ZS?yNie} zzI(O`O!jo5S2#2R3eX8efGp&-;QIgxI0ua4z;~y>U&=&pfo>QTfGfZa;3E(KE8t`e zkidB@z;+x9BJu%<=pn#A&jGlqaE`+<*ybyE2b3mo8SsJDp7fqWhtCgLUAFCb887G9 z9hBH(59Vyk+(>oZnL=jJqPQg_n@Hy`J?{)sT_~c4)V5UVR{hMg$6u~Zm^)0FHE>JwD*ru9LTD*-0y(cg(gCr;yK5 zU1}qHC!I+=wV6LQks;_x&b`;k4(BaUs{M7Zf4jcT@BixTlJJDI0)G;va0e4x3pR7<#g{p6?YEXrW=r&BFl8H}P{Q|36 zX~L>b6RPcCS_VWoJR?+gs4BARb*Mrb!r}W+mBgsa4lzujYJm)~j#X5%vqa6F<$CFG zEbBa%W@qcE>BO)-kUpKs+35|ae`{EOJheSMh~fl^BCBMn9=M)=LZ+ntW*P6=94#MZ zL0G{))K;9de#i`{*w7FyujQQj`PVrV2Pc^) zAh^!`GsrBWUFV*;DAb1o(G(VzED#1C9gy?=mo{Zcv zq}T?etW2n;#C7~N5>I~%P>%9lL{VNyC~!`UKtUl(P>>#+Z9%ro*O&Na@MMZfKS-!Y zKEV(-Orj_fLT+PuD1}(UHdMtI%3_&fbHvlgDR9|_%Tbaa@QwZ*QP4jTIdJ)kP~PT& zR+O9$S}Y|bIX(^?eF9SYTY`)A6KZ30U9_($&cDs_KU&HQS7~YMBD%>tT<+#hOc*n3 zTWDtAI6&YrtIRErSHN>q7MvSzN;%Sfj`W{<$syKvb^dP7+sx9WrB* z0;<#i5@Lan*s(w(4+@*^*;FbEq;9(4x2Wg}_GAewG@Sd!juTX%Bc1oT=YGz+Z)Q#h zFP;jB=<22DPfYTChv+62Q-A`V24JFd7|NKR2L$jT@Ddj6`x)jhCD9e&a|B%jwt#~c z;(<2s5%4uohy4{`9k>j90&otl3!1I~8n_DZ^F4sH+w-U%*Zvlm1X%|bfIqPR0`n!{ z;YRbh`Ij%Qgh994OIk^%*F8y-wPUq~Rvb=~#}iHU5)_*w$T@BJBjneP*MflV=gPCa^Zh8q7@p))kPv(d zoRuy@BzJJK6BkZYUF>(;&9_>eZu1GMG@A9s+%rLA7)LJRBmzD_j4OUZk0j|jT4X2O zC#F0@UB(vFk4!0hNF6oQ1h$~2F^!`hG}MWLn%_nJj%Zg5sdGCh+%@F5;zAMiF;m}Q zFfxLj39s*n67+(hekh{man*$k+S(#Ikc4s4ThvpfC7_%@pJ2F28b3W;bim1TZ+R!sq$=?Fa0xXGV*39!%f`8H6;;XCS z5;#H2c&q1tGoGqLt)GfgN*>g@dCc{octw$qNY~EvK(oM1r?$@Dz?Ym^0}CE&<{is) z{-z+!Qe^oz#6ZeJcWeG)ZYzZw#cwHpT>N_<$@zulIO-7Oc&Ttxbj#1|fy}IYjlT`k zjZKfLBsVl^Re__E3Ohw@KeJLL2Wr#%nQ}a3_EFxg@y2rWL3GhiRcUvA9BZIA?=?yP zQ!}@eHM9Pa=1nc3Ni#<<29KNws@@gRQigNm|#(8I;z_}S7riJ*Jn79#1P_8<+E=|r;9u&!7-)PLgoSX8LhMw4<<8LjQ6j{LU#g>oEi zrGO1}*5jxrPR1*P33b<^iGj*+bf8*}V+u#2YIT%kncDN4Er;X<3TMc}QBr6wwjk$L z>)%3Qen-Agpw(Qtcl2Vt8exof^C?IOJ_R@GI7D)1Ix2B9h`NUAwZYQma-~+>5%)1T|Zi`Hp?{qtOJ=DPakxNwIMkP!n-)&#r$*6OykW)j|>!xEIYu6s>Z8}7F$gQlm6x|1kQ zN<;N(bz>4!`(U}+f2BT7@J-tQWwN)C;giwk(ZpXM#_(Z|LNBGz_1hQ@E+U!0|vHhT2eztfl~J zGbZMGP&~$0j!W=Tx8btD)YYDA&fpeP)li6-usup$b54-UQk?d$6ta}HOPnmY|CNHO zcAwkbl-iW@mgV?z732h3WHh=Jre4EIm6`a7Slgt@fV#+;Qsl}U0(~t!joM+Vv~(JB zGWb9SPdmrR;PdQ4`0jFaG1M|UKR=Gua3@#Tq`{|If|r$5RA|#8)RaYqz({oGJUWs} zt(=B3_|Kp#j`p2~Z$^lq)z#8{#3wV?ShM`sx9q$1@i!!`;+afDlYv-RLx5KryNJhyp8?Cg~LagBwir^RyJK!OEQG}-&s5U!EGQ8TVRm$tj)mr(K z94eJ(N^=*BrQLm^u+PCWj6H#~4$Bq)4TS!Qg-r4a2%O)Y&^(IhN36tMAJWhhnAr7& zA&(Q<*%3Jsht0TLZ&cT-C*vl4JAI6~=|X}Nw19&bX84~NrM92vZ_{L7fB8Prq`mL! zq@00o@ZX?+6^R|vclpyAftnHH_82E?B(S+8V+)D4 zWfEoV9nNLsEf(WxTjy(|B;zHjt?d2JaN8C$5@n~99mqOvKP+!kof{MlO=bZyQL-B4 zP>i=`Zgr^<-h$7OuL!&c7IL~I#xEGJ->5$0_8KQ|B!`xI+HMjU9iZq22dTTZXE!*+ zJ=?b%9H2JZZR_V*r+^171)?|Au|naVn@9A(rZ_x;cglwOS+U`6gEtUd$g2w&RiANs zjpS`6Nqe&@$+okYK$G)GJmY&K->B&=5+#{-E(z=nUobU{NczRyR8D}k)P zz%xD literal 0 HcmV?d00001 diff --git a/local_test/test_try/export.ts b/local_test/test_try/export.ts new file mode 100644 index 0000000000..ec726c2ec5 --- /dev/null +++ b/local_test/test_try/export.ts @@ -0,0 +1 @@ +export let a = class A{}; diff --git a/local_test/test_try/import.ts b/local_test/test_try/import.ts new file mode 100644 index 0000000000..ce2a384ad7 --- /dev/null +++ b/local_test/test_try/import.ts @@ -0,0 +1,3 @@ +import { a } from "./export" + +let b = a; diff --git a/local_test/tmp/build/test_another_export.js b/local_test/tmp/build/test_another_export.js new file mode 100644 index 0000000000..d3b5a3a8aa --- /dev/null +++ b/local_test/tmp/build/test_another_export.js @@ -0,0 +1,19 @@ +export class AnotherClassA { + constructor() { + this.a = this.getA(); + } + getA() { + return 3; + } +} +export class AnotherClassB { +} +export class DistinctClass { + constructor() { + this.name = "I'm in another export"; + } +} +// export default class declarations +export default class AnotherDefaultClass { +} +; diff --git a/local_test/tmp/build/test_another_simpler_export.js b/local_test/tmp/build/test_another_simpler_export.js new file mode 100644 index 0000000000..eb8a75684a --- /dev/null +++ b/local_test/tmp/build/test_another_simpler_export.js @@ -0,0 +1,6 @@ +export class AnotherClassB { +} +; +export class AnotherClassC { +} +; diff --git a/local_test/tmp/build/test_export.js b/local_test/tmp/build/test_export.js new file mode 100644 index 0000000000..f9a1e21e47 --- /dev/null +++ b/local_test/tmp/build/test_export.js @@ -0,0 +1,42 @@ +import { AnotherClassB, AnotherClassB as ClassC } from "./test_another_export"; +class DistinctClass { + constructor() { + this.name = "I'm in export"; + } +} +import * as anotherExport_1 from "./test_another_export"; +// --- 1. ExportDeclaration --- +// 1.1 re-export +export { anotherExport_1 as anotherExport }; +export { AnotherClassA, AnotherClassB, DistinctClass } from "./test_another_export"; +export { default as anotherDefaultClass } from "./test_another_export"; +// 1.2 named exporting via a clause +class ClassE { +} +; +export { ClassE }; +export { ClassC, ClassC as ClassD }; // exporte an imported class +// --- 2. ExportKeyword --- +// 2.1 inline named exports - ClassDeclaration +export class ClassF { +} +; +// export default class {} +// 2.2 inline named exports - VariableStatements +class ClassA { +} +; +export let InstanceA = new ClassA(); +export let InstanceB = new AnotherClassB(); +export let SomeClass = class { +}; +export let SomeClassInst = new class { +}; +// export default cLass AnotherDefaultClass{}; +// --- 3. ExportAssignment - default export --- +class defaultC { +} +export default defaultC; +// 4. VariableStatement/ClassExpression +//// export class as member of obj +// export default {defaultC, ClassA} diff --git a/local_test/tmp/build/test_import.js b/local_test/tmp/build/test_import.js new file mode 100644 index 0000000000..c281288b49 --- /dev/null +++ b/local_test/tmp/build/test_import.js @@ -0,0 +1,29 @@ +// 1. default import +import DefaultClassA from "./test_export.js"; +// 2. namespace import +import * as Imported from "./test_export.js"; +import { anotherExport as anotherImport } from "./test_export.js"; +// 3. named import +import { InstanceA, InstanceB, } from "./test_export.js"; +// 3.1 rename imports: +import { ClassD as ClassDDD, default as defaultAlt, anotherDefaultClass as defualtClassAlt } from "./test_export.js"; +// 4. empty import +import "./test_export.js"; +// 5. combining default import with namespace: +import DefaultClassB, * as importedAlt from "./test_export.js"; +// 6. combining default with named imports: +import DefaultClassC, { ClassC, ClassE } from "./test_export.js"; +///////////// +let da = DefaultClassA; +let ita = Imported.AnotherClassA; +let ae = anotherImport.AnotherClassA; +let ia = InstanceA; +let ib = InstanceB; +let cddd = ClassDDD; +let dat = defaultAlt; +let dcat = defualtClassAlt; +let dcb = DefaultClassB; +let italt = importedAlt.AnotherClassA; +let dcc = DefaultClassC; +let cc = ClassC; +let cd = ClassE; diff --git a/local_test/tmp/build/test_simpler_export.js b/local_test/tmp/build/test_simpler_export.js new file mode 100644 index 0000000000..9940293462 --- /dev/null +++ b/local_test/tmp/build/test_simpler_export.js @@ -0,0 +1,6 @@ +class ClassA { +} +; +export let SomeClass = class { +}; +export let SomeOtherClass = ClassA; diff --git a/patches/AppPackage/ace-loader.diff.zip b/patches/AppPackage/ace-loader.diff.zip new file mode 100755 index 0000000000000000000000000000000000000000..ad03b2ec0e8486d08b5874300c56a79c0263b265 GIT binary patch literal 1051 zcmWIWW@Zs#;Nak3=uMj#%zy-VfNb*=6NA(w1HF{Yw6wJ$x&DtW1pdv7H;h`CyV~qv zrjzug$1L33$2}Fc6sXVjQ@^%ReWl{o#d{cHul(OvHrXt7x9IZAk)dyUj(sTh^m9+^UL)ewramW4bqbdd zr(|lsi6fuM>7auv0yQ4+z0~jd|9K z-g)xK)4FDrMcMyDN&ln1Zn?3^Z+VDXM*JrMJ>@=$AIVSRd>$D-75u1t-&Voo({Yt+ zk=z!&%0kiGa-+q>3wgH9?GSolmzuG>tLV)4?m2JOHT;#*(le)WytEM!*t)FUxE&t*o5*WQR0}mV(dYi_{wtgD#fs(VQ_9QJmwR@G; z=2d&-P1L?DWZdyS^Xb3pQ>Hig*B@9D6~6nX&8nqeopp0{Bv>-mWMn3q&zFKRVt%$SKOqsMTbFBEiPUQ94Hu!~fPPuJ- z%IcSM__3VRt6ncEshZ4|H`ge^cpY!8XQZ`+c-^xZPG>yhgu#9Ev6PvkwHRBGz9exFf?maF@T zh^vocV?Xswe3_>%p0nzCXOHWqtLpaGGp&w3eazr~r?AG#NvP7=I<?^PCY0X)qwJf&teATv3T2~LN`F?$K*?IN5_Pq7mt2B~cEUGCA zTe53*I)}Xdp=obkyx_2!e;N_A9%06d%yF9>fD8ivnRAAoL(;Mto4I2>i!E) zeeWqTw=;jew-vn+kRDJEEMMv*VU3+%s#n{c>(y?Vd3m<2(@kGhrez@57#f;$e zO|p(_KdSBMWxSBJ<$CwGAND_PC-9mHZ@;$3XzpGe19Rr(moFtVu2}vyZC^NJVT}+E zuc=SKeZ~N9b`G;c4zDLNGcbH&XJ82MW@Hj!KxAfQIZ$Rs1;|-Dz?+o~B+CedRzUhR I&_o6X0B3Q`-2eap literal 0 HcmV?d00001 diff --git a/patches/AppPackage/build.diff.zip b/patches/AppPackage/build.diff.zip new file mode 100755 index 0000000000000000000000000000000000000000..1cd9438ef9d78820573a725cd978b4dcde42aff0 GIT binary patch literal 2671 zcmV-#3Xt_sO9KQH00;;O010xDQvd(}000000000001N;C05WD~Fk>@gE@WwDX1!T` zZ`w=}|DR8>$5oGw0Am{n1RbZoUHkN;R#lrj>6DACwY>%>#n3+ z-XRi_^>1hAeP)MuNwg!T=jqPWVaus8Th4TPF>@Bv<iy+cRwPF$&37 z787GZbbZC&#ME`8_YTOc$ah_zF3q`dLH_c6OQQ{q9{iWvJv}gAbE4f}dv9sRR^)2W zM#Pwrx6Favra_F06})FU8R|=2?|t3dx6H{_+j$H z^UHhKoH~ggXMPl}Ub!^RNEVSzNMh>T(G7D6jpM*~C<0P)#prJJw~zn$K;AK$?Gr|# zguLEwJpbD&UwQ3^G6SS*VbqD%$V!co-K6Gw3kbldbaNM#^Z6X=lY&U#^a5j5ju&sQ91!G z@kiT)KCzFMdVc7#Z^WafXBZ1jGp3jH(q0fl*BA3S(rlsA8xDtUv|hd>V`I7;U63Ju zEXd23J@RKlhzEiP)|SRrOtbBZc>5qA_$P@x6792ipAmQpxBv`SN0aEDC5Ob%Sc(`c zq&ubwvbU*8ZD$349kwjnvIH%ZB{WREDA~bdV(&vYV7N?^J7Pa%%mH1Gh|4^>4>EF3 zgFO?(%9j@fL3F^)e&AZLQR@v6!Lt0k*5lyukDUkF4pKaozcaRr18@ShkNQNh`vdYQ zba^r3y1bZ=41+6^5K9P6)+Kwm?0ZCoL;R4rsvq7*cP!Baa)8vhT;!%4op#iHDy)Y~;SD3C#4(^vlVel{@ zzx_t?f5>_b4zOp1iV4|KKa}ioS4E=DHGzE+LSLY?LvvwPgeF|tFv@&~<+6^dj}n&h zB$76s-t@-ZVm4RFAAg(>INj2OxmMuY2~B*K4k|)&qYT%iiOB`)%tDqQW-Nj5Zb?VA zXEHA>rZZ-Grlu_!B&6kuyj0(PoS^E@x#p*H?rzh0P4gYEKF>! zrPRHf+@@oJ5Dbp9C`OrJBDc6UfyQVMP3hY3R}wtXX1BXhD4ePMcXMi?ano4j{?p z)Sg6im+|*Js>24c(gA;(>ZnG;W%n$I;?gdlJW(N671f6jB^WCEfTbmYg1uu;s0Ir9 zctC9yKzw_V`piSyqDcl4bSdbdP@9J!T7?oQrC;#+Y)_MRCc@G+JO6}Wc|B;+;rJJ8 zaD1e>|5|?-NqJ+D_Z407RT%7-#Mdy7um68YpukeO@aO*`CYsLuTrN&qwzB;S$3=vFHSgBA2fqTes;*)Xs(IJ}xgt%S!iA zt&+#Q9hJ+nDIAYQ5v=zdWgk+Q50GVv9HVTdX=|r9G|+YS&CmDB*iz(uEcR8PJ?T>$ z7UCJ)qh2)o8BOkyO~`VFx1-@yUyO{4iYkk;DK3~Yksh6Sljq!VF2-#=1(i$KFjo>( zE(PWQWOjWNdG&yKP7Y~OYQ|oke_=VV7~`?*EX%ynBHj5-PlUluuoIuRrL{ELYa&Yl z(EpOVv6n>9kcaLV*{{e~cR``q7T2rYFuMCxxCC@Rly?mG;?kpwrKU|U>6|Xz`W@rM zc5%r#0YLYhUgGr*ejDbAO9pjtinLZBR1&!HL6|6=O}m^Wtl!}Uy%V)%LA+MF<|2&& zg)$Jfi)oU=&7Hcg74gBBsuTuRI=iG+<~y(r<~vX)n8zv0G54gC`=+lcBT1dlmL#Pd zKoD?B7mdt$Osse=Ny(ZeC_w(UAWKNf{KLWsQSsNHhSUm2lBq?w*FN)uRPNk_aPdwv zwROjUJKt0dxAgEMhxBIJZH>s=m zXkQKANOdLnHS!8*DSaDGO7I!v17I#t6Ul}Chz(T9a;2j01iw0a{e1}~<#H@o*70^ZG09`pcI&rrpDukg$= zMO5(+6>z~39lEGR5KL>4SSktl^cLsft~=^YonFB*v=Y3hgn~Tc-#VqJO9-k14enH# zNCpk($4&go08qZCB{*4qe dWNBt*P)h{{000000RRC2IsgCw9|`~f008-M2nPTF literal 0 HcmV?d00001 diff --git a/patches/AppPackage/ets-loader.diff.zip b/patches/AppPackage/ets-loader.diff.zip new file mode 100755 index 0000000000000000000000000000000000000000..604b782826eb99a9fd69da3251161b6a2ef8eea5 GIT binary patch literal 2137 zcmY+G`9Bj51IMStga;$%=*zTKyhIPPYLhF;3ZrCl%(2Nd5fTcyCOL=2HpkMpea+*@ zkRv3wd!A7Q@Jb3SKl7Ww|@)G?wOyje4QFQDn#GC znLEQs>L;0ub}kkMf}(Y-k@9vOGeaGeY6hO0(ppf;AjU`r}fGV=7x!-DW zyUbt$W56`HFSZYeHZnPj#QYRIgsxT>zIF3~%d-4Kj*_ ztTjuCDQ%=$4nO`V0FoQWHh1{1+amTmlk4{U6{kBxAjQ0SM+eJ7VDMR48f59!&Zm~h zUXuTan~{^gSeNW7*Au;075%0ssAX7WpC-htI!j{j8>EP=HC#(GY&S!@BKEZbc7 z#M4N9>z*kkz_Ql95q8gF$@UIM!{)K`7Q}9L{S|!j<)`&+(u$+E7}C*L!zmt<#l(Xp zWrQ6+^-A!}HA`JwtOv1VC^luLCZ6p+@(AlMa{?Ff^u&*fz*2G7ttqK(zlnZ)_ z>Ds*W4oJ^*6fU}zk_Nj|yLa6~!noN;_kNy^75+Wit4_~~kkGAlXbFc0=$E6ynOn<)aPXdtEW<&RK$jS7S?N1*l&L+Z zpJUu^&#+lOl?3g1VOfJfj1|1*lWp>$)8bwmQr7=TiOWn$Sk-P4URG!tSEg-r=(>vC z(Cb>KQm;1r(^7LF!&i>BYn36hDs)B|R-pYRz=GPEiWs&=!XosF)L#nMDwny+0k=a4 zHMSP*mu`xzg$r%E?w8K>m^&u6rHb2i@C@%Ex-4Bgg0yqA>j(O|Q({si zLaSyz$x?UxAa9d-ge3m~Evo6RZq#}tg0GFnSDH6ACP(|n(lCS!n4o&32PsAaRit^! zpHF)}#fWA@q>_6fxXnppmN!fONPN^!T6rS|eLwL9UBO(m%2*iZ5Vl1;?~Tyi{pn~ys-Y@wR}?WtYPtu zf;GVSt>pq?2LRAVf@93vQUwnOj%LjivOlNu7{J8Xf$kDG+t}*DsLrx#C#+v{rLR=0 zdOQ&2Inm_hf(X+hyIfIf76-qZMq2|;yWsPk?&9U%zJ*Ln4G3_n(vm1h?xiT@@V;)a zv%ypjbdvoQjEq4f^3{4%Xk;*c+yo*9W$J&~LF(9`0_d5po5TcC!E{Qy%h!?*jwgt=w_8Jw1R8 z+$|65!e5IkC>%7W5)HSgMEU1Oxx5HB7qkzy1URTl683->=Xw LpZ%3$z~Ae?gEj^$ literal 0 HcmV?d00001 diff --git a/patches/DebugInfo/runtime.patch b/patches/DebugInfo/runtime.patch new file mode 100755 index 0000000000..237b0b7970 --- /dev/null +++ b/patches/DebugInfo/runtime.patch @@ -0,0 +1,160 @@ +diff --git a/assembler/assembly-debug.h b/assembler/assembly-debug.h +old mode 100644 +new mode 100755 +index cf1f325b..530c30fe +--- a/assembler/assembly-debug.h ++++ b/assembler/assembly-debug.h +@@ -24,6 +24,7 @@ namespace panda::pandasm::debuginfo { + + struct Ins { + size_t line_number = 0; ++ size_t column_number = 0; + std::string whole_line = ""; + size_t bound_left = 0; + size_t bound_right = 0; +@@ -33,6 +34,11 @@ struct Ins { + line_number = ln; + } + ++ void SetColumnNumber(size_t cn) ++ { ++ column_number = cn; ++ } ++ + Ins() = default; + Ins(size_t l_n, std::string &f_c, size_t b_l, size_t b_r) + : line_number(l_n), whole_line(std::move(f_c)), bound_left(b_l), bound_right(b_r) +diff --git a/assembler/assembly-emitter.cpp b/assembler/assembly-emitter.cpp +old mode 100644 +new mode 100755 +index 2e300c4f..939815e2 +--- a/assembler/assembly-emitter.cpp ++++ b/assembler/assembly-emitter.cpp +@@ -1621,6 +1621,11 @@ size_t Function::GetLineNumber(size_t i) const + return static_cast(ins[i].ins_debug.line_number); + } + ++size_t Function::GetColumnNumber(size_t i) const ++{ ++ return static_cast(ins[i].ins_debug.column_number); ++} ++ + void Function::EmitNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, + uint32_t pc_inc, int32_t line_inc) const + { +@@ -1649,6 +1654,22 @@ void Function::EmitLineNumber(panda_file::LineNumberProgramItem *program, std::v + } + } + ++void Function::EmitColumnNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, ++ int32_t &prev_column_number, uint32_t &pc_inc, size_t instruction_number, bool emit_debug_info) const ++{ ++ if (emit_debug_info) { ++ int32_t cn = GetColumnNumber(instruction_number); ++ if (cn != prev_column_number) { ++ program->EmitColumn(constant_pool, pc_inc, cn); ++ pc_inc = 0; ++ prev_column_number = cn; ++ } ++ return; ++ } ++ ++ ++} ++ + void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, const std::vector &bytecode, + ItemContainer *container, std::vector *constant_pool, + bool emit_debug_info) const +@@ -1662,6 +1683,7 @@ void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, con + + uint32_t pc_inc = 0; + int32_t prev_line_number = GetLineNumber(0); ++ int32_t prev_column_number = GetColumnNumber(0); + BytecodeInstruction bi(bytecode.data()); + debug_item->SetLineNumber(static_cast(prev_line_number)); + +@@ -1677,6 +1699,10 @@ void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, con + EmitLineNumber(program, constant_pool, prev_line_number, pc_inc, i); + } + ++ if (language == pandasm::extensions::Language::ECMASCRIPT) { ++ EmitColumnNumber(program, constant_pool, prev_column_number, pc_inc, i, emit_debug_info); ++ } ++ + pc_inc += bi.GetSize(); + bi = bi.GetNext(); + } +diff --git a/assembler/assembly-function.h b/assembler/assembly-function.h +old mode 100644 +new mode 100755 +index 91137d1b..c06a4f69 +--- a/assembler/assembly-function.h ++++ b/assembler/assembly-function.h +@@ -131,6 +131,8 @@ struct Function { + const std::unordered_map &literalarrays) const; + + size_t GetLineNumber(size_t i) const; ++ ++ size_t GetColumnNumber(size_t i) const; + + void EmitLocalVariable(panda_file::LineNumberProgramItem *program, panda_file::ItemContainer *container, + std::vector *constant_pool, uint32_t &pc_inc, size_t instruction_number) const; +@@ -138,6 +140,9 @@ struct Function { + int32_t line_inc) const; + void EmitLineNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, + int32_t &prev_line_number, uint32_t &pc_inc, size_t instruction_number) const; ++ // column number is only for javascript for now ++ void EmitColumnNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, ++ int32_t &prev_column_number, uint32_t &pc_inc, size_t instruction_number, bool emit_debug_info) const; + + void BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, const std::vector &bytecode, + panda_file::ItemContainer *container, std::vector *constant_pool, +diff --git a/libpandafile/file_items.cpp b/libpandafile/file_items.cpp +old mode 100644 +new mode 100755 +index 7f3e3b56..4dc7239f +--- a/libpandafile/file_items.cpp ++++ b/libpandafile/file_items.cpp +@@ -1387,6 +1387,15 @@ bool LineNumberProgramItem::EmitSpecialOpcode(uint32_t pc_inc, int32_t line_inc) + return true; + } + ++void LineNumberProgramItem::EmitColumn(std::vector *constant_pool, uint32_t pc_inc, int32_t column) ++{ ++ if (pc_inc != 0U) { ++ EmitAdvancePc(constant_pool, pc_inc); ++ } ++ EmitOpcode(Opcode::SET_COLUMN); ++ EmitUleb128(constant_pool, column); ++} ++ + void LineNumberProgramItem::EmitPrologEnd() + { + EmitOpcode(Opcode::SET_PROLOGUE_END); +diff --git a/libpandafile/file_items.h b/libpandafile/file_items.h +old mode 100644 +new mode 100755 +index 27a09082..1c3404cc +--- a/libpandafile/file_items.h ++++ b/libpandafile/file_items.h +@@ -489,6 +489,8 @@ public: + SET_EPILOGUE_BEGIN = 0x08, + SET_FILE = 0x09, + SET_SOURCE_CODE = 0x0a, ++ SET_COLUMN = 0X0b, // The SET_COLUMN opcode takes a single unsigned LEB128 operand and ++ // stores it in the column register of the state machine. + LAST + }; + +@@ -514,6 +516,8 @@ public: + + bool EmitSpecialOpcode(uint32_t pc_inc, int32_t line_inc); + ++ void EmitColumn(std::vector *constant_pool, uint32_t pc_inc, int32_t column); ++ + void EmitPrologEnd(); + + void EmitEpilogBegin(); +diff --git a/libpandafile/line_program_state.h b/libpandafile/line_program_state.h +old mode 100644 +new mode 100755 diff --git a/patches/DebugInfo/ts2abc.patch b/patches/DebugInfo/ts2abc.patch new file mode 100755 index 0000000000..c3b3022309 --- /dev/null +++ b/patches/DebugInfo/ts2abc.patch @@ -0,0 +1,15 @@ +diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp +index 1f3e8c12..d25e479f 100755 +--- a/ts2panda/ts2abc/ts2abc.cpp ++++ b/ts2panda/ts2abc/ts2abc.cpp +@@ -402,6 +402,10 @@ static void ParseInstructionDebugInfo(const Json::Value &ins, panda::pandasm::In + if (debugPosInfo.isMember("wholeLine") && debugPosInfo["wholeLine"].isString()) { + insDebug.whole_line = debugPosInfo["wholeLine"].asString(); + } ++ ++ if (debugPosInfo.isMember("columnNum") && debugPosInfo["columnNum"].isInt()) { ++ insDebug.column_number = debugPosInfo["columnNum"].asInt(); ++ } + } + + if (debugPosInfo.isMember("lineNum") && debugPosInfo["lineNum"].isInt()) { diff --git a/patches/ModulesSupport/ESM.patch b/patches/ModulesSupport/ESM.patch new file mode 100755 index 0000000000..db92e92e43 --- /dev/null +++ b/patches/ModulesSupport/ESM.patch @@ -0,0 +1,2235 @@ +diff --git a/test262/config.py b/test262/config.py +index 9af9c3b5..ee2a0ff9 100755 +--- a/test262/config.py ++++ b/test262/config.py +@@ -100,5 +100,663 @@ MODULE_FILES_LIST = [ + "parse-err-return.js", + "parse-err-yield.js", + "dup-bound-names.js", +- "await-module.js" ++ "await-module.js", ++ "comment-multi-line-html-close.js", ++ "comment-single-line-html-close.js", ++ "comment-single-line-html-open.js", ++ "early-dup-export-as-star-as.js", ++ "early-dup-export-decl.js", ++ "early-dup-export-dflt-id.js", ++ "early-dup-export-dflt.js", ++ "early-dup-export-id-as.js", ++ "early-dup-export-id.js", ++ "export-star-as-dflt.js", ++ "early-dup-lables.js", ++ "early-dup-lex.js", ++ "early-export-global.js", ++ "early-export-ill-formed-string.js", ++ "early-export-unresolvable.js", ++ "early-import-arguments.js", ++ "early-import-as-arguments.js", ++ "early-import-as-eval.js", ++ "early-import-eval.js", ++ "early-lex-and-var.js", ++ "early-new-target.js", ++ "early-strict-mode.js", ++ "early-super.js", ++ "early-undef-break.js", ++ "early-undef-continue.js", ++ "eval-export-cls-semi.js", ++ "eval-export-dflt-cls-anon.js", ++ "eval-export-dflt-cls-anon-semi.js", ++ "eval-export-dflt-cls-named.js", ++ "eval-export-dflt-cls-named-semi.js", ++ "eval-export-dflt-cls-name-meth.js", ++ "eval-export-dflt-expr-cls-anon.js", ++ "eval-export-dflt-expr-cls-named.js", ++ "eval-export-dflt-expr-cls-name-meth.js", ++ "eval-export-dflt-expr-err-eval.js", ++ "eval-export-dflt-expr-err-get-value.js", ++ "eval-export-dflt-expr-fn-anon.js", ++ "eval-export-dflt-expr-fn-named.js", ++ "eval-export-dflt-expr-gen-anon.js", ++ "eval-export-dflt-expr-gen-named.js", ++ "eval-export-dflt-expr-in.js", ++ "eval-export-dflt-fun-anon-semi.js", ++ "eval-export-dflt-fun-named-semi.js", ++ "eval-export-dflt-gen-anon-semi.js", ++ "eval-export-dflt-gen-named-semi.js", ++ "eval-export-fun-semi.js", ++ "eval-export-gen-semi.js", ++ "eval-gtbndng-indirect-trlng-comma_FIXTURE.js", ++ "eval-gtbndng-indirect-trlng-comma.js", ++ "eval-gtbndng-indirect-update-as_FIXTURE.js", ++ "eval-gtbndng-indirect-update-as.js", ++ "eval-gtbndng-indirect-update-dflt_FIXTURE.js", ++ "eval-gtbndng-indirect-update-dflt.js", ++ "eval-gtbndng-indirect-update_FIXTURE.js", ++ "eval-gtbndng-indirect-update.js", ++ "eval-gtbndng-local-bndng-cls.js", ++ "eval-gtbndng-local-bndng-const.js", ++ "eval-gtbndng-local-bndng-let.js", ++ "eval-gtbndng-local-bndng-var.js", ++ "eval-rqstd-abrupt-err-type_FIXTURE.js", ++ "eval-rqstd-abrupt-err-uri_FIXTURE.js", ++ "eval-rqstd-abrupt.js", ++ "eval-rqstd-once_FIXTURE.js", ++ "eval-rqstd-once.js", ++ "eval-rqstd-order-1_FIXTURE.js", ++ "eval-rqstd-order-2_FIXTURE.js", ++ "eval-rqstd-order-3_FIXTURE.js", ++ "eval-rqstd-order-4_FIXTURE.js", ++ "eval-rqstd-order-5_FIXTURE.js", ++ "eval-rqstd-order-6_FIXTURE.js", ++ "eval-rqstd-order-7_FIXTURE.js", ++ "eval-rqstd-order-8_FIXTURE.js", ++ "eval-rqstd-order-9_FIXTURE.js", ++ "eval-rqstd-order.js", ++ "eval-self-abrupt.js", ++ "eval-self-once.js", ++ "eval-this.js", ++ "export-default-asyncfunction-declaration-binding-exists.js", ++ "export-default-asyncfunction-declaration-binding.js", ++ "export-default-asyncgenerator-declaration-binding-exists.js", ++ "export-default-asyncgenerator-declaration-binding.js", ++ "export-default-function-declaration-binding-exists.js", ++ "export-default-function-declaration-binding.js", ++ "export-default-generator-declaration-binding-exists.js", ++ "export-default-generator-declaration-binding.js", ++ "export-expname-binding-string.js", ++ "export-expname_FIXTURE.js", ++ "export-expname-from-as-unpaired-surrogate.js", ++ "export-expname-from-binding-string.js", ++ "export-expname-from-star.js", ++ "export-expname-from-star-string.js", ++ "export-expname-from-star-unpaired-surrogate.js", ++ "export-expname-from-string-binding.js", ++ "export-expname-from-string.js", ++ "export-expname-from-string-string.js", ++ "export-expname-from-unpaired-surrogate.js", ++ "export-expname-import-string-binding.js", ++ "export-expname-import-unpaired-surrogate.js", ++ "export-expname-string-binding.js", ++ "export-expname-unpaired-surrogate.js", ++ "export-star-as-dflt_FIXTURE.js", ++ "export-star-as-dflt.js", ++ "instn-iee-bndng-cls_FIXTURE.js", ++ "instn-iee-bndng-cls.js", ++ "instn-iee-bndng-const_FIXTURE.js", ++ "instn-iee-bndng-const.js", ++ "instn-iee-bndng-fun_FIXTURE.js", ++ "instn-iee-bndng-fun.js", ++ "instn-iee-bndng-gen_FIXTURE.js", ++ "instn-iee-bndng-gen.js", ++ "instn-iee-bndng-let_FIXTURE.js", ++ "instn-iee-bndng-let.js", ++ "instn-iee-bndng-var_FIXTURE.js", ++ "instn-iee-bndng-var.js", ++ "instn-iee-err-ambiguous-1_FIXTURE.js", ++ "instn-iee-err-ambiguous-2_FIXTURE.js", ++ "instn-iee-err-ambiguous-as.js", ++ "instn-iee-err-ambiguous_FIXTURE.js", ++ "instn-iee-err-ambiguous.js", ++ "instn-iee-err-circular-as.js", ++ "instn-iee-err-circular_FIXTURE.js", ++ "instn-iee-err-circular.js", ++ "instn-iee-err-dflt-thru-star-as.js", ++ "instn-iee-err-dflt-thru-star-dflt_FIXTURE.js", ++ "instn-iee-err-dflt-thru-star-int_FIXTURE.js", ++ "instn-iee-err-dflt-thru-star.js", ++ "instn-iee-err-not-found-as.js", ++ "instn-iee-err-not-found-empty_FIXTURE.js", ++ "instn-iee-err-not-found.js", ++ "instn-iee-iee-cycle-2_FIXTURE.js", ++ "instn-iee-iee-cycle.js", ++ "instn-iee-star-cycle-2_FIXTURE.js", ++ "instn-iee-star-cycle-indirect-x_FIXTURE.js", ++ "instn-iee-star-cycle.js", ++ "instn-iee-trlng-comma_FIXTURE.js", ++ "instn-iee-trlng-comma.js", ++ "instn-local-bndng-cls.js", ++ "instn-local-bndng-const.js", ++ "instn-local-bndng-export-cls.js", ++ "instn-local-bndng-export-const.js", ++ "instn-local-bndng-export-fun.js", ++ "instn-local-bndng-export-gen.js", ++ "instn-local-bndng-export-let.js", ++ "instn-local-bndng-export-var.js", ++ "instn-local-bndng-for-dup.js", ++ "instn-local-bndng-for.js", ++ "instn-local-bndng-fun.js", ++ "instn-local-bndng-gen.js", ++ "instn-local-bndng-let.js", ++ "instn-local-bndng-var-dup.js", ++ "instn-local-bndng-var.js", ++ "instn-named-bndng-cls.js", ++ "instn-named-bndng-const.js", ++ "instn-named-bndng-dflt-cls.js", ++ "instn-named-bndng-dflt-expr.js", ++ "instn-named-bndng-dflt-fun-anon.js", ++ "instn-named-bndng-dflt-fun-named.js", ++ "instn-named-bndng-dflt-gen-anon.js", ++ "instn-named-bndng-dflt-gen-named.js", ++ "instn-named-bndng-dflt-named.js", ++ "instn-named-bndng-dflt-star.js", ++ "instn-named-bndng-fun.js", ++ "instn-named-bndng-gen.js", ++ "instn-named-bndng-let.js", ++ "instn-named-bndng-trlng-comma.js", ++ "instn-named-bndng-var.js", ++ "instn-named-err-ambiguous-1_FIXTURE.js", ++ "instn-named-err-ambiguous-2_FIXTURE.js", ++ "instn-named-err-ambiguous-as.js", ++ "instn-named-err-ambiguous_FIXTURE.js", ++ "instn-named-err-ambiguous.js", ++ "instn-named-err-dflt-thru-star-as.js", ++ "instn-named-err-dflt-thru-star-dflt_FIXTURE.js", ++ "instn-named-err-dflt-thru-star-dflt.js", ++ "instn-named-err-dflt-thru-star-int_FIXTURE.js", ++ "instn-named-err-not-found-as.js", ++ "instn-named-err-not-found-dflt.js", ++ "instn-named-err-not-found-empty_FIXTURE.js", ++ "instn-named-err-not-found.js", ++ "instn-named-id-name.js", ++ "instn-named-iee-cycle-2_FIXTURE.js", ++ "instn-named-iee-cycle.js", ++ "instn-named-star-cycle-2_FIXTURE.js", ++ "instn-named-star-cycle-indirect-x_FIXTURE.js", ++ "instn-named-star-cycle.js", ++ "instn-once.js", ++ "instn-resolve-empty-export_FIXTURE.js", ++ "instn-resolve-empty-export.js", ++ "instn-resolve-empty-import_FIXTURE.js", ++ "instn-resolve-empty-import.js", ++ "instn-resolve-err-syntax-1_FIXTURE.js", ++ "instn-resolve-err-syntax-1.js", ++ "instn-resolve-err-syntax-2_FIXTURE.js", ++ "instn-resolve-err-syntax-2.js", ++ "instn-resolve-order-depth-child_FIXTURE.js", ++ "instn-resolve-order-depth.js", ++ "instn-resolve-order-depth-reference_FIXTURE.js", ++ "instn-resolve-order-depth-syntax_FIXTURE.js", ++ "instn-resolve-order-src.js", ++ "instn-resolve-order-src-reference_FIXTURE.js", ++ "instn-resolve-order-src-syntax_FIXTURE.js", ++ "instn-resolve-order-src-valid_FIXTURE.js", ++ "instn-same-global.js", ++ "instn-same-global-set_FIXTURE.js", ++ "instn-star-ambiguous-1_FIXTURE.js", ++ "instn-star-ambiguous-2_FIXTURE.js", ++ "instn-star-ambiguous_FIXTURE.js", ++ "instn-star-ambiguous.js", ++ "instn-star-as-props-dflt-skip.js", ++ "instn-star-binding.js", ++ "instn-star-equality.js", ++ "instn-star-equality-other_FIXTURE.js", ++ "instn-star-err-not-found-empty_FIXTURE.js", ++ "instn-star-err-not-found-faulty_FIXTURE.js", ++ "instn-star-err-not-found.js", ++ "instn-star-id-name.js", ++ "instn-star-iee-cycle-2_FIXTURE.js", ++ "instn-star-iee-cycle.js", ++ "instn-star-props-circular-a_FIXTURE.js", ++ "instn-star-props-circular-b_FIXTURE.js", ++ "instn-star-props-circular.js", ++ "instn-star-props-dflt-keep-indirect-def_FIXTURE.js", ++ "instn-star-props-dflt-keep-indirect.js", ++ "instn-star-props-dflt-keep-indirect-reexport_FIXTURE.js", ++ "instn-star-props-dflt-keep-local.js", ++ "instn-star-props-dflt-keep-local-named_FIXTURE.js", ++ "instn-star-props-dflt-keep-local-prod_FIXTURE.js", ++ "instn-star-props-dflt-skip.js", ++ "instn-star-props-dflt-skip-named_FIXTURE.js", ++ "instn-star-props-dflt-skip-prod_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-as-named_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-as-prod_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-named_FIXTURE.js", ++ "instn-star-props-dflt-skip-star-prod_FIXTURE.js", ++ "instn-star-props-nrml-1_FIXTURE.js", ++ "instn-star-props-nrml-indirect_FIXTURE.js", ++ "instn-star-props-nrml.js", ++ "instn-star-props-nrml-star_FIXTURE.js", ++ "instn-star-star-cycle-2_FIXTURE.js", ++ "instn-star-star-cycle-indirect-x_FIXTURE.js", ++ "instn-star-star-cycle.js", ++ "instn-uniq-env-rec.js", ++ "instn-uniq-env-rec-other_FIXTURE.js", ++ "invalid-private-names-call-expression-bad-reference.js", ++ "invalid-private-names-call-expression-this.js", ++ "invalid-private-names-member-expression-bad-reference.js", ++ "invalid-private-names-member-expression-this.js", ++ "parse-err-decl-pos-export-arrow-function.js", ++ "parse-err-decl-pos-export-block-stmt.js", ++ "parse-err-decl-pos-export-block-stmt-list.js", ++ "parse-err-decl-pos-export-class-decl-meth.js", ++ "parse-err-decl-pos-export-class-decl-method-gen.js", ++ "parse-err-decl-pos-export-class-decl-method-gen-static.js", ++ "parse-err-decl-pos-export-class-decl-meth-static.js", ++ "parse-err-decl-pos-export-class-expr-meth-gen.js", ++ "parse-err-decl-pos-export-class-expr-meth-gen-static.js", ++ "parse-err-decl-pos-export-class-expr-meth.js", ++ "parse-err-decl-pos-export-class-expr-meth-static.js", ++ "parse-err-decl-pos-export-do-while.js", ++ "parse-err-decl-pos-export-for-const.js", ++ "parse-err-decl-pos-export-for-in-const.js", ++ "parse-err-decl-pos-export-for-in-let.js", ++ "parse-err-decl-pos-export-for-in-lhs.js", ++ "parse-err-decl-pos-export-for-in-var.js", ++ "parse-err-decl-pos-export-for-let.js", ++ "parse-err-decl-pos-export-for-lhs.js", ++ "parse-err-decl-pos-export-for-of-const.js", ++ "parse-err-decl-pos-export-for-of-let.js", ++ "parse-err-decl-pos-export-for-of-lhs.js", ++ "parse-err-decl-pos-export-for-of-var.js", ++ "parse-err-decl-pos-export-for-var.js", ++ "parse-err-decl-pos-export-function-decl.js", ++ "parse-err-decl-pos-export-function-expr.js", ++ "parse-err-decl-pos-export-generator-decl.js", ++ "parse-err-decl-pos-export-generator-expr.js", ++ "parse-err-decl-pos-export-if-else.js", ++ "parse-err-decl-pos-export-if-if.js", ++ "parse-err-decl-pos-export-labeled.js", ++ "parse-err-decl-pos-export-object-gen-method.js", ++ "parse-err-decl-pos-export-object-getter.js", ++ "parse-err-decl-pos-export-object-method.js", ++ "parse-err-decl-pos-export-object-setter.js", ++ "parse-err-decl-pos-export-switch-case-dflt.js", ++ "parse-err-decl-pos-export-switch-case.js", ++ "parse-err-decl-pos-export-switch-dftl.js", ++ "parse-err-decl-pos-export-try-catch-finally.js", ++ "parse-err-decl-pos-export-try-catch.js", ++ "parse-err-decl-pos-export-try-finally.js", ++ "parse-err-decl-pos-export-try-try.js", ++ "parse-err-decl-pos-export-while.js", ++ "parse-err-decl-pos-import-arrow-function.js", ++ "parse-err-decl-pos-import-block-stmt.js", ++ "parse-err-decl-pos-import-block-stmt-list.js", ++ "parse-err-decl-pos-import-class-decl-meth.js", ++ "parse-err-decl-pos-import-class-decl-method-gen.js", ++ "parse-err-decl-pos-import-class-decl-method-gen-static.js", ++ "parse-err-decl-pos-import-class-decl-meth-static.js", ++ "parse-err-decl-pos-import-class-expr-meth-gen.js", ++ "parse-err-decl-pos-import-class-expr-meth-gen-static.js", ++ "parse-err-decl-pos-import-class-expr-meth.js", ++ "parse-err-decl-pos-import-class-expr-meth-static.js", ++ "parse-err-decl-pos-import-do-while.js", ++ "parse-err-decl-pos-import-for-const.js", ++ "parse-err-decl-pos-import-for-in-const.js", ++ "parse-err-decl-pos-import-for-in-let.js", ++ "parse-err-decl-pos-import-for-in-lhs.js", ++ "parse-err-decl-pos-import-for-in-var.js", ++ "parse-err-decl-pos-import-for-let.js", ++ "parse-err-decl-pos-import-for-lhs.js", ++ "parse-err-decl-pos-import-for-of-const.js", ++ "parse-err-decl-pos-import-for-of-let.js", ++ "parse-err-decl-pos-import-for-of-lhs.js", ++ "parse-err-decl-pos-import-for-of-var.js", ++ "parse-err-decl-pos-import-for-var.js", ++ "parse-err-decl-pos-import-function-decl.js", ++ "parse-err-decl-pos-import-function-expr.js", ++ "parse-err-decl-pos-import-generator-decl.js", ++ "parse-err-decl-pos-import-generator-expr.js", ++ "parse-err-decl-pos-import-if-else.js", ++ "parse-err-decl-pos-import-if-if.js", ++ "parse-err-decl-pos-import-labeled.js", ++ "parse-err-decl-pos-import-object-gen-method.js", ++ "parse-err-decl-pos-import-object-getter.js", ++ "parse-err-decl-pos-import-object-method.js", ++ "parse-err-decl-pos-import-object-setter.js", ++ "parse-err-decl-pos-import-switch-case-dflt.js", ++ "parse-err-decl-pos-import-switch-case.js", ++ "parse-err-decl-pos-import-switch-dftl.js", ++ "parse-err-decl-pos-import-try-catch-finally.js", ++ "parse-err-decl-pos-import-try-catch.js", ++ "parse-err-decl-pos-import-try-finally.js", ++ "parse-err-decl-pos-import-try-try.js", ++ "parse-err-decl-pos-import-while.js", ++ "parse-err-export-dflt-const.js", ++ "parse-err-export-dflt-expr.js", ++ "parse-err-export-dflt-let.js", ++ "parse-err-export-dflt-var.js", ++ "parse-err-hoist-lex-fun.js", ++ "parse-err-hoist-lex-gen.js", ++ "parse-err-invoke-anon-fun-decl.js", ++ "parse-err-invoke-anon-gen-decl.js", ++ "parse-err-return.js", ++ "parse-err-semi-dflt-expr.js", ++ "parse-err-semi-export-star.js", ++ "parse-err-semi-named-export-from.js", ++ "parse-err-semi-named-export.js", ++ "parse-err-semi-name-space-export.js", ++ "parse-err-syntax-1.js", ++ "parse-err-syntax-2.js", ++ "parse-err-yield.js", ++ "parse-export-empty.js", ++ "private-identifiers-not-empty.js", ++ "privatename-not-valid-earlyerr-module-1.js", ++ "privatename-not-valid-earlyerr-module-2.js", ++ "privatename-not-valid-earlyerr-module-3.js", ++ "privatename-not-valid-earlyerr-module-4.js", ++ "privatename-not-valid-earlyerr-module-5.js", ++ "privatename-not-valid-earlyerr-module-6.js", ++ "privatename-not-valid-earlyerr-module-7.js", ++ "privatename-not-valid-earlyerr-module-8.js", ++ "privatename-valid-no-earlyerr.js", ++ "verify-dfs-a_FIXTURE.js", ++ "verify-dfs-b_FIXTURE.js", ++ "verify-dfs.js", ++ "Symbol.iterator.js", ++ "Symbol.toStringTag.js", ++ "define-own-property.js", ++ "delete-exported-init.js", ++ "delete-exported-uninit.js", ++ "delete-non-exported.js", ++ "enumerate-binding-uninit.js", ++ "get-nested-namespace-dflt-skip.js", ++ "get-nested-namespace-dflt-skip-named-end_FIXTURE.js", ++ "get-nested-namespace-dflt-skip-named_FIXTURE.js", ++ "get-nested-namespace-dflt-skip-prod-end_FIXTURE.js", ++ "get-nested-namespace-dflt-skip-prod_FIXTURE.js", ++ "get-nested-namespace-props-nrml-1_FIXTURE.js", ++ "get-nested-namespace-props-nrml-2_FIXTURE.js", ++ "get-nested-namespace-props-nrml-3_FIXTURE.js", ++ "get-nested-namespace-props-nrml.js", ++ "get-own-property-str-found-init.js", ++ "get-own-property-str-found-uninit.js", ++ "get-own-property-str-not-found.js", ++ "get-own-property-sym.js", ++ "get-prototype-of.js", ++ "get-str-found-init.js", ++ "get-str-found-uninit.js", ++ "get-str-initialize.js", ++ "get-str-not-found.js", ++ "get-str-update.js", ++ "get-sym-found.js", ++ "get-sym-not-found.js", ++ "has-property-str-found-init.js", ++ "has-property-str-found-uninit.js", ++ "has-property-str-not-found.js", ++ "has-property-sym-found.js", ++ "has-property-sym-not-found.js", ++ "is-extensible.js", ++ "object-hasOwnProperty-binding-uninit.js", ++ "object-keys-binding-uninit.js", ++ "object-propertyIsEnumerable-binding-uninit.js", ++ "own-property-keys-binding-types_FIXTURE.js", ++ "own-property-keys-binding-types.js", ++ "own-property-keys-sort.js", ++ "prevent-extensions.js", ++ "set.js", ++ "set-prototype-of.js", ++ "set-prototype-of-null.js", ++ "await-awaits-thenable-not-callable.js", ++ "await-awaits-thenables.js", ++ "await-awaits-thenables-that-throw.js", ++ "await-dynamic-import-rejection.js", ++ "await-dynamic-import-resolution.js", ++ "await-expr-func-expression.js", ++ "await-expr-new-expr.js", ++ "await-expr-new-expr-reject.js", ++ "await-expr-regexp.js", ++ "await-expr-reject-throws.js", ++ "await-expr-resolution.js", ++ "await-void-expr.js", ++ "dynamic-import-rejection.js", ++ "dynamic-import-resolution.js", ++ "early-errors-await-not-simple-assignment-target.js", ++ "if-await-expr.js", ++ "module-async-import-async-resolution-ticks.js", ++ "module-import-rejection-body_FIXTURE.js", ++ "module-import-rejection-body.js", ++ "module-import-rejection_FIXTURE.js", ++ "module-import-rejection.js", ++ "module-import-rejection-tick_FIXTURE.js", ++ "module-import-rejection-tick.js", ++ "module-import-resolution_FIXTURE.js", ++ "module-import-resolution.js", ++ "module-import-unwrapped_FIXTURE.js", ++ "module-import-unwrapped.js", ++ "module-self-import-async-resolution-ticks.js", ++ "module-sync-import-async-resolution-ticks.js", ++ "new-await.js", ++ "new-await-parens.js", ++ "new-await-script-code.js", ++ "no-operand.js", ++ "top-level-ticks-2.js", ++ "top-level-ticks.js", ++ "void-await-expr.js", ++ "while-dynamic-evaluation.js", ++ "await-expr-dyn-import.js", ++ "block-await-expr-array-literal.js", ++ "block-await-expr-func-expression.js", ++ "block-await-expr-identifier.js", ++ "block-await-expr-literal-number.js", ++ "block-await-expr-literal-string.js", ++ "block-await-expr-nested.js", ++ "block-await-expr-new-expr.js", ++ "block-await-expr-null.js", ++ "block-await-expr-obj-literal.js", ++ "block-await-expr-regexp.js", ++ "block-await-expr-template-literal.js", ++ "block-await-expr-this.js", ++ "catch-parameter.js", ++ "early-does-not-propagate-to-fn-declaration-body.js", ++ "early-does-not-propagate-to-fn-declaration-params.js", ++ "early-does-not-propagate-to-fn-expr-body.js", ++ "early-does-not-propagate-to-fn-expr-params.js", ++ "early-no-escaped-await.js", ++ "export-class-decl-await-expr-array-literal.js", ++ "export-class-decl-await-expr-func-expression.js", ++ "export-class-decl-await-expr-identifier.js", ++ "export-class-decl-await-expr-literal-number.js", ++ "export-class-decl-await-expr-literal-string.js", ++ "export-class-decl-await-expr-nested.js", ++ "export-class-decl-await-expr-new-expr.js", ++ "export-class-decl-await-expr-null.js", ++ "export-class-decl-await-expr-obj-literal.js", ++ "export-class-decl-await-expr-regexp.js", ++ "export-class-decl-await-expr-template-literal.js", ++ "export-class-decl-await-expr-this.js", ++ "export-dflt-assign-expr-await-expr-array-literal.js", ++ "export-dflt-assign-expr-await-expr-func-expression.js", ++ "export-dflt-assign-expr-await-expr-identifier.js", ++ "export-dflt-assign-expr-await-expr-literal-number.js", ++ "export-dflt-assign-expr-await-expr-literal-string.js", ++ "export-dflt-assign-expr-await-expr-nested.js", ++ "export-dflt-assign-expr-await-expr-new-expr.js", ++ "export-dflt-assign-expr-await-expr-null.js", ++ "export-dflt-assign-expr-await-expr-obj-literal.js", ++ "export-dflt-assign-expr-await-expr-regexp.js", ++ "export-dflt-assign-expr-await-expr-template-literal.js", ++ "export-dflt-assign-expr-await-expr-this.js", ++ "export-dft-class-decl-await-expr-array-literal.js", ++ "export-dft-class-decl-await-expr-func-expression.js", ++ "export-dft-class-decl-await-expr-identifier.js", ++ "export-dft-class-decl-await-expr-literal-number.js", ++ "export-dft-class-decl-await-expr-literal-string.js", ++ "export-dft-class-decl-await-expr-nested.js", ++ "export-dft-class-decl-await-expr-new-expr.js", ++ "export-dft-class-decl-await-expr-null.js", ++ "export-dft-class-decl-await-expr-obj-literal.js", ++ "export-dft-class-decl-await-expr-regexp.js", ++ "export-dft-class-decl-await-expr-template-literal.js", ++ "export-dft-class-decl-await-expr-this.js", ++ "export-lex-decl-await-expr-array-literal.js", ++ "export-lex-decl-await-expr-func-expression.js", ++ "export-lex-decl-await-expr-identifier.js", ++ "export-lex-decl-await-expr-literal-number.js", ++ "export-lex-decl-await-expr-literal-string.js", ++ "export-lex-decl-await-expr-nested.js", ++ "export-lex-decl-await-expr-new-expr.js", ++ "export-lex-decl-await-expr-null.js", ++ "export-lex-decl-await-expr-obj-literal.js", ++ "export-lex-decl-await-expr-regexp.js", ++ "export-lex-decl-await-expr-template-literal.js", ++ "export-lex-decl-await-expr-this.js", ++ "export-var-await-expr-array-literal.js", ++ "export-var-await-expr-func-expression.js", ++ "export-var-await-expr-identifier.js", ++ "export-var-await-expr-literal-number.js", ++ "export-var-await-expr-literal-string.js", ++ "export-var-await-expr-nested.js", ++ "export-var-await-expr-new-expr.js", ++ "export-var-await-expr-null.js", ++ "export-var-await-expr-obj-literal.js", ++ "export-var-await-expr-regexp.js", ++ "export-var-await-expr-template-literal.js", ++ "export-var-await-expr-this.js", ++ "for-await-await-expr-array-literal.js", ++ "for-await-await-expr-func-expression.js", ++ "for-await-await-expr-identifier.js", ++ "for-await-await-expr-literal-number.js", ++ "for-await-await-expr-literal-string.js", ++ "for-await-await-expr-nested.js", ++ "for-await-await-expr-new-expr.js", ++ "for-await-await-expr-null.js", ++ "for-await-await-expr-obj-literal.js", ++ "for-await-await-expr-regexp.js", ++ "for-await-await-expr-template-literal.js", ++ "for-await-await-expr-this.js", ++ "for-await-expr-array-literal.js", ++ "for-await-expr-func-expression.js", ++ "for-await-expr-identifier.js", ++ "for-await-expr-literal-number.js", ++ "for-await-expr-literal-string.js", ++ "for-await-expr-nested.js", ++ "for-await-expr-new-expr.js", ++ "for-await-expr-null.js", ++ "for-await-expr-obj-literal.js", ++ "for-await-expr-regexp.js", ++ "for-await-expr-template-literal.js", ++ "for-await-expr-this.js", ++ "for-in-await-expr-array-literal.js", ++ "for-in-await-expr-func-expression.js", ++ "for-in-await-expr-identifier.js", ++ "for-in-await-expr-literal-number.js", ++ "for-in-await-expr-literal-string.js", ++ "for-in-await-expr-nested.js", ++ "for-in-await-expr-new-expr.js", ++ "for-in-await-expr-null.js", ++ "for-in-await-expr-obj-literal.js", ++ "for-in-await-expr-regexp.js", ++ "for-in-await-expr-template-literal.js", ++ "for-in-await-expr-this.js", ++ "for-of-await-expr-array-literal.js", ++ "for-of-await-expr-func-expression.js", ++ "for-of-await-expr-identifier.js", ++ "for-of-await-expr-literal-number.js", ++ "for-of-await-expr-literal-string.js", ++ "for-of-await-expr-nested.js", ++ "for-of-await-expr-new-expr.js", ++ "for-of-await-expr-null.js", ++ "for-of-await-expr-obj-literal.js", ++ "for-of-await-expr-regexp.js", ++ "for-of-await-expr-template-literal.js", ++ "for-of-await-expr-this.js", ++ "if-block-await-expr-array-literal.js", ++ "if-block-await-expr-func-expression.js", ++ "if-block-await-expr-identifier.js", ++ "if-block-await-expr-literal-number.js", ++ "if-block-await-expr-literal-string.js", ++ "if-block-await-expr-nested.js", ++ "if-block-await-expr-new-expr.js", ++ "if-block-await-expr-null.js", ++ "if-block-await-expr-obj-literal.js", ++ "if-block-await-expr-regexp.js", ++ "if-block-await-expr-template-literal.js", ++ "if-block-await-expr-this.js", ++ "if-expr-await-expr-array-literal.js", ++ "if-expr-await-expr-func-expression.js", ++ "if-expr-await-expr-identifier.js", ++ "if-expr-await-expr-literal-number.js", ++ "if-expr-await-expr-literal-string.js", ++ "if-expr-await-expr-nested.js", ++ "if-expr-await-expr-new-expr.js", ++ "if-expr-await-expr-null.js", ++ "if-expr-await-expr-obj-literal.js", ++ "if-expr-await-expr-regexp.js", ++ "if-expr-await-expr-template-literal.js", ++ "if-expr-await-expr-this.js", ++ "top-level-await-expr-array-literal.js", ++ "top-level-await-expr-func-expression.js", ++ "top-level-await-expr-identifier.js", ++ "top-level-await-expr-literal-number.js", ++ "top-level-await-expr-literal-string.js", ++ "top-level-await-expr-nested.js", ++ "top-level-await-expr-new-expr.js", ++ "top-level-await-expr-null.js", ++ "top-level-await-expr-obj-literal.js", ++ "top-level-await-expr-regexp.js", ++ "top-level-await-expr-template-literal.js", ++ "top-level-await-expr-this.js", ++ "try-await-expr-array-literal.js", ++ "try-await-expr-func-expression.js", ++ "try-await-expr-identifier.js", ++ "try-await-expr-literal-number.js", ++ "try-await-expr-literal-string.js", ++ "try-await-expr-nested.js", ++ "try-await-expr-new-expr.js", ++ "try-await-expr-null.js", ++ "try-await-expr-obj-literal.js", ++ "try-await-expr-regexp.js", ++ "try-await-expr-template-literal.js", ++ "try-await-expr-this.js", ++ "typeof-await-expr-array-literal.js", ++ "typeof-await-expr-func-expression.js", ++ "typeof-await-expr-identifier.js", ++ "typeof-await-expr-literal-number.js", ++ "typeof-await-expr-literal-string.js", ++ "typeof-await-expr-nested.js", ++ "typeof-await-expr-new-expr.js", ++ "typeof-await-expr-null.js", ++ "typeof-await-expr-obj-literal.js", ++ "typeof-await-expr-regexp.js", ++ "typeof-await-expr-template-literal.js", ++ "typeof-await-expr-this.js", ++ "void-await-expr-array-literal.js", ++ "void-await-expr-func-expression.js", ++ "void-await-expr-identifier.js", ++ "void-await-expr-literal-number.js", ++ "void-await-expr-literal-string.js", ++ "void-await-expr-nested.js", ++ "void-await-expr-new-expr.js", ++ "void-await-expr-null.js", ++ "void-await-expr-obj-literal.js", ++ "void-await-expr-regexp.js", ++ "void-await-expr-template-literal.js", ++ "void-await-expr-this.js", ++ "while-await-expr-array-literal.js", ++ "while-await-expr-func-expression.js", ++ "while-await-expr-identifier.js", ++ "while-await-expr-literal-number.js", ++ "while-await-expr-literal-string.js", ++ "while-await-expr-nested.js", ++ "while-await-expr-new-expr.js", ++ "while-await-expr-null.js", ++ "while-await-expr-obj-literal.js", ++ "while-await-expr-regexp.js", ++ "while-await-expr-template-literal.js", ++ "while-await-expr-this.js" + ] +diff --git a/test262/es2015_tests.txt b/test262/es2015_tests.txt +index 92acde0d..69c4954f 100755 +--- a/test262/es2015_tests.txt ++++ b/test262/es2015_tests.txt +@@ -4405,6 +4405,664 @@ built-ins/WeakSet/iterator-close-after-add-failure.js + built-ins/WeakSet/prototype-of-weakset.js + language/expressions/generators/default-proto.js + language/statements/generators/default-proto.js ++language/module-code/comment-multi-line-html-close.js ++language/module-code/comment-single-line-html-close.js ++language/module-code/comment-single-line-html-open.js ++language/module-code/early-dup-export-as-star-as.js ++language/module-code/early-dup-export-decl.js ++language/module-code/early-dup-export-dflt-id.js ++language/module-code/early-dup-export-dflt.js ++language/module-code/early-dup-export-id-as.js ++language/module-code/early-dup-export-id.js ++language/module-code/early-dup-language/module-code/export-star-as-dflt.js ++language/module-code/early-dup-lables.js ++language/module-code/early-dup-lex.js ++language/module-code/early-export-global.js ++language/module-code/early-export-ill-formed-string.js ++language/module-code/early-export-unresolvable.js ++language/module-code/early-import-arguments.js ++language/module-code/early-import-as-arguments.js ++language/module-code/early-import-as-eval.js ++language/module-code/early-import-eval.js ++language/module-code/early-lex-and-var.js ++language/module-code/early-new-target.js ++language/module-code/early-strict-mode.js ++language/module-code/early-super.js ++language/module-code/early-undef-break.js ++language/module-code/early-undef-continue.js ++language/module-code/eval-export-cls-semi.js ++language/module-code/eval-export-dflt-cls-anon.js ++language/module-code/eval-export-dflt-cls-anon-semi.js ++language/module-code/eval-export-dflt-cls-named.js ++language/module-code/eval-export-dflt-cls-named-semi.js ++language/module-code/eval-export-dflt-cls-name-meth.js ++language/module-code/eval-export-dflt-expr-cls-anon.js ++language/module-code/eval-export-dflt-expr-cls-named.js ++language/module-code/eval-export-dflt-expr-cls-name-meth.js ++language/module-code/eval-export-dflt-expr-err-eval.js ++language/module-code/eval-export-dflt-expr-err-get-value.js ++language/module-code/eval-export-dflt-expr-fn-anon.js ++language/module-code/eval-export-dflt-expr-fn-named.js ++language/module-code/eval-export-dflt-expr-gen-anon.js ++language/module-code/eval-export-dflt-expr-gen-named.js ++language/module-code/eval-export-dflt-expr-in.js ++language/module-code/eval-export-dflt-fun-anon-semi.js ++language/module-code/eval-export-dflt-fun-named-semi.js ++language/module-code/eval-export-dflt-gen-anon-semi.js ++language/module-code/eval-export-dflt-gen-named-semi.js ++language/module-code/eval-export-fun-semi.js ++language/module-code/eval-export-gen-semi.js ++language/module-code/eval-gtbndng-indirect-trlng-comma_FIXTURE.js ++language/module-code/eval-gtbndng-indirect-trlng-comma.js ++language/module-code/eval-gtbndng-indirect-update-as_FIXTURE.js ++language/module-code/eval-gtbndng-indirect-update-as.js ++language/module-code/eval-gtbndng-indirect-update-dflt_FIXTURE.js ++language/module-code/eval-gtbndng-indirect-update-dflt.js ++language/module-code/eval-gtbndng-indirect-update_FIXTURE.js ++language/module-code/eval-gtbndng-indirect-update.js ++language/module-code/eval-gtbndng-local-bndng-cls.js ++language/module-code/eval-gtbndng-local-bndng-const.js ++language/module-code/eval-gtbndng-local-bndng-let.js ++language/module-code/eval-gtbndng-local-bndng-var.js ++language/module-code/eval-rqstd-abrupt-err-type_FIXTURE.js ++language/module-code/eval-rqstd-abrupt-err-uri_FIXTURE.js ++language/module-code/eval-rqstd-abrupt.js ++language/module-code/eval-rqstd-once_FIXTURE.js ++language/module-code/eval-rqstd-once.js ++language/module-code/eval-rqstd-order-1_FIXTURE.js ++language/module-code/eval-rqstd-order-2_FIXTURE.js ++language/module-code/eval-rqstd-order-3_FIXTURE.js ++language/module-code/eval-rqstd-order-4_FIXTURE.js ++language/module-code/eval-rqstd-order-5_FIXTURE.js ++language/module-code/eval-rqstd-order-6_FIXTURE.js ++language/module-code/eval-rqstd-order-7_FIXTURE.js ++language/module-code/eval-rqstd-order-8_FIXTURE.js ++language/module-code/eval-rqstd-order-9_FIXTURE.js ++language/module-code/eval-rqstd-order.js ++language/module-code/eval-self-abrupt.js ++language/module-code/eval-self-once.js ++language/module-code/eval-this.js ++language/module-code/export-default-asyncfunction-declaration-binding-exists.js ++language/module-code/export-default-asyncfunction-declaration-binding.js ++language/module-code/export-default-asyncgenerator-declaration-binding-exists.js ++language/module-code/export-default-asyncgenerator-declaration-binding.js ++language/module-code/export-default-function-declaration-binding-exists.js ++language/module-code/export-default-function-declaration-binding.js ++language/module-code/export-default-generator-declaration-binding-exists.js ++language/module-code/export-default-generator-declaration-binding.js ++language/module-code/export-expname-binding-string.js ++language/module-code/export-expname_FIXTURE.js ++language/module-code/export-expname-from-as-unpaired-surrogate.js ++language/module-code/export-expname-from-binding-string.js ++language/module-code/export-expname-from-star.js ++language/module-code/export-expname-from-star-string.js ++language/module-code/export-expname-from-star-unpaired-surrogate.js ++language/module-code/export-expname-from-string-binding.js ++language/module-code/export-expname-from-string.js ++language/module-code/export-expname-from-string-string.js ++language/module-code/export-expname-from-unpaired-surrogate.js ++language/module-code/export-expname-import-string-binding.js ++language/module-code/export-expname-import-unpaired-surrogate.js ++language/module-code/export-expname-string-binding.js ++language/module-code/export-expname-unpaired-surrogate.js ++language/module-code/export-star-as-dflt_FIXTURE.js ++language/module-code/export-star-as-dflt.js ++language/module-code/instn-iee-bndng-cls_FIXTURE.js ++language/module-code/instn-iee-bndng-cls.js ++language/module-code/instn-iee-bndng-const_FIXTURE.js ++language/module-code/instn-iee-bndng-const.js ++language/module-code/instn-iee-bndng-fun_FIXTURE.js ++language/module-code/instn-iee-bndng-fun.js ++language/module-code/instn-iee-bndng-gen_FIXTURE.js ++language/module-code/instn-iee-bndng-gen.js ++language/module-code/instn-iee-bndng-let_FIXTURE.js ++language/module-code/instn-iee-bndng-let.js ++language/module-code/instn-iee-bndng-var_FIXTURE.js ++language/module-code/instn-iee-bndng-var.js ++language/module-code/instn-iee-err-ambiguous-1_FIXTURE.js ++language/module-code/instn-iee-err-ambiguous-2_FIXTURE.js ++language/module-code/instn-iee-err-ambiguous-as.js ++language/module-code/instn-iee-err-ambiguous_FIXTURE.js ++language/module-code/instn-iee-err-ambiguous.js ++language/module-code/instn-iee-err-circular-as.js ++language/module-code/instn-iee-err-circular_FIXTURE.js ++language/module-code/instn-iee-err-circular.js ++language/module-code/instn-iee-err-dflt-thru-star-as.js ++language/module-code/instn-iee-err-dflt-thru-star-dflt_FIXTURE.js ++language/module-code/instn-iee-err-dflt-thru-star-int_FIXTURE.js ++language/module-code/instn-iee-err-dflt-thru-star.js ++language/module-code/instn-iee-err-not-found-as.js ++language/module-code/instn-iee-err-not-found-empty_FIXTURE.js ++language/module-code/instn-iee-err-not-found.js ++language/module-code/instn-iee-iee-cycle-2_FIXTURE.js ++language/module-code/instn-iee-iee-cycle.js ++language/module-code/instn-iee-star-cycle-2_FIXTURE.js ++language/module-code/instn-iee-star-cycle-indirect-x_FIXTURE.js ++language/module-code/instn-iee-star-cycle.js ++language/module-code/instn-iee-trlng-comma_FIXTURE.js ++language/module-code/instn-iee-trlng-comma.js ++language/module-code/instn-local-bndng-cls.js ++language/module-code/instn-local-bndng-const.js ++language/module-code/instn-local-bndng-export-cls.js ++language/module-code/instn-local-bndng-export-const.js ++language/module-code/instn-local-bndng-export-fun.js ++language/module-code/instn-local-bndng-export-gen.js ++language/module-code/instn-local-bndng-export-let.js ++language/module-code/instn-local-bndng-export-var.js ++language/module-code/instn-local-bndng-for-dup.js ++language/module-code/instn-local-bndng-for.js ++language/module-code/instn-local-bndng-fun.js ++language/module-code/instn-local-bndng-gen.js ++language/module-code/instn-local-bndng-let.js ++language/module-code/instn-local-bndng-var-dup.js ++language/module-code/instn-local-bndng-var.js ++language/module-code/instn-named-bndng-cls.js ++language/module-code/instn-named-bndng-const.js ++language/module-code/instn-named-bndng-dflt-cls.js ++language/module-code/instn-named-bndng-dflt-expr.js ++language/module-code/instn-named-bndng-dflt-fun-anon.js ++language/module-code/instn-named-bndng-dflt-fun-named.js ++language/module-code/instn-named-bndng-dflt-gen-anon.js ++language/module-code/instn-named-bndng-dflt-gen-named.js ++language/module-code/instn-named-bndng-dflt-named.js ++language/module-code/instn-named-bndng-dflt-star.js ++language/module-code/instn-named-bndng-fun.js ++language/module-code/instn-named-bndng-gen.js ++language/module-code/instn-named-bndng-let.js ++language/module-code/instn-named-bndng-trlng-comma.js ++language/module-code/instn-named-bndng-var.js ++language/module-code/instn-named-err-ambiguous-1_FIXTURE.js ++language/module-code/instn-named-err-ambiguous-2_FIXTURE.js ++language/module-code/instn-named-err-ambiguous-as.js ++language/module-code/instn-named-err-ambiguous_FIXTURE.js ++language/module-code/instn-named-err-ambiguous.js ++language/module-code/instn-named-err-dflt-thru-star-as.js ++language/module-code/instn-named-err-dflt-thru-star-dflt_FIXTURE.js ++language/module-code/instn-named-err-dflt-thru-star-dflt.js ++language/module-code/instn-named-err-dflt-thru-star-int_FIXTURE.js ++language/module-code/instn-named-err-not-found-as.js ++language/module-code/instn-named-err-not-found-dflt.js ++language/module-code/instn-named-err-not-found-empty_FIXTURE.js ++language/module-code/instn-named-err-not-found.js ++language/module-code/instn-named-id-name.js ++language/module-code/instn-named-iee-cycle-2_FIXTURE.js ++language/module-code/instn-named-iee-cycle.js ++language/module-code/instn-named-star-cycle-2_FIXTURE.js ++language/module-code/instn-named-star-cycle-indirect-x_FIXTURE.js ++language/module-code/instn-named-star-cycle.js ++language/module-code/instn-once.js ++language/module-code/instn-resolve-empty-export_FIXTURE.js ++language/module-code/instn-resolve-empty-export.js ++language/module-code/instn-resolve-empty-import_FIXTURE.js ++language/module-code/instn-resolve-empty-import.js ++language/module-code/instn-resolve-err-syntax-1_FIXTURE.js ++language/module-code/instn-resolve-err-syntax-1.js ++language/module-code/instn-resolve-err-syntax-2_FIXTURE.js ++language/module-code/instn-resolve-err-syntax-2.js ++language/module-code/instn-resolve-order-depth-child_FIXTURE.js ++language/module-code/instn-resolve-order-depth.js ++language/module-code/instn-resolve-order-depth-reference_FIXTURE.js ++language/module-code/instn-resolve-order-depth-syntax_FIXTURE.js ++language/module-code/instn-resolve-order-src.js ++language/module-code/instn-resolve-order-src-reference_FIXTURE.js ++language/module-code/instn-resolve-order-src-syntax_FIXTURE.js ++language/module-code/instn-resolve-order-src-valid_FIXTURE.js ++language/module-code/instn-same-global.js ++language/module-code/instn-same-global-set_FIXTURE.js ++language/module-code/instn-star-ambiguous-1_FIXTURE.js ++language/module-code/instn-star-ambiguous-2_FIXTURE.js ++language/module-code/instn-star-ambiguous_FIXTURE.js ++language/module-code/instn-star-ambiguous.js ++language/module-code/instn-star-as-props-dflt-skip.js ++language/module-code/instn-star-binding.js ++language/module-code/instn-star-equality.js ++language/module-code/instn-star-equality-other_FIXTURE.js ++language/module-code/instn-star-err-not-found-empty_FIXTURE.js ++language/module-code/instn-star-err-not-found-faulty_FIXTURE.js ++language/module-code/instn-star-err-not-found.js ++language/module-code/instn-star-id-name.js ++language/module-code/instn-star-iee-cycle-2_FIXTURE.js ++language/module-code/instn-star-iee-cycle.js ++language/module-code/instn-star-props-circular-a_FIXTURE.js ++language/module-code/instn-star-props-circular-b_FIXTURE.js ++language/module-code/instn-star-props-circular.js ++language/module-code/instn-star-props-dflt-keep-indirect-def_FIXTURE.js ++language/module-code/instn-star-props-dflt-keep-indirect.js ++language/module-code/instn-star-props-dflt-keep-indirect-reexport_FIXTURE.js ++language/module-code/instn-star-props-dflt-keep-local.js ++language/module-code/instn-star-props-dflt-keep-local-named_FIXTURE.js ++language/module-code/instn-star-props-dflt-keep-local-prod_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip.js ++language/module-code/instn-star-props-dflt-skip-named_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-prod_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-named_FIXTURE.js ++language/module-code/instn-star-props-dflt-skip-star-prod_FIXTURE.js ++language/module-code/instn-star-props-nrml-1_FIXTURE.js ++language/module-code/instn-star-props-nrml-indirect_FIXTURE.js ++language/module-code/instn-star-props-nrml.js ++language/module-code/instn-star-props-nrml-star_FIXTURE.js ++language/module-code/instn-star-star-cycle-2_FIXTURE.js ++language/module-code/instn-star-star-cycle-indirect-x_FIXTURE.js ++language/module-code/instn-star-star-cycle.js ++language/module-code/instn-uniq-env-rec.js ++language/module-code/instn-uniq-env-rec-other_FIXTURE.js ++language/module-code/invalid-private-names-call-expression-bad-reference.js ++language/module-code/invalid-private-names-call-expression-this.js ++language/module-code/invalid-private-names-member-expression-bad-reference.js ++language/module-code/invalid-private-names-member-expression-this.js ++language/module-code/parse-err-decl-pos-export-arrow-function.js ++language/module-code/parse-err-decl-pos-export-block-stmt.js ++language/module-code/parse-err-decl-pos-export-block-stmt-list.js ++language/module-code/parse-err-decl-pos-export-class-decl-meth.js ++language/module-code/parse-err-decl-pos-export-class-decl-method-gen.js ++language/module-code/parse-err-decl-pos-export-class-decl-method-gen-static.js ++language/module-code/parse-err-decl-pos-export-class-decl-meth-static.js ++language/module-code/parse-err-decl-pos-export-class-expr-meth-gen.js ++language/module-code/parse-err-decl-pos-export-class-expr-meth-gen-static.js ++language/module-code/parse-err-decl-pos-export-class-expr-meth.js ++language/module-code/parse-err-decl-pos-export-class-expr-meth-static.js ++language/module-code/parse-err-decl-pos-export-do-while.js ++language/module-code/parse-err-decl-pos-export-for-const.js ++language/module-code/parse-err-decl-pos-export-for-in-const.js ++language/module-code/parse-err-decl-pos-export-for-in-let.js ++language/module-code/parse-err-decl-pos-export-for-in-lhs.js ++language/module-code/parse-err-decl-pos-export-for-in-var.js ++language/module-code/parse-err-decl-pos-export-for-let.js ++language/module-code/parse-err-decl-pos-export-for-lhs.js ++language/module-code/parse-err-decl-pos-export-for-of-const.js ++language/module-code/parse-err-decl-pos-export-for-of-let.js ++language/module-code/parse-err-decl-pos-export-for-of-lhs.js ++language/module-code/parse-err-decl-pos-export-for-of-var.js ++language/module-code/parse-err-decl-pos-export-for-var.js ++language/module-code/parse-err-decl-pos-export-function-decl.js ++language/module-code/parse-err-decl-pos-export-function-expr.js ++language/module-code/parse-err-decl-pos-export-generator-decl.js ++language/module-code/parse-err-decl-pos-export-generator-expr.js ++language/module-code/parse-err-decl-pos-export-if-else.js ++language/module-code/parse-err-decl-pos-export-if-if.js ++language/module-code/parse-err-decl-pos-export-labeled.js ++language/module-code/parse-err-decl-pos-export-object-gen-method.js ++language/module-code/parse-err-decl-pos-export-object-getter.js ++language/module-code/parse-err-decl-pos-export-object-method.js ++language/module-code/parse-err-decl-pos-export-object-setter.js ++language/module-code/parse-err-decl-pos-export-switch-case-dflt.js ++language/module-code/parse-err-decl-pos-export-switch-case.js ++language/module-code/parse-err-decl-pos-export-switch-dftl.js ++language/module-code/parse-err-decl-pos-export-try-catch-finally.js ++language/module-code/parse-err-decl-pos-export-try-catch.js ++language/module-code/parse-err-decl-pos-export-try-finally.js ++language/module-code/parse-err-decl-pos-export-try-try.js ++language/module-code/parse-err-decl-pos-export-while.js ++language/module-code/parse-err-decl-pos-import-arrow-function.js ++language/module-code/parse-err-decl-pos-import-block-stmt.js ++language/module-code/parse-err-decl-pos-import-block-stmt-list.js ++language/module-code/parse-err-decl-pos-import-class-decl-meth.js ++language/module-code/parse-err-decl-pos-import-class-decl-method-gen.js ++language/module-code/parse-err-decl-pos-import-class-decl-method-gen-static.js ++language/module-code/parse-err-decl-pos-import-class-decl-meth-static.js ++language/module-code/parse-err-decl-pos-import-class-expr-meth-gen.js ++language/module-code/parse-err-decl-pos-import-class-expr-meth-gen-static.js ++language/module-code/parse-err-decl-pos-import-class-expr-meth.js ++language/module-code/parse-err-decl-pos-import-class-expr-meth-static.js ++language/module-code/parse-err-decl-pos-import-do-while.js ++language/module-code/parse-err-decl-pos-import-for-const.js ++language/module-code/parse-err-decl-pos-import-for-in-const.js ++language/module-code/parse-err-decl-pos-import-for-in-let.js ++language/module-code/parse-err-decl-pos-import-for-in-lhs.js ++language/module-code/parse-err-decl-pos-import-for-in-var.js ++language/module-code/parse-err-decl-pos-import-for-let.js ++language/module-code/parse-err-decl-pos-import-for-lhs.js ++language/module-code/parse-err-decl-pos-import-for-of-const.js ++language/module-code/parse-err-decl-pos-import-for-of-let.js ++language/module-code/parse-err-decl-pos-import-for-of-lhs.js ++language/module-code/parse-err-decl-pos-import-for-of-var.js ++language/module-code/parse-err-decl-pos-import-for-var.js ++language/module-code/parse-err-decl-pos-import-function-decl.js ++language/module-code/parse-err-decl-pos-import-function-expr.js ++language/module-code/parse-err-decl-pos-import-generator-decl.js ++language/module-code/parse-err-decl-pos-import-generator-expr.js ++language/module-code/parse-err-decl-pos-import-if-else.js ++language/module-code/parse-err-decl-pos-import-if-if.js ++language/module-code/parse-err-decl-pos-import-labeled.js ++language/module-code/parse-err-decl-pos-import-object-gen-method.js ++language/module-code/parse-err-decl-pos-import-object-getter.js ++language/module-code/parse-err-decl-pos-import-object-method.js ++language/module-code/parse-err-decl-pos-import-object-setter.js ++language/module-code/parse-err-decl-pos-import-switch-case-dflt.js ++language/module-code/parse-err-decl-pos-import-switch-case.js ++language/module-code/parse-err-decl-pos-import-switch-dftl.js ++language/module-code/parse-err-decl-pos-import-try-catch-finally.js ++language/module-code/parse-err-decl-pos-import-try-catch.js ++language/module-code/parse-err-decl-pos-import-try-finally.js ++language/module-code/parse-err-decl-pos-import-try-try.js ++language/module-code/parse-err-decl-pos-import-while.js ++language/module-code/parse-err-export-dflt-const.js ++language/module-code/parse-err-export-dflt-expr.js ++language/module-code/parse-err-export-dflt-let.js ++language/module-code/parse-err-export-dflt-var.js ++language/module-code/parse-err-hoist-lex-fun.js ++language/module-code/parse-err-hoist-lex-gen.js ++language/module-code/parse-err-invoke-anon-fun-decl.js ++language/module-code/parse-err-invoke-anon-gen-decl.js ++language/module-code/parse-err-return.js ++language/module-code/parse-err-semi-dflt-expr.js ++language/module-code/parse-err-semi-export-star.js ++language/module-code/parse-err-semi-named-export-from.js ++language/module-code/parse-err-semi-named-export.js ++language/module-code/parse-err-semi-name-space-export.js ++language/module-code/parse-err-syntax-1.js ++language/module-code/parse-err-syntax-2.js ++language/module-code/parse-err-yield.js ++language/module-code/parse-export-empty.js ++language/module-code/private-identifiers-not-empty.js ++language/module-code/privatename-not-valid-earlyerr-module-1.js ++language/module-code/privatename-not-valid-earlyerr-module-2.js ++language/module-code/privatename-not-valid-earlyerr-module-3.js ++language/module-code/privatename-not-valid-earlyerr-module-4.js ++language/module-code/privatename-not-valid-earlyerr-module-5.js ++language/module-code/privatename-not-valid-earlyerr-module-6.js ++language/module-code/privatename-not-valid-earlyerr-module-7.js ++language/module-code/privatename-not-valid-earlyerr-module-8.js ++language/module-code/privatename-valid-no-earlyerr.js ++language/module-code/verify-dfs-a_FIXTURE.js ++language/module-code/verify-dfs-b_FIXTURE.js ++language/module-code/verify-dfs.js ++language/module-code/namespace/Symbol.iterator.js ++language/module-code/namespace/Symbol.toStringTag.js ++language/module-code/namespace/internals/define-own-property.js ++language/module-code/namespace/internals/delete-exported-init.js ++language/module-code/namespace/internals/delete-exported-uninit.js ++language/module-code/namespace/internals/delete-non-exported.js ++language/module-code/namespace/internals/enumerate-binding-uninit.js ++language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js ++language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js ++language/module-code/namespace/internals/get-nested-namespace-props-nrml.js ++language/module-code/namespace/internals/get-own-property-str-found-init.js ++language/module-code/namespace/internals/get-own-property-str-found-uninit.js ++language/module-code/namespace/internals/get-own-property-str-not-found.js ++language/module-code/namespace/internals/get-own-property-sym.js ++language/module-code/namespace/internals/get-prototype-of.js ++language/module-code/namespace/internals/get-str-found-init.js ++language/module-code/namespace/internals/get-str-found-uninit.js ++language/module-code/namespace/internals/get-str-initialize.js ++language/module-code/namespace/internals/get-str-not-found.js ++language/module-code/namespace/internals/get-str-update.js ++language/module-code/namespace/internals/get-sym-found.js ++language/module-code/namespace/internals/get-sym-not-found.js ++language/module-code/namespace/internals/has-property-str-found-init.js ++language/module-code/namespace/internals/has-property-str-found-uninit.js ++language/module-code/namespace/internals/has-property-str-not-found.js ++language/module-code/namespace/internals/has-property-sym-found.js ++language/module-code/namespace/internals/has-property-sym-not-found.js ++language/module-code/namespace/internals/is-extensible.js ++language/module-code/namespace/internals/object-hasOwnProperty-binding-uninit.js ++language/module-code/namespace/internals/object-keys-binding-uninit.js ++language/module-code/namespace/internals/object-propertyIsEnumerable-binding-uninit.js ++language/module-code/namespace/internals/own-property-keys-binding-types_FIXTURE.js ++language/module-code/namespace/internals/own-property-keys-binding-types.js ++language/module-code/namespace/internals/own-property-keys-sort.js ++language/module-code/namespace/internals/prevent-extensions.js ++language/module-code/namespace/internals/set.js ++language/module-code/namespace/internals/set-prototype-of.js ++language/module-code/namespace/internals/set-prototype-of-null.js ++language/module-code/top-level-await/await-awaits-thenable-not-callable.js ++language/module-code/top-level-await/await-awaits-thenables.js ++language/module-code/top-level-await/await-awaits-thenables-that-throw.js ++language/module-code/top-level-await/await-dynamic-import-rejection.js ++language/module-code/top-level-await/await-dynamic-import-resolution.js ++language/module-code/top-level-await/await-expr-func-expression.js ++language/module-code/top-level-await/await-expr-new-expr.js ++language/module-code/top-level-await/await-expr-new-expr-reject.js ++language/module-code/top-level-await/await-expr-regexp.js ++language/module-code/top-level-await/await-expr-reject-throws.js ++language/module-code/top-level-await/await-expr-resolution.js ++language/module-code/top-level-await/await-void-expr.js ++language/module-code/top-level-await/dynamic-import-rejection.js ++language/module-code/top-level-await/dynamic-import-resolution.js ++language/module-code/top-level-await/early-errors-await-not-simple-assignment-target.js ++language/module-code/top-level-await/if-await-expr.js ++language/module-code/top-level-await/module-async-import-async-resolution-ticks.js ++language/module-code/top-level-await/module-import-rejection-body_FIXTURE.js ++language/module-code/top-level-await/module-import-rejection-body.js ++language/module-code/top-level-await/module-import-rejection_FIXTURE.js ++language/module-code/top-level-await/module-import-rejection.js ++language/module-code/top-level-await/module-import-rejection-tick_FIXTURE.js ++language/module-code/top-level-await/module-import-rejection-tick.js ++language/module-code/top-level-await/module-import-resolution_FIXTURE.js ++language/module-code/top-level-await/module-import-resolution.js ++language/module-code/top-level-await/module-import-unwrapped_FIXTURE.js ++language/module-code/top-level-await/module-import-unwrapped.js ++language/module-code/top-level-await/module-self-import-async-resolution-ticks.js ++language/module-code/top-level-await/module-sync-import-async-resolution-ticks.js ++language/module-code/top-level-await/new-await.js ++language/module-code/top-level-await/new-await-parens.js ++language/module-code/top-level-await/new-await-script-code.js ++language/module-code/top-level-await/no-operand.js ++language/module-code/top-level-await/top-level-ticks-2.js ++language/module-code/top-level-await/top-level-ticks.js ++language/module-code/top-level-await/void-await-expr.js ++language/module-code/top-level-await/while-dynamic-evaluation.js ++language/module-code/top-level-await/syntax/await-expr-dyn-import.js ++language/module-code/top-level-await/syntax/block-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/block-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/block-await-expr-identifier.js ++language/module-code/top-level-await/syntax/block-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/block-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/block-await-expr-nested.js ++language/module-code/top-level-await/syntax/block-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/block-await-expr-null.js ++language/module-code/top-level-await/syntax/block-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/block-await-expr-regexp.js ++language/module-code/top-level-await/syntax/block-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/block-await-expr-this.js ++language/module-code/top-level-await/syntax/catch-parameter.js ++language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-body.js ++language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-params.js ++language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-expr-body.js ++language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-expr-params.js ++language/module-code/top-level-await/syntax/early-no-escaped-await.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-identifier.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-nested.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-null.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-regexp.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/export-class-decl-await-expr-this.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-identifier.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-nested.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-null.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-regexp.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-this.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-identifier.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-nested.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-null.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-regexp.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-this.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-identifier.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-nested.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-null.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-regexp.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/export-lex-decl-await-expr-this.js ++language/module-code/top-level-await/syntax/export-var-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/export-var-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/export-var-await-expr-identifier.js ++language/module-code/top-level-await/syntax/export-var-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/export-var-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/export-var-await-expr-nested.js ++language/module-code/top-level-await/syntax/export-var-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/export-var-await-expr-null.js ++language/module-code/top-level-await/syntax/export-var-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/export-var-await-expr-regexp.js ++language/module-code/top-level-await/syntax/export-var-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/export-var-await-expr-this.js ++language/module-code/top-level-await/syntax/for-await-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/for-await-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/for-await-await-expr-identifier.js ++language/module-code/top-level-await/syntax/for-await-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/for-await-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/for-await-await-expr-nested.js ++language/module-code/top-level-await/syntax/for-await-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/for-await-await-expr-null.js ++language/module-code/top-level-await/syntax/for-await-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/for-await-await-expr-regexp.js ++language/module-code/top-level-await/syntax/for-await-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/for-await-await-expr-this.js ++language/module-code/top-level-await/syntax/for-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/for-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/for-await-expr-identifier.js ++language/module-code/top-level-await/syntax/for-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/for-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/for-await-expr-nested.js ++language/module-code/top-level-await/syntax/for-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/for-await-expr-null.js ++language/module-code/top-level-await/syntax/for-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/for-await-expr-regexp.js ++language/module-code/top-level-await/syntax/for-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/for-await-expr-this.js ++language/module-code/top-level-await/syntax/for-in-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/for-in-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/for-in-await-expr-identifier.js ++language/module-code/top-level-await/syntax/for-in-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/for-in-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/for-in-await-expr-nested.js ++language/module-code/top-level-await/syntax/for-in-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/for-in-await-expr-null.js ++language/module-code/top-level-await/syntax/for-in-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/for-in-await-expr-regexp.js ++language/module-code/top-level-await/syntax/for-in-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/for-in-await-expr-this.js ++language/module-code/top-level-await/syntax/for-of-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/for-of-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/for-of-await-expr-identifier.js ++language/module-code/top-level-await/syntax/for-of-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/for-of-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/for-of-await-expr-nested.js ++language/module-code/top-level-await/syntax/for-of-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/for-of-await-expr-null.js ++language/module-code/top-level-await/syntax/for-of-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/for-of-await-expr-regexp.js ++language/module-code/top-level-await/syntax/for-of-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/for-of-await-expr-this.js ++language/module-code/top-level-await/syntax/if-block-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/if-block-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/if-block-await-expr-identifier.js ++language/module-code/top-level-await/syntax/if-block-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/if-block-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/if-block-await-expr-nested.js ++language/module-code/top-level-await/syntax/if-block-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/if-block-await-expr-null.js ++language/module-code/top-level-await/syntax/if-block-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/if-block-await-expr-regexp.js ++language/module-code/top-level-await/syntax/if-block-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/if-block-await-expr-this.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-identifier.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-nested.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-null.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-regexp.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/if-expr-await-expr-this.js ++language/module-code/top-level-await/syntax/top-level-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/top-level-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/top-level-await-expr-identifier.js ++language/module-code/top-level-await/syntax/top-level-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/top-level-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/top-level-await-expr-nested.js ++language/module-code/top-level-await/syntax/top-level-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/top-level-await-expr-null.js ++language/module-code/top-level-await/syntax/top-level-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/top-level-await-expr-regexp.js ++language/module-code/top-level-await/syntax/top-level-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/top-level-await-expr-this.js ++language/module-code/top-level-await/syntax/try-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/try-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/try-await-expr-identifier.js ++language/module-code/top-level-await/syntax/try-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/try-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/try-await-expr-nested.js ++language/module-code/top-level-await/syntax/try-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/try-await-expr-null.js ++language/module-code/top-level-await/syntax/try-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/try-await-expr-regexp.js ++language/module-code/top-level-await/syntax/try-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/try-await-expr-this.js ++language/module-code/top-level-await/syntax/typeof-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/typeof-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/typeof-await-expr-identifier.js ++language/module-code/top-level-await/syntax/typeof-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/typeof-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/typeof-await-expr-nested.js ++language/module-code/top-level-await/syntax/typeof-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/typeof-await-expr-null.js ++language/module-code/top-level-await/syntax/typeof-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/typeof-await-expr-regexp.js ++language/module-code/top-level-await/syntax/typeof-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/typeof-await-expr-this.js ++language/module-code/top-level-await/syntax/void-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/void-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/void-await-expr-identifier.js ++language/module-code/top-level-await/syntax/void-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/void-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/void-await-expr-nested.js ++language/module-code/top-level-await/syntax/void-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/void-await-expr-null.js ++language/module-code/top-level-await/syntax/void-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/void-await-expr-regexp.js ++language/module-code/top-level-await/syntax/void-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/void-await-expr-this.js ++language/module-code/top-level-await/syntax/while-await-expr-array-literal.js ++language/module-code/top-level-await/syntax/while-await-expr-func-expression.js ++language/module-code/top-level-await/syntax/while-await-expr-identifier.js ++language/module-code/top-level-await/syntax/while-await-expr-literal-number.js ++language/module-code/top-level-await/syntax/while-await-expr-literal-string.js ++language/module-code/top-level-await/syntax/while-await-expr-nested.js ++language/module-code/top-level-await/syntax/while-await-expr-new-expr.js ++language/module-code/top-level-await/syntax/while-await-expr-null.js ++language/module-code/top-level-await/syntax/while-await-expr-obj-literal.js ++language/module-code/top-level-await/syntax/while-await-expr-regexp.js ++language/module-code/top-level-await/syntax/while-await-expr-template-literal.js ++language/module-code/top-level-await/syntax/while-await-expr-this.js + built-ins/Symbol/replace/cross-realm.js + built-ins/Symbol/split/cross-realm.js + built-ins/Symbol/species/cross-realm.js +diff --git a/ts2panda/scripts/diagnosticMessages.json b/ts2panda/scripts/diagnosticMessages.json +index b4142d71..7a2aef60 100755 +--- a/ts2panda/scripts/diagnosticMessages.json ++++ b/ts2panda/scripts/diagnosticMessages.json +@@ -243,6 +243,10 @@ + "category": "Error", + "code": 1210 + }, ++ "A class declaration without the 'default' modifier must have a name.": { ++ "category": "Error", ++ "code": 1211 ++ }, + "Identifier expected. '{0}' is a reserved word in strict mode.": { + "category": "Error", + "code": 1212 +@@ -423,6 +427,10 @@ + "category": "Error", + "code": 2501 + }, ++ "A module cannot have multiple default exports.": { ++ "category": "Error", ++ "code": 2528 ++ }, + "The 'super' can only be referenced in members of derived classes or object literal expressions.": { + "category": "Error", + "code": 2660 +diff --git a/ts2panda/src/addVariable2Scope.ts b/ts2panda/src/addVariable2Scope.ts +index c9f59db1..ed32f30b 100644 +--- a/ts2panda/src/addVariable2Scope.ts ++++ b/ts2panda/src/addVariable2Scope.ts +@@ -25,6 +25,8 @@ import { + FuncDecl, + InitStatus, + LetDecl, ++ ModuleDecl, ++ ModuleScope, + Scope, + VarDecl, + VariableScope +@@ -103,6 +105,11 @@ export function addVariableToScope(recorder: Recorder) { + scope.add(decl.name, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); + } else if (decl instanceof ConstDecl) { + scope.add(decl.name, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); ++ } else if (decl instanceof ModuleDecl) { ++ if (!(scope instanceof ModuleScope)) { ++ throw new Error("ModuleVariable can't exist without ModuleScope"); ++ } ++ scope.add(decls[j].name, VarDeclarationKind.MODULE); + } else if (decl instanceof FuncDecl) { + scope.add(decl.name, VarDeclarationKind.FUNCTION); + } else if (decl instanceof CatchParameter) { +diff --git a/ts2panda/src/base/bcGenUtil.ts b/ts2panda/src/base/bcGenUtil.ts +index 4f195377..f4f77e10 100755 +--- a/ts2panda/src/base/bcGenUtil.ts ++++ b/ts2panda/src/base/bcGenUtil.ts +@@ -43,7 +43,7 @@ import { + EcmaGetiteratornext, + EcmaGetnextpropname, + EcmaGetpropiterator, +- EcmaImportmodule, ++ EcmaGetModuleNamespace, + EcmaIsfalse, + EcmaIstrue, + EcmaLdglobalvar, +@@ -367,8 +367,8 @@ export function ldSuperByValue(obj: VReg, prop: VReg): IRNode { + return new EcmaLdsuperbyvalue(obj, prop); + } + +-export function importModule(name: string) { +- return new EcmaImportmodule(name); ++export function getModuleNamespace(moduleIdx: number) { ++ return new EcmaGetModuleNamespace(moduleIdx); + } + + export function loadModuleVarByName(name: string, module: VReg) { +diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts +index c9230ee0..40571744 100755 +--- a/ts2panda/src/compiler.ts ++++ b/ts2panda/src/compiler.ts +@@ -505,10 +505,10 @@ export class Compiler { + } + + compileVariableDeclaration(decl: ts.VariableDeclaration, isExported: boolean = false) { +- if (isExported) { +- let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); +- setVariableExported(name, this.getCurrentScope()); +- } ++ // if (isExported) { ++ // let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); ++ // setVariableExported(name, this.getCurrentScope()); ++ // } + + let lref = LReference.generateLReference(this, decl.name, true); + if (decl.initializer) { +@@ -690,7 +690,7 @@ export class Compiler { + let internalName = this.compilerDriver.getFuncInternalName(decl, this.recorder); + let env = this.getCurrentEnv(); + this.pandaGen.defineFunction(NodeKind.FirstNodeOfFunction, decl, internalName, env); +- this.pandaGen.storeModuleVar(decl, "default"); ++ this.pandaGen.storeModuleVar(decl, "*default*"); + } else { + throw new Error("SyntaxError: export function declaration cannot in other scope except ModuleScope"); + } +@@ -702,7 +702,7 @@ export class Compiler { + + private compileExportAssignment(stmt: ts.ExportAssignment) { + this.compileExpression(stmt.expression); +- this.pandaGen.storeModuleVar(stmt, "default"); ++ this.pandaGen.storeModuleVar(stmt, "*default*"); + } + + compileCondition(expr: ts.Expression, ifFalseLabel: Label) { +diff --git a/ts2panda/src/lexenv.ts b/ts2panda/src/lexenv.ts +index d4c1cc77..36ceab6c 100644 +--- a/ts2panda/src/lexenv.ts ++++ b/ts2panda/src/lexenv.ts +@@ -165,7 +165,7 @@ export class VariableAcessStore extends VariableAccessBase { + insns.push(storeAccumulator(bindVreg)); + + if (v.isExportVar()) { +- insns.push(storeModuleVariable(v.getExportedName())); ++ insns.push(storeModuleVariable(v.getName())); + } + + return insns; +diff --git a/ts2panda/src/modules.ts b/ts2panda/src/modules.ts +index a4a8aff2..edb796dd 100644 +--- a/ts2panda/src/modules.ts ++++ b/ts2panda/src/modules.ts +@@ -15,115 +15,259 @@ + + import * as ts from "typescript"; + import { PandaGen } from "./pandagen"; +-import jshelpers from "./jshelpers"; ++// import jshelpers from "./jshelpers"; + import { LocalVariable } from "./variable"; + import { DiagnosticCode, DiagnosticError } from "./diagnostic"; + import { ModuleScope } from "./scope"; + +-export class ModuleStmt { +- private node: ts.Node +- private moduleRequest: string; +- private namespace: string = ""; +- private bingdingNameMap: Map = new Map(); +- private isCopy: boolean = true; ++class Entry { ++ node: ts.Node; ++ exportName: string | undefined; ++ localName: string | undefined; ++ importName: string | undefined; ++ moduleRequest: number = -1; + +- constructor(node: ts.Node, moduleRequest: string = "") { ++ constructor(node: ts.Node, exportName: string | undefined, localName: string | undefined, importName: string | undefined, moduleRequest?: number) { + this.node = node; +- this.moduleRequest = moduleRequest; ++ this.exportName = exportName; ++ this.localName = localName; ++ this.importName = importName; ++ if (moduleRequest !== undefined) { ++ this.moduleRequest = moduleRequest; ++ } ++ } ++} ++ ++export class SourceTextModuleRecord { ++ private moduleRequests: Array = []; ++ private moduleRequestIdxMap: Map = new Map(); ++ ++ private regularImportEntries: Map = new Map(); ++ private namespaceImportEntries: Array = []; ++ ++ private localExportEntries: Map> = new Map>(); ++ private starExportEntries: Array = []; ++ private indirectExportEntries: Array = []; ++ ++ addModuleRequest(moduleRequest: string): number { ++ if (this.moduleRequestIdxMap.has(moduleRequest)) { ++ return this.moduleRequestIdxMap.get(moduleRequest)!; ++ } ++ let index = this.moduleRequests.length; ++ this.moduleRequests.push(moduleRequest); ++ this.moduleRequestIdxMap.set(moduleRequest, index); ++ return index; + } + +- getNode() { +- return this.node; ++ // import x from "foo.js"; ++ // import {x} from "foo.js"; ++ // import {x as y} from "foo.js"; ++ // import defaultExport from "foo.js" ++ addImportEntry(node: ts.Node, importName: string, localName: string, moduleRequest: string) { ++ let importEntry: Entry = new Entry(node, undefined, localName, importName, this.addModuleRequest(moduleRequest)); ++ // We don't care if there's already an entry for this local name, as in that ++ // case we will report an error when declaring the variable. ++ this.regularImportEntries.set(localName, importEntry); + } + +- getModuleRequest() { +- return this.moduleRequest; ++ // import * as x from "foo.js"; ++ addStarImportEntry(node: ts.Node, localName: string, moduleRequest: string) { ++ let starImportEntry: Entry = new Entry(node, undefined, localName, undefined, this.addModuleRequest(moduleRequest)); ++ this.namespaceImportEntries.push(starImportEntry); + } + +- addLocalName(localName: string, importName: string) { +- if (this.bingdingNameMap.has(localName)) { +- throw new DiagnosticError(this.node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(this.node), [localName]); ++ // export {x}; ++ // export {x as y}; ++ // export VariableStatement ++ // export Declaration ++ // export default ... ++ addLocalExportEntry(node: ts.Node, exportName: string, localName: string) { ++ let localExportEntry: Entry = new Entry(node, exportName, localName, undefined); ++ if (this.localExportEntries.has(localName)) { ++ this.localExportEntries.get(localName)!.push(localExportEntry); ++ } else { ++ this.localExportEntries.set(localName, [localExportEntry]); + } +- this.bingdingNameMap.set(localName, importName); + } + +- getBindingNameMap() { +- return this.bingdingNameMap; ++ // export {x} from "foo.js"; ++ // export {x as y} from "foo.js"; ++ // import { x } from "foo.js"; export { x } ++ addIndirectExportEntry(node: ts.Node, importName: string, exportName: string, moduleRequest: string) { ++ let indirectExportEntry: Entry = new Entry(node, exportName, undefined, importName, this.addModuleRequest(moduleRequest)); ++ this.indirectExportEntries.push(indirectExportEntry); + } + +- setNameSpace(namespace: string) { +- this.namespace = namespace; ++ // export * from "foo.js"; ++ addStarExportEntry(node: ts.Node, moduleRequest: string) { ++ let starExportEntry: Entry = new Entry(node, undefined, undefined, undefined, this.addModuleRequest(moduleRequest)); ++ this.starExportEntries.push(starExportEntry); + } + +- getNameSpace() { +- return this.namespace; ++ getModuleRequests() { ++ return this.moduleRequests; + } + +- setCopyFlag(isCopy: boolean) { +- this.isCopy = isCopy; ++ getRegularImportEntries() { ++ return this.regularImportEntries; + } + +- getCopyFlag() { +- return this.isCopy; ++ getNamespaceImportEntries() { ++ return this.namespaceImportEntries; + } +-} + +-export function setImport(importStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { +- importStmts.forEach((importStmt) => { +- pandagen.importModule(importStmt.getNode(), importStmt.getModuleRequest()); +- // import * as xxx from "a.js" +- if (importStmt.getNameSpace()) { +- let v = moduleScope.findLocal(importStmt.getNameSpace())!; +- pandagen.storeAccToLexEnv(importStmt.getNode(), moduleScope, 0, v, true); +- (v).initialize(); +- } ++ getLocalExportEntries() { ++ return this.localExportEntries; ++ } + +- // import { ... } from "a.js" +- // import defaultExport, * as a from "a.js" +- let moduleReg = pandagen.allocLocalVreg(); +- pandagen.storeAccumulator(importStmt.getNode(), moduleReg); +- +- let bindingNameMap = importStmt.getBindingNameMap(); +- bindingNameMap.forEach((value: string, key: string) => { +- let v = moduleScope.findLocal(key)!; +- pandagen.loadModuleVariable(importStmt.getNode(), moduleReg, value); +- pandagen.storeAccToLexEnv(importStmt.getNode(), moduleScope, 0, v, true); +- (v).initialize(); +- }); +- }) +-} ++ getStarExportEntries() { ++ return this.starExportEntries; ++ } ++ ++ getIndirectExportEntries() { ++ return this.indirectExportEntries; ++ } ++ ++ searchDuplicateExport(): Entry | undefined { + +-export function setExportBinding(exportStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { +- exportStmts.forEach((exportStmt) => { +- if (exportStmt.getModuleRequest()) { +- pandagen.importModule(exportStmt.getNode(), exportStmt.getModuleRequest()); +- let moduleReg = pandagen.allocLocalVreg(); +- pandagen.storeAccumulator(exportStmt.getNode(), moduleReg); +- +- if (!exportStmt.getCopyFlag()) { +- if (exportStmt.getNameSpace()) { +- pandagen.storeModuleVar(exportStmt.getNode(), exportStmt.getNameSpace()); +- } +- +- let bindingNameMap = exportStmt.getBindingNameMap(); +- bindingNameMap.forEach((value: string, key: string) => { +- pandagen.loadModuleVariable(exportStmt.getNode(), moduleReg, value); +- pandagen.storeModuleVar(exportStmt.getNode(), key); +- }); +- } else { +- pandagen.copyModule(exportStmt.getNode(), moduleReg); ++ } ++ ++ validateModuleRecordEntries(moduleScope: ModuleScope): boolean { ++ // check module is well-formed and report errors if not ++ { ++ let dupExportEntry: Entry | undefined = this.searchDuplicateExport(); ++ if (dupExportEntry !== undefined) { ++ ++ return false; + } +- } else { +- let bindingNameMap = exportStmt.getBindingNameMap(); +- bindingNameMap.forEach((value: string, key: string) => { +- let v = moduleScope.findLocal(value); +- if (typeof v == 'undefined') { +- throw new DiagnosticError(exportStmt.getNode(), DiagnosticCode.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, jshelpers.getSourceFileOfNode(exportStmt.getNode()), [value]); +- } +- +- (v).setExport(); +- (v).setExportedName(key); +- }); + } ++ ++ } ++ ++ ++ ++ ++ // Find any implicitly indirect exports and make them explicit. ++ // ++ // An explicitly indirect export is an export entry arising from an export ++ // statement of the following form: ++ // export {a as c} from "X"; ++ // An implicitly indirect export corresponds to ++ // export {b as c}; ++ // in the presence of an import statement of the form ++ // import {a as b} from "X"; ++ // This function finds such implicitly indirect export entries and rewrites ++ // them by filling in the import name and module request, as well as nulling ++ // out the local name. Effectively, it turns ++ // import {a as b} from "X"; export {b as c}; ++ // into: ++ // import {a as b} from "X"; export {a as c} from "X"; ++ // (The import entry is never deleted.) ++ makeIndirectExportsExplicit() { ++ ++ } ++} ++ ++// export class ModuleStmt { ++// private node: ts.Node ++// private moduleRequest: string; ++// private namespace: string = ""; ++// private bingdingNameMap: Map = new Map(); ++// private isCopy: boolean = true; ++ ++// constructor(node: ts.Node, moduleRequest: string = "") { ++// this.node = node; ++// this.moduleRequest = moduleRequest; ++// } ++ ++// getNode() { ++// return this.node; ++// } ++ ++// getModuleRequest() { ++// return this.moduleRequest; ++// } ++ ++// addLocalName(localName: string, importName: string) { ++// if (this.bingdingNameMap.has(localName)) { ++// throw new DiagnosticError(this.node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(this.node), [localName]); ++// } ++// this.bingdingNameMap.set(localName, importName); ++// } ++ ++// getBindingNameMap() { ++// return this.bingdingNameMap; ++// } ++ ++// setNameSpace(namespace: string) { ++// this.namespace = namespace; ++// } ++ ++// getNameSpace() { ++// return this.namespace; ++// } ++ ++// setCopyFlag(isCopy: boolean) { ++// this.isCopy = isCopy; ++// } ++ ++// getCopyFlag() { ++// return this.isCopy; ++// } ++// } ++ ++export function setModuleNamespaceImports(namespaceImportEntries: Array, moduleScope: ModuleScope, pandagen: PandaGen) { ++ if (!(moduleScope instanceof ModuleScope)) { ++ return; ++ } ++ namespaceImportEntries.forEach(entry => { ++ pandagen.getModuleNamespace(entry.node, entry.moduleRequest); ++ let v = moduleScope.findLocal(entry.localName!)!; ++ pandagen.storeAccToLexEnv(entry.node, moduleScope, 0, v, true); ++ (v).initialize(); + }) +-} +\ No newline at end of file ++} ++ ++// export function setImportNameBindings(regularImportEntries: Map, moduleScope: ModuleScope, pandagen: PandaGen) { ++// regularImportEntries.forEach((importEntry: Entry, localName: string) => { ++// let v = moduleScope.findLocal(localName)!; ++// v.setExport(); ++// // pandagen.storeAccToLexEnv(importEntry.node, moduleScope, 0, v, true); ++// (v).initialize(); ++// }); ++// } ++ ++// export function setExportBinding(exportStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { ++// exportStmts.forEach((exportStmt) => { ++// if (exportStmt.getModuleRequest()) { ++// pandagen.importModule(exportStmt.getNode(), exportStmt.getModuleRequest()); ++// let moduleReg = pandagen.allocLocalVreg(); ++// pandagen.storeAccumulator(exportStmt.getNode(), moduleReg); ++ ++// if (!exportStmt.getCopyFlag()) { ++// if (exportStmt.getNameSpace()) { ++// pandagen.storeModuleVar(exportStmt.getNode(), exportStmt.getNameSpace()); ++// } ++ ++// let bindingNameMap = exportStmt.getBindingNameMap(); ++// bindingNameMap.forEach((value: string, key: string) => { ++// pandagen.loadModuleVariable(exportStmt.getNode(), moduleReg, value); ++// pandagen.storeModuleVar(exportStmt.getNode(), key); ++// }); ++// } else { ++// pandagen.copyModule(exportStmt.getNode(), moduleReg); ++// } ++// } else { ++// let bindingNameMap = exportStmt.getBindingNameMap(); ++// bindingNameMap.forEach((value: string, key: string) => { ++// let v = moduleScope.findLocal(value); ++// if (typeof v == 'undefined') { ++// throw new DiagnosticError(exportStmt.getNode(), DiagnosticCode.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, jshelpers.getSourceFileOfNode(exportStmt.getNode()), [value]); ++// } ++ ++// (v).setExport(); ++// (v).setExportedName(key); ++// }); ++// } ++// }) ++// } +diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts +index 1b56905a..f8b54128 100644 +--- a/ts2panda/src/pandagen.ts ++++ b/ts2panda/src/pandagen.ts +@@ -51,7 +51,7 @@ import { + getIteratorNext, + getNextPropName, + getPropIterator, +- importModule, ++ getModuleNamespace, + isFalse, + isTrue, + jumpTarget, +@@ -1052,8 +1052,8 @@ export class PandaGen { + ) + } + +- importModule(node: ts.Node, moduleName: string) { +- this.add(node, importModule(moduleName)); ++ getModuleNamespace(node: ts.Node, moduleIdx: number) { ++ this.add(node, getModuleNamespace(moduleIdx)); + } + + loadModuleVariable(node: ts.Node, module: VReg, varName: string) { +diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts +index 387ddf83..2d42c247 100644 +--- a/ts2panda/src/recorder.ts ++++ b/ts2panda/src/recorder.ts +@@ -15,14 +15,18 @@ + + import ts from "typescript"; + import * as astutils from "./astutils"; +-import { isAnonymousFunctionDefinition } from "./base/util"; ++import { ++ isAnonymousFunctionDefinition, ++ hasDefaultKeywordModifier, ++ hasExportKeywordModifier ++} from "./base/util"; + import { CmdOptions } from "./cmdOptions"; + import { CompilerDriver } from "./compilerDriver"; + import { DiagnosticCode, DiagnosticError } from "./diagnostic"; + import { findOuterNodeOfParenthesis } from "./expression/parenthesizedExpression"; + import * as jshelpers from "./jshelpers"; + import { LOGD } from "./log"; +-import { ModuleStmt } from "./modules"; ++import { SourceTextModuleRecord } from "./modules"; + import { + CatchParameter, + ClassDecl, +@@ -35,6 +39,7 @@ import { + LetDecl, + LocalScope, + LoopScope, ++ ModuleDecl, + ModuleScope, + Scope, + VarDecl, +@@ -58,9 +63,7 @@ export class Recorder { + private parametersMap: Map = new Map(); + private funcNameMap: Map; + private ClassGroupOfNoCtor: Array = new Array(); +- private importStmts: Array = []; +- private exportStmts: Array = []; +- private defaultUsed: boolean = false; ++ private moduleRecord: SourceTextModuleRecord | undefined; + + constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver) { + this.node = node; +@@ -68,6 +71,9 @@ export class Recorder { + this.compilerDriver = compilerDriver; + this.funcNameMap = new Map(); + this.funcNameMap.set("main", 1); ++ if (CmdOptions.isModules() && scope instanceof ModuleScope) { ++ this.moduleRecord = new SourceTextModuleRecord(); ++ } + } + + record() { +@@ -100,6 +106,12 @@ export class Recorder { + this.compilerDriver.getFuncId(childNode); + let functionScope = this.buildVariableScope(scope, childNode); + this.recordFuncDecl(childNode, scope); ++ if (hasExportKeywordModifier(childNode)) { ++ if (!CmdOptions.isModules()) { ++ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); ++ } ++ this.recordExportInfo(childNode); ++ } + this.recordInfo(childNode, functionScope); + break; + } +@@ -120,16 +132,35 @@ export class Recorder { + case ts.SyntaxKind.ForStatement: + case ts.SyntaxKind.ForInStatement: + case ts.SyntaxKind.ForOfStatement: { +- let loopScope: LoopScope = new LoopScope(scope);; ++ let loopScope: LoopScope = new LoopScope(scope); + this.setScopeMap(childNode, loopScope); + this.recordInfo(childNode, loopScope); + break; + } +- case ts.SyntaxKind.ClassDeclaration: ++ case ts.SyntaxKind.ClassDeclaration: { ++ if (hasExportKeywordModifier(childNode) && scope instanceof ModuleScope) { ++ if (!CmdOptions.isModules()) { ++ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); ++ } ++ this.recordExportInfo(childNode); ++ } ++ this.recordClassInfo(childNode, scope); ++ break; ++ } + case ts.SyntaxKind.ClassExpression: { + this.recordClassInfo(childNode, scope); + break; + } ++ case ts.SyntaxKind.VariableStatement: { ++ if (hasExportKeywordModifier(childNode)) { ++ this.recordExportInfo(childNode); ++ } ++ // if (this.recordType) { ++ // TypeChecker.getInstance().formatNodeType(childNode); ++ // } ++ this.recordInfo(childNode, scope); ++ break; ++ } + case ts.SyntaxKind.Identifier: { + this.recordVariableDecl(childNode, scope); + break; +@@ -144,22 +175,19 @@ export class Recorder { + this.recordImportInfo(childNode, scope); + break; + } +- case ts.SyntaxKind.ExportDeclaration: { ++ case ts.SyntaxKind.ExportAssignment: { + if (!CmdOptions.isModules()) { + throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); + } +- if (!(scope instanceof ModuleScope)) { +- throw new Error("SyntaxError: export statement cannot in other scope except ModuleScope"); +- } + this.recordExportInfo(childNode); ++ this.recordInfo(childNode, scope); + break; + } +- case ts.SyntaxKind.ExportAssignment: { +- if (this.defaultUsed) { +- throw new DiagnosticError(childNode, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(childNode), ["default"]); ++ case ts.SyntaxKind.ExportDeclaration: { ++ if (!CmdOptions.isModules()) { ++ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); + } +- this.defaultUsed = true; +- this.recordInfo(childNode, scope); ++ this.recordExportInfo(childNode); + break; + } + default: +@@ -282,81 +310,117 @@ export class Recorder { + if (!ts.isStringLiteral(node.moduleSpecifier)) { + throw new Error("moduleSpecifier must be a stringLiteral"); + } +- let moduleRequest = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); +- let importStmt = new ModuleStmt(node, moduleRequest); ++ let moduleRequest: string = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); + + if (node.importClause) { + let importClause: ts.ImportClause = node.importClause; +- + // import defaultExport from "a.js" + if (importClause.name) { +- let name = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); +- scope.setDecls(new ConstDecl(name, importClause.name)); +- importStmt.addLocalName(name, "default"); ++ let localName = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); ++ scope.setDecls(new ModuleDecl(localName, importClause.name)); ++ this.moduleRecord!.addImportEntry(node.importClause, "default", localName, moduleRequest); + } + +- // import { ... } from "a.js" +- // import * as a from "a.js" +- // import defaultExport, * as a from "a.js" + if (importClause.namedBindings) { + let namedBindings = importClause.namedBindings; + // import * as a from "a.js" + if (ts.isNamespaceImport(namedBindings)) { + let nameSpace = jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name); +- scope.setDecls(new ConstDecl(nameSpace, namedBindings)); +- importStmt.setNameSpace(nameSpace); +- } +- +- // import { ... } from "a.js" +- if (ts.isNamedImports(namedBindings)) { +- namedBindings.elements.forEach((element) => { +- let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); +- let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; +- scope.setDecls(new ConstDecl(name, element)); +- importStmt.addLocalName(name, exoticName); ++ scope.setDecls(new ModuleDecl(nameSpace, namedBindings)); ++ this.moduleRecord!.addStarImportEntry(importClause.namedBindings, nameSpace, moduleRequest); ++ } else if (ts.isNamedImports(namedBindings)) { ++ // import { ... } from "a.js" ++ namedBindings.elements.forEach((element: any) => { ++ let localName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); ++ let importName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : localName; ++ scope.setDecls(new ModuleDecl(localName, element)); ++ this.moduleRecord!.addImportEntry(element, importName, localName, moduleRequest); + }); ++ } else { ++ throw new Error("Unreachable kind for namedBindings"); + } + } + } +- +- this.importStmts.push(importStmt); + } + +- private recordExportInfo(node: ts.ExportDeclaration) { +- let exportStmt: ModuleStmt; +- if (node.moduleSpecifier) { +- if (!ts.isStringLiteral(node.moduleSpecifier)) { +- throw new Error("moduleSpecifier must be a stringLiteral"); +- } +- exportStmt = new ModuleStmt(node, jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier)); +- } else { +- exportStmt = new ModuleStmt(node); +- } +- +- if (node.exportClause) { +- exportStmt.setCopyFlag(false); +- let namedBindings: ts.NamedExportBindings = node.exportClause; +- if (ts.isNamespaceExport(namedBindings)) { +- exportStmt.setNameSpace(jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name)); +- } +- +- if (ts.isNamedExports(namedBindings)) { +- namedBindings.elements.forEach((element) => { +- let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); +- if (name == 'default') { +- if (this.defaultUsed) { +- throw new DiagnosticError(node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(node), [name]); +- } else { +- this.defaultUsed = true; ++ private recordExportInfo(node: ts.ExportDeclaration | ts.ExportAssignment | ts.VariableStatement | ts.FunctionDeclaration | ts.ClassDeclaration) { ++ switch (node.kind) { ++ case ts.SyntaxKind.ExportDeclaration: { ++ if (node.moduleSpecifier) { ++ if (!ts.isStringLiteral(node.moduleSpecifier)) { ++ throw new Error("moduleSpecifier must be a stringLiteral"); ++ } ++ let moduleRequest: string = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); ++ ++ if (node.exportClause) { ++ let namedBindings: ts.NamedExportBindings = node.exportClause; ++ if (ts.isNamespaceExport(namedBindings)) { ++ // export * as m from "mod"; ++ // `export namespace` is not the ECMA2018's feature ++ } else if (ts.isNamedExports(namedBindings)) { ++ // export {x} from "mod"; ++ // export {v as x} from "mod"; ++ namedBindings.elements.forEach((element: any) => { ++ let exportName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); ++ let importName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : exportName; ++ this.moduleRecord!.addIndirectExportEntry(element, importName, exportName, moduleRequest); ++ }); + } ++ } else { ++ // export * from "mod"; ++ this.moduleRecord!.addStarExportEntry(node, moduleRequest); + } +- let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; +- exportStmt.addLocalName(name, exoticName); ++ } else if (node.exportClause && ts.isNamedExports(node.exportClause)) { ++ // export {x}; ++ // export {v as x}; ++ node.exportClause.elements.forEach((element: any) => { ++ let exportName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); ++ let localName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : exportName; ++ this.moduleRecord!.addLocalExportEntry(element, exportName, localName); ++ }); ++ } else { ++ throw new Error("Unreachable node kind for Export Declaration"); ++ } ++ break; ++ } ++ case ts.SyntaxKind.ExportAssignment: { ++ // export default 42; ++ // export default v; ++ // "*default*" is used within this specification as a synthetic name for anonymous default export values. ++ this.moduleRecord!.addLocalExportEntry(node, "default", "*default*"); ++ break; ++ } ++ case ts.SyntaxKind.VariableStatement: { ++ // export var a,b; ++ node.declarationList.declarations.forEach(decl => { ++ let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); ++ this.moduleRecord!.addLocalExportEntry(decl, name, name); + }); ++ break; + } ++ case ts.SyntaxKind.FunctionDeclaration: ++ case ts.SyntaxKind.ClassDeclaration: { ++ if (hasDefaultKeywordModifier(node)) { ++ // HoistableDeclaration : FunctionDecl/GeneratorDecl/AsyncFunctionDecl/AsyncGeneratorDecl ++ // export default function f(){} ++ // export default function(){} ++ // export default class{} ++ let localName = node.name ? jshelpers.getTextOfIdentifierOrLiteral(node.name) : "*default*"; ++ this.moduleRecord!.addLocalExportEntry(node, "default", localName); ++ } else { ++ // export function f(){} ++ // export class c{} ++ if (!node.name) { ++ // throw an syntax Error !!! ++ } ++ let name = jshelpers.getTextOfIdentifierOrLiteral(node.name!); ++ this.moduleRecord!.addLocalExportEntry(node, name, name); ++ } ++ break; ++ } ++ default: ++ throw new Error("Unreachable syntax kind for static exporting"); + } +- +- this.exportStmts.push(exportStmt); + } + + private recordFuncDecl(node: ts.FunctionDeclaration, scope: Scope) { +@@ -371,6 +435,7 @@ export class Recorder { + let funcDecl = new FuncDecl(funcName, node, this.compilerDriver.getFuncId(node)); + scope.setDecls(funcDecl); + let hoistScope = scope; ++ // Wrong logic with ModuleScope + if (scope instanceof GlobalScope || scope instanceof ModuleScope) { + this.collectHoistDecls(node, hoistScope, funcDecl); + } else if (scope instanceof LocalScope) { +@@ -523,12 +588,8 @@ export class Recorder { + return this.scopeMap.get(node); + } + +- getImportStmts() { +- return this.importStmts; +- } +- +- getExportStmts() { +- return this.exportStmts; ++ getModuleRecord() { ++ return this.moduleRecord; + } + + setHoistMap(scope: VariableScope, decl: Decl) { +@@ -568,4 +629,4 @@ export class Recorder { + getFuncNameMap() { + return this.funcNameMap; + } +-} +\ No newline at end of file ++} +diff --git a/ts2panda/src/scope.ts b/ts2panda/src/scope.ts +index 44cde853..dc9979d2 100644 +--- a/ts2panda/src/scope.ts ++++ b/ts2panda/src/scope.ts +@@ -54,6 +54,12 @@ export class ConstDecl extends Decl { + } + } + ++export class ModuleDecl extends Decl { ++ constructor(constName: string, node: ts.Node) { ++ super(constName, node); ++ } ++} ++ + export class FuncDecl extends Decl { + readonly index: number; + constructor(funcName: string, node: ts.Node, index: number) { +@@ -386,7 +392,13 @@ export class ModuleScope extends VariableScope { + } else if (declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { + v = new LocalVariable(declKind, name); + this.locals.push(v); +- } else { ++ } ++ ++ else if (declKind == VarDeclarationKind.MODULE) { ++ ++ } ++ ++ else { + v = new LocalVariable(declKind, name, status); + this.locals.push(v); + } +diff --git a/ts2panda/src/variable.ts b/ts2panda/src/variable.ts +index eba622a9..779eac3c 100644 +--- a/ts2panda/src/variable.ts ++++ b/ts2panda/src/variable.ts +@@ -101,8 +101,7 @@ export abstract class Variable { + + export class LocalVariable extends Variable { + status: InitStatus | null; +- isExport: boolean = false; +- exportedName: string = ""; ++ private isExport: boolean = false; + + constructor(declKind: VarDeclarationKind, name: string, status?: InitStatus) { + super(declKind, name); +@@ -127,17 +126,10 @@ export class LocalVariable extends Variable { + isExportVar() { + return this.isExport; + } ++} + +- setExportedName(name: string) { +- this.exportedName = name; +- } +- +- getExportedName() { +- if (!this.exportedName) { +- throw new Error("Exported Variable " + this.getName() + " doesn't have exported name"); +- } +- return this.exportedName; +- } ++export class ModuleVariable extends Variable { ++ + } + + export class GlobalVariable extends Variable { diff --git a/test262/config.py b/test262/config.py index f053ac961e..a3e6935672 100755 --- a/test262/config.py +++ b/test262/config.py @@ -32,6 +32,7 @@ CODE_ROOT = os.path.abspath(os.path.join(CUR_FILE_DIR, "../../..")) ARK_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/ark/ark" ICUI_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/global/i18n_standard" LLVM_DIR = f"{CODE_ROOT}/prebuilts/clang/ohos/linux-x86_64/llvm/lib/" +ARK_JS_RUNTIME_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/ark/ark_js_runtime" # " mode_type": { # "1": "only default", @@ -45,8 +46,8 @@ TEST_ES2015_DIR = os.path.join(DATA_DIR, "test_es2015") TEST_CI_DIR = os.path.join(DATA_DIR, "test_CI") DEFAULT_ARK_FRONTEND_TOOL = os.path.join(ARK_DIR, "build", "src", "index.js") -DEFAULT_ARK_TOOL = os.path.join(ARK_DIR, "..", "ark_js_runtime", "ark_js_vm") -DEFAULT_LIBS_DIR = f"{ARK_DIR}:{ICUI_DIR}:{LLVM_DIR}" +DEFAULT_ARK_TOOL = os.path.join(ARK_JS_RUNTIME_DIR, "ark_js_vm") +DEFAULT_LIBS_DIR = f"{ARK_DIR}:{ICUI_DIR}:{LLVM_DIR}:{ARK_JS_RUNTIME_DIR}" DEFAULT_HOST_TYPE = "panda" DEFAULT_HOST_PATH = "python3" @@ -60,14 +61,14 @@ ES5_LIST_FILE = os.path.join("test262", "es5_tests.txt") ES2015_LIST_FILE = os.path.join("test262", "es2015_tests.txt") CI_LIST_FILE = os.path.join("test262", "CI_tests.txt") -TEST262_GIT_HASH = "9ca13b12728b7e0089c7eb03fa2bd17f8abe297f" -HARNESS_GIT_HASH = "9c499f028eb24e67781435c0bb442e00343eb39d" -ESHOST_GIT_HASH = "fa2d4d27d9d6152002bdef36ee2d17e98b886268" +TEST262_GIT_HASH = "7e60f78958c89cb14e36f4f28de8fe8e9768743d" +HARNESS_GIT_HASH = "4092b799522ac20590c7b054632fe70494c32331" +ESHOST_GIT_HASH = "a71a29820b132ffcb6bb58061cabdba96e457da6" ESNEXT_GIT_HASH = "281eb10b2844929a7c0ac04527f5b42ce56509fd" -TEST262_GIT_URL = "https://gitee.com/Han00000000/test262.git" -ESHOST_GIT_URL = "https://gitee.com/Han00000000/eshost.git" -HARNESS_GIT_URL = "https://gitee.com/Han00000000/test262-harness.git" +TEST262_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262" +ESHOST_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262_eshost" +HARNESS_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262_harness" SKIP_LIST_FILE = os.path.join("test262", "skip_tests.json") ALL_SKIP_TESTS = [] @@ -83,6 +84,7 @@ ARK_ARCH_LIST = [ "aarch64", "arm" ] + DEFAULT_ARK_ARCH = ARK_ARCH_LIST[0] MODULE_FILES_LIST = [ diff --git a/test262/run_sunspider.py b/test262/run_sunspider.py index 9d958b1c25..af5cdc6f94 100755 --- a/test262/run_sunspider.py +++ b/test262/run_sunspider.py @@ -31,14 +31,23 @@ from config import * def parse_args(): parser = argparse.ArgumentParser() parser.add_argument('--ark-tool', + default=DEFAULT_ARK_TOOL, + required=False, help="ark's binary tool") parser.add_argument('--ark-frontend-tool', + default=DEFAULT_ARK_FRONTEND_TOOL, + required=False, help="ark frontend conversion tool") parser.add_argument("--libs-dir", + default=DEFAULT_LIBS_DIR, + required=False, help="The path collection of dependent so has been divided by':'") parser.add_argument("--js-file", + required=True, help="js file") parser.add_argument('--ark-frontend', + default=DEFAULT_ARK_FRONTEND, + required=False, nargs='?', choices=ARK_FRONTEND_LIST, type=str, help="Choose one of them") parser.add_argument('--ark-arch', @@ -173,7 +182,7 @@ class ArkProgram(): return retcode def execute(self): - + os.environ["LD_LIBRARY_PATH"] = self.libs_dir file_name_pre = os.path.splitext(self.js_file)[0] cmd_args = [] diff --git a/test262/skip_tests.json b/test262/skip_tests.json index 09271c54d8..c99bd2a5a1 100755 --- a/test262/skip_tests.json +++ b/test262/skip_tests.json @@ -12,7 +12,8 @@ "files": [ "language/statements/for/S12.6.3_A2.1.js", "language/statements/for/S12.6.3_A2.2.js", - "language/statements/for/S12.6.3_A2.js" + "language/statements/for/S12.6.3_A2.js", + "language/expressions/template-literal/tv-utf16-escape-sequence.js" ] }, { diff --git a/ts2panda/.gitignore b/ts2panda/.gitignore index 7631277bc0..9824f7fc54 100755 --- a/ts2panda/.gitignore +++ b/ts2panda/.gitignore @@ -1,5 +1,2 @@ node_modules/ build -src/builtinsMap.ts -src/irnodes.ts -src/diagnostic.ts diff --git a/ts2panda/BUILD.gn b/ts2panda/BUILD.gn index 80e0055ff0..7b2bbfed9d 100755 --- a/ts2panda/BUILD.gn +++ b/ts2panda/BUILD.gn @@ -25,9 +25,17 @@ ohos_copy("ts2abc_src") { module_install_name = "" } +action("npm_install") { + visibility = [ ":*" ] + script = "scripts/npm-install.sh" + args = [ rebase_path(node_path) ] + outputs = [ target_out_dir + "/$target_name/node_modules" ] + inputs = [ "${ts2abc_root}/package.json" ] +} + ohos_copy("node_modules") { sources = [ rebase_path("${node_modules}") ] - + deps = [ ":npm_install" ] outputs = [ target_out_dir + "/node_modules" ] module_install_name = "" } @@ -334,5 +342,9 @@ ohos_copy("copy_ts2abc_tests") { } group("ts2abc_unittests") { + testonly = true deps = [ "tests:ts2abc_tests(${buildtool_linux})" ] + # if (host_os == "linux") { + # deps += [ "${ts2abc_root}/ts2abc/tests:unittest" ] + # } } diff --git a/ts2panda/package-lock.json b/ts2panda/package-lock.json index e18acb061b..646821ba88 100644 --- a/ts2panda/package-lock.json +++ b/ts2panda/package-lock.json @@ -2319,9 +2319,9 @@ "dev": true }, "typescript": { - "version": "3.9.10", - "resolved": "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/typescript/download/typescript-4.4.3.tgz?cache=0&sync_timestamp=1632381565165&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftypescript%2Fdownload%2Ftypescript-4.4.3.tgz", + "integrity": "sha1-vcVAfKorEJ79T4L+EwZW+XeikyQ=", "dev": true }, "typical": { diff --git a/ts2panda/package.json b/ts2panda/package.json index 2fc7bed3c1..f37f0d41b6 100755 --- a/ts2panda/package.json +++ b/ts2panda/package.json @@ -33,7 +33,7 @@ "mocha": "^8.1.1", "sinon": "^9.0.3", "ts-sinon": "^1.2.1", - "typescript": "^3.9.7" + "typescript": "^4.1.3" }, "dependencies": { "@babel/core": "^7.12.10", diff --git a/ts2panda/scripts/npm-install.sh b/ts2panda/scripts/npm-install.sh new file mode 100755 index 0000000000..af9ab4e6fb --- /dev/null +++ b/ts2panda/scripts/npm-install.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +set -e + +script_path=$(cd $(dirname $0);pwd) +ts2panda_dir=$(dirname ${script_path}) +code_dir=${ts2panda_dir}/../../.. + +nodejs_dir=$1 + +cd ${ts2panda_dir} +export PATH=${nodejs_dir}:$PATH +npm config set registry http://mirrors.tools.huawei.com/npm/ +if [ "X${SKIP_SSL}" == "XYES" ];then + npm config set strict-ssl false +fi +npm cache clean -f +npm install + +cd ${code_dir} +if [ -d "${code_dir}/prebuilts/build-tools/common/ts2abc" ]; then + echo -e "\n" + echo "${code_dir}/prebuilts/build-tools/common/ts2abc already exist, it will be replaced" + /bin/rm -rf ${code_dir}/prebuilts/build-tools/common/ts2abc + echo -e "\n" +fi + +mkdir -p ${code_dir}/prebuilts/build-tools/common/ts2abc +/bin/cp -rf ${code_dir}/ark/ts2abc/ts2panda/node_modules ${code_dir}/prebuilts/build-tools/common/ts2abc/ || echo "skip copying due to other thread" diff --git a/ts2panda/scripts/run_tests.py b/ts2panda/scripts/run_tests.py index 00c75458dd..c5018b91b0 100755 --- a/ts2panda/scripts/run_tests.py +++ b/ts2panda/scripts/run_tests.py @@ -47,9 +47,6 @@ def parse_args(): parser.add_argument('--platform', default="linux", help='platform, as: linux, mac, win') - parser.add_argument('--gn-build', - action='store_true', - help='Whether it is GN compilation') parser.add_argument('--js-file', metavar='FILE', help='The name of the test use case file to execute') @@ -99,8 +96,6 @@ class Ts2abcTests(): run_command(['npm', 'install'], dist_dir) def copy_tests(self): - if self.args.gn_build: - return if os.path.exists(f'{self.dist_dir}/tests'): run_command(['rm', '-rf', f'{self.dist_dir}/tests']) run_command(['cp', '-rf', f'{self.src_dir}/tests', self.dist_dir]) @@ -131,16 +126,16 @@ class Ts2abcTests(): if self.args.js_file: tests_args = self.args.js_file else: - tests_args = "**/*.test.js" + tests_args = "tests/**/*.test.js" if plat_form == "linux": - cmd = [mocha, f'build/tests/{tests_args}'] + cmd = [mocha, f'build/{tests_args}'] ret = run_command(cmd, self.dist_dir) elif plat_form == "win": - cmd = [mocha, f'build-win/tests/{tests_args}'] + cmd = [mocha, f'build-win/{tests_args}'] ret = run_command(cmd, self.dist_dir) elif plat_form == 'mac': - cmd = [mocha, f'build-mac/tests/{tests_args}'] + cmd = [mocha, f'build-mac/{tests_args}'] ret = run_command(cmd, self.dist_dir) if ret: raise RuntimeError("Run [" + " ".join(cmd) + "] failed !") diff --git a/ts2panda/scripts/run_tests_executable.sh b/ts2panda/scripts/run_tests_executable.sh new file mode 100755 index 0000000000..7b91c76a61 --- /dev/null +++ b/ts2panda/scripts/run_tests_executable.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +prog_name=$1 +${prog_name} + +if [ $? -ne 0 ]; then + echo "Run [" ${prog_name} "] failed!" + exit 1 +else + echo "Run [" ${prog_name} "] success!" +fi diff --git a/ts2panda/src/addVariable2Scope.ts b/ts2panda/src/addVariable2Scope.ts index c9f59db164..fe4e1a763a 100644 --- a/ts2panda/src/addVariable2Scope.ts +++ b/ts2panda/src/addVariable2Scope.ts @@ -30,10 +30,44 @@ import { VariableScope } from "./scope"; import { isGlobalIdentifier } from "./syntaxCheckHelper"; -import { VarDeclarationKind } from "./variable"; +import { + VarDeclarationKind, + Variable +} from "./variable"; +import { TypeRecorder } from "./typeRecorder"; +import { CmdOptions } from "./cmdOptions"; + +function setVariableOrParameterType(node: ts.Node, v: Variable | undefined) { + if (v) { + let typeIndex = TypeRecorder.getInstance().tryGetVariable2Type(ts.getOriginalNode(node)); + if (typeIndex != -1) { + v.setTypeIndex(typeIndex); + } + // console.log("--node--", jshelpers.getTextOfNode(ts.getOriginalNode(node))); + // console.log("--node.type--", v.getTypeIndex()); + } +} +function setClassOrFunctionType(node: ts.Node, v: Variable | undefined) { + if (v) { + let typeIndex = TypeRecorder.getInstance().tryGetTypeIndex(ts.getOriginalNode(node)); + if (typeIndex != -1) { + v.setTypeIndex(typeIndex); + } + // console.log("--node--", jshelpers.getTextOfNode(ts.getOriginalNode(node))); + // console.log("--node.type--", v.getTypeIndex()); + } +} -function addInnerArgs(node: ts.Node, scope: VariableScope): void { +function setTypeIndex(node: ts.Node, v: Variable | undefined, isClassOrFunction: boolean) { + if (isClassOrFunction) { + setClassOrFunctionType(node, v); + } else { + setVariableOrParameterType(node, v); + } +} + +function addInnerArgs(node: ts.Node, scope: VariableScope, enableTypeRecord: boolean): void { // the first argument for js function is func_obj scope.addParameter("4funcObj", VarDeclarationKind.CONST, -1); // the second argument for newTarget @@ -48,7 +82,7 @@ function addInnerArgs(node: ts.Node, scope: VariableScope): void { if (node.kind != ts.SyntaxKind.SourceFile) { let funcNode = node; - addParameters(funcNode, scope); + addParameters(funcNode, scope, enableTypeRecord); } if (scope.getUseArgs()) { @@ -66,25 +100,30 @@ function addInnerArgs(node: ts.Node, scope: VariableScope): void { } } -export function addVariableToScope(recorder: Recorder) { +export function addVariableToScope(recorder: Recorder, enableTypeRecord: boolean) { let scopeMap = recorder.getScopeMap(); let hoistMap = recorder.getHoistMap(); scopeMap.forEach((scope, node) => { let hoistDecls = []; if (scope instanceof VariableScope) { - addInnerArgs(node, scope); + addInnerArgs(node, scope, enableTypeRecord); hoistDecls = hoistMap.get(scope); if (hoistDecls) { hoistDecls.forEach(hoistDecl => { + let v: Variable | undefined; if (hoistDecl instanceof VarDecl) { - scope.add(hoistDecl.name, VarDeclarationKind.VAR); + v = scope.add(hoistDecl.name, VarDeclarationKind.VAR); } else if (hoistDecl instanceof FuncDecl) { - scope.add(hoistDecl.name, VarDeclarationKind.FUNCTION); + v = scope.add(hoistDecl.name, VarDeclarationKind.FUNCTION); } else { throw new Error("Wrong type of declaration to be hoisted") } + + if (enableTypeRecord) { + setTypeIndex(hoistDecl.node, v, hoistDecl instanceof FuncDecl); + } }) } } @@ -98,22 +137,22 @@ export function addVariableToScope(recorder: Recorder) { if (hoistDecls && hoistDecls.includes(decl)) { continue; } - + let v: Variable | undefined; if (decl instanceof LetDecl) { - scope.add(decl.name, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); } else if (decl instanceof ConstDecl) { - scope.add(decl.name, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); } else if (decl instanceof FuncDecl) { - scope.add(decl.name, VarDeclarationKind.FUNCTION); + v = scope.add(decl.name, VarDeclarationKind.FUNCTION); } else if (decl instanceof CatchParameter) { - scope.add(decl.name, VarDeclarationKind.LET); + v = scope.add(decl.name, VarDeclarationKind.LET); } else if (decl instanceof ClassDecl) { let classNode = decl.node; if (ts.isClassDeclaration(classNode)) { - scope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); } else { let classScope = recorder.getScopeOfNode(classNode); - classScope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); + v = classScope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); } } else { /** @@ -123,14 +162,17 @@ export function addVariableToScope(recorder: Recorder) { * but it should be added to scope */ if (isGlobalIdentifier(decls[j].name)) { - scope.add(decls[j].name, VarDeclarationKind.VAR); + v = scope.add(decls[j].name, VarDeclarationKind.VAR); } } + if (enableTypeRecord) { + setTypeIndex(decl.node, v, decl instanceof ClassDecl || decl instanceof FuncDecl); + } } }) } -function addParameters(node: ts.FunctionLikeDeclaration, scope: VariableScope): void { +function addParameters(node: ts.FunctionLikeDeclaration, scope: VariableScope, enableTypeRecord: boolean): void { let patternParams: Array = new Array(); for (let i = 0; i < node.parameters.length; ++i) { let param = node.parameters[i]; @@ -142,7 +184,11 @@ function addParameters(node: ts.FunctionLikeDeclaration, scope: VariableScope): name = jshelpers.getTextOfIdentifierOrLiteral(param.name); } - scope.addParameter(name, VarDeclarationKind.VAR, i + 1); + let v = scope.addParameter(name, VarDeclarationKind.VAR, i + 1); + + if (enableTypeRecord) { + setTypeIndex(param.name, v, false); + } } for (let i = 0; i < patternParams.length; i++) { diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts new file mode 100755 index 0000000000..28620a384f --- /dev/null +++ b/ts2panda/src/base/typeSystem.ts @@ -0,0 +1,568 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as ts from "typescript"; +import { + Literal, + LiteralBuffer, + LiteralTag +} from "./literal"; +import { LOGD } from "../log"; +import { TypeChecker } from "../typeChecker"; +import { TypeRecorder } from "../typeRecorder"; +import { PandaGen } from "../pandagen"; +import * as jshelpers from "../jshelpers"; +import { access } from "fs"; + +export enum PrimitiveType { + ANY, + NUMBER, + BOOLEAN, + STRING, + SYMBOL, + VOID, + NULL, + UNDEFINED, + _LENGTH = 50 +} + +export enum L2Type { + CLASS, + CLASSINST, + FUNCTION, + OBJECT, // object literal + EXTERNAL, + _COUNTER +} + +export enum ModifierAbstract { + NONABSTRACT, + ABSTRACT +} + +export enum ModifierStatic { + NONSTATIC, + STATIC +} + +export enum ModifierReadonly { + NONREADONLY, + READONLY +} + +export enum AccessFlag { + PUBLIC, + PRIVATE, + PROTECTED +} + +type ClassMemberFunction = ts.MethodDeclaration | ts.ConstructorDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration; + +export abstract class BaseType { + + abstract transfer2LiteralBuffer(): LiteralBuffer; + protected typeChecker = TypeChecker.getInstance(); + protected typeRecorder = TypeRecorder.getInstance(); + + protected addCurrentType(node: ts.Node, index: number) { + this.typeRecorder.addType2Index(node, index); + } + + protected setVariable2Type(variableNode: ts.Node, index: number, isUserDefinedType: boolean) { + this.typeRecorder.setVariable2Type(variableNode, index, isUserDefinedType); + } + + protected tryGetTypeIndex(typeNode: ts.Node) { + return this.typeRecorder.tryGetTypeIndex(typeNode); + } + + protected createType(node: ts.Node, newExpressionFlag: boolean, variableNode?: ts.Node) { + switch (node.kind) { + case ts.SyntaxKind.MethodDeclaration: + case ts.SyntaxKind.Constructor: + case ts.SyntaxKind.GetAccessor: + case ts.SyntaxKind.SetAccessor: { + new FunctionType(node, variableNode); + break; + } + case ts.SyntaxKind.ClassDeclaration: { + new ClassType(node, newExpressionFlag, variableNode); + break; + } + // create other type as project goes on; + default: + LOGD("Error: Currently this type is not supported"); + // throw new Error("Currently this type is not supported"); + } + } + + protected getOrCreateUserDefinedType(node: ts.Identifier, newExpressionFlag: boolean, variableNode?: ts.Node) { + let typeIndex = -1; + let declNode = this.typeChecker.getTypeDeclForIdentifier(node); + if (declNode) { + typeIndex = this.tryGetTypeIndex(declNode); + if (typeIndex == -1) { + this.createType(declNode, newExpressionFlag, variableNode); + typeIndex = this.tryGetTypeIndex(declNode); + } + } + return typeIndex; + } + + protected getTypeIndexForDeclWithType( + node: ts.FunctionLikeDeclaration | ts.ParameterDeclaration | ts.PropertyDeclaration, variableNode?: ts.Node): number { + if (node.type) { + // check for newExpression + let newExpressionFlag = false; + if (node.kind == ts.SyntaxKind.PropertyDeclaration && node.initializer && node.initializer.kind == ts.SyntaxKind.NewExpression) { + newExpressionFlag = true; + } + // get typeFlag to check if its a primitive type + let typeRef = node.type; + let typeFlagName = this.typeChecker.getTypeFlagsAtLocation(typeRef); + let typeIndex = -1; + let isUserDefinedType = false; + if (typeFlagName in PrimitiveType) { + typeIndex = PrimitiveType[typeFlagName as keyof typeof PrimitiveType]; + } else { + let identifier = typeRef.getChildAt(0); + typeIndex = this.getOrCreateUserDefinedType(identifier, newExpressionFlag, variableNode); + isUserDefinedType = true; + } + // set variable if variable node is given; + if (variableNode) { + this.setVariable2Type(variableNode, typeIndex, isUserDefinedType); + } + if (typeIndex == -1) { + LOGD("ERROR: Type cannot be found for: " + jshelpers.getTextOfNode(node)); + } + return typeIndex!; + } + LOGD("WARNING: node type not found for: " + jshelpers.getTextOfNode(node)); + return -1; + } + + protected getIndexFromTypeArrayBuffer(type: BaseType): number { + return PandaGen.appendTypeArrayBuffer(type); + } + + protected setTypeArrayBuffer(type: BaseType, index: number) { + PandaGen.setTypeArrayBuffer(type, index); + } + +} + +export class PlaceHolderType extends BaseType { + transfer2LiteralBuffer(): LiteralBuffer { + return new LiteralBuffer(); + } +} + +export class TypeSummary extends BaseType { + preservedIndex: number = 0; + userDefinedClassNum: number = 0; + anonymousRedirect: Array = new Array(); + constructor() { + super(); + this.preservedIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + } + + public setInfo(userDefinedClassNum: number, anonymousRedirect: Array) { + this.userDefinedClassNum = userDefinedClassNum; + this.anonymousRedirect = anonymousRedirect; + this.setTypeArrayBuffer(this, this.preservedIndex); + } + + transfer2LiteralBuffer(): LiteralBuffer { + let countBuf = new LiteralBuffer(); + let summaryLiterals: Array = new Array(); + summaryLiterals.push(new Literal(LiteralTag.INTEGER, L2Type._COUNTER)); + summaryLiterals.push(new Literal(LiteralTag.INTEGER, this.userDefinedClassNum)); + summaryLiterals.push(new Literal(LiteralTag.INTEGER, this.anonymousRedirect.length)); + for (let element of this.anonymousRedirect) { + summaryLiterals.push(new Literal(LiteralTag.STRING, element)); + } + countBuf.addLiterals(...summaryLiterals); + return countBuf; + } +} + +export class ClassType extends BaseType { + modifier: number = 0; // 0 -> unabstract, 1 -> abstract; + heritages: Array = new Array(); + // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + staticFields: Map> = new Map>(); + staticMethods: Array = new Array(); + fields: Map> = new Map>(); + methods: Array = new Array(); + typeIndex: number; + + constructor(classNode: ts.ClassDeclaration | ts.ClassExpression, newExpressionFlag: boolean, variableNode?: ts.Node) { + super(); + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + // record type before its initialization, so its index can be recorded + // in case there's recursive reference of this type + this.addCurrentType(classNode, shiftedIndex); + + this.fillInModifiers(classNode); + this.fillInHeritages(classNode); + this.fillInFieldsAndMethods(classNode); + + // initialization finished, add variable to type if variable is given + if (variableNode) { + // if the variable is a instance, create another classInstType instead of current classType itself + if (newExpressionFlag) { + new ClassInstType(variableNode, this.typeIndex); + } else { + this.setVariable2Type(variableNode, shiftedIndex, true); + } + } + this.setTypeArrayBuffer(this, this.typeIndex); + // check typeRecorder + // this.typeRecorder.getLog(classNode, this.typeIndex); + } + + public getTypeIndex() { + return this.typeIndex; + } + + private fillInModifiers(node: ts.ClassDeclaration | ts.ClassExpression) { + if (node.modifiers) { + for (let modifier of node.modifiers) { + switch (modifier.kind) { + case ts.SyntaxKind.AbstractKeyword: { + this.modifier = ModifierAbstract.ABSTRACT; + break; + } + case ts.SyntaxKind.ExportKeyword: { + break; + } + } + } + } + } + + private fillInHeritages(node: ts.ClassDeclaration | ts.ClassExpression) { + if (node.heritageClauses) { + for (let heritage of node.heritageClauses) { + for (let heritageType of heritage.types) { + let heritageIdentifier = heritageType.expression; + let heritageTypeIndex = this.getOrCreateUserDefinedType(heritageIdentifier, false); + this.heritages.push(heritageTypeIndex); + } + } + } + } + + private fillInFields(member: ts.PropertyDeclaration) { + // collect modifier info + let fieldName: string = ""; + switch (member.name.kind) { + case ts.SyntaxKind.Identifier: + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); + break; + case ts.SyntaxKind.ComputedPropertyName: + fieldName = "#computed"; + break; + default: + throw new Error("Invalid proerty name"); + } + + // Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + let fieldInfo = Array(PrimitiveType.ANY, AccessFlag.PUBLIC, ModifierReadonly.NONREADONLY); + let isStatic: boolean = false; + if (member.modifiers) { + for (let modifier of member.modifiers) { + switch (modifier.kind) { + case ts.SyntaxKind.StaticKeyword: { + isStatic = true; + break; + } + case ts.SyntaxKind.PrivateKeyword: { + fieldInfo[1] = AccessFlag.PRIVATE; + break; + } + case ts.SyntaxKind.ProtectedKeyword: { + fieldInfo[1] = AccessFlag.PROTECTED; + break; + } + case ts.SyntaxKind.ReadonlyKeyword: { + fieldInfo[2] = ModifierReadonly.READONLY; + break; + } + } + } + } + // collect type info + let variableNode = member.name ? member.name : undefined; + fieldInfo[0] = this.getTypeIndexForDeclWithType(member, variableNode); + + if (isStatic) { + this.staticFields.set(fieldName, fieldInfo); + } else { + this.fields.set(fieldName, fieldInfo); + } + } + + private fillInMethods(member: ClassMemberFunction) { + /** + * a method like declaration in a new class must be a new type, + * create this type and add it into typeRecorder + */ + let variableNode = member.name ? member.name : undefined; + let funcType = new FunctionType(member, variableNode); + + // Then, get the typeIndex and fill in the methods array + let typeIndex = this.tryGetTypeIndex(member); + let funcModifier = funcType.getModifier(); + if (funcModifier) { + this.staticMethods.push(typeIndex!); + } else { + this.methods.push(typeIndex!); + } + } + + private fillInFieldsAndMethods(node: ts.ClassDeclaration | ts.ClassExpression) { + if (node.members) { + for (let member of node.members) { + switch (member.kind) { + case ts.SyntaxKind.MethodDeclaration: + case ts.SyntaxKind.Constructor: + case ts.SyntaxKind.GetAccessor: + case ts.SyntaxKind.SetAccessor: { + this.fillInMethods(member); + break; + } + case ts.SyntaxKind.PropertyDeclaration: { + this.fillInFields(member); + break; + } + } + } + } + } + + transfer2LiteralBuffer() { + let classTypeBuf = new LiteralBuffer(); + let classTypeLiterals: Array = new Array(); + // the first element is to determine the L2 type + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.CLASS)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.modifier)); + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); + this.heritages.forEach(heritage => { + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, heritage)); + }); + + // record static methods and fields; + this.transferFields2Literal(classTypeLiterals, true); + this.transferMethods2Literal(classTypeLiterals, true); + + // record unstatic fields and methods + this.transferFields2Literal(classTypeLiterals, false); + this.transferMethods2Literal(classTypeLiterals, false); + + classTypeBuf.addLiterals(...classTypeLiterals); + return classTypeBuf; + } + + private transferFields2Literal(classTypeLiterals: Array, isStatic: boolean) { + let transferredTarget: Map> = isStatic ? this.staticFields : this.fields; + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.size)); + transferredTarget.forEach((typeInfo, name) => { + classTypeLiterals.push(new Literal(LiteralTag.STRING, name)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[0])); // typeIndex + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[1])); // accessFlag + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[2])); // readonly + }); + } + + private transferMethods2Literal(classTypeLiterals: Array, isStatic: boolean) { + let transferredTarget: Array = isStatic ? this.staticMethods : this.methods; + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.length)); + transferredTarget.forEach(method => { + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, method)); + }); + } +} + +export class ClassInstType extends BaseType { + shiftedReferredClassIndex: number = 0; // the referred class in the type system; + constructor(variableNode: ts.Node, referredClassIndex: number) { + super(); + // use referedClassIndex to point to the actually class type of this instance + this.shiftedReferredClassIndex = referredClassIndex + PrimitiveType._LENGTH; + + // map variable to classInstType, which has a newly generated index + let currIndex = this.getIndexFromTypeArrayBuffer(this); + let shiftedIndex = currIndex + PrimitiveType._LENGTH; + this.setVariable2Type(variableNode, shiftedIndex, true); + } + + transfer2LiteralBuffer(): LiteralBuffer { + let classInstBuf = new LiteralBuffer(); + let classInstLiterals: Array = new Array(); + + classInstLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.CLASSINST)); + classInstLiterals.push(new Literal(LiteralTag.INTEGER, this.shiftedReferredClassIndex)); + classInstBuf.addLiterals(...classInstLiterals); + + return classInstBuf; + } +} + +export class FunctionType extends BaseType { + name: string | undefined = ''; + accessFlag: number = 0; // 0 -> public -> 0, private -> 1, protected -> 2 + modifierStatic: number = 0; // 0 -> unstatic, 1 -> static + parameters: Array = new Array(); + returnType: number = 0; + typeIndex: number; + + constructor(funcNode: ts.FunctionLikeDeclaration, variableNode?: ts.Node) { + super(); + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + // record type before its initialization, so its index can be recorded + // in case there's recursive reference of this type + this.addCurrentType(funcNode, shiftedIndex); + + if (funcNode.name) { + this.name = jshelpers.getTextOfIdentifierOrLiteral(funcNode.name); + } else { + this.name = "constructor"; + } + this.fillInModifiers(funcNode); + this.fillInParameters(funcNode); + this.fillInReturn(funcNode); + + // initialization finished, add variable to type if variable is given + if (variableNode) { + this.setVariable2Type(variableNode, shiftedIndex, true); + } + this.setTypeArrayBuffer(this, this.typeIndex); + + // check typeRecorder + // this.typeRecorder.getLog(funcNode, this.typeIndex); + } + + public getTypeIndex() { + return this.typeIndex; + } + + private fillInModifiers(node: ts.FunctionLikeDeclaration) { + if (node.modifiers) { + for (let modifier of node.modifiers) { + switch (modifier.kind) { + case ts.SyntaxKind.PrivateKeyword: { + this.accessFlag = AccessFlag.PRIVATE; + break; + } + case ts.SyntaxKind.ProtectedKeyword: { + this.accessFlag = AccessFlag.PROTECTED; + break; + } + case ts.SyntaxKind.StaticKeyword: { + this.modifierStatic = ModifierStatic.STATIC; + } + } + } + } + } + + private fillInParameters(node: ts.FunctionLikeDeclaration) { + if (node.parameters) { + for (let parameter of node.parameters) { + let variableNode = parameter.name; + let typeIndex = this.getTypeIndexForDeclWithType(parameter, variableNode); + this.parameters.push(typeIndex); + } + } + } + + private fillInReturn(node: ts.FunctionLikeDeclaration) { + let typeIndex = this.getTypeIndexForDeclWithType(node); + if (typeIndex != -1) { + this.returnType = typeIndex; + } + } + + getModifier() { + return this.modifierStatic; + } + + transfer2LiteralBuffer(): LiteralBuffer { + let funcTypeBuf = new LiteralBuffer(); + let funcTypeLiterals: Array = new Array(); + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.FUNCTION)); + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.accessFlag)); + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.modifierStatic)); + funcTypeLiterals.push(new Literal(LiteralTag.STRING, this.name)); + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.parameters.length)); + this.parameters.forEach((type) => { + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, type)); + }); + + funcTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.returnType)); + funcTypeBuf.addLiterals(...funcTypeLiterals); + return funcTypeBuf; + } +} + +export class ExternalType extends BaseType { + fullRedirectNath: string; + typeIndex: number; + + constructor(importName: string, redirectPath: string) { + super(); + this.fullRedirectNath = `#${importName}#${redirectPath}`; + this.typeIndex = this.getIndexFromTypeArrayBuffer(this); + } + + public getTypeIndex() { + return this.typeIndex; + } + + transfer2LiteralBuffer(): LiteralBuffer { + let ImpTypeBuf = new LiteralBuffer(); + let ImpTypeLiterals: Array = new Array(); + ImpTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.EXTERNAL)); + ImpTypeLiterals.push(new Literal(LiteralTag.STRING, this.fullRedirectNath)); + ImpTypeBuf.addLiterals(...ImpTypeLiterals); + return ImpTypeBuf; + } +} + +export class ObjectLiteralType extends BaseType { + private properties: Map = new Map(); + private methods: Array = new Array(); + + constructor(obj: ts.ObjectLiteralExpression) { + super(); + + // TODO extract object info here + } + + transfer2LiteralBuffer(): LiteralBuffer { + let objTypeBuf = new LiteralBuffer(); + + return objTypeBuf; + } +} \ No newline at end of file diff --git a/ts2panda/src/base/util.ts b/ts2panda/src/base/util.ts index c9a2177cad..3c141cb824 100755 --- a/ts2panda/src/base/util.ts +++ b/ts2panda/src/base/util.ts @@ -295,4 +295,4 @@ export function getRangeStartVregPos(ins: IRNode): number { return -1; } return ins instanceof EcmaCreateobjectwithexcludedkeys ? 2 : 1; -} +} \ No newline at end of file diff --git a/ts2panda/src/cmdOptions.ts b/ts2panda/src/cmdOptions.ts index 6a14324b7f..77b983ac13 100644 --- a/ts2panda/src/cmdOptions.ts +++ b/ts2panda/src/cmdOptions.ts @@ -22,23 +22,28 @@ import path = require("path"); import { execute } from "./base/util"; const ts2pandaOptions = [ - { name: 'variant-bytecode', alias: 'r', type: Boolean, defaultValue: true, description: "emit 2nd bytecode to pandafile."}, - { name: 'modules', alias: 'm', type: Boolean, defaultValue: false, description: "compile as module."}, - { name: 'debug-log', alias: 'l', type: Boolean, defaultValue: false, description: "show info debug log."}, - { name: 'dump-assembly', alias: 'a', type: Boolean, defaultValue: false, description: "dump assembly to file."}, - { name: 'debug', alias: 'd', type: Boolean, defaultValue: false, description: "compile with debug info."}, - { name: 'show-statistics', alias: 's', type: String, lazyMultiple: true, defaultValue: "", description: "show compile statistics(ast, histogram, hoisting, all)."}, - { name: 'output', alias: 'o', type: String, defaultValue: "", description: "set output file."}, - { name: 'timeout', alias: 't', type: Number, defaultValue: 0, description: "js to abc timeout threshold(unit: seconds)."}, - { name: 'opt-log-level', type: String, defaultValue: "error", description: "specifie optimizer log level. Possible values: ['debug', 'info', 'error', 'fatal']"}, - { name: 'opt-level', type: Number, defaultValue: 1, description: "Optimization level. Possible values: [0, 1, 2]. Default: 0\n 0: no optimizations\n \ + { name: 'variant-bytecode', alias: 'r', type: Boolean, defaultValue: true, description: "emit 2nd bytecode to pandafile." }, + { name: 'modules', alias: 'm', type: Boolean, defaultValue: false, description: "compile as module." }, + { name: 'debug-log', alias: 'l', type: Boolean, defaultValue: false, description: "show info debug log." }, + { name: 'dump-assembly', alias: 'a', type: Boolean, defaultValue: false, description: "dump assembly to file." }, + { name: 'debug', alias: 'd', type: Boolean, defaultValue: false, description: "compile with debug info." }, + { name: 'show-statistics', alias: 's', type: String, lazyMultiple: true, defaultValue: "", description: "show compile statistics(ast, histogram, hoisting, all)." }, + { name: 'output', alias: 'o', type: String, defaultValue: "", description: "set output file." }, + { name: 'timeout', alias: 't', type: Number, defaultValue: 0, description: "js to abc timeout threshold(unit: seconds)." }, + { name: 'opt-log-level', type: String, defaultValue: "error", description: "specifie optimizer log level. Possible values: ['debug', 'info', 'error', 'fatal']" }, + { + name: 'opt-level', type: Number, defaultValue: 1, description: "Optimization level. Possible values: [0, 1, 2]. Default: 0\n 0: no optimizations\n \ 1: basic bytecode optimizations, including valueNumber, lowering, constantResolver, regAccAllocator\n \ 2: other bytecode optimizations, unimplemented yet"}, - { name: 'help', alias: 'h', type: Boolean, description: "Show usage guide."}, - { name: 'bc-version', alias: 'v', type: Boolean, defaultValue: false, description: "Print ark bytecode version"}, - { name: 'bc-min-version', type: Boolean, defaultValue: false, description: "Print ark bytecode minimum supported version"} + { name: 'help', alias: 'h', type: Boolean, description: "Show usage guide." }, + { name: 'bc-version', alias: 'v', type: Boolean, defaultValue: false, description: "Print ark bytecode version" }, + { name: 'bc-min-version', type: Boolean, defaultValue: false, description: "Print ark bytecode minimum supported version" }, + { name: 'included-files', alias: 'i', type: String, lazyMultiple: true, defaultValue: [], description: "The list of dependent files." }, + { name: 'record-type', alias: 'p', type: Boolean, defaultValue: false, description: "Record type info. Default: false" } ] + + export class CmdOptions { private static parsedResult: ts.ParsedCommandLine; private static options: commandLineArgs.CommandLineOptions; @@ -152,7 +157,7 @@ export class CmdOptions { return this.options["bc-version"]; } - static getVersion(isBcVersion : boolean = true) : void { + static getVersion(isBcVersion: boolean = true): void { let js2abc = path.join(path.resolve(__dirname, '../bin'), "js2abc"); let version_arg = isBcVersion ? "--bc-version" : "--bc-min-version" execute(`${js2abc}`, [version_arg]); @@ -165,6 +170,21 @@ export class CmdOptions { return this.options["bc-min-version"]; } + static getIncludedFiles(): string[] { + if (!this.options) { + return []; + } + + return this.options["included-files"]; + } + + static needRecordType(): boolean { + if (!this.options) { + return false; + } + return this.options["record-type"]; + } + static parseUserCmd(args: string[]): ts.ParsedCommandLine | undefined { this.options = commandLineArgs(ts2pandaOptions, { partial: true }); if (this.options.help) { @@ -186,4 +206,5 @@ export class CmdOptions { this.parsedResult = ts.parseCommandLine(this.options._unknown!); return this.parsedResult; } + } diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index c9230ee088..a3d561c59b 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -84,7 +84,11 @@ import { import { checkValidUseSuperBeforeSuper, compileClassDeclaration, - compileConstructor + compileConstructor, + compileDefaultConstructor, + compileDefaultInitClassMembers, + compileReturnThis4Ctor, + isContainConstruct } from "./statement/classStatement"; import { compileForOfStatement } from "./statement/forOfStatement"; import { LabelTarget } from "./statement/labelTarget"; @@ -269,6 +273,10 @@ export class Compiler { let statements = body.statements; let unreachableFlag = false; + if (body.parent && ts.isConstructorDeclaration(body.parent)) { + compileDefaultInitClassMembers(this, body.parent) + } + statements.forEach((stmt) => { this.compileStatement(stmt); if (stmt.kind == ts.SyntaxKind.ReturnStatement) { @@ -277,8 +285,7 @@ export class Compiler { }); if (body.parent && ts.isConstructorDeclaration(body.parent)) { - - compileConstructor(this, body.parent, unreachableFlag); + compileReturnThis4Ctor(this, body.parent, unreachableFlag); return; } @@ -393,6 +400,14 @@ export class Compiler { let pandaGen = this.pandaGen; this.compileFunctionParameterDeclaration(decl); + if (ts.isConstructorDeclaration(decl)) { + let classNode = decl.parent; + if (jshelpers.getClassExtendsHeritageElement(classNode) && !isContainConstruct(classNode)) { + compileDefaultConstructor(this, decl); + return; + } + } + if (decl.kind == ts.SyntaxKind.FunctionExpression) { if (decl.name) { let funcName = jshelpers.getTextOfIdentifierOrLiteral(decl.name); @@ -481,6 +496,7 @@ export class Compiler { this.compileExportAssignment(stmt); break; case ts.SyntaxKind.ExportDeclaration: + case ts.SyntaxKind.NotEmittedStatement: break; default: throw new Error("Statement " + this.getNodeName(stmt) + " is unimplemented"); @@ -611,7 +627,7 @@ export class Compiler { compileFinallyBeforeCFC(endTry: TryStatement | undefined, cfc: ControlFlowChange, continueTargetLabel: Label | undefined) {// compile finally before control flow change let startTry = TryStatement.getCurrentTryStatement(); let originTry = startTry; - for (; startTry != endTry; startTry = startTry ?.getOuterTryStatement()) { + for (; startTry != endTry; startTry = startTry?.getOuterTryStatement()) { if (startTry && startTry.trybuilder) { let inlineFinallyBegin = new Label(); @@ -673,7 +689,7 @@ export class Compiler { // try-catch-finally statements must have been transformed into // two nested try statements with only "catch" or "finally" each. if (stmt.catchClause && stmt.finallyBlock) { - transformTryCatchFinally(stmt, this.recorder); + stmt = transformTryCatchFinally(stmt, this.recorder); } let tryBuilder = new TryBuilder(this, this.pandaGen, stmt); @@ -859,6 +875,8 @@ export class Compiler { case ts.SyntaxKind.ClassExpression: compileClassDeclaration(this, expr); break; + case ts.SyntaxKind.PartiallyEmittedExpression: + break; default: throw new Error("Expression of type " + this.getNodeName(expr) + " is unimplemented"); } diff --git a/ts2panda/src/compilerDriver.ts b/ts2panda/src/compilerDriver.ts index 46a1533d01..c43c793bd0 100644 --- a/ts2panda/src/compilerDriver.ts +++ b/ts2panda/src/compilerDriver.ts @@ -43,6 +43,7 @@ import { import { getClassNameForConstructor } from "./statement/classStatement"; import { checkDuplicateDeclaration, checkExportEntries } from "./syntaxChecker"; import { Ts2Panda } from "./ts2panda"; +import { TypeRecorder } from "./typeRecorder"; export class PendingCompilationUnit { constructor( @@ -143,6 +144,12 @@ export class CompilerDriver { return spArray.reverse(); } + compileForSyntaxCheck(node: ts.SourceFile): void { + let recorder = this.compilePrologue(node, false); + checkDuplicateDeclaration(recorder); + checkExportEntries(recorder); + } + compile(node: ts.SourceFile): void { if (CmdOptions.showASTStatistics()) { let statics: number[] = new Array(ts.SyntaxKind.Count).fill(0); @@ -155,7 +162,7 @@ export class CompilerDriver { }); } - let recorder = this.compilePrologue(node); + let recorder = this.compilePrologue(node, true); // initiate ts2abc if (!CmdOptions.isAssemblyMode()) { @@ -233,7 +240,7 @@ export class CompilerDriver { } compileUnitTest(node: ts.SourceFile): void { - let recorder = this.compilePrologue(node); + let recorder = this.compilePrologue(node, true); for (let i = 0; i < this.pendingCompilationUnits.length; i++) { let unit: PendingCompilationUnit = this.pendingCompilationUnits[i]; @@ -261,7 +268,7 @@ export class CompilerDriver { this.compilationUnits.push(pandaGen); } - private compilePrologue(node: ts.SourceFile) { + private compilePrologue(node: ts.SourceFile, recordType: boolean) { let topLevelScope: GlobalScope | ModuleScope; if (CmdOptions.isModules()) { topLevelScope = new ModuleScope(node); @@ -269,12 +276,14 @@ export class CompilerDriver { topLevelScope = new GlobalScope(node); } - let recorder = new Recorder(node, topLevelScope, this); + let enableTypeRecord = recordType && CmdOptions.needRecordType(); + if (enableTypeRecord) { + TypeRecorder.createInstance(); + } + let recorder = new Recorder(node, topLevelScope, this, enableTypeRecord); recorder.record(); - - checkDuplicateDeclaration(recorder); - checkExportEntries(recorder); - addVariableToScope(recorder); + + addVariableToScope(recorder, enableTypeRecord); let postOrderVariableScopes = this.postOrderAnalysis(topLevelScope); for (let variableScope of postOrderVariableScopes) { diff --git a/ts2panda/src/debuginfo.ts b/ts2panda/src/debuginfo.ts index 527b8f0d50..688eac267e 100644 --- a/ts2panda/src/debuginfo.ts +++ b/ts2panda/src/debuginfo.ts @@ -171,8 +171,28 @@ export class DebugInfo { let firstStmt = pandaGen.getFirstStmt(); if (firstStmt) { let file = jshelpers.getSourceFileOfNode(firstStmt); - let loc = file.getLineAndCharacterOfPosition(firstStmt.getStart()); - let wholeLineText = firstStmt.getText(); + if (!file) { + return; + } + + let pos : number = 0; + let tempWholeLineText : string = "" + if (firstStmt.pos === -1 || firstStmt.end === -1) { + let parent = firstStmt.parent; + while (parent) { + if (parent.pos !== -1 && parent.end !== -1) { + pos = parent.pos; + tempWholeLineText = parent.getText(); + break; + } + parent = parent.parent; + } + } else { + pos = firstStmt.getStart(); + } + + let loc = file.getLineAndCharacterOfPosition(pos); + let wholeLineText = tempWholeLineText || firstStmt.getText(); posInfo.setSourecLineNum(loc.line); posInfo.setSourecColumnNum(loc.character); posInfo.setWholeLine(wholeLineText); @@ -199,12 +219,29 @@ export class DebugInfo { let wholeLineText = ""; if (DebugInfo.isNode(node)) { let tsNode = (node); - let file = jshelpers.getSourceFileOfNode(node); + let file = jshelpers.getSourceFileOfNode(tsNode); if (!file) { return; } - let loc = file.getLineAndCharacterOfPosition(tsNode.getStart()); - wholeLineText = tsNode.getText(); + + let pos : number = 0; + let tempWholeLineText : string = "" + if (tsNode.pos === -1 || tsNode.end === -1) { + let parent = tsNode.parent; + while (parent) { + if (parent.pos !== -1 && parent.end !== -1) { + pos = parent.pos; + tempWholeLineText = parent.getText(); + break; + } + parent = parent.parent; + } + } else { + pos = tsNode.getStart(); + } + + let loc = file.getLineAndCharacterOfPosition(pos); + wholeLineText = tempWholeLineText || tsNode.getText(); lineNumber = loc.line; columnNumber = loc.character; } @@ -381,4 +418,4 @@ export class DebugInfo { scope.setScopeEndIns(placeHolder); } } -} \ No newline at end of file +} diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index f778f0a75e..120b2c0131 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -23,10 +23,15 @@ import { CacheExpander } from "./pass/cacheExpander"; import { ICPass } from "./pass/ICPass"; import { RegAlloc } from "./regAllocator"; import { setGlobalStrict } from "./strictMode"; +import { TypeChecker } from "./typeChecker"; +import { TypeRecorder } from "./typeRecorder"; import jshelpers = require("./jshelpers"); +import path = require("path"); function main(fileNames: string[], options: ts.CompilerOptions) { let program = ts.createProgram(fileNames, options); + let typeChecker = TypeChecker.getInstance(); + typeChecker.setTypeChecker(program.getTypeChecker()); let emitResult = program.emit( undefined, undefined, @@ -36,11 +41,24 @@ function main(fileNames: string[], options: ts.CompilerOptions) { before: [ (ctx: ts.TransformationContext) => { return (node: ts.SourceFile) => { - let outputBinName = CmdOptions.getOutputBinName(); - let fileName = node.fileName.substring(0, node.fileName.lastIndexOf('.')); - if (fileName != CmdOptions.getInputFileName()) { - outputBinName = fileName + ".abc"; + let outputBinName = getOutputBinName(node); + // console.log("<==============> " + outputBinName + " <================>"); + let compilerDriver = new CompilerDriver(outputBinName); + compilerDriver.compileForSyntaxCheck(node); + return node; + } + } + ], + after: [ + (ctx: ts.TransformationContext) => { + return (node: ts.SourceFile) => { + if (ts.getEmitHelpers(node)) { + const printer: ts.Printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const text: string = printer.printNode(ts.EmitHint.Unspecified, node, node); + let newNode = ts.createSourceFile(node.fileName, text, options.target!); + node = newNode; } + let outputBinName = getOutputBinName(node); let compilerDriver = new CompilerDriver(outputBinName); setGlobalStrict(jshelpers.isEffectiveStrictModeSourceFile(node, options)); if (CmdOptions.isVariantBytecode()) { @@ -70,6 +88,21 @@ function main(fileNames: string[], options: ts.CompilerOptions) { }); } +function getOutputBinName(node: ts.SourceFile) { + let outputBinName = CmdOptions.getOutputBinName(); + let fileName = node.fileName.substring(0, node.fileName.lastIndexOf('.')); + let inputFileName = CmdOptions.getInputFileName(); + if (/^win/.test(require('os').platform())) { + var inputFileTmps = inputFileName.split(path.sep); + inputFileName = path.posix.join(...inputFileTmps); + } + + if (fileName != inputFileName) { + outputBinName = fileName + ".abc"; + } + return outputBinName; +} + namespace Compiler { export namespace Options { export let Default: ts.CompilerOptions = { @@ -78,7 +111,7 @@ namespace Compiler { noEmitOnError: true, noImplicitAny: true, target: ts.ScriptTarget.ES2015, - module: ts.ModuleKind.CommonJS, + module: ts.ModuleKind.ES2015, strictNullChecks: true, skipLibCheck: true, alwaysStrict: true @@ -98,7 +131,8 @@ function run(args: string[], options?: ts.CompilerOptions): void { } } try { - main(parsed.fileNames, parsed.options); + let files: string[] = parsed.fileNames; + main(files.concat(CmdOptions.getIncludedFiles()), parsed.options); } catch (err) { if (err instanceof diag.DiagnosticError) { let diagnostic = diag.getDiagnostic(err.code); diff --git a/ts2panda/src/jshelpers.d.ts b/ts2panda/src/jshelpers.d.ts index 5e4203d763..7138633f30 100644 --- a/ts2panda/src/jshelpers.d.ts +++ b/ts2panda/src/jshelpers.d.ts @@ -13,6 +13,8 @@ * limitations under the License. */ +import ts from "typescript"; + export function getSymbol(node: ts.Node): ts.Symbol; export function tsStringToString(str: ts.__String): string; export function getTextOfIdentifierOrLiteral(node: ts.Node): string; @@ -22,7 +24,6 @@ export function getFlowNode(stmt: ts.Statement): ts.Node; export function bindSourceFile(sourceFile: ts.SourceFile, options: ts.CompilerOptions); export function createDiagnosticForNode(node: ts.Node, message: ts.DiagnosticMessage, ...args: (string | number | undefined)[]): ts.DiagnosticWithLocation; export function createCompilerDiagnostic(message: ts.DiagnosticMessage, ...args: (string | number | undefined)[]): ts.Diagnostic; -export function createCompilerDiagnostic(message: ts.DiagnosticMessage, ...args: (string | number | undefined)[]): ts.Diagnostic; export function createFileDiagnostic(file: ts.SourceFile, start: number, length: number, message: ts.DiagnosticMessage, ...args: (string | number | undefined)[]): ts.DiagnosticWithLocation; export function isEffectiveStrictModeSourceFile(node: ts.SourceFile, compilerOptions: ts.CompilerOptions): boolean; export function getErrorSpanForNode(sourceFile: ts.SourceFile, node: ts.Node): ts.TextSpan; @@ -70,5 +71,5 @@ export function skipOuterExpressions(node: ts.Node, kinds?: ts.OuterExpressionKi export function isSuperCall(n: ts.Node); export function isThisProperty(node: ts.Node): boolean; export function isThisIdentifier(node: ts.Node | undefined): boolean; -export function getClassExtendsHeritageElement(node: ts.ClassLikeDeclaration | ts.InterfaceDeclaration); -export function isSuperProperty(node: ts.Node); \ No newline at end of file +export function isSuperProperty(node: ts.Node); +export function setParent(child: T | undefined, parent: T["parent"] | undefined): T | undefined; \ No newline at end of file diff --git a/ts2panda/src/jshelpers.js b/ts2panda/src/jshelpers.js index a958271e22..e3c2960d8d 100755 --- a/ts2panda/src/jshelpers.js +++ b/ts2panda/src/jshelpers.js @@ -103,10 +103,6 @@ function getTextOfNode(node, includeTrivia) { return ts.getTextOfNode(node, includeTrivia); } -function getContainingClass(node) { - return ts.getContainingClass(node); -} - function nodePosToString(node) { return ts.nodePosToString(node); } @@ -247,8 +243,8 @@ function isSuperProperty(node) { return ts.isSuperProperty(node); } -function getClassExtendsHeritageElement(node) { - return ts.getClassExtendsHeritageElement(node); +function setParent(child, parent) { + return ts.setParent(child, parent); } module.exports = { @@ -274,7 +270,6 @@ module.exports = { getSourceFileOfNode: getSourceFileOfNode, isIterationStatement: isIterationStatement, getTextOfNode: getTextOfNode, - getContainingClass: getContainingClass, nodePosToString: nodePosToString, getContainingFunctionDeclaration: getContainingFunctionDeclaration, tokenToString: tokenToString, @@ -310,5 +305,5 @@ module.exports = { isThisIdentifier: isThisIdentifier, isThisProperty: isThisProperty, isSuperProperty: isSuperProperty, - getClassExtendsHeritageElement: getClassExtendsHeritageElement, + setParent: setParent, }; diff --git a/ts2panda/src/modules.ts b/ts2panda/src/modules.ts index a4a8aff21e..8e1ea468a7 100644 --- a/ts2panda/src/modules.ts +++ b/ts2panda/src/modules.ts @@ -25,6 +25,7 @@ export class ModuleStmt { private moduleRequest: string; private namespace: string = ""; private bingdingNameMap: Map = new Map(); + private bingdingNodeMap: Map = new Map(); private isCopy: boolean = true; constructor(node: ts.Node, moduleRequest: string = "") { @@ -51,6 +52,14 @@ export class ModuleStmt { return this.bingdingNameMap; } + addNodeMap(name: ts.Node, propertyName: ts.Node) { + this.bingdingNodeMap.set(name, propertyName); + } + + getBindingNodeMap() { + return this.bingdingNodeMap; + } + setNameSpace(namespace: string) { this.namespace = namespace; } diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts index 1b56905a96..a1f43d6841 100644 --- a/ts2panda/src/pandagen.ts +++ b/ts2panda/src/pandagen.ts @@ -183,6 +183,8 @@ import { CatchTable } from "./statement/tryStatement"; import { Variable } from "./variable"; +import { BaseType } from "./base/typeSystem"; +import { TypeRecorder } from "./typeRecorder"; export class PandaGen { private debugTag: string = "PandaGen"; @@ -203,7 +205,7 @@ export class PandaGen { private icSize: number = 0; private callType: number = 0; - private static literalArrayBuffer: Array = []; + private static literalArrayBuffer: Array = new Array(); constructor(internalName: string, parametersCount: number, scope: Scope | undefined = undefined) { this.internalName = internalName; @@ -219,6 +221,14 @@ export class PandaGen { public getCallType(): number { return this.callType; } + + static getExportedTypes() { + if (TypeRecorder.getInstance()) { + return TypeRecorder.getInstance().getExportedType(); + } else { + return new Map(); + } + } public getSourceCodeDebugInfo() { return this.sourceCodeDebugInfo; @@ -266,6 +276,16 @@ export class PandaGen { this.icSize = total; } + static appendTypeArrayBuffer(type: BaseType): number { + let index = PandaGen.literalArrayBuffer.length; + PandaGen.literalArrayBuffer.push(type.transfer2LiteralBuffer()); + return index; + } + + static setTypeArrayBuffer(type: BaseType, index: number) { + PandaGen.literalArrayBuffer[index] = type.transfer2LiteralBuffer(); + } + getFirstStmt() { return this.firstStmt; } diff --git a/ts2panda/src/pandasm.ts b/ts2panda/src/pandasm.ts index c523f7fa87..a63e410bba 100644 --- a/ts2panda/src/pandasm.ts +++ b/ts2panda/src/pandasm.ts @@ -73,6 +73,8 @@ export class Function { public sourceFile: string; public sourceCode: string | undefined; public callType: number; + public typeInfo: Array; + public exportedSymbol2Types: Array | undefined; constructor( name: string, @@ -83,7 +85,9 @@ export class Function { variables: Array | undefined = undefined, sourceFile: string = "", sourceCode: string | undefined = undefined, - callType: number = 0 + callType: number = 0, + typeInfo: Array, + exportedSymbol2Types: Array | undefined = undefined ) { this.name = name; this.signature = signature; @@ -96,6 +100,8 @@ export class Function { this.sourceFile = sourceFile; this.sourceCode = sourceCode; this.callType = callType; + this.typeInfo = typeInfo; + this.exportedSymbol2Types = exportedSymbol2Types; } } @@ -169,6 +175,26 @@ export class CatchTable { } } +export class TypeOfVreg { + private vregNum: number; + private typeIndex: number; + + constructor(vregNum: number, typeIndex: number) { + this.vregNum = vregNum; + this.typeIndex = typeIndex; + } +} + +export class ExportedSymbol2Type { + private symbol: string; + private type: number; + + constructor(symbol: string, type: number) { + this.symbol = symbol; + this.type = type; + } +} + export interface Emmiter { generate_program: (filename: string, program: Program) => string; } diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index 387ddf83d1..dc3bf45673 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -41,18 +41,20 @@ import { VariableScope } from "./scope"; import { - AddCtor2Class, - isContainConstruct, - getClassNameForConstructor + AddCtor2Class, getClassNameForConstructor, isContainConstruct } from "./statement/classStatement"; import { checkSyntaxError } from "./syntaxChecker"; import { isGlobalIdentifier } from "./syntaxCheckHelper"; +import { TypeChecker } from "./typeChecker"; import { VarDeclarationKind } from "./variable"; +import { TypeRecorder } from "./typeRecorder"; +import { PandaGen } from "./pandagen"; export class Recorder { node: ts.Node; scope: Scope; compilerDriver: CompilerDriver; + recordType: boolean; private scopeMap: Map = new Map(); private hoistMap: Map = new Map(); private parametersMap: Map = new Map(); @@ -62,17 +64,25 @@ export class Recorder { private exportStmts: Array = []; private defaultUsed: boolean = false; - constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver) { + constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver, recordType: boolean) { this.node = node; this.scope = scope; this.compilerDriver = compilerDriver; + this.recordType = recordType; this.funcNameMap = new Map(); this.funcNameMap.set("main", 1); } record() { + this.setParent(this.node); this.setScopeMap(this.node, this.scope); this.recordInfo(this.node, this.scope); + if (this.recordType) { + TypeRecorder.getInstance().setTypeSummary(); + TypeRecorder.getInstance().getLog(); + } else { + PandaGen.clearLiteralArrayBuffer(); + } return this.node; } @@ -80,9 +90,20 @@ export class Recorder { return this.ClassGroupOfNoCtor; } + private setParent(node: ts.Node) { + node.forEachChild(childNode => { + childNode = jshelpers.setParent(childNode, node)!; + let originNode = ts.getOriginalNode(childNode); + childNode = ts.setTextRange(childNode, originNode); + this.setParent(childNode); + }); + } + private recordInfo(node: ts.Node, scope: Scope) { node.forEachChild(childNode => { - checkSyntaxError(childNode); + if (!this.recordType) { + checkSyntaxError(childNode); + } switch (childNode.kind) { case ts.SyntaxKind.FunctionExpression: case ts.SyntaxKind.MethodDeclaration: @@ -128,6 +149,9 @@ export class Recorder { case ts.SyntaxKind.ClassDeclaration: case ts.SyntaxKind.ClassExpression: { this.recordClassInfo(childNode, scope); + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode); + } break; } case ts.SyntaxKind.Identifier: { @@ -141,7 +165,10 @@ export class Recorder { if (!(scope instanceof ModuleScope)) { throw new Error("SyntaxError: import statement cannot in other scope except ModuleScope"); } - this.recordImportInfo(childNode, scope); + let importStmt = this.recordImportInfo(childNode, scope); + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode, importStmt); + } break; } case ts.SyntaxKind.ExportDeclaration: { @@ -151,7 +178,10 @@ export class Recorder { if (!(scope instanceof ModuleScope)) { throw new Error("SyntaxError: export statement cannot in other scope except ModuleScope"); } - this.recordExportInfo(childNode); + let exportStmt = this.recordExportInfo(childNode); + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode, exportStmt); + } break; } case ts.SyntaxKind.ExportAssignment: { @@ -160,6 +190,16 @@ export class Recorder { } this.defaultUsed = true; this.recordInfo(childNode, scope); + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode); + } + break; + } + case ts.SyntaxKind.VariableStatement: { + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode); + } + this.recordInfo(childNode, scope); break; } default: @@ -196,6 +236,7 @@ export class Recorder { let parent = this.getDeclarationNodeOfId(id); if (parent) { + // console.log(id.getText()); let declKind = astutils.getVarDeclarationKind(parent); // collect declaration information to corresponding scope @@ -216,7 +257,7 @@ export class Recorder { let tmp: Scope | undefined = nearestRefVariableScope.getNearestLexicalScope(); let needCreateLoopEnv: boolean = false; if (nearestDefLexicalScope instanceof LoopScope) { - while(tmp) { + while (tmp) { if (tmp == nearestDefLexicalScope) { needCreateLoopEnv = true; break; @@ -235,7 +276,7 @@ export class Recorder { if (name == "arguments") { let varialbeScope = scope.getNearestVariableScope(); - varialbeScope ?.setUseArgs(true); + varialbeScope?.setUseArgs(true); } } @@ -278,7 +319,7 @@ export class Recorder { } } - private recordImportInfo(node: ts.ImportDeclaration, scope: ModuleScope) { + private recordImportInfo(node: ts.ImportDeclaration, scope: ModuleScope): ModuleStmt { if (!ts.isStringLiteral(node.moduleSpecifier)) { throw new Error("moduleSpecifier must be a stringLiteral"); } @@ -293,6 +334,7 @@ export class Recorder { let name = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); scope.setDecls(new ConstDecl(name, importClause.name)); importStmt.addLocalName(name, "default"); + importStmt.addNodeMap(importClause.name, importClause.name); } // import { ... } from "a.js" @@ -314,15 +356,18 @@ export class Recorder { let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; scope.setDecls(new ConstDecl(name, element)); importStmt.addLocalName(name, exoticName); + importStmt.addNodeMap(element.name, element.propertyName ? element.propertyName : element.name); }); } } } this.importStmts.push(importStmt); + return importStmt; } - private recordExportInfo(node: ts.ExportDeclaration) { + private recordExportInfo(node: ts.ExportDeclaration): ModuleStmt { + var node = ts.getOriginalNode(node); let exportStmt: ModuleStmt; if (node.moduleSpecifier) { if (!ts.isStringLiteral(node.moduleSpecifier)) { @@ -352,11 +397,12 @@ export class Recorder { } let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; exportStmt.addLocalName(name, exoticName); + exportStmt.addNodeMap(element.name, element.propertyName ? element.propertyName : element.name); }); } } - this.exportStmts.push(exportStmt); + return exportStmt; } private recordFuncDecl(node: ts.FunctionDeclaration, scope: Scope) { @@ -492,8 +538,11 @@ export class Recorder { // if variable share a same name with the parameter of its contained function, it should not be hoisted if (scope instanceof FunctionScope) { - let nearestFunc = jshelpers.getContainingFunction(node); - let functionParameters = this.getParametersOfFunction(nearestFunc); + let nearestFunc = jshelpers.getContainingFunctionDeclaration(node); + if (!nearestFunc) { + return; + } + let functionParameters = this.getParametersOfFunction(nearestFunc); if (functionParameters) { for (let i = 0; i < functionParameters.length; i++) { if (functionParameters[i].name == declName) { diff --git a/ts2panda/src/statement/classStatement.ts b/ts2panda/src/statement/classStatement.ts index d346350f80..1d951aed7e 100644 --- a/ts2panda/src/statement/classStatement.ts +++ b/ts2panda/src/statement/classStatement.ts @@ -131,41 +131,23 @@ export function compileClassDeclaration(compiler: Compiler, stmt: ts.ClassLikeDe export function AddCtor2Class(recorder: Recorder, classNode: ts.ClassLikeDeclaration, scope: Scope) { let ctorNode; - let hasHeritage = classNode.heritageClauses && classNode.heritageClauses.length; - let statement: ts.Statement | undefined; - let superCallNode = ts.createSuper(); - if (hasHeritage) { - let parameter = ts.createParameter(undefined, undefined, ts.createToken(ts.SyntaxKind.DotDotDotToken), "args"); - ctorNode = ts.createConstructor(undefined, undefined, [parameter], undefined); - let callNode = ts.createCall( - superCallNode, - undefined, - [ts.createSpread(ts.createIdentifier("args"))] - ); - superCallNode.parent = callNode; - superCallNode.pos = classNode.pos; - superCallNode.end = classNode.pos; - statement = ts.createExpressionStatement(callNode); - callNode.parent = statement; - callNode.pos = classNode.pos; - callNode.end = classNode.pos; + if (jshelpers.getClassExtendsHeritageElement(classNode)) { + let parameter = ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createToken(ts.SyntaxKind.DotDotDotToken), "args"); + ctorNode = ts.factory.createConstructorDeclaration(undefined, undefined, [parameter], undefined); } else { - ctorNode = ts.createConstructor(undefined, undefined, [], undefined); + ctorNode = ts.factory.createConstructorDeclaration(undefined, undefined, [], undefined); } - if (statement) { - ctorNode.body = ts.createBlock([statement]); - statement.parent = ctorNode; - statement.pos = classNode.pos; - statement.end = classNode.pos; - } else { - ctorNode.body = ts.createBlock([]); - } + ctorNode = jshelpers.setParent(ctorNode, classNode)!; + ctorNode = ts.setTextRange(ctorNode, classNode); + + let body = ts.factory.createBlock([]); + body = jshelpers.setParent(body, ctorNode)!; + body = ts.setTextRange(body, classNode)!; - ctorNode.parent = classNode; - ctorNode.pos = classNode.pos; - ctorNode.end = classNode.pos; - ctorNode.body!.parent = ctorNode; + ctorNode = ts.factory.updateConstructorDeclaration(ctorNode, undefined, undefined, ctorNode.parameters, body); + ctorNode = jshelpers.setParent(ctorNode, classNode)!; + ctorNode = ts.setTextRange(ctorNode, classNode); let parentScope = recorder.getScopeOfNode(classNode); recorder.compilerDriver.getFuncId(classNode); @@ -182,6 +164,17 @@ export function AddCtor2Class(recorder: Recorder, classNode: ts.ClassLikeDeclara recorder.recordFunctionParameters(ctorNode); } +export function compileDefaultConstructor(compiler: Compiler, ctrNode: ts.ConstructorDeclaration) { + let callNode = ts.factory.createCallExpression(ts.factory.createSuper(), undefined, + [ts.factory.createSpreadElement(ts.factory.createIdentifier("args"))]); + + callNode = jshelpers.setParent(callNode, ctrNode)!; + callNode = ts.setTextRange(callNode, ctrNode)! + + compileSuperCall(compiler, callNode, [], true); + compileConstructor(compiler, ctrNode, false); +} + function compileUnCompiledProperty(compiler: Compiler, properties: Property[], classReg: VReg) { let pandaGen = compiler.getPandaGen(); for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) { @@ -245,9 +238,74 @@ function createClassLiteralBuf(compiler: Compiler, classBuffer: LiteralBuffer, pandaGen.storeAccumulator(stmt, vregs[1]); } +export function compileDefaultInitClassMembers(compiler: Compiler, node: ts.ConstructorDeclaration) { + let pandaGen = compiler.getPandaGen(); + let members = node.parent!.members; + for (let index = 0; index < members.length; index++) { + let decl = members[index]; + if (ts.isPropertyDeclaration(decl) && !jshelpers.hasStaticModifier(decl)) { + if (!decl.initializer) { + continue; + } + + let prop: VReg | string = ""; + let thisReg: VReg = pandaGen.getTemp(); + compiler.getThis(node, thisReg); + + compiler.compileExpression(decl.initializer); + + switch (decl.name.kind) { + case ts.SyntaxKind.Identifier: + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: { + prop = jshelpers.getTextOfIdentifierOrLiteral(decl.name); + pandaGen.storeObjProperty(node, thisReg, prop); + break; + } + case ts.SyntaxKind.ComputedPropertyName: { + // need to store the init value first + let initVal: VReg = pandaGen.getTemp(); + pandaGen.storeAccumulator(node, initVal); + + prop = pandaGen.getTemp(); + compiler.compileExpression(decl.name.expression); + pandaGen.storeAccumulator(node, prop); + + pandaGen.loadAccumulator(node, initVal); + pandaGen.storeObjProperty(node, thisReg, prop); + pandaGen.freeTemps(initVal, prop); + break; + } + default: + throw new Error("Private Identifier has not been supported") + + } + + pandaGen.freeTemps(thisReg); + } + } +} + +export function compileReturnThis4Ctor(compiler: Compiler, node: ts.ConstructorDeclaration, unreachableFlag: boolean) { + let pandaGen = compiler.getPandaGen(); + + if (unreachableFlag) { + return; + } + + let thisReg = pandaGen.getTemp(); + compiler.getThis(node, thisReg); + pandaGen.loadAccumulator(node, thisReg); + + checkValidUseSuperBeforeSuper(compiler, node); + + pandaGen.return(node); + pandaGen.freeTemps(thisReg); +} + export function compileConstructor(compiler: Compiler, node: ts.ConstructorDeclaration, unreachableFlag: boolean) { let pandaGen = compiler.getPandaGen(); - let members = node.parent.members; + let members = node.parent!.members; for (let index = 0; index < members.length; index++) { let decl = members[index]; @@ -330,19 +388,26 @@ export function compileSuperCall(compiler: Compiler, node: ts.CallExpression, ar function loadCtorObj(node: ts.CallExpression, compiler: Compiler) { let recorder = compiler.getRecorder(); let pandaGen = compiler.getPandaGen(); - let nearestFunc = jshelpers.getContainingFunction(node); + let nearestFunc = jshelpers.getContainingFunctionDeclaration(node); + if (!nearestFunc) { + return; + } + let nearestFuncScope = recorder.getScopeOfNode(nearestFunc); + if (!nearestFuncScope) { + return; + } if (ts.isConstructorDeclaration(nearestFunc)) { let funcObj = nearestFuncScope.findLocal("4funcObj"); pandaGen.loadAccumulator(node, getVregisterCache(pandaGen, CacheList.FUNC)); } else { - let outerFunc = jshelpers.getContainingFunction(nearestFunc); - let outerFuncScope = recorder.getScopeOfNode(outerFunc); + let outerFunc = jshelpers.getContainingFunctionDeclaration(nearestFunc); + let outerFuncScope = recorder.getScopeOfNode(outerFunc!); outerFuncScope.pendingCreateEnv(); let level = 1; - while (!ts.isConstructorDeclaration(outerFunc)) { - outerFunc = jshelpers.getContainingFunction(outerFunc); + while (!ts.isConstructorDeclaration(outerFunc!)) { + outerFunc = jshelpers.getContainingFunctionDeclaration(outerFunc!); outerFuncScope.pendingCreateEnv(); level++; } @@ -429,7 +494,7 @@ export function getClassNameForConstructor(classNode: ts.ClassLikeDeclaration) { let className = ""; if (!isAnonymousClass(classNode)) { - className = jshelpers.getTextOfIdentifierOrLiteral(classNode.name); + className = jshelpers.getTextOfIdentifierOrLiteral(classNode.name!); } else { let outerNode = findOuterNodeOfParenthesis(classNode); @@ -651,7 +716,7 @@ function scalarArrayEquals(node1: ts.Node | undefined, node2: ts.Node | undefine let val1Modifs = node1.modifiers; let val2Modifs = node2.modifiers; if (val1Modifs && val2Modifs) { - return val1Modifs.length == val2Modifs.length && val1Modifs.every(function(v, i) { return v === val2Modifs![i] });; + return val1Modifs.length == val2Modifs.length && val1Modifs.every(function (v, i) { return v === val2Modifs![i] });; } if (!val1Modifs && !val2Modifs) { diff --git a/ts2panda/src/statement/returnStatement.ts b/ts2panda/src/statement/returnStatement.ts index 221db0bb2e..90510ba9b3 100644 --- a/ts2panda/src/statement/returnStatement.ts +++ b/ts2panda/src/statement/returnStatement.ts @@ -134,8 +134,8 @@ function compileNormalReturn(stmt: ts.ReturnStatement, returnValue: VReg, compil } function isReturnInDerivedCtor(stmt: ts.ReturnStatement) { - let funcNode = jshelpers.getContainingFunction(stmt); - if (!ts.isConstructorDeclaration(funcNode)) { + let funcNode = jshelpers.getContainingFunctionDeclaration(stmt); + if (!funcNode || !ts.isConstructorDeclaration(funcNode)) { return false; } diff --git a/ts2panda/src/statement/tryStatement.ts b/ts2panda/src/statement/tryStatement.ts index 6107c01453..d720e5420d 100644 --- a/ts2panda/src/statement/tryStatement.ts +++ b/ts2panda/src/statement/tryStatement.ts @@ -28,9 +28,10 @@ import { import { IteratorType, IteratorRecord } from "./forOfStatement"; import * as astutils from "../astutils"; import { VarDeclarationKind } from "../variable"; +import jshelpers from "../jshelpers"; // adjust the try...catch...finally into nested try(try...catch) finally -export function transformTryCatchFinally(tryStmt: ts.TryStatement, recorder: Recorder) { +export function transformTryCatchFinally(tryStmt: ts.TryStatement, recorder: Recorder): ts.TryStatement { // after create new try block node, mapped with new scope, and adjust parent node let tryStmtScope = recorder.getScopeOfNode(tryStmt); let newTryBlockScope = new LocalScope(tryStmtScope); @@ -38,18 +39,16 @@ export function transformTryCatchFinally(tryStmt: ts.TryStatement, recorder: Rec (recorder.getScopeOfNode(tryStmt.tryBlock)).setParent(newTryStmtScope); (recorder.getScopeOfNode(tryStmt.catchClause!)).setParent(newTryStmtScope); - const newTryStmt = ts.createTry(tryStmt.tryBlock, tryStmt.catchClause, undefined); + const newTryStmt = ts.factory.createTryStatement(tryStmt.tryBlock, tryStmt.catchClause, undefined); recorder.setScopeMap(newTryStmt, newTryStmtScope); const newTryBlock = [newTryStmt]; - newTryBlock[0].pos = tryStmt.tryBlock.pos; - newTryBlock[0].end = tryStmt.tryBlock.end; - tryStmt.tryBlock = ts.updateBlock(tryStmt.tryBlock, newTryBlock); - newTryBlock[0].parent = tryStmt.tryBlock; - + newTryBlock[0] = jshelpers.setParent(newTryBlock[0], tryStmt)!; + newTryBlock[0] = ts.setTextRange(newTryBlock[0], tryStmt.tryBlock)!; + let tryBlock = ts.factory.updateBlock(tryStmt.tryBlock, newTryBlock); + tryStmt = ts.factory.updateTryStatement(tryStmt, tryBlock, undefined, tryStmt.finallyBlock); recorder.setScopeMap(tryStmt.tryBlock, newTryBlockScope); - tryStmt.catchClause = undefined; - tryStmt = ts.updateTry(tryStmt, tryStmt.tryBlock, undefined, tryStmt.finallyBlock); + return tryStmt; } export class LabelPair { @@ -359,7 +358,7 @@ function compileCatchClauseVariableDeclaration(compiler: Compiler, param: ts.Var } export function updateCatchTables(inlinedTry: TryStatement | undefined, targetTry: TryStatement, inlinedLabelPair: LabelPair) { - for (; inlinedTry != targetTry; inlinedTry = inlinedTry ?.getOuterTryStatement()) { + for (; inlinedTry != targetTry; inlinedTry = inlinedTry?.getOuterTryStatement()) { inlinedTry!.getCatchTable().splitLabelPair(inlinedLabelPair); } targetTry.getCatchTable().splitLabelPair(inlinedLabelPair); diff --git a/ts2panda/src/syntaxCheckHelper.ts b/ts2panda/src/syntaxCheckHelper.ts index 2c719c38f4..8439b27263 100644 --- a/ts2panda/src/syntaxCheckHelper.ts +++ b/ts2panda/src/syntaxCheckHelper.ts @@ -256,6 +256,10 @@ export function isOptionalParameter(node: ts.ParameterDeclaration): boolean { return true; } + if (!node.parent || !node.parent.parent) { + return false; + } + let iife = jshelpers.getImmediatelyInvokedFunctionExpression(node.parent); if (iife) { return !node.type && !node.dotDotDotToken && node.parent.parameters.indexOf(node) >= iife.arguments.length; diff --git a/ts2panda/src/syntaxChecker.ts b/ts2panda/src/syntaxChecker.ts index a9fe751dda..185e3a2df3 100644 --- a/ts2panda/src/syntaxChecker.ts +++ b/ts2panda/src/syntaxChecker.ts @@ -21,7 +21,7 @@ import { } from "./diagnostic"; import { hasExportKeywordModifier } from "./base/util"; import { findInnerExprOfParenthesis } from "./expression/parenthesizedExpression"; -import jshelpers, { getContainingFunction, getSourceFileOfNode } from "./jshelpers"; +import jshelpers, { getContainingFunction, getContainingFunctionDeclaration, getSourceFileOfNode } from "./jshelpers"; import { LOGE } from "./log"; import { Recorder } from "./recorder"; import { @@ -73,7 +73,7 @@ export function checkDuplicateDeclaration(recorder: Recorder) { } // implement catchParameter-related duplicate-entry check - if ((node.kind == ts.SyntaxKind.Block) && (node.parent.kind == ts.SyntaxKind.CatchClause)) { + if ((node.kind == ts.SyntaxKind.Block) && (node.parent != undefined && node.parent.kind == ts.SyntaxKind.CatchClause)) { let catchScope = scopeMap.get(node.parent); checkDuplicateInCatch(scope, catchScope); } @@ -355,12 +355,11 @@ function checkMetaProperty(node: ts.MetaProperty) { if (!getContainingFunction(node)) { throw new DiagnosticError(node, DiagnosticCode.Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor, file, args); } else { - let func = getContainingFunction(node); - while (getContainingFunction(func)) { - func = getContainingFunction(func); + let func = getContainingFunctionDeclaration(node); + while (getContainingFunctionDeclaration(func!)) { + func = getContainingFunctionDeclaration(func!); } - - if (ts.isArrowFunction(func)) { + if (func && ts.isArrowFunction(func)) { throw new DiagnosticError(node, DiagnosticCode.Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor, file, args); } } @@ -1051,7 +1050,7 @@ function getPropertieDeclaration(node: ts.Node, name: ts.Node) { function checkDisallowedTrailingComma(list: ts.NodeArray | undefined) { if (list && list.hasTrailingComma) { - let file = jshelpers.getSourceFileOfNode(list); + let file = jshelpers.getSourceFileOfNode(list[0]); throw new DiagnosticError(list[0], DiagnosticCode.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma, file); } } @@ -1059,10 +1058,10 @@ function checkDisallowedTrailingComma(list: ts.NodeArray | undefined) { function checkParameters(parameters: ts.NodeArray) { let count = parameters.length; let optionalParameter = false; - let file = jshelpers.getSourceFileOfNode(parameters); for (let i = 0; i < count; i++) { let parameter = parameters[i]; + let file = jshelpers.getSourceFileOfNode(parameter); if (parameter.dotDotDotToken) { if (i != count - 1) { throw new DiagnosticError(parameter.dotDotDotToken, DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list, file); @@ -1205,6 +1204,12 @@ function checkRegularExpression(regexp: ts.RegularExpressionLiteral) { new regexpParse().parseLiteral(regexpText); } +function checkThrowStatement(node: ts.ThrowStatement) { + if (ts.isIdentifier(node.expression) && (node.expression).text === '') { + throw new DiagnosticError(node, DiagnosticCode.Line_break_not_permitted_here, jshelpers.getSourceFileOfNode(node)); + } +} + function checkSyntaxErrorForSloppyAndStrictMode(node: ts.Node) { switch (node.kind) { case ts.SyntaxKind.BreakStatement: @@ -1270,6 +1275,9 @@ function checkSyntaxErrorForSloppyAndStrictMode(node: ts.Node) { case ts.SyntaxKind.RegularExpressionLiteral: checkRegularExpression(node); break; + case ts.SyntaxKind.ThrowStatement: + checkThrowStatement(node); + break; default: break; } diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index e3b60b281e..9e5a1c053f 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -24,9 +24,20 @@ import { } from "./irnodes"; import { LOGD } from "./log"; import { PandaGen } from "./pandagen"; -import { CatchTable, Function, Ins, Signature } from "./pandasm"; +import { + CatchTable, + ExportedSymbol2Type, + Function, + Ins, + Signature +} from "./pandasm"; import { generateCatchTables } from "./statement/tryStatement"; -import { escapeUnicode, isRangeInst, getRangeStartVregPos } from "./base/util"; +import { + escapeUnicode, + isRangeInst, + getRangeStartVregPos +} from "./base/util"; +import { TypeOfVreg } from "./pandasm"; const dollarSign: RegExp = /\$/g; @@ -35,7 +46,8 @@ const JsonType = { "record": 1, "string": 2, "literal_arr": 3, - "options": 4 + "options": 4, + "type_arr": 5 }; export class Ts2Panda { static strings: Set = new Set(); @@ -119,7 +131,7 @@ export class Ts2Panda { Ts2Panda.jsonString += escapeUnicode(JSON.stringify(strings_arr, null, 2)); } - strings_arr.forEach(function(str){ + strings_arr.forEach(function(str) { let strObject = { "type": JsonType.string, "string": str @@ -133,11 +145,16 @@ export class Ts2Panda { static dumpConstantPool(ts2abc: any): void { let literalArrays = PandaGen.getLiteralArrayBuffer(); + // console.log("-=-=-=- LiteralArrayBuffer =-=-=-=-=-="); + // for (let e of PandaGen.getLiteralArrayBuffer()) { + // console.log(JSON.parse(JSON.stringify(e))); + // } + if (CmdOptions.isEnableDebugLog()) { Ts2Panda.jsonString += escapeUnicode(JSON.stringify(literalArrays, null, 2)); } - literalArrays.forEach(function(literalArray){ + literalArrays.forEach(function(literalArray) { let literalArrayObject = { "type": JsonType.literal_arr, "literalArray": literalArray @@ -148,7 +165,7 @@ export class Ts2Panda { }); } - static dumpCmdOptions(ts2abc: any): void { + static dumpCmdOptions(ts2abc: any): void { let options = { "type": JsonType.options, "module_mode": CmdOptions.isModules(), @@ -171,6 +188,25 @@ export class Ts2Panda { let funcInsnsAndRegsNum = Ts2Panda.getFuncInsnsAndRegsNum(pg); let sourceFile = pg.getSourceFileDebugInfo(); let callType = pg.getCallType(); + let typeRecord = pg.getLocals(); + // console.log("\\\\\\-= funcNmae =-\\\\\\ - ", funcName); + let typeInfo = new Array(); + typeRecord.forEach((vreg) => { + let typeOfVreg = new TypeOfVreg(vreg.num, vreg.getTypeIndex()); + typeInfo.push(typeOfVreg); + + // console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); + // console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); + }); + + let exportedTypes = PandaGen.getExportedTypes(); + let exportedSymbol2Types = exportedTypes.size == 0 ? undefined : new Array(); + if (funcName == "func_main_0") { + exportedTypes.forEach((type: number, symbol: string) => { + let exportedSymbol2Type = new ExportedSymbol2Type(symbol, type); + exportedSymbol2Types!.push(exportedSymbol2Type); + }) + } let variables, sourceCode; if (CmdOptions.isDebugMode()) { @@ -190,7 +226,9 @@ export class Ts2Panda { variables, sourceFile, sourceCode, - callType + callType, + typeInfo, + exportedSymbol2Types ); let catchTables = generateCatchTables(pg.getCatchMap()); catchTables.forEach((catchTable) => { diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts new file mode 100755 index 0000000000..e1c24decfc --- /dev/null +++ b/ts2panda/src/typeChecker.ts @@ -0,0 +1,200 @@ +import ts, { forEachChild } from "typescript"; +import { ClassType, ExternalType } from "./base/typeSystem"; +import { ModuleStmt } from "./modules"; +import { TypeRecorder } from "./typeRecorder"; +import * as jshelpers from "./jshelpers"; +import { LOGD } from "./log"; + +export class TypeChecker { + private static instance: TypeChecker; + private compiledTypeChecker: any = null; + private constructor() { } + + public static getInstance(): TypeChecker { + if (!TypeChecker.instance) { + TypeChecker.instance = new TypeChecker(); + } + return TypeChecker.instance; + } + + public setTypeChecker(typeChecker: ts.TypeChecker) { + this.compiledTypeChecker = typeChecker; + } + + public getTypeChecker(): ts.TypeChecker { + return this.compiledTypeChecker; + } + + public getTypeDeclForIdentifier(node: ts.Node) { + if (node.kind == ts.SyntaxKind.ClassExpression) { + return node; + } + let symbol = this.compiledTypeChecker.getSymbolAtLocation(node); + if (symbol && symbol.declarations) { + return symbol.declarations[0]; + } + LOGD("TypeDecl NOT FOUND for: " + node.getFullText()); + return null; + } + + public getTypeFlagsAtLocation(node: ts.Node): string { + let typeFlag = this.compiledTypeChecker.getTypeAtLocation(node).getFlags(); + return ts.TypeFlags[typeFlag].toUpperCase(); + } + + public checkExportKeyword(node: ts.Node): boolean { + if (node.modifiers) { + for (let modifier of node.modifiers) { + if (modifier.kind === ts.SyntaxKind.ExportKeyword) { + return true; + } + } + } + return false; + } + + private getTypeDeclForInitializer(initializer: ts.Node, exportNeeded:boolean) { + switch (initializer.kind) { + // only create the type when it was used (initialized) or TODO: exported + // NewExpression initializer means that the type is a new class (TODO: or other object later, but is there any?) + case ts.SyntaxKind.NewExpression: + let initializerExpression = initializer; + return this.getTypeDeclForIdentifier(initializerExpression.expression); + case ts.SyntaxKind.ClassExpression: + if (exportNeeded) { + return initializer; + } + break; + // Or the initializer is a variable + case ts.SyntaxKind.Identifier: + // other types, functions/primitives... + return this.getTypeDeclForIdentifier(initializer); + case ts.SyntaxKind.PropertyAccessExpression: + return initializer; + default: + break; + return null; + } + } + + // If newExpressionFlag is ture, the type has to be created no mater the export is needed or + //not, while newExpressionFlag if false, the export has to be needed. + private checkForTypeDecl(originalName: ts.Node, typeDeclNode: ts.Node, exportNeeded: boolean, newExpressionFlag: boolean) { + switch (typeDeclNode.kind) { + // Type found to be defined a classDeclaration or classExpression + case ts.SyntaxKind.ClassDeclaration: + case ts.SyntaxKind.ClassExpression: + let origTypeDeclNode = ts.getOriginalNode(typeDeclNode); + let classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); + if (classTypeIndex == -1) { + new ClassType(origTypeDeclNode, newExpressionFlag, originalName); + if (newExpressionFlag) { + classTypeIndex = TypeRecorder.getInstance().tryGetVariable2Type(originalName); + } else { + classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); + } + } + if (exportNeeded) { + let exportedName = jshelpers.getTextOfIdentifierOrLiteral(originalName); + TypeRecorder.getInstance().setExportedType(exportedName, classTypeIndex, true); + } + break; + // The type was passed by a variable, need to keep search in deep + case ts.SyntaxKind.VariableDeclaration: + let varDeclNode = typeDeclNode; + let nextInitializer = varDeclNode.initializer; + if (nextInitializer) { + let nextTypeDeclNode = this.getTypeDeclForInitializer(nextInitializer, exportNeeded); + if (nextTypeDeclNode) { + this.checkForTypeDecl(originalName, nextTypeDeclNode, exportNeeded, newExpressionFlag); + } + } + break; + case ts.SyntaxKind.ImportSpecifier: + case ts.SyntaxKind.ImportClause: + let ImportTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); + if (ImportTypeIndex != -1) { + TypeRecorder.getInstance().setVariable2Type(originalName, ImportTypeIndex, true); + } else { + // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + } + break; + case ts.SyntaxKind.PropertyAccessExpression: + let propertyAccessExpression = typeDeclNode; + let localName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.expression); + let externalName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.name); + if (TypeRecorder.getInstance().inNampespaceMap(localName)) { + let redirectPath = TypeRecorder.getInstance().getPathForNamespace(localName)!; + let externalType = new ExternalType(externalName, redirectPath); + let ImportTypeIndex = externalType.getTypeIndex(); + TypeRecorder.getInstance().setVariable2Type(originalName, TypeRecorder.getInstance().shiftType(ImportTypeIndex), true); + } else { + // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + } + } + } + + public checkTypeForVariableDeclaration(node: ts.VariableDeclaration, exportNeeded: boolean) { + let name = node.name; + let initializer = node.initializer; + if (initializer) { + let typeDeclNode = this.getTypeDeclForInitializer(initializer, exportNeeded); + let newExpressionFlag = initializer.kind == ts.SyntaxKind.NewExpression; + if (typeDeclNode) { + this.checkForTypeDecl(name, typeDeclNode, exportNeeded, newExpressionFlag); + } + } + } + + // Entry for type recording, only process node that will need a type to be created + public formatNodeType(node: ts.Node, importOrExportStmt?: ModuleStmt) { + if (this.compiledTypeChecker === null) { + return; + } + switch(node.kind) { + case ts.SyntaxKind.VariableStatement: + // For varibaleStatemnt, need to check what kind of type the variable was set to + const variableStatementNode = node; + const decList = variableStatementNode.declarationList; + let exportNeeded = this.checkExportKeyword(node); + decList.declarations.forEach(declaration => { + this.checkTypeForVariableDeclaration(declaration, exportNeeded); + }); + break; + case ts.SyntaxKind.ClassDeclaration: + // Only create the type if it is exported. + // Otherwise, waite until it gets instantiated + let classDeclNode = ts.getOriginalNode(node); + if (this.checkExportKeyword(node)) { + let classType = new ClassType(classDeclNode, false); + let typeIndex = classType.getTypeIndex(); + let className = classDeclNode.name; + let exportedName = "default"; + if (className) { + exportedName = jshelpers.getTextOfIdentifierOrLiteral(className); + } + TypeRecorder.getInstance().setExportedType(exportedName, typeIndex, false); + } + break; + case ts.SyntaxKind.ExportDeclaration: + if (importOrExportStmt) { + TypeRecorder.getInstance().addExportedType(importOrExportStmt); + } + break; + case ts.SyntaxKind.ImportDeclaration: + if (importOrExportStmt) { + TypeRecorder.getInstance().addImportedType(importOrExportStmt); + } + break; + case ts.SyntaxKind.ExportAssignment: + let exportAssignmentNode = node; + let expression = exportAssignmentNode.expression; + let exportedName = "default"; + let expressionType = this.compiledTypeChecker.getTypeAtLocation(expression); + let typeNode = expressionType.getSymbol()?.valueDeclaration; + TypeRecorder.getInstance().addNonReExportedType(exportedName, typeNode); + break; + } + } + +} diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts new file mode 100755 index 0000000000..00a3b3344a --- /dev/null +++ b/ts2panda/src/typeRecorder.ts @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import ts from "typescript"; +import { + ClassType, + ExternalType, + TypeSummary +} from "./base/typeSystem"; +import { ModuleStmt } from "./modules"; +import { TypeChecker } from "./typeChecker"; +import { PrimitiveType } from "./base/typeSystem"; +import * as jshelpers from "./jshelpers"; + +export class TypeRecorder { + private static instance: TypeRecorder; + private type2Index: Map = new Map(); + private variable2Type: Map = new Map(); + private userDefinedTypeSet: Set = new Set();; + private typeSummary: TypeSummary = new TypeSummary(); + // ---> export/import + // exportedType: exportedName -> typeIndex + private exportedType: Map = new Map(); + // namespace mapping: namepace -> filepath (import * as sth from "...") + // later in PropertyAccessExpression we'll need this to map the symbol to filepath + private namespaceMap: Map = new Map(); + // (export * from "..."), if the symbol isn't in the reExportedType map, search here. + private anonymousReExport: Array = new Array(); + + private constructor() {} + + public static getInstance(): TypeRecorder { + return TypeRecorder.instance; + } + + public static createInstance(): TypeRecorder { + TypeRecorder.instance = new TypeRecorder(); + return TypeRecorder.instance; + } + + public setTypeSummary() { + this.typeSummary.setInfo(this.countUserDefinedTypeSet(), this.anonymousReExport); + } + + public addUserDefinedTypeSet(index: number) { + this.userDefinedTypeSet.add(index); + } + + public countUserDefinedTypeSet(): number { + return this.userDefinedTypeSet.size; + } + + public addType2Index(typeNode: ts.Node, index: number) { + this.type2Index.set(typeNode, index); + this.addUserDefinedTypeSet(index); + } + + public setVariable2Type(variableNode: ts.Node, index: number, isUserDefinedType: boolean) { + this.variable2Type.set(variableNode, index); + if (isUserDefinedType) { + this.addUserDefinedTypeSet(index); + } + } + + public hasType(typeNode: ts.Node): boolean { + return this.type2Index.has(typeNode); + } + + public tryGetTypeIndex(typeNode: ts.Node): number { + if (this.type2Index.has(typeNode)) { + return this.type2Index.get(typeNode)!; + } else { + return -1; + } + } + + public tryGetVariable2Type(variableNode: ts.Node): number { + if (this.variable2Type.has(variableNode)) { + return this.variable2Type.get(variableNode)!; + } else { + return -1; + } + } + + // ---> exported/imported + public addImportedType(moduleStmt: ModuleStmt) { + moduleStmt.getBindingNodeMap().forEach((externalNode, localNode) => { + let externalName = jshelpers.getTextOfIdentifierOrLiteral(externalNode); + let importDeclNode = TypeChecker.getInstance().getTypeDeclForIdentifier(localNode); + let externalType = new ExternalType(externalName, moduleStmt.getModuleRequest()); + this.addType2Index(importDeclNode, this.shiftType(externalType.getTypeIndex())); + }); + + if (moduleStmt.getNameSpace() != "") { + this.setNamespaceMap(moduleStmt.getNameSpace(), moduleStmt.getModuleRequest()); + } + } + + public addExportedType(moduleStmt: ModuleStmt) { + if (moduleStmt.getModuleRequest() != "") { + // re-export, no need to search in typeRecord cause it must not be there + if (moduleStmt.getNameSpace() != "") { + // re-export * as namespace + let externalType = new ExternalType("*", moduleStmt.getModuleRequest()); + let typeIndex = this.shiftType(externalType.getTypeIndex()); + this.setExportedType(moduleStmt.getNameSpace(), typeIndex, true); + this.addUserDefinedTypeSet(typeIndex); + } else if (moduleStmt.getBindingNameMap().size != 0) { + // re-export via clause + moduleStmt.getBindingNameMap().forEach((originalName, exportedName) => { + // let redirectName = this.createRedirectName(originalName, moduleStmt.getModuleRequest()); + // this.setReExportedType(exportedName, redirectName); + let externalType = new ExternalType(originalName, moduleStmt.getModuleRequest()); + let typeIndex = this.shiftType(externalType.getTypeIndex()); + this.setExportedType(exportedName, typeIndex, true); + this.addUserDefinedTypeSet(typeIndex); + }); + } else { + // re-export * with anonymuse namespace + this.addAnonymousReExport(moduleStmt.getModuleRequest()); + } + } else { + // named export via clause, could came from imported or local + // propertyName is local name, name is external name + moduleStmt.getBindingNodeMap().forEach((localNode, externalNode) => { + let exportedName = jshelpers.getTextOfIdentifierOrLiteral(externalNode); + let nodeType = TypeChecker.getInstance().getTypeChecker().getTypeAtLocation(localNode); + let typeNode = nodeType.getSymbol()?.valueDeclaration; + this.addNonReExportedType(exportedName, typeNode!); + }); + } + } + + public addNonReExportedType(exportedName: string, typeNode: ts.Node) { + // Check if type of localName was already stroed in typeRecord + // Imported type should already be stored in typeRecord by design + let typeIndexForType = this.tryGetTypeIndex(typeNode); + let typeIndexForVariable = this.tryGetVariable2Type(typeNode); + if (typeIndexForType != -1) { + this.setExportedType(exportedName, typeIndexForType, true); + } else if (typeIndexForVariable != -1) { + this.setExportedType(exportedName, typeIndexForVariable, true); + } else { + // not found in typeRecord. Need to create the type and + // add to typeRecord with its localName and to exportedType with its exportedName + if (typeNode.kind == ts.SyntaxKind.ClassDeclaration) { + let classType = new ClassType(typeNode, false); + let typeIndex = classType.getTypeIndex(); + this.setExportedType(exportedName, typeIndex, false); + } + + // Checking for duplicated export name should already be done by + // some kind of syntax checker, so no need to worry about duplicated export + } + } + + public shiftType(typeIndex: number) { + return typeIndex + PrimitiveType._LENGTH; + } + + public setExportedType(exportedName: string, typeIndex: number, shifted: boolean) { + if (!shifted) { + typeIndex = this.shiftType(typeIndex); + } + this.exportedType.set(exportedName, typeIndex); + } + + public addAnonymousReExport(redirectName: string) { + this.anonymousReExport.push(redirectName); + } + + public setNamespaceMap(namespace: string, filePath: string) { + this.namespaceMap.set(namespace, filePath); + } + + public inNampespaceMap(targetName: string) { + return this.namespaceMap.has(targetName); + } + + public getPathForNamespace(targetName: string) { + return this.namespaceMap.get(targetName); + } + + // for log + public getType2Index(): Map { + return this.type2Index; + } + + public getVariable2Type(): Map { + return this.variable2Type; + } + + public getTypeSet() { + return this.userDefinedTypeSet; + } + + public getExportedType() { + return this.exportedType; + } + + public getAnonymousReExport() { + return this.anonymousReExport; + } + + public getNamespaceMap() { + return this.namespaceMap; + } + + public printNodeMap(map: Map) { + map.forEach((value, key) => { + console.log(jshelpers.getTextOfNode(key) + ": " + value); + }); + } + + public printExportMap(map: Map) { + map.forEach((value, key) => { + console.log(key + " : " + value); + }); + } + + public printReExportMap(map: Map) { + map.forEach((value, key) => { + console.log(key + " : " + value); + }); + } + + public getLog() { + // console.log("=========== getLog ===========: " + node.kind); + // console.log(jshelpers.getTextOfNode(node)); + // console.log("=========== currIndex ===========: ", currIndex); + // console.log(PandaGen.getLiteralArrayBuffer()[currIndex]); + // console.log("=============================="); + // console.log("type2Index: "); + // console.log(this.printNodeMap(this.getType2Index())); + // console.log("variable2Type: "); + // console.log(this.printNodeMap(this.getVariable2Type())); + // console.log("getTypeSet: "); + // console.log(this.getTypeSet()); + // console.log("=============================="); + // console.log("exportedType:"); + // console.log(this.printExportMap(this.getExportedType())); + // console.log("AnoymousRedirect:"); + // console.log(this.getAnonymousReExport()); + // console.log("namespace Map:"); + // console.log(this.getNamespaceMap()); + // console.log("=============================="); + } +} \ No newline at end of file diff --git a/ts2panda/src/variable.ts b/ts2panda/src/variable.ts index eba622a9ea..1c1ed7f3fb 100644 --- a/ts2panda/src/variable.ts +++ b/ts2panda/src/variable.ts @@ -33,6 +33,7 @@ export enum VarDeclarationKind { export abstract class Variable { private vreg: VReg | undefined; private name: string; + private typeIndex: number; isLexVar: boolean = false; idxLex: number = 0; constructor( @@ -42,10 +43,12 @@ export abstract class Variable { this.name = name; this.vreg = undefined; this.name = name; + this.typeIndex = 77; } bindVreg(vreg: VReg) { this.vreg = vreg; + this.vreg.setTypeIndex(this.typeIndex); } hasAlreadyBinded(): boolean { @@ -63,6 +66,14 @@ export abstract class Variable { return this.name; } + getTypeIndex() { + return this.typeIndex; + } + + setTypeIndex(typeIndex: number) { + return this.typeIndex = typeIndex; + } + setLexVar(scope: VariableScope | LoopScope) { this.idxLex = scope.getLexVarIdx() scope.pendingCreateEnv(); diff --git a/ts2panda/templates/diagnostic.ts.erb b/ts2panda/templates/diagnostic.ts.erb index a6df2d5730..795fda099a 100755 --- a/ts2panda/templates/diagnostic.ts.erb +++ b/ts2panda/templates/diagnostic.ts.erb @@ -17,10 +17,10 @@ import { LOGE } from "./log" export class DiagnosticError { irnode:ts.Node | undefined; code:number; - file: ts.Node | undefined; + file: ts.SourceFile | undefined; args: (string | number | undefined)[]; - constructor(irnode:ts.Node | undefined, code:number,file?:ts.Node | undefined ,args?:(string | number | undefined)[]) { + constructor(irnode:ts.Node | undefined, code:number, file?:ts.SourceFile | undefined, args?:(string | number | undefined)[]) { this.code = code this.irnode = irnode this.file = file ? file : undefined @@ -40,13 +40,13 @@ export function printDiagnostic(diagnostic: ts.Diagnostic) { } -export function createDiagnosticOnFirstToken(file:ts.Node | undefined,node: ts.Node ,message: ts.DiagnosticMessage|ts.DiagnosticMessageChain,...args:(string | number | undefined)[]) { +export function createDiagnosticOnFirstToken(file:ts.SourceFile, node: ts.Node ,message: ts.DiagnosticMessage,...args:(string | number | undefined)[]) { let span = jshelpers.getSpanOfTokenAtPosition(file, node.pos); let diagnostic = jshelpers.createFileDiagnostic(file,span.start,span.length,message,...args); return diagnostic; } -export function createFileDiagnostic(file:ts.Node|undefined,node: ts.Node , message: ts.DiagnosticMessage|ts.DiagnosticMessageChain,...args:(string | number | undefined)[]) { +export function createFileDiagnostic(file:ts.SourceFile, node: ts.Node, message: ts.DiagnosticMessage,...args:(string | number | undefined)[]) { let diagnostic; let span = jshelpers.getErrorSpanForNode(file, node); @@ -68,7 +68,7 @@ export function createFileDiagnostic(file:ts.Node|undefined,node: ts.Node , mess return diagnostic; } -export function createDiagnostic(file:ts.Node|undefined, location: ts.Node | undefined, message: ts.DiagnosticMessage|ts.DiagnosticMessageChain,...args:(string | number | undefined)[]) { +export function createDiagnostic(file:ts.SourceFile | undefined, location: ts.Node | undefined, message: ts.DiagnosticMessage,...args:(string | number | undefined)[]) { var diagnostic; if (!location) { @@ -76,7 +76,7 @@ export function createDiagnostic(file:ts.Node|undefined, location: ts.Node | und } if (file) { - diagnostic = createFileDiagnostic(file,location,message,...args); + diagnostic = createFileDiagnostic(file, location, message, ...args); } else { diagnostic = jshelpers.createDiagnosticForNode(location, message, ...args) } diff --git a/ts2panda/templates/irnodes.ts.erb b/ts2panda/templates/irnodes.ts.erb index 40e6936c0e..2e73c9cee4 100755 --- a/ts2panda/templates/irnodes.ts.erb +++ b/ts2panda/templates/irnodes.ts.erb @@ -185,6 +185,7 @@ export abstract class Intrinsic extends IRNode { export class VReg { private static global_id = 0; + private typeIndex: number; readonly id: number; // used for debug purpose to distinguish one instance from another num: number = -1; @@ -201,6 +202,7 @@ export class VReg { constructor() { this.id = VReg.global_id++; + this.typeIndex = 0; // for debug purposes this.setStackTrace(null); @@ -225,6 +227,14 @@ export class VReg { return; } } + + getTypeIndex() { + return this.typeIndex; + } + + setTypeIndex(typeIndex: number) { + this.typeIndex = typeIndex; + } } export class Imm extends IRNode { diff --git a/ts2panda/tests/BUILD.gn b/ts2panda/tests/BUILD.gn index b8a513f60c..e820285118 100644 --- a/ts2panda/tests/BUILD.gn +++ b/ts2panda/tests/BUILD.gn @@ -26,7 +26,6 @@ action("ts2abc_tests") { rebase_path(target_out_dir + "/.."), "--node-modules", rebase_path("${node_modules}"), - "--gn-build", ] if (host_toolchain == buildtool_linux) { diff --git a/ts2panda/tests/expression/functionExpression.test.ts b/ts2panda/tests/expression/functionExpression.test.ts index f7cdaa4e5a..a772d73bd9 100755 --- a/ts2panda/tests/expression/functionExpression.test.ts +++ b/ts2panda/tests/expression/functionExpression.test.ts @@ -30,6 +30,7 @@ import { EcmaEqdyn, EcmaGetresumemode, EcmaLdlexenvdyn, + EcmaLdfunction, EcmaResumegenerator, EcmaReturnundefined, EcmaSuspendgenerator, @@ -60,6 +61,8 @@ describe("compileFunctionExpression", function () { let expected_func = [ new EcmaLdlexenvdyn(), new StaDyn(new VReg()), + new EcmaLdfunction(), + new StaDyn(new VReg()), new LdaDyn(new VReg()), new StaDyn(new VReg()), new EcmaCallarg0dyn(new VReg()), diff --git a/ts2panda/tests/lexenv.test.ts b/ts2panda/tests/lexenv.test.ts index 634973e736..9de941b90a 100644 --- a/ts2panda/tests/lexenv.test.ts +++ b/ts2panda/tests/lexenv.test.ts @@ -118,7 +118,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let sourceFile = creatAstFromSnippet(source); let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); recorder.record(); expect(globalScope, "root is null!").to.not.equal(null); @@ -146,7 +146,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let sourceFile = creatAstFromSnippet(source); let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); recorder.record(); let children = globalScope.getChildVariableScope(); @@ -194,7 +194,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); @@ -218,7 +218,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); @@ -272,7 +272,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); diff --git a/ts2panda/ts2abc/BUILD.gn b/ts2panda/ts2abc/BUILD.gn index 77d34e3a71..4c1d44e515 100755 --- a/ts2panda/ts2abc/BUILD.gn +++ b/ts2panda/ts2abc/BUILD.gn @@ -21,6 +21,7 @@ config("ts2abc_config") { include_dirs = [ ".", "$jsoncpp_root/include", + "$ark_root/libpandabase" ] if (enable_bytecode_optimizer) { @@ -46,7 +47,7 @@ config("ts2abc_config") { } ohos_executable("ts2abc") { - sources = [ "ts2abc.cpp" ] + sources = [ "ts2abc.cpp","main.cpp" ] configs = [ ":ts2abc_config" ] diff --git a/ts2panda/ts2abc/main.cpp b/ts2panda/ts2abc/main.cpp new file mode 100644 index 0000000000..587f2310e2 --- /dev/null +++ b/ts2panda/ts2abc/main.cpp @@ -0,0 +1,92 @@ +/* * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "assembly-type.h" +#include "assembly-program.h" +#include "assembly-emitter.h" +#include "json/json.h" +#include "ts2abc_options.h" +#include "ts2abc.h" + +int main(int argc, const char *argv[]) +{ + panda::PandArgParser argParser; + panda::Span sp(argv, argc); + panda::ts2abc::Options options(sp[0]); + options.AddOptions(&argParser); + + if (!argParser.Parse(argc, argv)) { + std::cerr << argParser.GetErrorString(); + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + std::string usage = "Usage: ts2abc [OPTIONS]... [ARGS]..."; + if (options.GetHelpArg()) { + std::cout << usage << std::endl; + std::cout << argParser.GetHelpString(); + return RETURN_SUCCESS; + } + + if (options.GetBcVersionArg() || options.GetBcMinVersionArg()) { + std::string version = options.GetBcVersionArg() ? panda::panda_file::GetVersion(panda::panda_file::version) : + panda::panda_file::GetVersion(panda::panda_file::minVersion); + std::cout << version << std::endl; + return RETURN_SUCCESS; + } + + if ((options.GetOptLevelArg() < OptLevel::O_LEVEL0) || (options.GetOptLevelArg() > OptLevel::O_LEVEL2)) { + std::cerr << "Incorrect optimization level value" << std::endl; + std::cerr << usage << std::endl; + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + std::string input, output; + std::string data = ""; + + if (!options.GetCompileByPipeArg()) { + input = options.GetTailArg1(); + output = options.GetTailArg2(); + if (input.empty() || output.empty()) { + std::cerr << "Incorrect args number" << std::endl; + std::cerr << "Usage example: ts2abc test.json test.abc"<< std::endl; + std::cerr << usage << std::endl; + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + if (!HandleJsonFile(input, data)) { + return RETURN_FAILED; + } + } else { + output = options.GetTailArg1(); + if (output.empty()) { + std::cerr << usage << std::endl; + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + if (!ReadFromPipe(data)) { + return RETURN_FAILED; + } + } + + if (!GenerateProgram(data, output, options.GetOptLevelArg(), options.GetOptLogLevelArg())) { + std::cerr << "call GenerateProgram fail" << std::endl; + return RETURN_FAILED; + } + + return RETURN_SUCCESS; +} diff --git a/ts2panda/ts2abc/tests/BUILD.gn b/ts2panda/ts2abc/tests/BUILD.gn new file mode 100644 index 0000000000..4875b12ea7 --- /dev/null +++ b/ts2panda/ts2abc/tests/BUILD.gn @@ -0,0 +1,41 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//ark/runtime_core/ark_config.gni") +import("//ark/ts2abc/ts2panda/ts2abc_config.gni") + +# ts2abc_unittest_action("DebugLogTest") { +# sources = [ "debuglog_test.cpp" ] +# } + +# ts2abc_unittest_action("DebugModeTest") { +# sources = [ "debugmode_test.cpp" ] +# } + +# ts2abc_unittest_action("StringArrTest") { +# sources = [ "stringarr_test.cpp" ] +# } + +# ts2abc_unittest_action("FunctionsTest") { +# sources = [ "functions_test.cpp" ] +# } + +# group("unittest") { +# testonly = true +# deps = [ +# ":DebugLogTestAction", +# ":DebugModeTestAction", +# ":FunctionsTestAction", +# ":StringArrTestAction", +# ] +# } diff --git a/ts2panda/ts2abc/tests/debuglog_test.cpp b/ts2panda/ts2abc/tests/debuglog_test.cpp new file mode 100644 index 0000000000..2c829cee4f --- /dev/null +++ b/ts2panda/ts2abc/tests/debuglog_test.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gtest/gtest.h" +#include "ts2abc.h" + +using namespace testing; +using namespace testing::ext; + +namespace ARK::Ts2Abc::Ts2Abc { + class DebugLogTest : public testing::Test { + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + }; + + void DebugLogTest::SetUpTestCase() {} + void DebugLogTest::TearDownTestCase() {} + void DebugLogTest::SetUp() {} + void DebugLogTest::TearDown() {} + + HWTEST_F(DebugLogTest, DebugLogTest_True, TestSize.Level0) + { + Json::Value rootValue; + rootValue["log_enabled"] = true; + ParseLogEnable(rootValue); + ASSERT_TRUE(GetDebugLog() == true); + } + + HWTEST_F(DebugLogTest, DebugLogTest_False, TestSize.Level0) + { + Json::Value rootValue; + rootValue["log_enabled"] = false; + ParseLogEnable(rootValue); + ASSERT_TRUE(GetDebugLog() == false); + } +} \ No newline at end of file diff --git a/ts2panda/ts2abc/tests/debugmode_test.cpp b/ts2panda/ts2abc/tests/debugmode_test.cpp new file mode 100644 index 0000000000..39b9099f53 --- /dev/null +++ b/ts2panda/ts2abc/tests/debugmode_test.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gtest/gtest.h" +#include "ts2abc.h" + +using namespace testing; +using namespace testing::ext; + +namespace ARK::Ts2Abc::Ts2Abc { + class DebugModeTest : public testing::Test { + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + }; + + void DebugModeTest::SetUpTestCase() {} + void DebugModeTest::TearDownTestCase() {} + void DebugModeTest::SetUp() {} + void DebugModeTest::TearDown() {} + + HWTEST_F(DebugModeTest, DebugModeTest_True, TestSize.Level0) + { + Json::Value rootValue; + rootValue["debug_mode"] = true; + ParseDebugMode(rootValue); + ASSERT_TRUE(GetDebugModeEnabled() == true); + } + + HWTEST_F(DebugModeTest, DebugModeTest_False, TestSize.Level0) + { + Json::Value rootValue; + rootValue["debug_mode"] = false; + ParseDebugMode(rootValue); + ASSERT_TRUE(GetDebugModeEnabled() == false); + } +} \ No newline at end of file diff --git a/ts2panda/ts2abc/tests/functions_test.cpp b/ts2panda/ts2abc/tests/functions_test.cpp new file mode 100644 index 0000000000..700b36d696 --- /dev/null +++ b/ts2panda/ts2abc/tests/functions_test.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "gtest/gtest.h" +#include "ts2abc.h" + +using namespace testing; +using namespace testing::ext; +namespace fs = std::filesystem; + +namespace ARK::Ts2Abc::Ts2Abc { + class FunctionTest : public testing::Test { + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + }; + + Json::Value function = {}; + + void FunctionTest::SetUpTestCase() {} + void FunctionTest::TearDownTestCase() {} + void FunctionTest::SetUp() + { + std::string file = "../../ark/ts2abc/ts2panda/ts2abc/tests/sources/add.json"; + std::string data = ""; + int ret = HandleJsonFile(file, data); + EXPECT_EQ(ret, 1); + Json::Value rootValue; + ret = ParseJson(data, rootValue); + EXPECT_EQ(ret, RETURN_SUCCESS); + function = rootValue["func_body"]; + } + void FunctionTest::TearDown() {} + + HWTEST_F(FunctionTest, FunctionTest_GetFunctionDefintion, TestSize.Level0) + { + auto pandaFunc = GetFunctionDefintion(function); + EXPECT_EQ(pandaFunc.name, function["name"].asString()); + EXPECT_EQ(pandaFunc.return_type.GetName(), "any"); + auto signature = function["signature"]; + EXPECT_EQ(pandaFunc.params.size(), signature["params"].asUInt()); + EXPECT_EQ(pandaFunc.regs_num, function["regs_num"].asUInt()); + } +} \ No newline at end of file diff --git a/ts2panda/ts2abc/tests/sources/add.json b/ts2panda/ts2abc/tests/sources/add.json new file mode 100644 index 0000000000..a5328fd5b3 --- /dev/null +++ b/ts2panda/ts2abc/tests/sources/add.json @@ -0,0 +1,157 @@ +{ + "type": 0, + "func_body": { + "name": "Add", + "signature": { + "params": 5 + }, + "ins": [ + { + "op": "mov.dyn", + "regs": [ + 4, + 12 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "mov.dyn", + "regs": [ + 3, + 11 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "mov.dyn", + "regs": [ + 2, + 10 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "mov.dyn", + "regs": [ + 1, + 9 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "mov.dyn", + "regs": [ + 0, + 8 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "ecma.ldlexenvdyn", + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "sta.dyn", + "regs": [ + 7 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "lda.dyn", + "regs": [ + 3 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 11 + } + }, + { + "op": "sta.dyn", + "regs": [ + 6 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 11 + } + }, + { + "op": "lda.dyn", + "regs": [ + 4 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 13 + } + }, + { + "op": "ecma.add2dyn", + "regs": [ + 6 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 11 + } + }, + { + "op": "sta.dyn", + "regs": [ + 5 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "lda.dyn", + "regs": [ + 5 + ], + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + }, + { + "op": "return.dyn", + "debug_pos_info": { + "lineNum": 1, + "columnNum": 4 + } + } + ], + "labels": [], + "regs_num": 8, + "metadata": { + "attribute": "" + }, + "catchTables": [], + "sourceFile": "test.js" + } +} \ No newline at end of file diff --git a/ts2panda/ts2abc/tests/stringarr_test.cpp b/ts2panda/ts2abc/tests/stringarr_test.cpp new file mode 100644 index 0000000000..bc08e8698e --- /dev/null +++ b/ts2panda/ts2abc/tests/stringarr_test.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gtest/gtest.h" +#include "ts2abc.h" + +using namespace testing; +using namespace testing::ext; + +namespace ARK::Ts2Abc::Ts2Abc { + class StringArrTest : public testing::Test { + public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + }; + + void StringArrTest::SetUpTestCase() {} + void StringArrTest::TearDownTestCase() {} + void StringArrTest::SetUp() {} + void StringArrTest::TearDown() {} + + HWTEST_F(StringArrTest, StringArrTest_With0, TestSize.Level0) + { + std::string input = "Hello 000World"; + std::string expected = "Hello 000World"; + std::string output = ParseString(input); + EXPECT_EQ(output, expected); + } + + HWTEST_F(StringArrTest, StringArrTest_HalfUnicodeChar, TestSize.Level0) + { + std::string input = "Hello\\UD834World"; + std::string expected = "Hello\\UD834World"; + std::string output = ParseString(input); + EXPECT_EQ(output, expected); + } +} \ No newline at end of file diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 0e72bf4f5e..34c0b52e40 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -25,6 +25,7 @@ #include "json/json.h" #include "ts2abc_options.h" #include "securec.h" +#include "ts2abc.h" #ifdef ENABLE_BYTECODE_OPT #include "optimize_bytecode.h" @@ -52,22 +53,11 @@ namespace { constexpr bool IS_DEFINED = true; // Temprorary map to simplify debuging std::unordered_map g_opcodeMap = { -#define OPLIST(opcode, name, optype, width, flags, def_idx, use_idxs) { name, panda::pandasm::Opcode::opcode }, +#define OPLIST(opcode, name, optype, width, flags, def_idx, use_idxs) {name, panda::pandasm::Opcode::opcode}, PANDA_INSTRUCTION_LIST(OPLIST) #undef OPLIST - { "", panda::pandasm::Opcode::INVALID }, + {"", panda::pandasm::Opcode::INVALID}, }; - - enum JsonType { - FUNCTION = 0, - RECORD, - STRING, - LITERALBUFFER, - OPTIONS - }; - - const int RETURN_SUCCESS = 0; - const int RETURN_FAILED = 1; } // pandasm hellpers @@ -121,10 +111,30 @@ static bool IsValidInt32(double value) value >= static_cast(std::numeric_limits::min())); } +bool GetDebugLog() +{ + return g_debugLogEnabled; +} + +static void SetDebugLog(bool debugLog) +{ + g_debugLogEnabled = debugLog; +} + +bool GetDebugModeEnabled() +{ + return g_debugModeEnabled; +} + +static void SetDebugModeEnabled(bool value) +{ + g_debugModeEnabled = value; +} + // Unified interface for debug log print static void Logd(const char *format, ...) { - if (g_debugLogEnabled) { + if (GetDebugLog()) { va_list valist; va_start(valist, format); char logMsg[LOG_BUFFER_SIZE]; @@ -195,7 +205,7 @@ static std::string ParseUnicodeEscapeString(const std::string &data) return newData; } -static std::string ParseString(const std::string &data) +std::string ParseString(const std::string &data) { if (data.find("\\u") != std::string::npos) { return ParseUnicodeEscapeString(data); @@ -379,7 +389,7 @@ static void ParseInstructionDebugInfo(const Json::Value &ins, panda::pandasm::In panda::pandasm::debuginfo::Ins insDebug; if (ins.isMember("debug_pos_info") && ins["debug_pos_info"].isObject()) { auto debugPosInfo = ins["debug_pos_info"]; - if (g_debugModeEnabled) { + if (GetDebugModeEnabled()) { if (debugPosInfo.isMember("boundLeft") && debugPosInfo["boundLeft"].isInt()) { insDebug.bound_left = debugPosInfo["boundLeft"].asInt(); } @@ -415,7 +425,7 @@ static panda::pandasm::Ins ParseInstruction(const Json::Value &ins) static int ParseVariablesDebugInfo(const Json::Value &function, panda::pandasm::Function &pandaFunc) { - if (!g_debugModeEnabled) { + if (!GetDebugModeEnabled()) { return RETURN_SUCCESS; } @@ -464,7 +474,7 @@ static int ParseSourceFileDebugInfo(const Json::Value &function, panda::pandasm: pandaFunc.source_file = function["sourceFile"].asString(); } - if (g_debugModeEnabled) { + if (GetDebugModeEnabled()) { if (function.isMember("sourceCode") && function["sourceCode"].isString()) { pandaFunc.source_code = function["sourceCode"].asString(); } @@ -496,7 +506,7 @@ static panda::pandasm::Function::CatchBlock ParsecatchBlock(const Json::Value &c return pandaCatchBlock; } -static panda::pandasm::Function GetFunctionDefintion(const Json::Value &function) +panda::pandasm::Function GetFunctionDefintion(const Json::Value &function) { std::string funcName = ""; if (function.isMember("name") && function["name"].isString()) { @@ -610,12 +620,96 @@ static void ParseFunctionCallType(const Json::Value &function, panda::pandasm::F } panda::pandasm::AnnotationData callTypeAnnotation("_ESCallTypeAnnotation"); std::string annotationName = "callType"; - panda::pandasm::AnnotationElement callTypeAnnotationElement(annotationName, - std::make_unique( - panda::pandasm::ScalarValue::Create(callType))); + panda::pandasm::AnnotationElement callTypeAnnotationElement(annotationName, std::make_unique(panda::pandasm::ScalarValue::Create(callType))); callTypeAnnotation.AddElement(std::move(callTypeAnnotationElement)); - const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back( - std::move(callTypeAnnotation)); + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(callTypeAnnotation)); +} + +static void ParseFunctionTypeInfo(const Json::Value &function, panda::pandasm::Function &pandaFunc) +{ + if (function.isMember("typeInfo") && function["typeInfo"].isArray()) { + auto typeInfo = function["typeInfo"]; + panda::pandasm::AnnotationData funcAnnotation("_ESTypeAnnotation"); + std::vector elements; + for (Json::ArrayIndex i = 0; i < typeInfo.size(); i++) { + auto type = typeInfo[i]; + if (!type.isObject()) { + continue; + } + + // TODO add type-vreg info to function annotation + uint32_t vregNum = 0; + if (type.isMember("vregNum") && type["vregNum"].isInt()) { + vregNum = type["vregNum"].asUInt(); + } + + uint32_t typeIndex = 0; + if (type.isMember("typeIndex") && type["typeIndex"].isInt()) { + typeIndex = type["typeIndex"].asUInt(); + } + + panda::pandasm::ScalarValue vNum(panda::pandasm::ScalarValue::Create(vregNum)); + elements.emplace_back(std::move(vNum)); + panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + elements.emplace_back(std::move(tIndex)); + } + + std::string annotationName = "typeOfVreg"; + panda::pandasm::AnnotationElement typeOfVregElement(annotationName, std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, elements))); + funcAnnotation.AddElement(std::move(typeOfVregElement)); + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + } +} + +static void ParseFunctionExportedType(const Json::Value &function, panda::pandasm::Function &pandaFunc) +{ + std::string funcName = ""; + if (function.isMember("name") && function["name"].isString()) { + funcName = function["name"].asString(); + if (funcName != "func_main_0") { + return; + } + } + + if (function.isMember("exportedSymbol2Types") && function["exportedSymbol2Types"].isArray()) { + auto exportedTypes = function["exportedSymbol2Types"]; + panda::pandasm::AnnotationData funcAnnotation("_ESTypeAnnotation"); + std::vector symbolElements; + std::vector symbolTypeElements; + for (Json::ArrayIndex i = 0; i < exportedTypes.size(); i++) { + auto exportedType = exportedTypes[i]; + if (!exportedType.isObject()) { + continue; + } + + std::string exportedSymbol = ""; + if (exportedType.isMember("symbol") && exportedType["symbol"].isString()) { + exportedSymbol = exportedType["symbol"].asString(); + } + + uint32_t typeIndex = 0; + if (exportedType.isMember("type") && exportedType["type"].isInt()) { + typeIndex = exportedType["type"].asUInt(); + } + + panda::pandasm::ScalarValue symbol(panda::pandasm::ScalarValue::Create(exportedSymbol)); + symbolElements.emplace_back(std::move(symbol)); + panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + symbolTypeElements.emplace_back(std::move(tIndex)); + } + + std::string symbolAnnotationName = "exportedSymbols"; + panda::pandasm::AnnotationElement exportedSymbolsElement(symbolAnnotationName, + std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::STRING, symbolElements))); + funcAnnotation.AddElement(std::move(exportedSymbolsElement)); + + std::string symbolTypeAnnotationName = "exportedSymbolTypes"; + panda::pandasm::AnnotationElement exportedSymbolTypesElement(symbolTypeAnnotationName, + std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, symbolTypeElements))); + funcAnnotation.AddElement(std::move(exportedSymbolTypesElement)); + + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + } } static panda::pandasm::Function ParseFunction(const Json::Value &function) @@ -623,16 +717,14 @@ static panda::pandasm::Function ParseFunction(const Json::Value &function) auto pandaFunc = GetFunctionDefintion(function); ParseFunctionMetadata(function, pandaFunc); ParseFunctionInstructions(function, pandaFunc); - // parsing variables debug info ParseVariablesDebugInfo(function, pandaFunc); - // parsing source file debug info ParseSourceFileDebugInfo(function, pandaFunc); - // parsing labels ParseFunctionLabels(function, pandaFunc); - // parsing catch blocks ParseFunctionCatchTables(function, pandaFunc); // parsing call opt type ParseFunctionCallType(function, pandaFunc); + ParseFunctionTypeInfo(function, pandaFunc); + ParseFunctionExportedType(function, pandaFunc); return pandaFunc; } @@ -644,6 +736,13 @@ static void GenerateESCallTypeAnnotationRecord(panda::pandasm::Program &prog) callTypeAnnotationRecord.metadata->SetAccessFlags(panda::ACC_ANNOTATION); prog.record_table.emplace(callTypeAnnotationRecord.name, std::move(callTypeAnnotationRecord)); } +static void GenerateESTypeAnnotationRecord(panda::pandasm::Program &prog) +{ + auto tsTypeAnnotationRecord = panda::pandasm::Record("_ESTypeAnnotation", LANG_EXT); + tsTypeAnnotationRecord.metadata->SetAttribute("external"); + tsTypeAnnotationRecord.metadata->SetAccessFlags(panda::ACC_ANNOTATION); + prog.record_table.emplace(tsTypeAnnotationRecord.name, std::move(tsTypeAnnotationRecord)); +} static void GenrateESModuleModeRecord(panda::pandasm::Program &prog, bool moduleMode) { @@ -661,7 +760,7 @@ static void GenrateESModuleModeRecord(panda::pandasm::Program &prog, bool module prog.record_table.emplace(ecmaModuleModeRecord.name, std::move(ecmaModuleModeRecord)); } -static int ParseJson(const std::string &data, Json::Value &rootValue) +int ParseJson(const std::string &data, Json::Value &rootValue) { JSONCPP_STRING errs; Json::CharReaderBuilder readerBuilder; @@ -692,18 +791,18 @@ static void ParseModuleMode(const Json::Value &rootValue, panda::pandasm::Progra GenrateESModuleModeRecord(prog, g_moduleModeEnabled); } -static void ParseLogEnable(const Json::Value &rootValue) +void ParseLogEnable(const Json::Value &rootValue) { if (rootValue.isMember("log_enabled") && rootValue["log_enabled"].isBool()) { - g_debugLogEnabled = rootValue["log_enabled"].asBool(); + SetDebugLog(rootValue["log_enabled"].asBool()); } } -static void ParseDebugMode(const Json::Value &rootValue) +void ParseDebugMode(const Json::Value &rootValue) { Logd("-----------------parse debug_mode-----------------"); if (rootValue.isMember("debug_mode") && rootValue["debug_mode"].isBool()) { - g_debugModeEnabled = rootValue["debug_mode"].asBool(); + SetDebugModeEnabled(rootValue["debug_mode"].asBool()); } } @@ -713,7 +812,7 @@ static void ParseOptLevel(const Json::Value &rootValue) if (rootValue.isMember("opt_level") && rootValue["opt_level"].isInt()) { g_optLevel = rootValue["opt_level"].asInt(); } - if (g_debugModeEnabled) { + if (GetDebugModeEnabled()) { g_optLevel = 0; } } @@ -740,6 +839,7 @@ static void ReplaceAllDistinct(std::string &str, const std::string &oldValue, co static void ParseOptions(const Json::Value &rootValue, panda::pandasm::Program &prog) { GenerateESCallTypeAnnotationRecord(prog); + GenerateESTypeAnnotationRecord(prog); ParseModuleMode(rootValue, prog); ParseLogEnable(rootValue); ParseDebugMode(rootValue); @@ -856,9 +956,7 @@ static bool ParseData(const std::string &data, panda::pandasm::Program &prog) return true; } -static bool GenerateProgram(const std::string &data, std::string output, - panda::PandArg optLevelArg, - panda::PandArg optLogLevelArg) +bool GenerateProgram(const std::string &data, std::string output, int optLevel, std::string optLogLevel) { panda::pandasm::Program prog = panda::pandasm::Program(); prog.lang = panda::pandasm::extensions::Language::ECMASCRIPT; @@ -870,8 +968,8 @@ static bool GenerateProgram(const std::string &data, std::string output, Logd("parsing done, calling pandasm\n"); #ifdef ENABLE_BYTECODE_OPT - if (g_optLevel != O_LEVEL0 || optLevelArg.GetValue() != O_LEVEL0) { - std::string optLogLevel = (optLogLevelArg.GetValue() != "error") ? optLogLevelArg.GetValue() : g_optLogLevel; + if (g_optLevel != O_LEVEL0 || optLevel != O_LEVEL0) { + optLogLevel = (optLogLevel != "error") ? optLogLevel : g_optLogLevel; const uint32_t componentMask = panda::Logger::Component::CLASS2PANDA | panda::Logger::Component::ASSEMBLER | panda::Logger::Component::BYTECODE_OPTIMIZER | panda::Logger::Component::COMPILER; @@ -905,7 +1003,7 @@ static bool GenerateProgram(const std::string &data, std::string output, return true; } -static bool HandleJsonFile(const std::string &input, std::string &data) +bool HandleJsonFile(const std::string &input, std::string &data) { auto inputAbs = panda::os::file::File::GetAbsolutePath(input); if (!inputAbs) { @@ -939,7 +1037,7 @@ static bool HandleJsonFile(const std::string &input, std::string &data) return true; } -static bool ReadFromPipe(std::string &data) +bool ReadFromPipe(std::string &data) { const size_t bufSize = 4096; const size_t fd = 3; @@ -964,101 +1062,3 @@ static bool ReadFromPipe(std::string &data) Logd("finish reading from pipe"); return true; } - -int main(int argc, const char *argv[]) -{ - panda::PandArgParser argParser; - panda::Span sp(argv, argc); - panda::ts2abc::Options options(sp[0]); - options.AddOptions(&argParser); - - panda::PandArg sizeStatArg("size-stat", false, "Print panda file size statistic"); - argParser.Add(&sizeStatArg); - panda::PandArg helpArg("help", false, "Print this message and exit"); - argParser.Add(&helpArg); - panda::PandArg optLevelArg("opt-level", 0, - "Optimization level. Possible values: [0, 1, 2]. Default: 0\n 0: no optimizations\n " - "1: basic bytecode optimizations, including valueNumber, lowering, constantResolver, regAccAllocator\n " - "2: (experimental optimizations): Sta/Lda Peephole, Movi/Lda Peephole, Register Coalescing"); - argParser.Add(&optLevelArg); - panda::PandArg optLogLevelArg("opt-log-level", "error", - "Optimization log level. Possible values: ['error', 'debug', 'info', 'fatal']. Default: 'error' "); - argParser.Add(&optLogLevelArg); - panda::PandArg bcVersionArg("bc-version", false, "Print ark bytecode version"); - argParser.Add(&bcVersionArg); - panda::PandArg bcMinVersionArg("bc-min-version", false, "Print ark bytecode minimum supported version"); - argParser.Add(&bcMinVersionArg); - panda::PandArg compileByPipeArg("compile-by-pipe", false, "Compile a json file that is passed by pipe"); - argParser.Add(&compileByPipeArg); - - argParser.EnableTail(); - - panda::PandArg tailArg1("ARG_1", "", "Path to input(json file) or path to output(ark bytecode)" \ - " when 'compile-by-pipe' enabled"); - panda::PandArg tailArg2("ARG_2", "", "Path to output(ark bytecode) or ignore when 'compile-by-pipe'" \ - " enabled"); - argParser.PushBackTail(&tailArg1); - argParser.PushBackTail(&tailArg2); - - if (!argParser.Parse(argc, argv)) { - std::cerr << argParser.GetErrorString(); - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - - std::string usage = "Usage: ts2abc [OPTIONS]... [ARGS]..."; - if (helpArg.GetValue()) { - std::cout << usage << std::endl; - std::cout << argParser.GetHelpString(); - return RETURN_SUCCESS; - } - - if (bcVersionArg.GetValue() || bcMinVersionArg.GetValue()) { - std::string version = bcVersionArg.GetValue() ? panda::panda_file::GetVersion(panda::panda_file::version) : - panda::panda_file::GetVersion(panda::panda_file::minVersion); - std::cout << version << std::endl; - return RETURN_SUCCESS; - } - - if ((optLevelArg.GetValue() < O_LEVEL0) || (optLevelArg.GetValue() > O_LEVEL2)) { - std::cerr << "Incorrect optimization level value" << std::endl; - std::cerr << usage << std::endl; - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - - std::string input, output; - std::string data = ""; - - if (!compileByPipeArg.GetValue()) { - input = tailArg1.GetValue(); - output = tailArg2.GetValue(); - if (input.empty() || output.empty()) { - std::cerr << "Incorrect args number" << std::endl; - std::cerr << "Usage example: ts2abc test.json test.abc\n" << std::endl; - std::cerr << usage << std::endl; - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - if (!HandleJsonFile(input, data)) { - return RETURN_FAILED; - } - } else { - output = tailArg1.GetValue(); - if (output.empty()) { - std::cerr << usage << std::endl; - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - if (!ReadFromPipe(data)) { - return RETURN_FAILED; - } - } - - if (!GenerateProgram(data, output, optLevelArg, optLogLevelArg)) { - std::cerr << "call GenerateProgram fail" << std::endl; - return RETURN_FAILED; - } - - return RETURN_SUCCESS; -} diff --git a/ts2panda/ts2abc/ts2abc.h b/ts2panda/ts2abc/ts2abc.h new file mode 100644 index 0000000000..90826ef448 --- /dev/null +++ b/ts2panda/ts2abc/ts2abc.h @@ -0,0 +1,60 @@ +/* * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PANDA_TS2ABC_GEN_H_ +#define PANDA_TS2ABC_GEN_H_ + +#include +#include +#include +#include +#include +#include + +#include "assembly-type.h" +#include "assembly-program.h" +#include "assembly-emitter.h" +#include "json/json.h" + +enum JsonType { + FUNCTION = 0, + RECORD, + STRING, + LITERALBUFFER, + OPTIONS +}; + +constexpr int RETURN_SUCCESS = 0; +constexpr int RETURN_FAILED = 1; + +enum OptLevel { + O_LEVEL0 = 0, + O_LEVEL1, + O_LEVEL2 +}; + +bool HandleJsonFile(const std::string &input, std::string &data); +bool ReadFromPipe(std::string &data); +bool GenerateProgram(const std::string &data, std::string output, + int optLevel, + std::string optLogLevel); +bool GetDebugLog(); +void ParseLogEnable(const Json::Value &rootValue); +bool GetDebugModeEnabled(); +void ParseDebugMode(const Json::Value &rootValue); +std::string ParseString(const std::string &data); +int ParseJson(const std::string &data, Json::Value &rootValue); +panda::pandasm::Function GetFunctionDefintion(const Json::Value &function); + +#endif // PANDA_TS2ABC_GEN_H_ \ No newline at end of file diff --git a/ts2panda/ts2abc/ts2abc_options.h b/ts2panda/ts2abc/ts2abc_options.h index d1d9e9f8ef..4ec2d2adbf 100755 --- a/ts2panda/ts2abc/ts2abc_options.h +++ b/ts2panda/ts2abc/ts2abc_options.h @@ -23,30 +23,195 @@ #include namespace panda::ts2abc { -class Options { -public: + class Options { + public: + explicit Options(const std::string &exePath) : exe_dir_(GetExeDir(exePath)) {} - explicit Options(const std::string &exePath) : exe_dir_(GetExeDir(exePath)) {} + ~Options() = default; - ~Options() = default; + void AddOptions(PandArgParser *parser) + { + parser->Add(&size_stat_arg_); + parser->Add(&help_arg_); + parser->Add(&opt_level_arg_); + parser->Add(&opt_log_level_arg_); + parser->Add(&bc_version_arg_); + parser->Add(&bc_min_version_arg_); + parser->Add(&compile_by_pipe_arg_); + parser->EnableTail(); + parser->PushBackTail(&Tail_Arg1_arg_); + parser->PushBackTail(&Tail_Arg2_arg_); + } - void AddOptions(PandArgParser *parser) {} + bool GetSizeStatArg() const + { + return size_stat_arg_.GetValue(); + } -private: - static std::string GetExeDir(const std::string &exePath) - { - auto pos = exePath.find_last_of('/'); - return exePath.substr(0, pos); - } + void SetSizeStatArg(bool value) + { + size_stat_arg_.SetValue(value); + } - std::string exe_dir_; -}; -} // namespace panda::ts2abc + bool WasSetSizeStatArg() const + { + return size_stat_arg_.WasSet(); + } + + bool GetHelpArg() const + { + return help_arg_.GetValue(); + } + + void SetHelpArg(bool value) + { + help_arg_.SetValue(value); + } + + bool WasSetHelpArg() const + { + return help_arg_.WasSet(); + } + + int GetOptLevelArg() const + { + return opt_level_arg_.GetValue(); + } + + void SetOptLevelArg(int value) + { + opt_level_arg_.SetValue(value); + } + + bool WasSetOptLevelArg() const + { + return opt_level_arg_.WasSet(); + } + + std::string GetOptLogLevelArg() const + { + return opt_log_level_arg_.GetValue(); + } + + void SetOptLogLevelArg(std::string value) + { + opt_log_level_arg_.SetValue(value); + } + + bool WasSetOptLogLevelArg() const + { + return opt_log_level_arg_.WasSet(); + } + + bool GetBcVersionArg() const + { + return bc_version_arg_.GetValue(); + } + + void SetSetBcVersionArg(bool value) + { + bc_version_arg_.SetValue(value); + } + + bool WasBcVersionArg() const + { + return bc_version_arg_.WasSet(); + } + + bool GetBcMinVersionArg() const + { + return bc_min_version_arg_.GetValue(); + } -enum OptLevel { - O_LEVEL0 = 0, - O_LEVEL1, - O_LEVEL2 -}; + void SetBcMinVersionArg(bool value) + { + bc_min_version_arg_.SetValue(value); + } + + bool WasSetBcMinVersionArg() const + { + return bc_min_version_arg_.WasSet(); + } + + bool GetCompileByPipeArg() const + { + return compile_by_pipe_arg_.GetValue(); + } + + void SetCompileByPipeArg(bool value) + { + compile_by_pipe_arg_.SetValue(value); + } + + bool WasSetCompileByPipeArg() const + { + return compile_by_pipe_arg_.WasSet(); + } + + std::string GetTailArg1() const + { + return Tail_Arg1_arg_.GetValue(); + } + + void SetTailArg1(std::string value) + { + Tail_Arg1_arg_.SetValue(value); + } + + bool WasSetTailArg1() const + { + return Tail_Arg1_arg_.WasSet(); + } + + std::string GetTailArg2() const + { + return Tail_Arg2_arg_.GetValue(); + } + + void SetTailArg2(std::string value) + { + Tail_Arg2_arg_.SetValue(value); + } + + bool WasSetTailArg2() const + { + return Tail_Arg2_arg_.WasSet(); + } + + private: + static std::string GetExeDir(const std::string &exePath) + { + auto pos = exePath.find_last_of('/'); + return exePath.substr(0, pos); + } + + std::string exe_dir_; + panda::PandArg size_stat_arg_{ "size-stat", false, + R"(Print panda file size statistic)"}; + panda::PandArg help_arg_{ "help", false, + R"(Print this message and exit)"}; + panda::PandArg opt_level_arg_{ "opt-level", 0, + R"("Optimization level. Possible values: [0, 1, 2]. Default: 0\n" + "0: no optimizations\n " + "1: basic bytecode optimizations, including valueNumber," + "lowering, constantResolver, regAccAllocator\n " + "2: (experimental optimizations): Sta/Lda Peephole, " + "Movi/Lda Peephole, Register Coalescing")"}; + panda::PandArg opt_log_level_arg_{ "opt-log-level", "error", + R"(Optimization log level. Possible values: " + "['error', 'debug', 'info', 'fatal']. Default: 'error' )"}; + panda::PandArg bc_version_arg_{ "bc-version", false, + R"(Print ark bytecode version)"}; + panda::PandArg bc_min_version_arg_{ "bc-min-version", false, + R"(Print ark bytecode minimum supported version)"}; + panda::PandArg compile_by_pipe_arg_{ "compile-by-pipe", false, + R"(Compile a json file that is passed by pipe)"}; + panda::PandArg Tail_Arg1_arg_{ "ARG_1", "", + R"(Path to input(json file) or path to output(ark bytecode)" + " when 'compile-by-pipe' enabled)"}; + panda::PandArg Tail_Arg2_arg_{ "ARG_2", "", + R"(Path to output(ark bytecode) or ignore when 'compile-by-pipe' enabled)"}; + }; +} // namespace panda::ts2abc #endif // PANDA_TS2ABC_OPTIONS_GEN_H_ \ No newline at end of file diff --git a/ts2panda/ts2abc_config.gni b/ts2panda/ts2abc_config.gni index a86ae8032e..aa2b3f9fc3 100755 --- a/ts2panda/ts2abc_config.gni +++ b/ts2panda/ts2abc_config.gni @@ -12,6 +12,7 @@ # limitations under the License. import("//build/ohos.gni") +import("//build/test.gni") declare_args() { buildtool_linux = "//build/toolchain/linux:clang_x64" @@ -27,12 +28,11 @@ declare_args() { ts2abc_build_path = "" } +node_modules = "//prebuilts/build-tools/common/ts2abc/node_modules" if (build_public_version) { nodejs_dir = "//prebuilts/build-tools/common/nodejs" - node_modules = "//prebuilts/build-tools/common/ts2abc/node_modules" } else { nodejs_dir = "//prebuilts/ace-toolkit/nodejs" - node_modules = "//prebuilts/ace-toolkit/ace-loader/panda/node_modules" } if (host_toolchain == buildtool_mac) { @@ -151,3 +151,79 @@ template("ts2abc_gen_abc") { outputs = invoker.out_puts } } + +template("ts2abc_unittest_action") { + _target_name_ = "${target_name}" + invoker.module_out_path = "ark/ts2abc" + + # unittest for phone running + ohos_unittest(_target_name_) { + configs = [ "${ts2abc_root}/ts2abc:ts2abc_config" ] + deps = [ "${ts2abc_root}/ts2abc:ts2abc_static" ] + forward_variables_from(invoker, "*") + } + + _module_out_path_ = invoker.module_out_path + + # unittest for host running + action("${_target_name_}Action") { + testonly = true + _host_test_target_ = ":${_target_name_}(${host_toolchain})" + _root_out_dir_ = get_label_info(_host_test_target_, "root_out_dir") + + deps = [ _host_test_target_ ] + + script = "${ts2abc_root}/scripts/run_tests_executable.sh" + + args = [ rebase_path(_root_out_dir_) + + "/tests/unittest/${_module_out_path_}/${_target_name_}" ] + + inputs = [ + "$_root_out_dir_/tests/unittest/${_module_out_path_}/${_target_name_}", + ] + outputs = [ "$target_out_dir/${_target_name_}/" ] + } +} + +# ts2abc performs the ut test +# +# Mandatory arguments: +# js_file: The name of the test use case file to execute , ex expression/TemplateExpression.test.js +template("ts2abc_unittest") { + assert(defined(invoker.js_file), "js_file is required!") + + action("$target_name") { + script = "${ts2abc_root}/scripts/run_tests.py" + deps = [ "${ts2abc_root}:ts2abc_tests" ] + + args = [ + "--src-dir", + rebase_path("${ts2abc_root}"), + "--dist-dir", + rebase_path(target_out_dir + "/.."), + "--node-modules", + rebase_path("${node_modules}"), + "--js-file", + invoker.js_file, + "--gn-build", + ] + + if (host_toolchain == buildtool_linux) { + args += [ + "--platform", + "linux", + ] + } else if (host_toolchain == buildtool_mac) { + args += [ + "--platform", + "mac", + ] + } else { + args += [ + "--platform", + "win", + ] + } + outputs = [ "$target_out_dir/${target_name}/" ] + } +} -- Gitee From bd7d9a7634c3782368abff10192f385d3f6278c5 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Tue, 21 Dec 2021 16:31:20 +0800 Subject: [PATCH 02/21] Distinguish between ts and js file, don't record type on js file and take different setParent policy Change-Id: Ibdbbe59118ed07ea784c6be6c2b472d60290e310 Signed-off-by: zhuoli --- ts2panda/scripts/run_tests.py | 2 +- ts2panda/src/compilerDriver.ts | 14 ++++++++++++-- ts2panda/src/recorder.ts | 12 ++++++++---- .../tests/expression/functionExpression.test.ts | 6 +++--- ts2panda/tests/lexenv.test.ts | 12 ++++++------ 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/ts2panda/scripts/run_tests.py b/ts2panda/scripts/run_tests.py index c5018b91b0..5289947436 100755 --- a/ts2panda/scripts/run_tests.py +++ b/ts2panda/scripts/run_tests.py @@ -27,7 +27,7 @@ CUR_FILE_DIR = os.path.dirname(__file__) TS2PANDA_DIR = os.path.abspath(os.path.join(CUR_FILE_DIR, "..")) CODE_ROOT = os.path.abspath(os.path.join(TS2PANDA_DIR, "../../..")) DEFAULT_TARGET_DIR = os.path.join( - CODE_ROOT, "out/ohos-arm-release/clang_x64/obj/ark/ts2abc/ts2panda") + CODE_ROOT, "out/hi3516dv300/clang_x64/obj/ark/ts2abc/ts2panda") DEFAULT_NODE_MODULE = os.path.join( CODE_ROOT, "prebuilts/build-tools/common/ts2abc/node_modules") diff --git a/ts2panda/src/compilerDriver.ts b/ts2panda/src/compilerDriver.ts index c43c793bd0..89745c848c 100644 --- a/ts2panda/src/compilerDriver.ts +++ b/ts2panda/src/compilerDriver.ts @@ -268,6 +268,15 @@ export class CompilerDriver { this.compilationUnits.push(pandaGen); } + private isTypeScriptSourceFile(node: ts.SourceFile) { + let fileName = node.fileName; + if (fileName && fileName.endsWith(".ts")) { + return true; + } else { + return false; + } + } + private compilePrologue(node: ts.SourceFile, recordType: boolean) { let topLevelScope: GlobalScope | ModuleScope; if (CmdOptions.isModules()) { @@ -276,11 +285,12 @@ export class CompilerDriver { topLevelScope = new GlobalScope(node); } - let enableTypeRecord = recordType && CmdOptions.needRecordType(); + let isTsFile = this.isTypeScriptSourceFile(node); + let enableTypeRecord = recordType && CmdOptions.needRecordType() && isTsFile; if (enableTypeRecord) { TypeRecorder.createInstance(); } - let recorder = new Recorder(node, topLevelScope, this, enableTypeRecord); + let recorder = new Recorder(node, topLevelScope, this, enableTypeRecord, isTsFile); recorder.record(); addVariableToScope(recorder, enableTypeRecord); diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index dc3bf45673..5310a959ee 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -63,14 +63,16 @@ export class Recorder { private importStmts: Array = []; private exportStmts: Array = []; private defaultUsed: boolean = false; + private isTsFile: boolean; - constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver, recordType: boolean) { + constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver, recordType: boolean, isTsFile: boolean) { this.node = node; this.scope = scope; this.compilerDriver = compilerDriver; this.recordType = recordType; this.funcNameMap = new Map(); this.funcNameMap.set("main", 1); + this.isTsFile = isTsFile; } record() { @@ -92,9 +94,11 @@ export class Recorder { private setParent(node: ts.Node) { node.forEachChild(childNode => { - childNode = jshelpers.setParent(childNode, node)!; - let originNode = ts.getOriginalNode(childNode); - childNode = ts.setTextRange(childNode, originNode); + if (!this.isTsFile || childNode!.parent == undefined || childNode.parent.kind != node.kind) { + childNode = jshelpers.setParent(childNode, node)!; + let originNode = ts.getOriginalNode(childNode); + childNode = ts.setTextRange(childNode, originNode); + } this.setParent(childNode); }); } diff --git a/ts2panda/tests/expression/functionExpression.test.ts b/ts2panda/tests/expression/functionExpression.test.ts index a772d73bd9..b944d6f750 100755 --- a/ts2panda/tests/expression/functionExpression.test.ts +++ b/ts2panda/tests/expression/functionExpression.test.ts @@ -30,7 +30,7 @@ import { EcmaEqdyn, EcmaGetresumemode, EcmaLdlexenvdyn, - EcmaLdfunction, + // EcmaLdfunction, EcmaResumegenerator, EcmaReturnundefined, EcmaSuspendgenerator, @@ -61,7 +61,7 @@ describe("compileFunctionExpression", function () { let expected_func = [ new EcmaLdlexenvdyn(), new StaDyn(new VReg()), - new EcmaLdfunction(), + // new EcmaLdfunction(), new StaDyn(new VReg()), new LdaDyn(new VReg()), new StaDyn(new VReg()), @@ -372,4 +372,4 @@ describe("compileFunctionExpression", function () { } expect(errorThrown).to.be.true; }); -}) \ No newline at end of file +}) diff --git a/ts2panda/tests/lexenv.test.ts b/ts2panda/tests/lexenv.test.ts index 9de941b90a..612e7b4aa9 100644 --- a/ts2panda/tests/lexenv.test.ts +++ b/ts2panda/tests/lexenv.test.ts @@ -118,7 +118,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let sourceFile = creatAstFromSnippet(source); let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false, false); recorder.record(); expect(globalScope, "root is null!").to.not.equal(null); @@ -146,7 +146,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let sourceFile = creatAstFromSnippet(source); let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false, false); recorder.record(); let children = globalScope.getChildVariableScope(); @@ -194,7 +194,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); @@ -218,7 +218,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); @@ -272,7 +272,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { let compilerDriver = new CompilerDriver('UnitTest'); let globalScope = new GlobalScope(sourceFile); - let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false); + let recorder = new Recorder(sourceFile, globalScope, compilerDriver, false, false); recorder.record(); let postOrderVariableScopes = compilerDriver.postOrderAnalysis(globalScope); @@ -559,4 +559,4 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { expect(checkInstructions(anonymousPg!.getInsns(), expect_anonymous), "check annonymous func ins").to.be.true; expect(checkInstructions(outerPg!.getInsns(), expect_outer), "check outer func ins").to.be.true; }); -}); \ No newline at end of file +}); -- Gitee From e8706882a9622f036d8293351fe17358a2453ad5 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Wed, 22 Dec 2021 18:32:27 +0800 Subject: [PATCH 03/21] Primitive type support Change-Id: I16122c12c9857ae346dc3a85b7239480c7cd362b Signed-off-by: zhuoli --- local_test/test_full.abc | Bin 1916 -> 2020 bytes ts2panda/src/base/typeSystem.ts | 11 ++---- ts2panda/src/ts2panda.ts | 13 +++--- ts2panda/src/typeChecker.ts | 37 ++++++++++++++++-- .../expression/functionExpression.test.ts | 4 +- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/local_test/test_full.abc b/local_test/test_full.abc index abed29f7ac8011cdc91f0703d34e5578eb662b5e..6aa3d1fd62a9f61018249d305679854a00a5e75d 100644 GIT binary patch literal 2020 zcma)7U1%It6h8OfnaNJpX0u(JZM9%wrQ%D}q&3<|ajjC6O>2l0D=o`*J4v=|cVlL@ zsjUk7WSKv0k{tQ1pE#>QK`N(v#-`{zV_CFS8lc1K`m&sTa)w{6C0KJ((cl+n(vL1 z%M)$s_}&gbSZve-+Sc-x4mak!ea)KhQ+D2KHrr%slq)?YK4gwjw&y(O1?5B-qkL&x z_%X_sCQ9WpJ;Ir%+Q&Oh52H7Uok=fIE$=qMj=0tNhMyQwakkT{S5MX&t?H9hs8sh? z4!%&X^!z9TKLdx);geB2(Lhc1MNH1O+)VVC#)P_&P}?0)qdZhFfY)?X_`?w4dWxyH zdH68pUlIP3gun7neq=3wbt7-+7D~*h>xuu*%uD`1v6B2J*7`fR4eRn73WOg9f%?uf z|1l3=VIW#vCE6Bveo&q5G@GM=PeZgyxq7WR^JZre{1B(n+zUO(13-Jyg-Dv4q<8V~ zG!M`4z>IwXOv17##`Z_76FZcZ=(Mc(L=w0CkP{tLJ+~RwNg^?pL4rQZCR~uIlQ}MT zAn_fCZV0gXd>j|XE`(c{odyfKpMwKQp7o32o;E4r9=BGMI(EbE0k&n6zL~uX7qTxF z>+KdkhE6?bFVg*np17~jyv=^1|6KiljsIrB?Mp)PW~FczlP0rDdYbHA+99XJC!8@S zDAa?Yazo0*+3r9*+;!qA8x6##__Nx&6GLb@@j}wU0jp~w6TiPBRU6vG);)DSRckrf zRDB5QIPa>0D!|xUvG)`;-&&diz{$)tv%Dq1Q+9Cn(4seoZ7KR1S33fx9okDM(vE#j z(>3veMOir5rmG{}rHHyZG&+6*7pJQt1&bx_4e0oYBFz=(+->-vg6$95d3;0iZX$`I zN2MU534WxA?KMbazwy=d$|AqT_TN~4_P zC`N5U6oV)_RCp4X-7^&9m*W7+eXlP#md;bC?2s&28_pT&<%cDaRLWTxa;R8wyMEyu z?z{ac#?=i(84SrqluT@J)JJh_+%SdnoJSGpS?H+9iRbx|?pmR?KIIJYY1!gNZtL^N z8lRTWKGZ5oBM~jTYN&!vR{=Hh`V{uMncNloA?u8FwotIrZga&+x7S~TWDl3{`b|@S Tom>VkU{?m3cYqPd-vECDr*RkE literal 1916 zcma)6OKcle6us}gdGqnKb%F_Qi^@k9LPCIO(^8tU87MLm4rvJ>Kvb^dP7+sx9WrB* z0;<#i5@Lan*s(w(4+@*^*;FbEq;9(4x2Wg}_GAewG@Sd!juTX%Bc1oT=YGz+Z)Q#h zFP;jB=<22DPfYTChv+62Q-A`V24JFd7|NKR2L$jT@Ddj6`x)jhCD9e&a|B%jwt#~c z;(<2s5%4uohy4{`9k>j90&otl3!1I~8n_DZ^F4sH+w-U%*Zvlm1X%|bfIqPR0`n!{ z;YRbh`Ij%Qgh994OIk^%*F8y-wPUq~Rvb=~#}iHU5)_*w$T@BJBjneP*MflV=gPCa^Zh8q7@p))kPv(d zoRuy@BzJJK6BkZYUF>(;&9_>eZu1GMG@A9s+%rLA7)LJRBmzD_j4OUZk0j|jT4X2O zC#F0@UB(vFk4!0hNF6oQ1h$~2F^!`hG}MWLn%_nJj%Zg5sdGCh+%@F5;zAMiF;m}Q zFfxLj39s*n67+(hekh{man*$k+S(#Ikc4s4ThvpfC7_%@pJ2F28b3W;bim1TZ+R!sq$=?Fa0xXGV*39!%f`8H6;;XCS z5;#H2c&q1tGoGqLt)GfgN*>g@dCc{octw$qNY~EvK(oM1r?$@Dz?Ym^0}CE&<{is) z{-z+!Qe^oz#6ZeJcWeG)ZYzZw#cwHpT>N_<$@zulIO-7Oc&Ttxbj#1|fy}IYjlT`k zjZKfLBsVl^Re__E3Ohw@KeJLL2Wr#%nQ}a3_EFxg@y2rWL3GhiRcUvA9BZIA?=?yP zQ!}@eHM9Pa=1typeRef.getChildAt(0); typeIndex = this.getOrCreateUserDefinedType(identifier, newExpressionFlag, variableNode); isUserDefinedType = true; @@ -145,8 +141,9 @@ export abstract class BaseType { if (variableNode) { this.setVariable2Type(variableNode, typeIndex, isUserDefinedType); } - if (typeIndex == -1) { + if (!typeIndex) { LOGD("ERROR: Type cannot be found for: " + jshelpers.getTextOfNode(node)); + typeIndex = -1; } return typeIndex!; } diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index 9e5a1c053f..d4f8ea38ff 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -145,10 +145,10 @@ export class Ts2Panda { static dumpConstantPool(ts2abc: any): void { let literalArrays = PandaGen.getLiteralArrayBuffer(); - // console.log("-=-=-=- LiteralArrayBuffer =-=-=-=-=-="); - // for (let e of PandaGen.getLiteralArrayBuffer()) { - // console.log(JSON.parse(JSON.stringify(e))); - // } + console.log("-------- LiteralArrayBuffer --------"); + for (let e of PandaGen.getLiteralArrayBuffer()) { + console.log(JSON.parse(JSON.stringify(e))); + } if (CmdOptions.isEnableDebugLog()) { Ts2Panda.jsonString += escapeUnicode(JSON.stringify(literalArrays, null, 2)); @@ -189,14 +189,13 @@ export class Ts2Panda { let sourceFile = pg.getSourceFileDebugInfo(); let callType = pg.getCallType(); let typeRecord = pg.getLocals(); - // console.log("\\\\\\-= funcNmae =-\\\\\\ - ", funcName); let typeInfo = new Array(); typeRecord.forEach((vreg) => { let typeOfVreg = new TypeOfVreg(vreg.num, vreg.getTypeIndex()); typeInfo.push(typeOfVreg); - // console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); - // console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); + console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); + console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); }); let exportedTypes = PandaGen.getExportedTypes(); diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index e1c24decfc..1217a62352 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -4,6 +4,18 @@ import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; import * as jshelpers from "./jshelpers"; import { LOGD } from "./log"; +import { PrimitiveType } from "./base/typeSystem"; + +export enum PrimitiveFlags { + ANY = 1, + NUMBER = 8, + BOOLEAN = 1048592, + STRING = 4, + SYMBOL = 4096, + NULL = 65536, + UNDEFINED = 32768, + _LENGTH = 50 +} export class TypeChecker { private static instance: TypeChecker; @@ -39,7 +51,12 @@ export class TypeChecker { public getTypeFlagsAtLocation(node: ts.Node): string { let typeFlag = this.compiledTypeChecker.getTypeAtLocation(node).getFlags(); - return ts.TypeFlags[typeFlag].toUpperCase(); + if (typeFlag) { + return PrimitiveFlags[typeFlag]; + } else { + console.log("typeFlag not found: ", typeFlag); + return "" + } } public checkExportKeyword(node: ts.Node): boolean { @@ -53,6 +70,15 @@ export class TypeChecker { return false; } + public checkPotentialPrimitiveType(node: ts.Node): number | undefined { + let typeFlagName = this.getTypeFlagsAtLocation(node); + let typeIndex = undefined; + if (typeFlagName in PrimitiveType) { + typeIndex = PrimitiveType[typeFlagName as keyof typeof PrimitiveType]; + } + return typeIndex; + } + private getTypeDeclForInitializer(initializer: ts.Node, exportNeeded:boolean) { switch (initializer.kind) { // only create the type when it was used (initialized) or TODO: exported @@ -72,8 +98,7 @@ export class TypeChecker { case ts.SyntaxKind.PropertyAccessExpression: return initializer; default: - break; - return null; + return null; } } @@ -137,7 +162,11 @@ export class TypeChecker { public checkTypeForVariableDeclaration(node: ts.VariableDeclaration, exportNeeded: boolean) { let name = node.name; let initializer = node.initializer; - if (initializer) { + // first check if this is a primitive type declaration + let typeIndex = this.checkPotentialPrimitiveType(name); + if (typeIndex) { + TypeRecorder.getInstance().setVariable2Type(name, typeIndex, false); + } else if (initializer) { let typeDeclNode = this.getTypeDeclForInitializer(initializer, exportNeeded); let newExpressionFlag = initializer.kind == ts.SyntaxKind.NewExpression; if (typeDeclNode) { diff --git a/ts2panda/tests/expression/functionExpression.test.ts b/ts2panda/tests/expression/functionExpression.test.ts index b944d6f750..c7743c9a4b 100755 --- a/ts2panda/tests/expression/functionExpression.test.ts +++ b/ts2panda/tests/expression/functionExpression.test.ts @@ -30,7 +30,7 @@ import { EcmaEqdyn, EcmaGetresumemode, EcmaLdlexenvdyn, - // EcmaLdfunction, + EcmaLdfunction, EcmaResumegenerator, EcmaReturnundefined, EcmaSuspendgenerator, @@ -61,7 +61,7 @@ describe("compileFunctionExpression", function () { let expected_func = [ new EcmaLdlexenvdyn(), new StaDyn(new VReg()), - // new EcmaLdfunction(), + new EcmaLdfunction(), new StaDyn(new VReg()), new LdaDyn(new VReg()), new StaDyn(new VReg()), -- Gitee From 97708daa24ae4f24971f9c09971fc5f71ca51a09 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Fri, 24 Dec 2021 17:39:32 +0800 Subject: [PATCH 04/21] Add union type support Change-Id: Ib07ca26fd7e6edec30822452ea3c7731fa16905a Signed-off-by: zhuoli --- ts2panda/src/base/typeSystem.ts | 52 +++++++++++++++++++- ts2panda/src/typeChecker.ts | 86 ++++++++++++++++++++++++--------- ts2panda/src/typeRecorder.ts | 30 ++++++------ 3 files changed, 130 insertions(+), 38 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 84909f5d4a..7c1038ca7a 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -30,6 +30,7 @@ export enum PrimitiveType { ANY, NUMBER, BOOLEAN, + BIGINT, STRING, SYMBOL, NULL, @@ -41,6 +42,7 @@ export enum L2Type { CLASS, CLASSINST, FUNCTION, + UNION, OBJECT, // object literal EXTERNAL, _COUNTER @@ -130,7 +132,7 @@ export abstract class BaseType { } // get typeFlag to check if its a primitive type let typeRef = node.type; - let typeIndex = this.typeChecker.checkPotentialPrimitiveType(typeRef); + let typeIndex = this.typeChecker.checkDeclarationType(typeRef); let isUserDefinedType = false; if (!typeIndex) { let identifier = typeRef.getChildAt(0); @@ -547,6 +549,54 @@ export class ExternalType extends BaseType { } } +export class UnionType extends BaseType { + unionedTypeArray: Array = []; + typeIndex: number; + shiftedTypeIndex: number; + + constructor(typeNode: ts.Node) { + super(); + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; + // record type before its initialization, so its index can be recorded + // in case there's recursive reference of this type + this.addCurrentType(typeNode, this.shiftedTypeIndex); + this.fillInUnionArray(typeNode, this.unionedTypeArray); + this.setTypeArrayBuffer(this, this.typeIndex); + } + + fillInUnionArray(typeNode: ts.Node, unionedTypeArray: Array) { + for (let element of (typeNode).types) { + let elementNode = element; + let typeIndex = this.typeChecker.checkDeclarationType(elementNode); + if (typeIndex) { + unionedTypeArray.push(typeIndex); + } else if (elementNode.kind == ts.SyntaxKind.TypeReference) { + let typeName = elementNode.getChildAt(0); + let typeDecl = this.typeChecker.getTypeDeclForInitializer(typeName, false); + if (typeDecl) { + typeIndex = this.typeChecker.checkForTypeDecl(typeName, typeDecl, false, true); + } else { + typeIndex = 0; + } + unionedTypeArray.push(typeIndex); + } + } + } + + transfer2LiteralBuffer(): LiteralBuffer { + let UnionTypeBuf = new LiteralBuffer(); + let UnionTypeLiterals: Array = new Array(); + UnionTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.UNION)); + UnionTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.unionedTypeArray.length)); + for (let type of this.unionedTypeArray) { + UnionTypeLiterals.push(new Literal(LiteralTag.INTEGER, type)); + } + UnionTypeBuf.addLiterals(...UnionTypeLiterals); + return UnionTypeBuf; + } +} + export class ObjectLiteralType extends BaseType { private properties: Map = new Map(); private methods: Array = new Array(); diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index 1217a62352..a602e733d0 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -1,5 +1,10 @@ import ts, { forEachChild } from "typescript"; -import { ClassType, ExternalType } from "./base/typeSystem"; +import { + ClassType, + ClassInstType, + ExternalType, + UnionType +} from "./base/typeSystem"; import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; import * as jshelpers from "./jshelpers"; @@ -38,6 +43,9 @@ export class TypeChecker { } public getTypeDeclForIdentifier(node: ts.Node) { + if (!node) { + return undefined; + } if (node.kind == ts.SyntaxKind.ClassExpression) { return node; } @@ -46,16 +54,16 @@ export class TypeChecker { return symbol.declarations[0]; } LOGD("TypeDecl NOT FOUND for: " + node.getFullText()); - return null; + return undefined; } - public getTypeFlagsAtLocation(node: ts.Node): string { + public getTypeFlagsAtLocation(node: ts.Node): string | undefined { let typeFlag = this.compiledTypeChecker.getTypeAtLocation(node).getFlags(); if (typeFlag) { return PrimitiveFlags[typeFlag]; } else { - console.log("typeFlag not found: ", typeFlag); - return "" + LOGD("typeFlag not found: ", typeFlag); + return undefined } } @@ -70,16 +78,42 @@ export class TypeChecker { return false; } - public checkPotentialPrimitiveType(node: ts.Node): number | undefined { + public checkPotentialPrimitiveType(node: ts.TypeNode): number | undefined { let typeFlagName = this.getTypeFlagsAtLocation(node); let typeIndex = undefined; - if (typeFlagName in PrimitiveType) { + if (typeFlagName && typeFlagName in PrimitiveType) { typeIndex = PrimitiveType[typeFlagName as keyof typeof PrimitiveType]; } return typeIndex; } - private getTypeDeclForInitializer(initializer: ts.Node, exportNeeded:boolean) { + public checkDeclarationType(typeNode: ts.TypeNode | undefined) { + if (!typeNode) { + return undefined; + } + switch (typeNode.kind) { + case ts.SyntaxKind.StringKeyword: + case ts.SyntaxKind.NumberKeyword: + case ts.SyntaxKind.BooleanKeyword: + case ts.SyntaxKind.SymbolKeyword: + case ts.SyntaxKind.UndefinedKeyword: + case ts.SyntaxKind.BigIntKeyword: + case ts.SyntaxKind.LiteralType: + let typeName = typeNode.getText().toUpperCase(); + let typeIndex = undefined; + if (typeName && typeName in PrimitiveType) { + typeIndex = PrimitiveType[typeName as keyof typeof PrimitiveType]; + } + return typeIndex; + case ts.SyntaxKind.UnionType: + let unionType = new UnionType(typeNode); + return unionType.shiftedTypeIndex; + default: + return undefined; + } + } + + public getTypeDeclForInitializer(initializer: ts.Node, exportNeeded:boolean) { switch (initializer.kind) { // only create the type when it was used (initialized) or TODO: exported // NewExpression initializer means that the type is a new class (TODO: or other object later, but is there any?) @@ -102,9 +136,9 @@ export class TypeChecker { } } - // If newExpressionFlag is ture, the type has to be created no mater the export is needed or - //not, while newExpressionFlag if false, the export has to be needed. - private checkForTypeDecl(originalName: ts.Node, typeDeclNode: ts.Node, exportNeeded: boolean, newExpressionFlag: boolean) { + // If newExpressionFlag is ture, the type has to be created no matter the export is needed or not; + // while newExpressionFlag if false, the export has to be needed. + public checkForTypeDecl(originalName: ts.Node, typeDeclNode: ts.Node, exportNeeded: boolean, newExpressionFlag: boolean): number { switch (typeDeclNode.kind) { // Type found to be defined a classDeclaration or classExpression case ts.SyntaxKind.ClassDeclaration: @@ -118,12 +152,16 @@ export class TypeChecker { } else { classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); } + } else if (newExpressionFlag) { + // class type is created, need to add current variable to classInstance + classTypeIndex = classTypeIndex + 1; + TypeRecorder.getInstance().setVariable2Type(originalName, classTypeIndex, true); } if (exportNeeded) { let exportedName = jshelpers.getTextOfIdentifierOrLiteral(originalName); TypeRecorder.getInstance().setExportedType(exportedName, classTypeIndex, true); } - break; + return classTypeIndex; // The type was passed by a variable, need to keep search in deep case ts.SyntaxKind.VariableDeclaration: let varDeclNode = typeDeclNode; @@ -131,19 +169,19 @@ export class TypeChecker { if (nextInitializer) { let nextTypeDeclNode = this.getTypeDeclForInitializer(nextInitializer, exportNeeded); if (nextTypeDeclNode) { - this.checkForTypeDecl(originalName, nextTypeDeclNode, exportNeeded, newExpressionFlag); + return this.checkForTypeDecl(originalName, nextTypeDeclNode, exportNeeded, newExpressionFlag); } } - break; + return 0; case ts.SyntaxKind.ImportSpecifier: case ts.SyntaxKind.ImportClause: let ImportTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); if (ImportTypeIndex != -1) { TypeRecorder.getInstance().setVariable2Type(originalName, ImportTypeIndex, true); - } else { - // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + return ImportTypeIndex; } - break; + // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + return 0; case ts.SyntaxKind.PropertyAccessExpression: let propertyAccessExpression = typeDeclNode; let localName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.expression); @@ -152,18 +190,22 @@ export class TypeChecker { let redirectPath = TypeRecorder.getInstance().getPathForNamespace(localName)!; let externalType = new ExternalType(externalName, redirectPath); let ImportTypeIndex = externalType.getTypeIndex(); - TypeRecorder.getInstance().setVariable2Type(originalName, TypeRecorder.getInstance().shiftType(ImportTypeIndex), true); - } else { - // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + let shiftedTypeIndex = TypeRecorder.getInstance().shiftType(ImportTypeIndex); + TypeRecorder.getInstance().setVariable2Type(originalName, shiftedTypeIndex, true); + return shiftedTypeIndex; } + // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); + return 0; } + return 0; } public checkTypeForVariableDeclaration(node: ts.VariableDeclaration, exportNeeded: boolean) { let name = node.name; let initializer = node.initializer; - // first check if this is a primitive type declaration - let typeIndex = this.checkPotentialPrimitiveType(name); + let type = (ts.getOriginalNode(node)).type; + // first check if this is a primitive or union declaration + let typeIndex = this.checkDeclarationType(type); if (typeIndex) { TypeRecorder.getInstance().setVariable2Type(name, typeIndex, false); } else if (initializer) { diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index 00a3b3344a..fc9a803ffe 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -241,20 +241,20 @@ export class TypeRecorder { // console.log(jshelpers.getTextOfNode(node)); // console.log("=========== currIndex ===========: ", currIndex); // console.log(PandaGen.getLiteralArrayBuffer()[currIndex]); - // console.log("=============================="); - // console.log("type2Index: "); - // console.log(this.printNodeMap(this.getType2Index())); - // console.log("variable2Type: "); - // console.log(this.printNodeMap(this.getVariable2Type())); - // console.log("getTypeSet: "); - // console.log(this.getTypeSet()); - // console.log("=============================="); - // console.log("exportedType:"); - // console.log(this.printExportMap(this.getExportedType())); - // console.log("AnoymousRedirect:"); - // console.log(this.getAnonymousReExport()); - // console.log("namespace Map:"); - // console.log(this.getNamespaceMap()); - // console.log("=============================="); + console.log("=============================="); + console.log("type2Index: "); + console.log(this.printNodeMap(this.getType2Index())); + console.log("variable2Type: "); + console.log(this.printNodeMap(this.getVariable2Type())); + console.log("getTypeSet: "); + console.log(this.getTypeSet()); + console.log("=============================="); + console.log("exportedType:"); + console.log(this.printExportMap(this.getExportedType())); + console.log("AnoymousRedirect:"); + console.log(this.getAnonymousReExport()); + console.log("namespace Map:"); + console.log(this.getNamespaceMap()); + console.log("=============================="); } } \ No newline at end of file -- Gitee From 88a0c754563e169b927a26ac9cb75d781ea8ffe9 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Mon, 27 Dec 2021 21:24:56 +0800 Subject: [PATCH 05/21] Add array type Change-Id: Id05e6e61de65d5473e9231b734b965804381f05f Signed-off-by: zhuoli --- ts2panda/src/base/typeSystem.ts | 56 +++++++++++++++++++++++++++++++++ ts2panda/src/typeChecker.ts | 9 ++++-- ts2panda/src/typeRecorder.ts | 15 ++++++++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 7c1038ca7a..a6f157b036 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -43,6 +43,7 @@ export enum L2Type { CLASSINST, FUNCTION, UNION, + ARRAY, OBJECT, // object literal EXTERNAL, _COUNTER @@ -597,6 +598,61 @@ export class UnionType extends BaseType { } } +export class ArrayType extends BaseType { + referedTypeIndex: number = 0; + typeIndex: number = 0; + shiftedTypeIndex: number; + constructor(typeNode: ts.Node) { + super(); + this.referedTypeIndex = this.getReferencedType(typeNode); + if (this.typeRecorder.hasArrayTypeMapping(this.referedTypeIndex)) { + this.shiftedTypeIndex = this.getRecordedArrayIndex(this.referedTypeIndex)!; + } else { + this.typeIndex = this.getIndexFromTypeArrayBuffer(this); + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; + this.setTypeArrayBuffer(this, this.typeIndex); + this.setRecordedArrayIndex(this.referedTypeIndex, this.shiftedTypeIndex); + } + } + + getReferencedType(typeNode: ts.Node) { + let elementNode = (typeNode).elementType; + let typeIndex = this.typeChecker.checkDeclarationType(elementNode); + if (typeIndex) { + return typeIndex; + } else if (elementNode.kind == ts.SyntaxKind.TypeReference) { + let typeName = elementNode.getChildAt(0); + let typeDecl = this.typeChecker.getTypeDeclForInitializer(typeName, false); + if (typeDecl) { + typeIndex = this.typeChecker.checkForTypeDecl(typeName, typeDecl, false, true); + } else { + typeIndex = 0; + } + return typeIndex; + } + return 0; + } + + getRecordedArrayIndex(referedTypeIndex: number) { + return this.typeRecorder.getFromArrayTypeMap(referedTypeIndex); + } + + setRecordedArrayIndex(referedTypeIndex: number, shiftedTypeIndex: number) { + return this.typeRecorder.setArrayTypeMap(referedTypeIndex, shiftedTypeIndex); + } + + transfer2LiteralBuffer(): LiteralBuffer { + let classInstBuf = new LiteralBuffer(); + let classInstLiterals: Array = new Array(); + + classInstLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.ARRAY)); + classInstLiterals.push(new Literal(LiteralTag.INTEGER, this.referedTypeIndex)); + classInstBuf.addLiterals(...classInstLiterals); + + return classInstBuf; + } +} + export class ObjectLiteralType extends BaseType { private properties: Map = new Map(); private methods: Array = new Array(); diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index a602e733d0..a30593f7b6 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -3,7 +3,8 @@ import { ClassType, ClassInstType, ExternalType, - UnionType + UnionType, + ArrayType } from "./base/typeSystem"; import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; @@ -108,6 +109,9 @@ export class TypeChecker { case ts.SyntaxKind.UnionType: let unionType = new UnionType(typeNode); return unionType.shiftedTypeIndex; + case ts.SyntaxKind.ArrayType: + let arrayType = new ArrayType(typeNode); + return arrayType.shiftedTypeIndex; default: return undefined; } @@ -207,7 +211,8 @@ export class TypeChecker { // first check if this is a primitive or union declaration let typeIndex = this.checkDeclarationType(type); if (typeIndex) { - TypeRecorder.getInstance().setVariable2Type(name, typeIndex, false); + let isUserDefinedType = typeIndex <= PrimitiveType._LENGTH ? false : true; + TypeRecorder.getInstance().setVariable2Type(name, typeIndex, isUserDefinedType); } else if (initializer) { let typeDeclNode = this.getTypeDeclForInitializer(initializer, exportNeeded); let newExpressionFlag = initializer.kind == ts.SyntaxKind.NewExpression; diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index fc9a803ffe..643942ac63 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import ts from "typescript"; +import ts, { IndexedAccessType } from "typescript"; import { ClassType, ExternalType, @@ -30,6 +30,7 @@ export class TypeRecorder { private variable2Type: Map = new Map(); private userDefinedTypeSet: Set = new Set();; private typeSummary: TypeSummary = new TypeSummary(); + private arrayTypeMap: Map = new Map(); // ---> export/import // exportedType: exportedName -> typeIndex private exportedType: Map = new Map(); @@ -94,6 +95,18 @@ export class TypeRecorder { } } + public setArrayTypeMap(contentTypeIndex: number, arrayTypeIndex: number) { + this.arrayTypeMap.set(contentTypeIndex, arrayTypeIndex) + } + + public hasArrayTypeMapping(contentTypeIndex: number) { + return this.arrayTypeMap.has(contentTypeIndex); + } + + public getFromArrayTypeMap(contentTypeIndex: number) { + return this.arrayTypeMap.get(contentTypeIndex); + } + // ---> exported/imported public addImportedType(moduleStmt: ModuleStmt) { moduleStmt.getBindingNodeMap().forEach((externalNode, localNode) => { -- Gitee From 93baa819e2398e3059df7190a1172c55b00773f4 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Tue, 28 Dec 2021 21:14:57 +0800 Subject: [PATCH 06/21] Add support for recognize same userDefinedType in array or union Add support for functionType Change-Id: I33c3433f801d811d130480b71d39cae7c8d03c70 Signed-off-by: zhuoli --- ts2panda/src/base/typeSystem.ts | 105 ++++++++++++++++++-------------- ts2panda/src/recorder.ts | 3 + ts2panda/src/typeChecker.ts | 53 ++++++++++++---- ts2panda/src/typeRecorder.ts | 21 +++++-- 4 files changed, 122 insertions(+), 60 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index a6f157b036..d938e5ac82 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -27,7 +27,7 @@ import * as jshelpers from "../jshelpers"; import { access } from "fs"; export enum PrimitiveType { - ANY, + ANY = -1, NUMBER, BOOLEAN, BIGINT, @@ -78,6 +78,8 @@ export abstract class BaseType { protected typeChecker = TypeChecker.getInstance(); protected typeRecorder = TypeRecorder.getInstance(); + // this is needed for type like class, since it's declaration is in a certain place + // other types like primitives don't need this protected addCurrentType(node: ts.Node, index: number) { this.typeRecorder.addType2Index(node, index); } @@ -111,11 +113,11 @@ export abstract class BaseType { } protected getOrCreateUserDefinedType(node: ts.Identifier, newExpressionFlag: boolean, variableNode?: ts.Node) { - let typeIndex = -1; + let typeIndex = PrimitiveType.ANY; let declNode = this.typeChecker.getTypeDeclForIdentifier(node); if (declNode) { typeIndex = this.tryGetTypeIndex(declNode); - if (typeIndex == -1) { + if (typeIndex == PrimitiveType.ANY) { this.createType(declNode, newExpressionFlag, variableNode); typeIndex = this.tryGetTypeIndex(declNode); } @@ -135,23 +137,23 @@ export abstract class BaseType { let typeRef = node.type; let typeIndex = this.typeChecker.checkDeclarationType(typeRef); let isUserDefinedType = false; - if (!typeIndex) { + if (typeIndex == PrimitiveType.ANY) { let identifier = typeRef.getChildAt(0); typeIndex = this.getOrCreateUserDefinedType(identifier, newExpressionFlag, variableNode); isUserDefinedType = true; } + if (typeIndex == PrimitiveType.ANY) { + console.log("ERROR: Type cannot be found for: " + jshelpers.getTextOfNode(node)); + typeIndex = PrimitiveType.ANY; + } // set variable if variable node is given; if (variableNode) { this.setVariable2Type(variableNode, typeIndex, isUserDefinedType); } - if (!typeIndex) { - LOGD("ERROR: Type cannot be found for: " + jshelpers.getTextOfNode(node)); - typeIndex = -1; - } return typeIndex!; } LOGD("WARNING: node type not found for: " + jshelpers.getTextOfNode(node)); - return -1; + return PrimitiveType.ANY; } protected getIndexFromTypeArrayBuffer(type: BaseType): number { @@ -499,9 +501,7 @@ export class FunctionType extends BaseType { private fillInReturn(node: ts.FunctionLikeDeclaration) { let typeIndex = this.getTypeIndexForDeclWithType(node); - if (typeIndex != -1) { - this.returnType = typeIndex; - } + this.returnType = typeIndex; } getModifier() { @@ -552,36 +552,44 @@ export class ExternalType extends BaseType { export class UnionType extends BaseType { unionedTypeArray: Array = []; - typeIndex: number; - shiftedTypeIndex: number; + typeIndex: number = PrimitiveType.ANY; + shiftedTypeIndex: number = PrimitiveType.ANY; constructor(typeNode: ts.Node) { super(); - this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); - this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; - // record type before its initialization, so its index can be recorded - // in case there's recursive reference of this type - this.addCurrentType(typeNode, this.shiftedTypeIndex); - this.fillInUnionArray(typeNode, this.unionedTypeArray); - this.setTypeArrayBuffer(this, this.typeIndex); + this.setOrReadFromArrayRecord(typeNode); + } + + setOrReadFromArrayRecord(typeNode: ts.Node) { + let unionStr = typeNode.getText(); + if (this.hasUnionTypeMapping(unionStr)) { + this.shiftedTypeIndex = this.getFromUnionTypeMap(unionStr)!; + } else { + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; + this.fillInUnionArray(typeNode, this.unionedTypeArray); + this.setUnionTypeMap(unionStr, this.shiftedTypeIndex); + this.setTypeArrayBuffer(this, this.typeIndex); + } + } + + hasUnionTypeMapping(unionStr: string) { + return this.typeRecorder.hasUnionTypeMapping(unionStr); + } + + getFromUnionTypeMap(unionStr: string) { + return this.typeRecorder.getFromUnionTypeMap(unionStr); + } + + setUnionTypeMap(unionStr: string, shiftedTypeIndex: number) { + return this.typeRecorder.setUnionTypeMap(unionStr, shiftedTypeIndex); } fillInUnionArray(typeNode: ts.Node, unionedTypeArray: Array) { for (let element of (typeNode).types) { let elementNode = element; - let typeIndex = this.typeChecker.checkDeclarationType(elementNode); - if (typeIndex) { - unionedTypeArray.push(typeIndex); - } else if (elementNode.kind == ts.SyntaxKind.TypeReference) { - let typeName = elementNode.getChildAt(0); - let typeDecl = this.typeChecker.getTypeDeclForInitializer(typeName, false); - if (typeDecl) { - typeIndex = this.typeChecker.checkForTypeDecl(typeName, typeDecl, false, true); - } else { - typeIndex = 0; - } - unionedTypeArray.push(typeIndex); - } + let typeIndex = this.typeChecker.getOrCreateRecordForTypeNode(elementNode); + unionedTypeArray.push(typeIndex!); } } @@ -599,19 +607,24 @@ export class UnionType extends BaseType { } export class ArrayType extends BaseType { - referedTypeIndex: number = 0; - typeIndex: number = 0; - shiftedTypeIndex: number; + referedTypeIndex: number = PrimitiveType.ANY; + typeIndex: number = PrimitiveType.ANY; + shiftedTypeIndex: number = PrimitiveType.ANY; constructor(typeNode: ts.Node) { super(); - this.referedTypeIndex = this.getReferencedType(typeNode); - if (this.typeRecorder.hasArrayTypeMapping(this.referedTypeIndex)) { - this.shiftedTypeIndex = this.getRecordedArrayIndex(this.referedTypeIndex)!; + let elementNode = (typeNode).elementType; + this.referedTypeIndex = this.typeChecker.getOrCreateRecordForTypeNode(elementNode); + this.setOrReadFromArrayRecord(); + } + + setOrReadFromArrayRecord() { + if (this.hasArrayTypeMapping(this.referedTypeIndex)) { + this.shiftedTypeIndex = this.getFromArrayTypeMap(this.referedTypeIndex)!; } else { this.typeIndex = this.getIndexFromTypeArrayBuffer(this); this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; this.setTypeArrayBuffer(this, this.typeIndex); - this.setRecordedArrayIndex(this.referedTypeIndex, this.shiftedTypeIndex); + this.setArrayTypeMap(this.referedTypeIndex, this.shiftedTypeIndex); } } @@ -633,22 +646,24 @@ export class ArrayType extends BaseType { return 0; } - getRecordedArrayIndex(referedTypeIndex: number) { + hasArrayTypeMapping(referedTypeIndex: number) { + return this.typeRecorder.hasArrayTypeMapping(referedTypeIndex); + } + + getFromArrayTypeMap(referedTypeIndex: number) { return this.typeRecorder.getFromArrayTypeMap(referedTypeIndex); } - setRecordedArrayIndex(referedTypeIndex: number, shiftedTypeIndex: number) { + setArrayTypeMap(referedTypeIndex: number, shiftedTypeIndex: number) { return this.typeRecorder.setArrayTypeMap(referedTypeIndex, shiftedTypeIndex); } transfer2LiteralBuffer(): LiteralBuffer { let classInstBuf = new LiteralBuffer(); let classInstLiterals: Array = new Array(); - classInstLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.ARRAY)); classInstLiterals.push(new Literal(LiteralTag.INTEGER, this.referedTypeIndex)); classInstBuf.addLiterals(...classInstLiterals); - return classInstBuf; } } diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index 5310a959ee..cdd9759a57 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -125,6 +125,9 @@ export class Recorder { this.compilerDriver.getFuncId(childNode); let functionScope = this.buildVariableScope(scope, childNode); this.recordFuncDecl(childNode, scope); + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode); + } this.recordInfo(childNode, functionScope); break; } diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index a30593f7b6..303edab1b5 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -4,7 +4,8 @@ import { ClassInstType, ExternalType, UnionType, - ArrayType + ArrayType, + FunctionType } from "./base/typeSystem"; import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; @@ -88,9 +89,24 @@ export class TypeChecker { return typeIndex; } + public getOrCreateRecordForTypeNode(typeNode: ts.TypeNode) { + let typeIndex = PrimitiveType.ANY; + typeIndex = this.checkDeclarationType(typeNode); + if (typeIndex == PrimitiveType.ANY && typeNode.kind == ts.SyntaxKind.TypeReference) { + let typeName = typeNode.getChildAt(0); + let typeDecl = this.getTypeDeclForInitializer(typeName, false); + if (typeDecl) { + typeIndex = this.checkForTypeDecl(typeName, typeDecl, false, true); + } else { + typeIndex = PrimitiveType.ANY; + } + } + return typeIndex; + } + public checkDeclarationType(typeNode: ts.TypeNode | undefined) { if (!typeNode) { - return undefined; + return PrimitiveType.ANY; } switch (typeNode.kind) { case ts.SyntaxKind.StringKeyword: @@ -101,7 +117,7 @@ export class TypeChecker { case ts.SyntaxKind.BigIntKeyword: case ts.SyntaxKind.LiteralType: let typeName = typeNode.getText().toUpperCase(); - let typeIndex = undefined; + let typeIndex = PrimitiveType.ANY; if (typeName && typeName in PrimitiveType) { typeIndex = PrimitiveType[typeName as keyof typeof PrimitiveType]; } @@ -112,8 +128,15 @@ export class TypeChecker { case ts.SyntaxKind.ArrayType: let arrayType = new ArrayType(typeNode); return arrayType.shiftedTypeIndex; + case ts.SyntaxKind.ParenthesizedType: + let subType = (typeNode).type + if (subType.kind == ts.SyntaxKind.UnionType) { + let unionType = new UnionType(subType); + return unionType.shiftedTypeIndex; + } + return PrimitiveType.ANY; default: - return undefined; + return PrimitiveType.ANY; } } @@ -143,13 +166,16 @@ export class TypeChecker { // If newExpressionFlag is ture, the type has to be created no matter the export is needed or not; // while newExpressionFlag if false, the export has to be needed. public checkForTypeDecl(originalName: ts.Node, typeDeclNode: ts.Node, exportNeeded: boolean, newExpressionFlag: boolean): number { + if (!typeDeclNode) { + return PrimitiveType.ANY; + } switch (typeDeclNode.kind) { // Type found to be defined a classDeclaration or classExpression case ts.SyntaxKind.ClassDeclaration: case ts.SyntaxKind.ClassExpression: let origTypeDeclNode = ts.getOriginalNode(typeDeclNode); let classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); - if (classTypeIndex == -1) { + if (classTypeIndex == PrimitiveType.ANY) { new ClassType(origTypeDeclNode, newExpressionFlag, originalName); if (newExpressionFlag) { classTypeIndex = TypeRecorder.getInstance().tryGetVariable2Type(originalName); @@ -176,16 +202,16 @@ export class TypeChecker { return this.checkForTypeDecl(originalName, nextTypeDeclNode, exportNeeded, newExpressionFlag); } } - return 0; + return PrimitiveType.ANY; case ts.SyntaxKind.ImportSpecifier: case ts.SyntaxKind.ImportClause: let ImportTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); - if (ImportTypeIndex != -1) { + if (ImportTypeIndex != PrimitiveType.ANY) { TypeRecorder.getInstance().setVariable2Type(originalName, ImportTypeIndex, true); return ImportTypeIndex; } // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); - return 0; + return PrimitiveType.ANY; case ts.SyntaxKind.PropertyAccessExpression: let propertyAccessExpression = typeDeclNode; let localName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.expression); @@ -199,9 +225,9 @@ export class TypeChecker { return shiftedTypeIndex; } // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); - return 0; + return PrimitiveType.ANY; } - return 0; + return PrimitiveType.ANY; } public checkTypeForVariableDeclaration(node: ts.VariableDeclaration, exportNeeded: boolean) { @@ -210,7 +236,7 @@ export class TypeChecker { let type = (ts.getOriginalNode(node)).type; // first check if this is a primitive or union declaration let typeIndex = this.checkDeclarationType(type); - if (typeIndex) { + if (typeIndex != PrimitiveType.ANY) { let isUserDefinedType = typeIndex <= PrimitiveType._LENGTH ? false : true; TypeRecorder.getInstance().setVariable2Type(name, typeIndex, isUserDefinedType); } else if (initializer) { @@ -237,6 +263,11 @@ export class TypeChecker { this.checkTypeForVariableDeclaration(declaration, exportNeeded); }); break; + case ts.SyntaxKind.FunctionDeclaration: + let functionDeclNode = ts.getOriginalNode(node); + let functionName = functionDeclNode.name? functionDeclNode.name : undefined; + new FunctionType(functionDeclNode, functionName); + break; case ts.SyntaxKind.ClassDeclaration: // Only create the type if it is exported. // Otherwise, waite until it gets instantiated diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index 643942ac63..54cb3430c2 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -31,6 +31,7 @@ export class TypeRecorder { private userDefinedTypeSet: Set = new Set();; private typeSummary: TypeSummary = new TypeSummary(); private arrayTypeMap: Map = new Map(); + private unionTypeMap: Map = new Map(); // ---> export/import // exportedType: exportedName -> typeIndex private exportedType: Map = new Map(); @@ -83,7 +84,7 @@ export class TypeRecorder { if (this.type2Index.has(typeNode)) { return this.type2Index.get(typeNode)!; } else { - return -1; + return PrimitiveType.ANY; } } @@ -91,7 +92,7 @@ export class TypeRecorder { if (this.variable2Type.has(variableNode)) { return this.variable2Type.get(variableNode)!; } else { - return -1; + return PrimitiveType.ANY; } } @@ -107,6 +108,18 @@ export class TypeRecorder { return this.arrayTypeMap.get(contentTypeIndex); } + public setUnionTypeMap(unionStr: string, unionTypeIndex: number) { + this.unionTypeMap.set(unionStr, unionTypeIndex) + } + + public hasUnionTypeMapping(unionStr: string) { + return this.unionTypeMap.has(unionStr); + } + + public getFromUnionTypeMap(unionStr: string) { + return this.unionTypeMap.get(unionStr); + } + // ---> exported/imported public addImportedType(moduleStmt: ModuleStmt) { moduleStmt.getBindingNodeMap().forEach((externalNode, localNode) => { @@ -161,9 +174,9 @@ export class TypeRecorder { // Imported type should already be stored in typeRecord by design let typeIndexForType = this.tryGetTypeIndex(typeNode); let typeIndexForVariable = this.tryGetVariable2Type(typeNode); - if (typeIndexForType != -1) { + if (typeIndexForType != PrimitiveType.ANY) { this.setExportedType(exportedName, typeIndexForType, true); - } else if (typeIndexForVariable != -1) { + } else if (typeIndexForVariable != PrimitiveType.ANY) { this.setExportedType(exportedName, typeIndexForVariable, true); } else { // not found in typeRecord. Need to create the type and -- Gitee From f3b3783c7f583fa738e375a70b3561e713efd032 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Wed, 29 Dec 2021 18:58:34 +0800 Subject: [PATCH 07/21] Update npm registry from "mirrors.tools.huawei.com" to "repo.huaweicloud.com" Change-Id: Iaa1db8d2dc086ce015c8b16cb34c959965a7e03b Signed-off-by: zhuoli --- ts2panda/scripts/npm-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts2panda/scripts/npm-install.sh b/ts2panda/scripts/npm-install.sh index af9ab4e6fb..f669e0589b 100755 --- a/ts2panda/scripts/npm-install.sh +++ b/ts2panda/scripts/npm-install.sh @@ -21,7 +21,7 @@ nodejs_dir=$1 cd ${ts2panda_dir} export PATH=${nodejs_dir}:$PATH -npm config set registry http://mirrors.tools.huawei.com/npm/ +npm config set registry http://repo.huaweicloud.com/repository/npm/ if [ "X${SKIP_SSL}" == "XYES" ];then npm config set strict-ssl false fi -- Gitee From 367d6783820f9cd5622fe44d150f65837810efc3 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Wed, 29 Dec 2021 20:09:01 +0800 Subject: [PATCH 08/21] Add member methods name in class TypeLiteral Change-Id: I0ad9faa1078b1b69b65a05c3fc82741d3d5b650c Signed-off-by: zhuoli --- ts2panda/src/base/typeSystem.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index d938e5ac82..620e8d9a8d 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -206,9 +206,9 @@ export class ClassType extends BaseType { heritages: Array = new Array(); // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] staticFields: Map> = new Map>(); - staticMethods: Array = new Array(); + staticMethods: Map = new Map(); fields: Map> = new Map>(); - methods: Array = new Array(); + methods: Map = new Map(); typeIndex: number; constructor(classNode: ts.ClassDeclaration | ts.ClassExpression, newExpressionFlag: boolean, variableNode?: ts.Node) { @@ -333,9 +333,9 @@ export class ClassType extends BaseType { let typeIndex = this.tryGetTypeIndex(member); let funcModifier = funcType.getModifier(); if (funcModifier) { - this.staticMethods.push(typeIndex!); + this.staticMethods.set(funcType.getFunctionName(), typeIndex!); } else { - this.methods.push(typeIndex!); + this.methods.set(funcType.getFunctionName(), typeIndex!); } } @@ -396,11 +396,12 @@ export class ClassType extends BaseType { } private transferMethods2Literal(classTypeLiterals: Array, isStatic: boolean) { - let transferredTarget: Array = isStatic ? this.staticMethods : this.methods; + let transferredTarget: Map = isStatic ? this.staticMethods : this.methods; - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.length)); - transferredTarget.forEach(method => { - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, method)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.size)); + transferredTarget.forEach((typeInfo, name) => { + classTypeLiterals.push(new Literal(LiteralTag.STRING, name)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo)); }); } } @@ -431,7 +432,7 @@ export class ClassInstType extends BaseType { } export class FunctionType extends BaseType { - name: string | undefined = ''; + name: string = ''; accessFlag: number = 0; // 0 -> public -> 0, private -> 1, protected -> 2 modifierStatic: number = 0; // 0 -> unstatic, 1 -> static parameters: Array = new Array(); @@ -465,6 +466,10 @@ export class FunctionType extends BaseType { // this.typeRecorder.getLog(funcNode, this.typeIndex); } + public getFunctionName() { + return this.name; + } + public getTypeIndex() { return this.typeIndex; } -- Gitee From 30e2d7512ca51cf6583dea79cb74929568e06e01 Mon Sep 17 00:00:00 2001 From: ctw Date: Thu, 30 Dec 2021 21:25:01 +0800 Subject: [PATCH 09/21] fix get id for ctor Change-Id: I6d7f29e0df486687f1588909c0ca5f9dbb0a171e Signed-off-by: ctw --- ts2panda/src/base/util.ts | 4 ++-- ts2panda/src/compiler.ts | 4 ++-- ts2panda/src/compilerDriver.ts | 8 +++---- ts2panda/src/recorder.ts | 27 ++++++++++++++++-------- ts2panda/src/scope.ts | 8 ++----- ts2panda/src/statement/classStatement.ts | 19 ++++++++++------- 6 files changed, 39 insertions(+), 31 deletions(-) diff --git a/ts2panda/src/base/util.ts b/ts2panda/src/base/util.ts index 3c141cb824..e0f66130a0 100755 --- a/ts2panda/src/base/util.ts +++ b/ts2panda/src/base/util.ts @@ -14,7 +14,7 @@ */ import path = require("path"); -import { isContainConstruct } from "../statement/classStatement"; +import { extractCtorOfClass } from "../statement/classStatement"; import { LocalVariable, Variable } from "../variable"; import * as ts from "typescript"; import { @@ -274,7 +274,7 @@ export function getParamLengthOfFunc(node: ts.FunctionLikeDeclaration) { } export function getParameterLength4Ctor(node: ts.ClassLikeDeclaration) { - if (!isContainConstruct(node)) { + if (!extractCtorOfClass(node)) { return 0; } diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index a3d561c59b..8eb1e3aecd 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -88,7 +88,7 @@ import { compileDefaultConstructor, compileDefaultInitClassMembers, compileReturnThis4Ctor, - isContainConstruct + extractCtorOfClass } from "./statement/classStatement"; import { compileForOfStatement } from "./statement/forOfStatement"; import { LabelTarget } from "./statement/labelTarget"; @@ -402,7 +402,7 @@ export class Compiler { if (ts.isConstructorDeclaration(decl)) { let classNode = decl.parent; - if (jshelpers.getClassExtendsHeritageElement(classNode) && !isContainConstruct(classNode)) { + if (jshelpers.getClassExtendsHeritageElement(classNode) && !extractCtorOfClass(classNode)) { compileDefaultConstructor(this, decl); return; } diff --git a/ts2panda/src/compilerDriver.ts b/ts2panda/src/compilerDriver.ts index 89745c848c..a39363e50b 100644 --- a/ts2panda/src/compilerDriver.ts +++ b/ts2panda/src/compilerDriver.ts @@ -339,7 +339,7 @@ export class CompilerDriver { name = "func_main_0"; } else if (ts.isConstructorDeclaration(node)) { let classNode = node.parent; - name = this.getInternalNameForCtor(classNode); + name = this.getInternalNameForCtor(classNode, node); } else { let funcNode = node; name = (recorder.getScopeOfNode(funcNode)).getFuncName(); @@ -368,11 +368,11 @@ export class CompilerDriver { return name; } - getInternalNameForCtor(node: ts.ClassLikeDeclaration) { + getInternalNameForCtor(node: ts.ClassLikeDeclaration, ctor: ts.ConstructorDeclaration) { let name = getClassNameForConstructor(node); - name = `#${this.getFuncId(node)}#${name}` + name = `#${this.getFuncId(ctor)}#${name}` if (name.lastIndexOf(".") != -1) { - name = `#${this.getFuncId(node)}#` + name = `#${this.getFuncId(ctor)}#` } return name; } diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index cdd9759a57..98b4bdeae5 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -41,7 +41,9 @@ import { VariableScope } from "./scope"; import { - AddCtor2Class, getClassNameForConstructor, isContainConstruct + AddCtor2Class, + getClassNameForConstructor, + extractCtorOfClass } from "./statement/classStatement"; import { checkSyntaxError } from "./syntaxChecker"; import { isGlobalIdentifier } from "./syntaxCheckHelper"; @@ -59,7 +61,7 @@ export class Recorder { private hoistMap: Map = new Map(); private parametersMap: Map = new Map(); private funcNameMap: Map; - private ClassGroupOfNoCtor: Array = new Array(); + private class2Ctor: Map = new Map(); private importStmts: Array = []; private exportStmts: Array = []; private defaultUsed: boolean = false; @@ -88,8 +90,14 @@ export class Recorder { return this.node; } - getClassGroupOfNoCtor() { - return this.ClassGroupOfNoCtor; + getCtorOfClass(node: ts.ClassLikeDeclaration) { + return this.class2Ctor.get(node); + } + + setCtorOfClass(node: ts.ClassLikeDeclaration, ctor: ts.ConstructorDeclaration) { + if (!this.class2Ctor.has(node)) { + this.class2Ctor.set(node, ctor); + } } private setParent(node: ts.Node) { @@ -115,14 +123,12 @@ export class Recorder { case ts.SyntaxKind.GetAccessor: case ts.SyntaxKind.SetAccessor: case ts.SyntaxKind.ArrowFunction: { - this.compilerDriver.getFuncId(childNode); let functionScope = this.buildVariableScope(scope, childNode); this.recordFuncInfo(childNode); this.recordInfo(childNode, functionScope); break; } case ts.SyntaxKind.FunctionDeclaration: { - this.compilerDriver.getFuncId(childNode); let functionScope = this.buildVariableScope(scope, childNode); this.recordFuncDecl(childNode, scope); if (this.recordType) { @@ -218,12 +224,15 @@ export class Recorder { private recordClassInfo(childNode: ts.ClassLikeDeclaration, scope: Scope) { let localScope = new LocalScope(scope); this.setScopeMap(childNode, localScope); - if (!isContainConstruct(childNode)) { + let ctor = extractCtorOfClass(childNode); + if (!ctor) { AddCtor2Class(this, childNode, localScope); + } else { + this.setCtorOfClass(childNode, ctor); } if (childNode.name) { let name = jshelpers.getTextOfIdentifierOrLiteral(childNode.name); - let calssDecl = new ClassDecl(name, childNode, this.compilerDriver.getFuncId(childNode)); + let calssDecl = new ClassDecl(name, childNode); scope.setDecls(calssDecl); } this.recordInfo(childNode, localScope); @@ -421,7 +430,7 @@ export class Recorder { return; } let funcName = jshelpers.getTextOfIdentifierOrLiteral(funcId); - let funcDecl = new FuncDecl(funcName, node, this.compilerDriver.getFuncId(node)); + let funcDecl = new FuncDecl(funcName, node); scope.setDecls(funcDecl); let hoistScope = scope; if (scope instanceof GlobalScope || scope instanceof ModuleScope) { diff --git a/ts2panda/src/scope.ts b/ts2panda/src/scope.ts index 44cde853d8..79a59c0486 100644 --- a/ts2panda/src/scope.ts +++ b/ts2panda/src/scope.ts @@ -55,18 +55,14 @@ export class ConstDecl extends Decl { } export class FuncDecl extends Decl { - readonly index: number; - constructor(funcName: string, node: ts.Node, index: number) { + constructor(funcName: string, node: ts.Node) { super(funcName, node); - this.index = index; } } export class ClassDecl extends Decl { - readonly index: number; - constructor(className: string, node: ts.Node, index: number) { + constructor(className: string, node: ts.Node) { super(className, node); - this.index = index; } } diff --git a/ts2panda/src/statement/classStatement.ts b/ts2panda/src/statement/classStatement.ts index 1d951aed7e..6edc3b9d15 100644 --- a/ts2panda/src/statement/classStatement.ts +++ b/ts2panda/src/statement/classStatement.ts @@ -60,7 +60,7 @@ export function compileClassDeclaration(compiler: Compiler, stmt: ts.ClassLikeDe let classBuffer = new LiteralBuffer(); let propertyIndex = 0; let staticItemsNum = 0; - let hasConstructor = isContainConstruct(stmt); + let hasConstructor = extractCtorOfClass(stmt) == undefined ? false : true; for (; propertyIndex < properties.length; propertyIndex++) { let prop = properties[propertyIndex]; @@ -150,7 +150,6 @@ export function AddCtor2Class(recorder: Recorder, classNode: ts.ClassLikeDeclara ctorNode = ts.setTextRange(ctorNode, classNode); let parentScope = recorder.getScopeOfNode(classNode); - recorder.compilerDriver.getFuncId(classNode); let funcScope = recorder.buildVariableScope(scope, ctorNode); funcScope.setParent(parentScope); @@ -162,6 +161,8 @@ export function AddCtor2Class(recorder: Recorder, classNode: ts.ClassLikeDeclara recorder.recordFuncName(ctorNode); recorder.recordFunctionParameters(ctorNode); + + recorder.setCtorOfClass(classNode, ctorNode); } export function compileDefaultConstructor(compiler: Compiler, ctrNode: ts.ConstructorDeclaration) { @@ -227,13 +228,15 @@ function compileUnCompiledVariable(compiler: Compiler, prop: Property, classReg: function createClassLiteralBuf(compiler: Compiler, classBuffer: LiteralBuffer, stmt: ts.ClassLikeDeclaration, vregs: VReg[]) { - let pandaGen = compiler.getPandaGen(); let classLiteralBuf = PandaGen.getLiteralArrayBuffer(); - let buffIdx = classLiteralBuf.length; - let internalName = compiler.getCompilerDriver().getInternalNameForCtor(stmt); classLiteralBuf.push(classBuffer); + let ctorNode = compiler.getRecorder().getCtorOfClass(stmt); + let internalName = compiler.getCompilerDriver().getInternalNameForCtor(stmt, ctorNode); + + let pandaGen = compiler.getPandaGen(); let parameterLength = getParameterLength4Ctor(stmt); + let buffIdx = classLiteralBuf.length; pandaGen.defineClassWithBuffer(stmt, internalName, buffIdx, parameterLength, vregs[0]); pandaGen.storeAccumulator(stmt, vregs[1]); } @@ -420,16 +423,16 @@ function loadCtorObj(node: ts.CallExpression, compiler: Compiler) { } -export function isContainConstruct(stmt: ts.ClassLikeDeclaration) { +export function extractCtorOfClass(stmt: ts.ClassLikeDeclaration) { let members = stmt.members; for (let index = 0; index < members.length; index++) { let member = members[index]; if (ts.isConstructorDeclaration(member)) { - return true + return member; } } - return false; + return undefined; } export function defineClassMember( -- Gitee From edb9e4943533bc3db3b3e07d798272a8688dcbfe Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Thu, 30 Dec 2021 10:31:12 +0800 Subject: [PATCH 10/21] add d-ts interfaceType of TypeSystem Change-Id: I71641855ec9e93f9b4234b0ab6592578f4283a80 Signed-off-by: zhangrengao --- ts2panda/src/base/typeSystem.ts | 168 ++++++++++++++++++++++++++++++-- ts2panda/src/compiler.ts | 1 + ts2panda/src/index.ts | 44 ++++++++- ts2panda/src/pandagen.ts | 8 ++ ts2panda/src/pandasm.ts | 15 ++- ts2panda/src/recorder.ts | 6 ++ ts2panda/src/strictMode.ts | 9 ++ ts2panda/src/ts2panda.ts | 13 ++- ts2panda/src/typeChecker.ts | 37 ++++++- ts2panda/src/typeRecorder.ts | 13 +++ ts2panda/ts2abc/ts2abc.cpp | 53 ++++++++++ 11 files changed, 355 insertions(+), 12 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 620e8d9a8d..245ebd508c 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -126,7 +126,7 @@ export abstract class BaseType { } protected getTypeIndexForDeclWithType( - node: ts.FunctionLikeDeclaration | ts.ParameterDeclaration | ts.PropertyDeclaration, variableNode?: ts.Node): number { + node: ts.FunctionLikeDeclaration | ts.ParameterDeclaration | ts.PropertyDeclaration | ts.PropertySignature | ts.MethodSignature, variableNode?: ts.Node): number { if (node.type) { // check for newExpression let newExpressionFlag = false; @@ -439,7 +439,7 @@ export class FunctionType extends BaseType { returnType: number = 0; typeIndex: number; - constructor(funcNode: ts.FunctionLikeDeclaration, variableNode?: ts.Node) { + constructor(funcNode: ts.FunctionLikeDeclaration | ts.MethodSignature, variableNode?: ts.Node) { super(); this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; @@ -474,7 +474,7 @@ export class FunctionType extends BaseType { return this.typeIndex; } - private fillInModifiers(node: ts.FunctionLikeDeclaration) { + private fillInModifiers(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { if (node.modifiers) { for (let modifier of node.modifiers) { switch (modifier.kind) { @@ -494,7 +494,7 @@ export class FunctionType extends BaseType { } } - private fillInParameters(node: ts.FunctionLikeDeclaration) { + private fillInParameters(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { if (node.parameters) { for (let parameter of node.parameters) { let variableNode = parameter.name; @@ -504,7 +504,7 @@ export class FunctionType extends BaseType { } } - private fillInReturn(node: ts.FunctionLikeDeclaration) { + private fillInReturn(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { let typeIndex = this.getTypeIndexForDeclWithType(node); this.returnType = typeIndex; } @@ -688,4 +688,160 @@ export class ObjectLiteralType extends BaseType { return objTypeBuf; } -} \ No newline at end of file +} + +export class InterfaceType extends BaseType { + heritages: Array = new Array(); + // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + fields: Map> = new Map>(); + methods: Array = new Array(); + typeIndex: number; + + constructor(interfaceNode: ts.InterfaceDeclaration, variableNode?: ts.Node) { + super(); + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + // record type before its initialization, so its index can be recorded + // in case there's recursive reference of this type + this.addCurrentType(interfaceNode, shiftedIndex); + + this.fillInHeritages(interfaceNode); + this.fillInFieldsAndMethods(interfaceNode); + + // initialization finished, add variable to type if variable is given + if (variableNode) { + // if the variable is a instance, create another classInstType instead of current classType itself + this.setVariable2Type(variableNode, shiftedIndex, true); + } + this.setTypeArrayBuffer(this, this.typeIndex); + } + + public getTypeIndex() { + return this.typeIndex; + } + + private fillInHeritages(node: ts.InterfaceDeclaration) { + if (node.heritageClauses) { + for (let heritage of node.heritageClauses) { + for (let heritageType of heritage.types) { + let heritageIdentifier = heritageType.expression; + let heritageTypeIndex = this.getOrCreateUserDefinedType(heritageIdentifier, false); + this.heritages.push(heritageTypeIndex); + } + } + } + } + + private fillInFields(member: ts.PropertySignature) { + // collect modifier info + let fieldName: string = ""; + switch (member.name.kind) { + case ts.SyntaxKind.Identifier: + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); + break; + case ts.SyntaxKind.ComputedPropertyName: + fieldName = "#computed"; + break; + default: + throw new Error("Invalid proerty name"); + } + + // Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + let fieldInfo = Array(PrimitiveType.ANY, AccessFlag.PUBLIC, ModifierReadonly.NONREADONLY); + if (member.modifiers) { + for (let modifier of member.modifiers) { + switch (modifier.kind) { + case ts.SyntaxKind.PrivateKeyword: { + fieldInfo[1] = AccessFlag.PRIVATE; + break; + } + case ts.SyntaxKind.ProtectedKeyword: { + fieldInfo[1] = AccessFlag.PROTECTED; + break; + } + case ts.SyntaxKind.ReadonlyKeyword: { + fieldInfo[2] = ModifierReadonly.READONLY; + break; + } + } + } + } + // collect type info + let variableNode = member.name ? member.name : undefined; + fieldInfo[0] = this.getTypeIndexForDeclWithType(member, variableNode); + + this.fields.set(fieldName, fieldInfo); + } + + private fillInMethods(member: ts.MethodSignature) { + /** + * a method like declaration in a new class must be a new type, + * create this type and add it into typeRecorder + */ + let variableNode = member.name ? member.name : undefined; + let funcType = new FunctionType(member, variableNode); + + // Then, get the typeIndex and fill in the methods array + let typeIndex = this.tryGetTypeIndex(member); + this.methods.push(typeIndex!); + } + + private fillInFieldsAndMethods(node: ts.InterfaceDeclaration) { + if (node.members) { + for (let member of node.members) { + switch (member.kind) { + case ts.SyntaxKind.MethodSignature:{ + this.fillInMethods(member); + break; + } + case ts.SyntaxKind.PropertySignature: { + this.fillInFields(member); + break; + } + } + } + } + } + + transfer2LiteralBuffer() { + let classTypeBuf = new LiteralBuffer(); + let classTypeLiterals: Array = new Array(); + // the first element is to determine the L2 type + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.CLASS)); + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); + this.heritages.forEach(heritage => { + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, heritage)); + }); + + // record fields and methods + this.transferFields2Literal(classTypeLiterals); + this.transferMethods2Literal(classTypeLiterals); + + classTypeBuf.addLiterals(...classTypeLiterals); + return classTypeBuf; + } + + private transferFields2Literal(classTypeLiterals: Array) { + let transferredTarget: Map> = this.fields; + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.size)); + transferredTarget.forEach((typeInfo, name) => { + classTypeLiterals.push(new Literal(LiteralTag.STRING, name)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[0])); // typeIndex + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[1])); // accessFlag + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[2])); // readonly + }); + } + + private transferMethods2Literal(classTypeLiterals: Array) { + let transferredTarget: Array = this.methods; + + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.length)); + transferredTarget.forEach(method => { + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, method)); + }); + } +} diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 8eb1e3aecd..3a33940bd3 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -497,6 +497,7 @@ export class Compiler { break; case ts.SyntaxKind.ExportDeclaration: case ts.SyntaxKind.NotEmittedStatement: + case ts.SyntaxKind.InterfaceDeclaration: break; default: throw new Error("Statement " + this.getNodeName(stmt) + " is unimplemented"); diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index 120b2c0131..787817e5da 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -22,7 +22,7 @@ import { Pass } from "./pass"; import { CacheExpander } from "./pass/cacheExpander"; import { ICPass } from "./pass/ICPass"; import { RegAlloc } from "./regAllocator"; -import { setGlobalStrict } from "./strictMode"; +import { setGlobalStrict, setGlobalDeclare, isGlobalDeclare } from "./strictMode"; import { TypeChecker } from "./typeChecker"; import { TypeRecorder } from "./typeRecorder"; import jshelpers = require("./jshelpers"); @@ -32,6 +32,48 @@ function main(fileNames: string[], options: ts.CompilerOptions) { let program = ts.createProgram(fileNames, options); let typeChecker = TypeChecker.getInstance(); typeChecker.setTypeChecker(program.getTypeChecker()); + + for (let sourceFile of program.getSourceFiles()) { + if (sourceFile.isDeclarationFile && !program.isSourceFileDefaultLibrary(sourceFile)) { + setGlobalDeclare(checkIsGlobalDeclaration(sourceFile)); + generateDTs(sourceFile, options); + } + } + + function checkIsGlobalDeclaration(sourceFile: ts.SourceFile) { + for (let statement of sourceFile.statements) { + if (statement.modifiers) { + for (let modifier of statement.modifiers) { + if (modifier.kind === ts.SyntaxKind.ExportKeyword) { + return false; + } + } + } else if (statement.kind === ts.SyntaxKind.ExportAssignment) { + return false; + } else if (statement.kind === ts.SyntaxKind.ImportKeyword || statement.kind === ts.SyntaxKind.ImportDeclaration) { + return false; + } + } + return true; + } + + function generateDTs(node: ts.SourceFile, options: ts.CompilerOptions) { + let outputBinName = getOutputBinName(node); + let compilerDriver = new CompilerDriver(outputBinName); + setGlobalStrict(jshelpers.isEffectiveStrictModeSourceFile(node, options)); + if (CmdOptions.isVariantBytecode()) { + LOGD("variant bytecode dump"); + let passes: Pass[] = [ + new CacheExpander(), + new ICPass(), + new RegAlloc() + ]; + compilerDriver.setCustomPasses(passes); + } + compilerDriver.compile(node); + compilerDriver.showStatistics(); + } + let emitResult = program.emit( undefined, undefined, diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts index a1f43d6841..d7b0bfceb7 100644 --- a/ts2panda/src/pandagen.ts +++ b/ts2panda/src/pandagen.ts @@ -230,6 +230,14 @@ export class PandaGen { } } + static getDeclaredTypes() { + if (TypeRecorder.getInstance()) { + return TypeRecorder.getInstance().getDeclaredType(); + } else { + return new Map(); + } + } + public getSourceCodeDebugInfo() { return this.sourceCodeDebugInfo; } diff --git a/ts2panda/src/pandasm.ts b/ts2panda/src/pandasm.ts index a63e410bba..565615a2f5 100644 --- a/ts2panda/src/pandasm.ts +++ b/ts2panda/src/pandasm.ts @@ -75,6 +75,7 @@ export class Function { public callType: number; public typeInfo: Array; public exportedSymbol2Types: Array | undefined; + public declaredSymbol2Types: Array | undefined; constructor( name: string, @@ -87,7 +88,8 @@ export class Function { sourceCode: string | undefined = undefined, callType: number = 0, typeInfo: Array, - exportedSymbol2Types: Array | undefined = undefined + exportedSymbol2Types: Array | undefined = undefined, + declaredSymbol2Types: Array | undefined = undefined ) { this.name = name; this.signature = signature; @@ -102,6 +104,7 @@ export class Function { this.callType = callType; this.typeInfo = typeInfo; this.exportedSymbol2Types = exportedSymbol2Types; + this.declaredSymbol2Types = declaredSymbol2Types; } } @@ -195,6 +198,16 @@ export class ExportedSymbol2Type { } } +export class DeclaredSymbol2Type { + private symbol: string; + private type: number; + + constructor(symbol: string, type: number) { + this.symbol = symbol; + this.type = type; + } +} + export interface Emmiter { generate_program: (filename: string, program: Program) => string; } diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index 98b4bdeae5..f7a996f8bf 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -167,6 +167,12 @@ export class Recorder { } break; } + case ts.SyntaxKind.InterfaceDeclaration: { + if (this.recordType) { + TypeChecker.getInstance().formatNodeType(childNode); + } + break; + } case ts.SyntaxKind.Identifier: { this.recordVariableDecl(childNode, scope); break; diff --git a/ts2panda/src/strictMode.ts b/ts2panda/src/strictMode.ts index 80e27a1dc7..901098efb5 100644 --- a/ts2panda/src/strictMode.ts +++ b/ts2panda/src/strictMode.ts @@ -17,6 +17,7 @@ import * as ts from "typescript"; import jshelpers from "./jshelpers"; let globalStrict = true; +let globalDeclare = false; export function checkStrictModeStatementList(node: ts.Node): boolean { let statements; @@ -90,3 +91,11 @@ export function isStrictMode(node: ts.Node): boolean { return checkStrictMode(node); } + +export function setGlobalDeclare(flag: boolean) { + globalDeclare = flag; +} + +export function isGlobalDeclare() { + return globalDeclare; +} \ No newline at end of file diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index d4f8ea38ff..37967fc5bb 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -26,6 +26,7 @@ import { LOGD } from "./log"; import { PandaGen } from "./pandagen"; import { CatchTable, + DeclaredSymbol2Type, ExportedSymbol2Type, Function, Ins, @@ -207,6 +208,15 @@ export class Ts2Panda { }) } + let declareddTypes = PandaGen.getExportedTypes(); + let declaredSymbol2Types = declareddTypes.size == 0 ? undefined : new Array(); + if (funcName == "func_main_0") { + declareddTypes.forEach((type: number, symbol: string) => { + let declaredSymbol2Type = new DeclaredSymbol2Type(symbol, type); + declaredSymbol2Types!.push(declaredSymbol2Type); + }) + } + let variables, sourceCode; if (CmdOptions.isDebugMode()) { variables = pg.getVariableDebugInfoArray(); @@ -227,7 +237,8 @@ export class Ts2Panda { sourceCode, callType, typeInfo, - exportedSymbol2Types + exportedSymbol2Types, + declaredSymbol2Types ); let catchTables = generateCatchTables(pg.getCatchMap()); catchTables.forEach((catchTable) => { diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index 303edab1b5..463ef84bfa 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -5,7 +5,8 @@ import { ExternalType, UnionType, ArrayType, - FunctionType + FunctionType, + InterfaceType } from "./base/typeSystem"; import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; @@ -23,6 +24,7 @@ export enum PrimitiveFlags { UNDEFINED = 32768, _LENGTH = 50 } +import { isGlobalDeclare } from "./strictMode"; export class TypeChecker { private static instance: TypeChecker; @@ -272,15 +274,34 @@ export class TypeChecker { // Only create the type if it is exported. // Otherwise, waite until it gets instantiated let classDeclNode = ts.getOriginalNode(node); - if (this.checkExportKeyword(node)) { + if (this.checkExportKeyword(node) || this.checkDeclareKeyword(node)) { let classType = new ClassType(classDeclNode, false); let typeIndex = classType.getTypeIndex(); let className = classDeclNode.name; let exportedName = "default"; if (className) { exportedName = jshelpers.getTextOfIdentifierOrLiteral(className); + } else { + LOGD("ClassName NOT FOUND for:" + node.getFullText()); + } + if (this.checkExportKeyword(node)) { + TypeRecorder.getInstance().setExportedType(exportedName, typeIndex, false); + } else if (this.checkDeclareKeyword(node) && isGlobalDeclare()){ + TypeRecorder.getInstance().setDeclaredType(exportedName, typeIndex, false); + } + } + break; + case ts.SyntaxKind.InterfaceDeclaration: + if (isGlobalDeclare()) { + let interfaceDeclNode : ts.InterfaceDeclaration = ts.getOriginalNode(node); + console.log(interfaceDeclNode); + let interfaceType = new InterfaceType(interfaceDeclNode); + let interfaceName = interfaceDeclNode.name; + if (interfaceName) { + TypeRecorder.getInstance().setDeclaredType(jshelpers.getTextOfIdentifierOrLiteral(interfaceName), interfaceType.getTypeIndex(), false); + } else { + LOGD("InterfaceName NOT FOUND for:" + node.getFullText()); } - TypeRecorder.getInstance().setExportedType(exportedName, typeIndex, false); } break; case ts.SyntaxKind.ExportDeclaration: @@ -304,4 +325,14 @@ export class TypeChecker { } } + public checkDeclareKeyword(node: ts.Node): boolean { + if (node.modifiers) { + for (let modifier of node.modifiers) { + if (modifier.kind === ts.SyntaxKind.DeclareKeyword) { + return true; + } + } + } + return false; + } } diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index 54cb3430c2..15f1e00acc 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -35,6 +35,8 @@ export class TypeRecorder { // ---> export/import // exportedType: exportedName -> typeIndex private exportedType: Map = new Map(); + // declaredType: declaredName -> typeIndex + private declaredType: Map = new Map(); // namespace mapping: namepace -> filepath (import * as sth from "...") // later in PropertyAccessExpression we'll need this to map the symbol to filepath private namespaceMap: Map = new Map(); @@ -203,6 +205,13 @@ export class TypeRecorder { this.exportedType.set(exportedName, typeIndex); } + public setDeclaredType(exportedName: string, typeIndex: number, shifted: boolean) { + if (!shifted) { + typeIndex = this.shiftType(typeIndex); + } + this.declaredType.set(exportedName, typeIndex); + } + public addAnonymousReExport(redirectName: string) { this.anonymousReExport.push(redirectName); } @@ -236,6 +245,10 @@ export class TypeRecorder { return this.exportedType; } + public getDeclaredType() { + return this.declaredType; + } + public getAnonymousReExport() { return this.anonymousReExport; } diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 34c0b52e40..1c9a2ab567 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -712,6 +712,57 @@ static void ParseFunctionExportedType(const Json::Value &function, panda::pandas } } +static void ParseFunctionDeclaredType(const Json::Value &function, panda::pandasm::Function &pandaFunc) +{ + std::string funcName = ""; + if (function.isMember("name") && function["name"].isString()) { + funcName = function["name"].asString(); + if (funcName != "func_main_0") { + return; + } + } + + if (function.isMember("declaredSymbol2Types") && function["declaredSymbol2Types"].isArray()) { + auto declaredTypes = function["declaredSymbol2Types"]; + panda::pandasm::AnnotationData funcAnnotation("_ESTypeAnnotation"); + std::vector symbolElements; + std::vector symbolTypeElements; + for (Json::ArrayIndex i = 0; i < declaredTypes.size(); i++) { + auto declaredType = declaredTypes[i]; + if (!declaredType.isObject()) { + continue; + } + + std::string declaredSymbol = ""; + if (declaredType.isMember("symbol") && declaredType["symbol"].isString()) { + declaredSymbol = declaredType["symbol"].asString(); + } + + uint32_t typeIndex = 0; + if (declaredType.isMember("type") && declaredType["type"].isInt()) { + typeIndex = declaredType["type"].asUInt(); + } + + panda::pandasm::ScalarValue symbol(panda::pandasm::ScalarValue::Create(declaredSymbol)); + symbolElements.emplace_back(std::move(symbol)); + panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + symbolTypeElements.emplace_back(std::move(tIndex)); + } + + std::string symbolAnnotationName = "declaredSymbols"; + panda::pandasm::AnnotationElement declaredSymbolsElement(symbolAnnotationName, + std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::STRING, symbolElements))); + funcAnnotation.AddElement(std::move(declaredSymbolsElement)); + + std::string symbolTypeAnnotationName = "declaredSymbolTypes"; + panda::pandasm::AnnotationElement declaredSymbolTypesElement(symbolTypeAnnotationName, + std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, symbolTypeElements))); + funcAnnotation.AddElement(std::move(declaredSymbolTypesElement)); + + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + } +} + static panda::pandasm::Function ParseFunction(const Json::Value &function) { auto pandaFunc = GetFunctionDefintion(function); @@ -725,6 +776,7 @@ static panda::pandasm::Function ParseFunction(const Json::Value &function) ParseFunctionCallType(function, pandaFunc); ParseFunctionTypeInfo(function, pandaFunc); ParseFunctionExportedType(function, pandaFunc); + ParseFunctionDeclaredType(function, pandaFunc); return pandaFunc; } @@ -836,6 +888,7 @@ static void ReplaceAllDistinct(std::string &str, const std::string &oldValue, co } } + .02 static void ParseOptions(const Json::Value &rootValue, panda::pandasm::Program &prog) { GenerateESCallTypeAnnotationRecord(prog); -- Gitee From 58ab56b889407ab86bb3ac7f6cdf5d7cf8b66586 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Fri, 31 Dec 2021 16:14:51 +0800 Subject: [PATCH 11/21] 1. Modification on class type: 1.Distinguish between extends and implements 2.Record non-static fields and methods before static fields and methods 2. Add INT primitive type to preserve a corresponding index for runtime Signed-off-by: zhuoli Change-Id: I1db560e2784c631131182617681450c4b86b9ca2 --- ts2panda/src/base/typeSystem.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 245ebd508c..be5d7d4bb2 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -35,18 +35,19 @@ export enum PrimitiveType { SYMBOL, NULL, UNDEFINED, + INT, _LENGTH = 50 } export enum L2Type { + _COUNTER, CLASS, CLASSINST, FUNCTION, UNION, ARRAY, OBJECT, // object literal - EXTERNAL, - _COUNTER + EXTERNAL } export enum ModifierAbstract { @@ -203,7 +204,8 @@ export class TypeSummary extends BaseType { export class ClassType extends BaseType { modifier: number = 0; // 0 -> unabstract, 1 -> abstract; - heritages: Array = new Array(); + extendsHeritage: number = -1; + implementsHeritages: Array = new Array(); // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] staticFields: Map> = new Map>(); staticMethods: Map = new Map(); @@ -260,10 +262,15 @@ export class ClassType extends BaseType { private fillInHeritages(node: ts.ClassDeclaration | ts.ClassExpression) { if (node.heritageClauses) { for (let heritage of node.heritageClauses) { + let heritageFullName = heritage.getText(); for (let heritageType of heritage.types) { let heritageIdentifier = heritageType.expression; let heritageTypeIndex = this.getOrCreateUserDefinedType(heritageIdentifier, false); - this.heritages.push(heritageTypeIndex); + if (heritageFullName.startsWith("extends ")) { + this.extendsHeritage = heritageTypeIndex; + } else if (heritageFullName.startsWith("implements ")) { + this.implementsHeritages.push(heritageTypeIndex); + } } } } @@ -366,19 +373,20 @@ export class ClassType extends BaseType { classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.CLASS)); classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.modifier)); - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); - this.heritages.forEach(heritage => { + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.extendsHeritage)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.implementsHeritages.length)); + this.implementsHeritages.forEach(heritage => { classTypeLiterals.push(new Literal(LiteralTag.INTEGER, heritage)); }); - // record static methods and fields; - this.transferFields2Literal(classTypeLiterals, true); - this.transferMethods2Literal(classTypeLiterals, true); - // record unstatic fields and methods this.transferFields2Literal(classTypeLiterals, false); this.transferMethods2Literal(classTypeLiterals, false); + // record static methods and fields; + this.transferFields2Literal(classTypeLiterals, true); + this.transferMethods2Literal(classTypeLiterals, true); + classTypeBuf.addLiterals(...classTypeLiterals); return classTypeBuf; } -- Gitee From ce7fb3b39744b642fe580b6e729cc6836290f37e Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Fri, 31 Dec 2021 16:39:06 +0800 Subject: [PATCH 12/21] fix format Change-Id: Ie6502fa5371454a977df32301c39c6c305705562 Signed-off-by: zhangrengao --- ts2panda/ts2abc/ts2abc.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 1c9a2ab567..413006bdd5 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -888,7 +888,6 @@ static void ReplaceAllDistinct(std::string &str, const std::string &oldValue, co } } - .02 static void ParseOptions(const Json::Value &rootValue, panda::pandasm::Program &prog) { GenerateESCallTypeAnnotationRecord(prog); -- Gitee From a7c8dc4ceddda74af226ee7ba796c2f5e0419bc0 Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Tue, 4 Jan 2022 10:19:56 +0800 Subject: [PATCH 13/21] delete debug info Change-Id: Ia7e77d2b83f7a82a71e69132027ab0861bd17f38 Signed-off-by: zhangrengao --- ts2panda/src/base/typeSystem.ts | 5 +++-- ts2panda/src/ts2panda.ts | 2 +- ts2panda/src/typeChecker.ts | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index be5d7d4bb2..f8ee435600 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -47,7 +47,8 @@ export enum L2Type { UNION, ARRAY, OBJECT, // object literal - EXTERNAL + EXTERNAL, + INTERFACE } export enum ModifierAbstract { @@ -817,7 +818,7 @@ export class InterfaceType extends BaseType { let classTypeBuf = new LiteralBuffer(); let classTypeLiterals: Array = new Array(); // the first element is to determine the L2 type - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.CLASS)); + classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.INTERFACE)); classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); this.heritages.forEach(heritage => { diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index 37967fc5bb..9ab2909393 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -208,7 +208,7 @@ export class Ts2Panda { }) } - let declareddTypes = PandaGen.getExportedTypes(); + let declareddTypes = PandaGen.getDeclaredTypes(); let declaredSymbol2Types = declareddTypes.size == 0 ? undefined : new Array(); if (funcName == "func_main_0") { declareddTypes.forEach((type: number, symbol: string) => { diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index 463ef84bfa..22022c9aaa 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -294,7 +294,6 @@ export class TypeChecker { case ts.SyntaxKind.InterfaceDeclaration: if (isGlobalDeclare()) { let interfaceDeclNode : ts.InterfaceDeclaration = ts.getOriginalNode(node); - console.log(interfaceDeclNode); let interfaceType = new InterfaceType(interfaceDeclNode); let interfaceName = interfaceDeclNode.name; if (interfaceName) { -- Gitee From a5eb7a8adfe3818917f49cd767f0be5bf2b3bb17 Mon Sep 17 00:00:00 2001 From: ctw Date: Tue, 4 Jan 2022 10:08:45 +0800 Subject: [PATCH 14/21] fix small bug of literal index Change-Id: I2ead598fbae687ff8f764d13ec3dc9543cfec519 Signed-off-by: ctw --- ts2panda/src/statement/classStatement.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts2panda/src/statement/classStatement.ts b/ts2panda/src/statement/classStatement.ts index 6edc3b9d15..982d1ab35d 100644 --- a/ts2panda/src/statement/classStatement.ts +++ b/ts2panda/src/statement/classStatement.ts @@ -236,7 +236,7 @@ function createClassLiteralBuf(compiler: Compiler, classBuffer: LiteralBuffer, let pandaGen = compiler.getPandaGen(); let parameterLength = getParameterLength4Ctor(stmt); - let buffIdx = classLiteralBuf.length; + let buffIdx = classLiteralBuf.length - 1; pandaGen.defineClassWithBuffer(stmt, internalName, buffIdx, parameterLength, vregs[0]); pandaGen.storeAccumulator(stmt, vregs[1]); } -- Gitee From 3f2326b594503fd0747db08ecb3120960a2908e4 Mon Sep 17 00:00:00 2001 From: zhuoli72 Date: Tue, 4 Jan 2022 00:16:11 +0800 Subject: [PATCH 15/21] Add object type support Signed-off-by: zhuoli72 Change-Id: I098deb7ed3cf594fd36032fb75fa94997d74f8d3 --- ts2panda/src/base/typeSystem.ts | 59 +++++++++++++++++---------------- ts2panda/src/typeChecker.ts | 11 ++++-- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index f8ee435600..46f8935cb0 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -642,24 +642,6 @@ export class ArrayType extends BaseType { } } - getReferencedType(typeNode: ts.Node) { - let elementNode = (typeNode).elementType; - let typeIndex = this.typeChecker.checkDeclarationType(elementNode); - if (typeIndex) { - return typeIndex; - } else if (elementNode.kind == ts.SyntaxKind.TypeReference) { - let typeName = elementNode.getChildAt(0); - let typeDecl = this.typeChecker.getTypeDeclForInitializer(typeName, false); - if (typeDecl) { - typeIndex = this.typeChecker.checkForTypeDecl(typeName, typeDecl, false, true); - } else { - typeIndex = 0; - } - return typeIndex; - } - return 0; - } - hasArrayTypeMapping(referedTypeIndex: number) { return this.typeRecorder.hasArrayTypeMapping(referedTypeIndex); } @@ -673,28 +655,47 @@ export class ArrayType extends BaseType { } transfer2LiteralBuffer(): LiteralBuffer { - let classInstBuf = new LiteralBuffer(); - let classInstLiterals: Array = new Array(); - classInstLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.ARRAY)); - classInstLiterals.push(new Literal(LiteralTag.INTEGER, this.referedTypeIndex)); - classInstBuf.addLiterals(...classInstLiterals); - return classInstBuf; + let arrayBuf = new LiteralBuffer(); + let arrayLiterals: Array = new Array(); + arrayLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.ARRAY)); + arrayLiterals.push(new Literal(LiteralTag.INTEGER, this.referedTypeIndex)); + arrayBuf.addLiterals(...arrayLiterals); + return arrayBuf; } } -export class ObjectLiteralType extends BaseType { +export class ObjectType extends BaseType { private properties: Map = new Map(); - private methods: Array = new Array(); + typeIndex: number = PrimitiveType.ANY; + shiftedTypeIndex: number = PrimitiveType.ANY; - constructor(obj: ts.ObjectLiteralExpression) { + constructor(objNode: ts.TypeLiteralNode) { super(); + this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; + this.fillInMembers(objNode); + this.setTypeArrayBuffer(this, this.typeIndex); + } - // TODO extract object info here + fillInMembers(objNode: ts.TypeLiteralNode) { + for (let member of objNode.members) { + let propertySig = member; + let name = member.name? member.name.getText() : "#undefined"; + let typeIndex = this.typeChecker.getOrCreateRecordForTypeNode(propertySig.type); + this.properties.set(name, typeIndex); + } } transfer2LiteralBuffer(): LiteralBuffer { let objTypeBuf = new LiteralBuffer(); - + let objLiterals: Array = new Array(); + objLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.OBJECT)); + objLiterals.push(new Literal(LiteralTag.INTEGER, this.properties.size)); + this.properties.forEach((typeIndex, name) => { + objLiterals.push(new Literal(LiteralTag.STRING, name)); + objLiterals.push(new Literal(LiteralTag.INTEGER, typeIndex)); + }); + objTypeBuf.addLiterals(...objLiterals); return objTypeBuf; } } diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index 22022c9aaa..f51a49940a 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -6,7 +6,8 @@ import { UnionType, ArrayType, FunctionType, - InterfaceType + InterfaceType, + ObjectType } from "./base/typeSystem"; import { ModuleStmt } from "./modules"; import { TypeRecorder } from "./typeRecorder"; @@ -91,7 +92,10 @@ export class TypeChecker { return typeIndex; } - public getOrCreateRecordForTypeNode(typeNode: ts.TypeNode) { + public getOrCreateRecordForTypeNode(typeNode: ts.TypeNode | undefined) { + if (!typeNode) { + return PrimitiveType.ANY; + } let typeIndex = PrimitiveType.ANY; typeIndex = this.checkDeclarationType(typeNode); if (typeIndex == PrimitiveType.ANY && typeNode.kind == ts.SyntaxKind.TypeReference) { @@ -137,6 +141,9 @@ export class TypeChecker { return unionType.shiftedTypeIndex; } return PrimitiveType.ANY; + case ts.SyntaxKind.TypeLiteral: + let objectType = new ObjectType(typeNode); + return objectType.shiftedTypeIndex; default: return PrimitiveType.ANY; } -- Gitee From 91fba4cd37473656632e9151e9c9b0e9b78c2a8a Mon Sep 17 00:00:00 2001 From: zhuoli Date: Tue, 4 Jan 2022 14:19:30 +0800 Subject: [PATCH 16/21] Fix test262 URL and disable debug log and local tests Signed-off-by: zhuoli Change-Id: I8210ab8ef0275cf3edf29483228ce10411be96e6 --- local_test/buffer.txt | 99 ---- local_test/constructor.txt | 425 -------------- local_test/import_test/.out.txt.swp | Bin 16384 -> 0 bytes local_test/import_test/out.txt | 226 -------- local_test/import_test/package.json | 12 - .../import_test/test_another_export.abc | Bin 1500 -> 0 bytes local_test/import_test/test_another_export.ts | 13 - .../test_another_simpler_export.abc | Bin 816 -> 0 bytes .../test_another_simpler_export.ts | 3 - local_test/import_test/test_export.abc | Bin 2056 -> 0 bytes local_test/import_test/test_export.ts | 47 -- local_test/import_test/test_import.abc | Bin 1100 -> 0 bytes local_test/import_test/test_import.ts | 43 -- .../import_test/test_simpler_export.abc | Bin 800 -> 0 bytes local_test/import_test/test_simpler_export.ts | 3 - local_test/out_full_standartd.txt | 548 ------------------ local_test/test.abc | Bin 852 -> 0 bytes local_test/test.ts | 9 - local_test/test_after.txt | 142 ----- local_test/test_before.txt | 116 ---- local_test/test_c.abc | Bin 896 -> 0 bytes local_test/test_c.ts | 10 - local_test/test_classExpression.abc | Bin 724 -> 0 bytes local_test/test_classExpression.ts | 13 - local_test/test_engine.abc | Bin 1908 -> 0 bytes local_test/test_engine.ts | 51 -- local_test/test_full.abc | Bin 2020 -> 0 bytes local_test/test_full.ts | 34 -- local_test/test_full.txt | 548 ------------------ local_test/test_full_alt.ts | 33 -- local_test/test_full_non-type.abc | Bin 1336 -> 0 bytes local_test/test_primi.abc | Bin 1056 -> 0 bytes local_test/test_primi.ts | 19 - local_test/test_try/export.abc | Bin 424 -> 0 bytes local_test/test_try/export.ts | 1 - local_test/test_try/import.ts | 3 - local_test/tmp/build/test_another_export.js | 19 - .../tmp/build/test_another_simpler_export.js | 6 - local_test/tmp/build/test_export.js | 42 -- local_test/tmp/build/test_import.js | 29 - local_test/tmp/build/test_simpler_export.js | 6 - test262/config.py | 12 +- ts2panda/src/cmdOptions.ts | 2 +- ts2panda/src/ts2panda.ts | 12 +- ts2panda/src/typeRecorder.ts | 30 +- 45 files changed, 28 insertions(+), 2528 deletions(-) delete mode 100644 local_test/buffer.txt delete mode 100644 local_test/constructor.txt delete mode 100644 local_test/import_test/.out.txt.swp delete mode 100644 local_test/import_test/out.txt delete mode 100644 local_test/import_test/package.json delete mode 100644 local_test/import_test/test_another_export.abc delete mode 100644 local_test/import_test/test_another_export.ts delete mode 100644 local_test/import_test/test_another_simpler_export.abc delete mode 100644 local_test/import_test/test_another_simpler_export.ts delete mode 100644 local_test/import_test/test_export.abc delete mode 100644 local_test/import_test/test_export.ts delete mode 100644 local_test/import_test/test_import.abc delete mode 100644 local_test/import_test/test_import.ts delete mode 100644 local_test/import_test/test_simpler_export.abc delete mode 100644 local_test/import_test/test_simpler_export.ts delete mode 100644 local_test/out_full_standartd.txt delete mode 100644 local_test/test.abc delete mode 100644 local_test/test.ts delete mode 100644 local_test/test_after.txt delete mode 100644 local_test/test_before.txt delete mode 100644 local_test/test_c.abc delete mode 100644 local_test/test_c.ts delete mode 100644 local_test/test_classExpression.abc delete mode 100644 local_test/test_classExpression.ts delete mode 100644 local_test/test_engine.abc delete mode 100644 local_test/test_engine.ts delete mode 100644 local_test/test_full.abc delete mode 100644 local_test/test_full.ts delete mode 100644 local_test/test_full.txt delete mode 100644 local_test/test_full_alt.ts delete mode 100644 local_test/test_full_non-type.abc delete mode 100644 local_test/test_primi.abc delete mode 100644 local_test/test_primi.ts delete mode 100644 local_test/test_try/export.abc delete mode 100644 local_test/test_try/export.ts delete mode 100644 local_test/test_try/import.ts delete mode 100644 local_test/tmp/build/test_another_export.js delete mode 100644 local_test/tmp/build/test_another_simpler_export.js delete mode 100644 local_test/tmp/build/test_export.js delete mode 100644 local_test/tmp/build/test_import.js delete mode 100644 local_test/tmp/build/test_simpler_export.js diff --git a/local_test/buffer.txt b/local_test/buffer.txt deleted file mode 100644 index 9841813e42..0000000000 --- a/local_test/buffer.txt +++ /dev/null @@ -1,99 +0,0 @@ -{ literalBuffer: [ { tag: 2, value: 4 }, { tag: 2, value: 10 } ] } -{ - literalBuffer: [ - { tag: 2, value: 0 }, { tag: 2, value: 0 }, - { tag: 2, value: 3 }, { tag: 2, value: 52 }, - { tag: 2, value: 54 }, { tag: 2, value: 56 }, - { tag: 2, value: 2 }, { tag: 5, value: 'c' }, - { tag: 2, value: 3 }, { tag: 2, value: 2 }, - { tag: 2, value: 0 }, { tag: 5, value: 'd' }, - { tag: 2, value: 54 }, { tag: 2, value: 1 }, - { tag: 2, value: 0 }, { tag: 2, value: 2 }, - { tag: 5, value: 'a' }, { tag: 2, value: 1 }, - { tag: 2, value: 0 }, { tag: 2, value: 0 }, - { tag: 5, value: 'b' }, { tag: 2, value: 3 }, - { tag: 2, value: 1 }, { tag: 2, value: 1 }, - { tag: 2, value: 2 }, { tag: 2, value: 57 }, - { tag: 2, value: 58 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 2, value: 53 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 2, value: 55 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'getA' }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 1 }, - { tag: 5, value: 'calSqur' }, - { tag: 2, value: 2 }, - { tag: 2, value: 1 }, - { tag: 2, value: 3 }, - { tag: 2, value: 54 } - ] -} -{ literalBuffer: [ { tag: 2, value: 1 }, { tag: 2, value: 51 } ] } diff --git a/local_test/constructor.txt b/local_test/constructor.txt deleted file mode 100644 index d7d93edc9f..0000000000 --- a/local_test/constructor.txt +++ /dev/null @@ -1,425 +0,0 @@ --------- source file -------- -"use strict"; -class AA { - constructor() { - this.a = 4; - } -} -function newYigeClass() { - let bigC = new AA(); -} - -*>*>*>*>*>*>**>* js constru <*<*<*<*<*<*<*<* -NodeObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536870912, - parent: SourceFileObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536871168, - parent: undefined, - kind: 290, - statements: [ - [Circular], - [NodeObject], - [NodeObject], - pos: 0, - end: 91, - hasTrailingComma: undefined, - transformFlags: 537985280 - ], - endOfFileToken: TokenObject { - pos: 91, - end: 92, - flags: 0, - modifierFlagsCache: 0, - transformFlags: 536870912, - parent: [SourceFileObject], - kind: 1 - }, - fileName: 'test.ts', - path: '/home/zhuoli/code/L2_up2date/ark/ts2abc/local_test/test.ts', - text: 'class AA {\n' + - ' public a:number = 4;\n' + - '}\n' + - '\n' + - 'function newYigeClass() {\n' + - ' let bigC = new AA();\n' + - '}\n', - isDeclarationFile: false, - referencedFiles: [], - typeReferenceDirectives: [], - hasNoDefaultLib: false, - libReferenceDirectives: [], - amdDependencies: [], - languageVariant: 0, - languageVersion: 2, - scriptKind: 3, - identifiers: Map { - 'AA' => 'AA', - 'a' => 'a', - 'newYigeClass' => 'newYigeClass', - 'bigC' => 'bigC' - }, - nodeCount: 18, - identifierCount: 5, - symbolCount: 5, - parseDiagnostics: [], - bindDiagnostics: [], - classifiableNames: Map { 'AA' => true }, - imports: [], - moduleAugmentations: [], - pragmas: Map {}, - original: SourceFileObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 541065472, - parent: undefined, - kind: 290, - statements: [Array], - endOfFileToken: [TokenObject], - fileName: 'test.ts', - path: '/home/zhuoli/code/L2_up2date/ark/ts2abc/local_test/test.ts', - text: 'class AA {\n' + - ' public a:number = 4;\n' + - '}\n' + - '\n' + - 'function newYigeClass() {\n' + - ' let bigC = new AA();\n' + - '}\n', - isDeclarationFile: false, - referencedFiles: [], - typeReferenceDirectives: [], - hasNoDefaultLib: false, - libReferenceDirectives: [], - amdDependencies: [], - languageVariant: 0, - languageVersion: 2, - scriptKind: 3, - identifiers: [Map], - nodeCount: 18, - identifierCount: 5, - symbolCount: 5, - parseDiagnostics: [], - bindDiagnostics: [], - classifiableNames: [Map], - imports: [], - moduleAugmentations: [], - pragmas: Map {}, - original: [SourceFileObject] - }, - lineMap: [ - 0, 11, 36, 38, - 39, 65, 90, 92 - ] - }, - kind: 226, - expression: TokenObject { - pos: -1, - end: -1, - flags: 8, - modifierFlagsCache: 0, - transformFlags: 536870912, - parent: undefined, - kind: 10, - text: 'use strict' - }, - emitNode: { startsOnNewLine: true } -} -*>*>*>*>*>*>**>* js constru <*<*<*<*<*<*<*<* -NodeObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536875008, - parent: NodeObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536875008, - parent: NodeObject { - pos: 0, - end: 92, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536875008, - parent: [NodeObject], - kind: 162, - decorators: undefined, - modifiers: undefined, - typeParameters: undefined, - parameters: [Array], - type: undefined, - body: [Circular], - original: undefined, - emitNode: [Object] - }, - kind: 223, - statements: [ - [Circular], - pos: 10, - end: 35, - hasTrailingComma: undefined, - transformFlags: 536875008 - ], - multiLine: true - }, - kind: 226, - expression: NodeObject { - pos: -1, - end: -1, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536875008, - parent: undefined, - kind: 209, - left: NodeObject { - pos: 21, - end: 23, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 536875008, - parent: undefined, - kind: 194, - expression: [TokenObject], - name: [IdentifierObject], - emitNode: [Object] - }, - operatorToken: TokenObject { - pos: -1, - end: -1, - flags: 8, - modifierFlagsCache: 0, - transformFlags: 0, - parent: undefined, - kind: 62 - }, - right: TokenObject { - pos: 32, - end: 34, - flags: 0, - modifierFlagsCache: 0, - transformFlags: 536870912, - parent: [NodeObject], - kind: 8, - text: '4', - numericLiteralFlags: 0, - id: 16 - } - }, - emitNode: { - sourceMapRange: NodeObject { - pos: 10, - end: 35, - flags: 0, - modifierFlagsCache: 536870916, - transformFlags: 541065217, - parent: [NodeObject], - kind: 159, - decorators: undefined, - modifiers: [Array], - name: [IdentifierObject], - questionToken: undefined, - type: [TokenObject], - initializer: [TokenObject], - symbol: [SymbolObject] - }, - commentRange: NodeObject { - pos: 10, - end: 35, - flags: 0, - modifierFlagsCache: 536870916, - transformFlags: 541065217, - parent: [NodeObject], - kind: 159, - decorators: undefined, - modifiers: [Array], - name: [IdentifierObject], - questionToken: undefined, - type: [TokenObject], - initializer: [TokenObject], - symbol: [SymbolObject] - } - }, - original: NodeObject { - pos: 10, - end: 35, - flags: 8, - modifierFlagsCache: 536870912, - transformFlags: 541065216, - parent: undefined, - kind: 159, - decorators: undefined, - modifiers: [ - pos: 10, - end: 21, - hasTrailingComma: undefined, - transformFlags: 536870912 - ], - name: IdentifierObject { - pos: 21, - end: 23, - flags: 0, - modifierFlagsCache: 0, - transformFlags: 536870912, - parent: [NodeObject], - kind: 75, - escapedText: 'a', - flowNode: [Object] - }, - questionToken: undefined, - exclamationToken: undefined, - type: undefined, - initializer: TokenObject { - pos: 32, - end: 34, - flags: 0, - modifierFlagsCache: 0, - transformFlags: 536870912, - parent: [NodeObject], - kind: 8, - text: '4', - numericLiteralFlags: 0, - id: 16 - }, - original: NodeObject { - pos: 10, - end: 35, - flags: 0, - modifierFlagsCache: 536870916, - transformFlags: 541065217, - parent: [NodeObject], - kind: 159, - decorators: undefined, - modifiers: [Array], - name: [IdentifierObject], - questionToken: undefined, - type: [TokenObject], - initializer: [TokenObject], - symbol: [SymbolObject] - }, - emitNode: { commentRange: [NodeObject], sourceMapRange: [NodeObject] } - } -} -=========== NodeKind ===========: 245 -class AA { - public a:number = 4; -} -=========== currIndex ===========: 0 -LiteralBuffer { - literalBuffer: [ - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 1 }, - Literal { tag: 5, value: 'a' }, - Literal { tag: 2, value: 1 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 } - ] -} -============================== -type2Index: Map { 0 => 0 } -variable2Type: Map { 21 => 1, 72 => 0 } -============================== -bigC -/////// hoist pos ////////// - -37 ---node.text-- function newYigeClass() { - let bigC = new AA(); -} ---node.pos-- 37 ---node.type-- 77 -/////// decls pos ////////// - -0 -//// class decl //// ---node.text-- class AA { - public a:number = 4; -} - -function newYigeClass() { - let bigC = new AA(); -} - ---node.pos-- 0 ---node.type-- 50 -////////// methods ////////// -0 -////////// methods ////////// -37 -/////// decls pos ////////// - -72 -//// let decl //// ---node.text-- bigC ---node.pos-- 72 ---node.type-- 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - #1#AA -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: bigC -==== bindVreg typeIndex ====: 50 -\\\-= funcNmae =-\\\ - newYigeClass -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 3 -\\\\\\ vreg type \\\\\ 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - func_main_0 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 --=-=-=-length=-=-=-=-=-= -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 5, value: 'a' }, - { tag: 2, value: 1 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/import_test/.out.txt.swp b/local_test/import_test/.out.txt.swp deleted file mode 100644 index d4370267716e8bc7aecf93677da99d9601a9c6b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWl0n7{?EYpeUDA2qY#l79Wt%-Cjae3XyG#h!lzx8;uX^ba&dW?4|C`0;Q=& zq8RA|UP6co5np^zykIbj#sqvYMu}V`CPJbw3J(TCKr2u|fhnS)zOL3OG`IRrYX!6dS^=$q zRzNGD70?Q31+)VHCk5=@@!}a8G+s7poBSL%VPSOhcS_gjTH4aeXecm=jV z79NB9Aq;b1BAmGe+i(;k!gk0* z9NJ($Oos_@j@bAb_QD%52wmXB%t}y4O}RtZeZAHq!>~3v?{gTjq?yYZk#xrHv9it1 zNt4k(pb8aT7ir!V;ZC)c+Fy~**=9OsHH~E@iO$N_J^fut zBR=813rcb2ZDf?}CCti(%J!Y#O@Dkul()qf%Lj?9A#Qb<`Q(sDZ1FC-GV~8Lif~v3 zY;p0pg@9SpPGr(KAB$rEcr&Cti zHfmHM87xdoSI14OFX6Qe2{RcRNy|3Wm}@eY7-?%`af+OGccW^PzidR7^+vB#$aCF0 zmyXwm>WxG?nMhkk+Dut->1z(}JIrjt>`YqiwrN{Vi-_qGEpX*Pg`!Ay>sVH(qpn;X zZn>5#!^WwgUTL|~>f4yf#tS2<-|HXMPtAszlj+|WXf(J}I&T?f+VI{Gq(N?@9lLcj z)!)WMy4%>0Fb&fwlFwPbdSvf970AKi@0$UmE1O9f)uC{yQB~-R{-R!r7y)ma@2k~| zsS4G(O{+7qR*lyMURz~6`n466JTN%?qo}E%aI?7Ty9H`q^^`XH)%j>;E3Y+$Eajyq z>v|?)e@^wcvoKjC>;Q97iF_fSVxrMZ=aW{ zxaJv?!=l+|PF+$>E}WO2X{A_WV6rF$`8(J@;}%_4ZWmvy==;bkDkSpCGvOF?px52L z?(;4v6_j&<1EPXGX?=Kdx;ME~hYS?&g7Q(G1+^*T(VGQSa%(A?XjR^lMO8&IB>ZJ7 z_u0q;W3(c$Vvh4ybghnd*8g9yevGgdb=Lpt_x($(?@z%Y_yBgpcF4oy&<0CkDqLiJ z{{tL`UEu5iY=mxD1r2ZqOofZA?N7otupeH9KInpJ@VB#;hoi6;-iMvA6;{J6aMt)o zU=Q>_H?+fDFa^%DcK;O)!d@7JDAYn2Cc!1v@F(D7_y~5v3y_6X&;avbHvGjp{%1G> z2jER`*8I;x5}Y-E4a|Yba0)FC!RN3Kc0fO*APSDwOFmKr8ScR-n|@=IB1$ z#N4%a1)H(!Sus_7aCR$i9?J)#Sgf-3;43Hp<6Ho@gBy+q@w4pX;ix^escjhfFl&@( z0Q&{f4^>EhHme;XbuRaB^yZdQb?AUY%KDJr+{)?AtzrDXvb$;Mjlja@mfEe1B<;%C zZsb{n{jDGslt>x@cDMrkdKKJoJQm>Rsv&928=WQA?N@$6l$lMf@j1<-h&zc5M|x>y Z1iK3Hm>HmlhoO_Vl@ZAKVOYh;Aa!M6U?^f>Vk`p#Q)SMxleR{v#mag2`rPlkd4BWi?37AGsSW8B z1piGW+Je#r2*5=^0=B?6LtX_qpaMLF!hAnLe&>mHfMEpP16F|z;0y2@=#3GL0e#Si z02aq;fg%rJauZA0qqZM@cf0^=kNq{q@xM$qYW`dovIq#8&MH~1i2rBl}i z3;m|muZM;EjY`ojxg@U`u1d0{7YtMwPao2PN_}iAGxkzBZ(ubhuzSpcV`IRN-mtOY zwZn8mCrT}st*lniO-nmVof+*)W^Pi=)Z<7(P%ud>3GNbx%#-*QLi)i5&P)S==~rlK z!#}cbvI0{NI7D5Kn3@kpEksNg0@K|v>UqSp7?@s!ruTcMogJdroRYH(hVm#^w)3Wv z#padFh*mC+Ea|SH=%xFL>x}4&StW00^}Oa9j;ojjHsMfbgjOHD7LNXm>jdYDMSb-%rUKw%#NA2>k?^N0&L(0g8#%G#FWmdaVzE(PDr-|lP-`|hoc zH2c)QwDzOjke2xKSdQ-TKZ_=iOl0j!CVG;QKB&=XB_Y`4@kx)9JxcgZwYcA2lf0PZ z7dc{~@mNh*6a3Z3hze+d<=CTlp$9Zk@&Jv~5Yjv~9iX?N`yDdZ#kF(Cp^H^x@Y@JSMwb+z4~aw@bzfZZeL(;)s6)Zi+%Dx{iCC#h zjbc@?rG-lfC!@Pt<7=WPh}}0(%CF?G3iZ&>nV;A&Uln4e-6n?XFyLT5MCd80JP$Yt>+<1^GY4)O+Vq+A=Dln{FO9gYio4G_R4@Ds4W5(gZjNni=s1T?@J_iKRn>J)kn=5HV1GG?S!JuH}e zzJ#EGec(o@?mT?-e5ivo%}iwCEM2C{0qnlcSCgnHR_WS&Xa4WVt#gs?`I0VO<+khD z)+o_f^)hzFJc38zzrMnw!JUqaI*I1CM`=$DqBvEHG!v@3;YK$IPwGgbj!PD>v_uNe zA@?1~`-Y{GzJOceM=ecYlQZe#pVHi^M90TO?}gvb2HJnoA7x4G_b{vY<=`7Kc9DIb~7s;BIuVq-~0db z{movq&d*px^d$ccW|Fg6qGw>rfC8L|=^q&)4g48E0&W5O<;eFk=n|Y=;1@su2U0}y z!27@^@Fj2$_yo2N@D*?u_zw6U_z8H1oLnDnbQeHLdI0cv0&rcXC>Q#2UGCu!VynQP z;GY6N0AB;Qfs4?O*XpwiZ(U!rEyrnj4X@d9j+0>?HJ9w=#`=nPibfY&tM;jtM!S91 zX?v70kC>$QbfmMk;VjxGY1BfBtF{|DL!4>0y{5D1g>t{uqC#ANMjKJo?6tL)>(RvI zlxMfSdaSM6kviuzR&COHUFE~1vos$2&BX0;pA;D_+Gid#`IZzh0W;=2s zV|m?KtgkkjPJNp6TK#nG!bz(Z$59sk9P&1%tn?VCEmQiYN~BKliL>cW!}H5pF@x^l_i5oHX6(Gu;nO9q5qoVV~*OWYo`nrfS$>+{V*B6SvuG<3-Oz&z}?R z2@f~g^GUBA-e)<@OUq#zVg}g3)N}jy%nqykw{HA!Wo#$OhcW$MxsUBUx1nq*5~R9JI<}}mCg!rjU4~CA<;2E$NIBs$5gQy1fr;37 zGZL7@?gL`u14skH{T#$Emc^Pv1L%IF7-$_$Y_e~tPSapQ{aIHn)2@X2x2{^Ed_w&# z)SYsmSC|P(VoomwnqSn!dopRkF5wR0_Hti3$G8k`5{Q1BV>NEp=kB zGFA4BVZ$)?m8zy8y$n6g14t24egrJ@H-`t`HkSEiF~t`oq>R7r{lu%JFa~Ny+~xDz^5p7DXr+ZTp3?deM;kU zrF=#1C|~euNnjKxwWa1?4I2w9{Cy?eY)i;^X**&h5xt+X$^ldv@THtjSyah%B?i?+iSNlD{jQjvX>Ic#uB_qw1BcU7V;zLU+IKgX#fBK diff --git a/local_test/import_test/test_export.ts b/local_test/import_test/test_export.ts deleted file mode 100644 index 31db216ab2..0000000000 --- a/local_test/import_test/test_export.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - AnotherClassB, - AnotherClassB as ClassC -} from "./test_another_export"; - -class DistinctClass{ - name: string = "I'm in export"; -} - -// --- 1. ExportDeclaration --- -// 1.1 re-export -export * as anotherExport from "./test_another_export"; -export { - AnotherClassA, - AnotherClassB, - DistinctClass -} from "./test_another_export"; -export { default as anotherDefaultClass} from "./test_another_export"; - - -// 1.2 named exporting via a clause -class ClassE{}; -export { ClassE }; -export { ClassC, ClassC as ClassD }; // exporte an imported class - -// --- 2. ExportKeyword --- -// 2.1 inline named exports - ClassDeclaration -export class ClassF {}; -// export default class {} - -// 2.2 inline named exports - VariableStatements -class ClassA {}; -export let InstanceA = new ClassA(); -export let InstanceB = new AnotherClassB(); -export let SomeClass = class {}; -export let SomeClassInst = new class {}; -// export default cLass AnotherDefaultClass{}; - -// --- 3. ExportAssignment - default export --- -class defaultC {} -export default defaultC; - -// 4. VariableStatement/ClassExpression - - -//// export class as member of obj -// export default {defaultC, ClassA} diff --git a/local_test/import_test/test_import.abc b/local_test/import_test/test_import.abc deleted file mode 100644 index eecdb5cc3dfd282fbd19345b01c1b32982d440d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1100 zcmd^8zl+pB6n>Mv>?XH+xH(x46cMoyMb;}UgtLi1P$B0jij75x$($zaWzWqVYPs!# zV&NaK8ab}Eun;Un1+}rUwiK%qv9J(~-3-j7UX-(K*~pYn<5?N7M~ zv4R<*Ei8IK12_%{;4JoCR^tz#M-kxM5%ekW3it##7SSOf0CM0y@C4vo?vIBa0BnzI z(TY;7Nd2q#BLofv;pt14@2pEd&xa~f=`dd+J5GR@T1kA3DW=^%qBrE|%)XEp%xmDo5V=j z%V$|0CL03@mP`5*gdm)oKjA79TrVx^BwASA$m4J=O7n1$b_U^@VC94#m^u=u%sEwY^QWM<1y^Z(kMq1}zR+{F`)m0sNc(uZ(Wvji9MDKNa4Tx>dW} zQQh=#xn;xXOlg}{(`d`6W7IV|Tei)rQ;omiimT!yxSXqQy@$?K5E=ggif<~JvI?@hKQndpAaw25w(Vbtu+Mz7bS zUC5(l0L``XEU?c*#m0leW&^z6WCzx&g&dXnhaj!_eI O7>!@zB^MEU2>k{1G^uR> diff --git a/local_test/import_test/test_import.ts b/local_test/import_test/test_import.ts deleted file mode 100644 index 7e508de8fa..0000000000 --- a/local_test/import_test/test_import.ts +++ /dev/null @@ -1,43 +0,0 @@ -// 1. default import -import DefaultClassA from "./test_export.js"; - -// 2. namespace import -import * as Imported from "./test_export.js"; -import { anotherExport as anotherImport } from "./test_export.js"; - -// 3. named import -import { - InstanceA, - InstanceB, -} from "./test_export.js"; - -// 3.1 rename imports: -import { - ClassD as ClassDDD, - default as defaultAlt, - anotherDefaultClass as defualtClassAlt -} from "./test_export.js"; - -// 4. empty import -import "./test_export.js"; - -// 5. combining default import with namespace: -import DefaultClassB, * as importedAlt from "./test_export.js"; - -// 6. combining default with named imports: -import DefaultClassC, {ClassC, ClassE} from "./test_export.js"; - -///////////// -let da = DefaultClassA; -let ita = Imported.AnotherClassA; -let ae = anotherImport.AnotherClassA -let ia = InstanceA; -let ib = InstanceB; -let cddd = ClassDDD; -let dat = defaultAlt; -let dcat = defualtClassAlt; -let dcb = DefaultClassB -let italt = importedAlt.AnotherClassA; -let dcc = DefaultClassC; -let cc = ClassC; -let cd = ClassE; \ No newline at end of file diff --git a/local_test/import_test/test_simpler_export.abc b/local_test/import_test/test_simpler_export.abc deleted file mode 100644 index 3e8c3ea58a07cd0bc982f69b358f818400af5a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmaiyziSjh6vyAp-2S>my>JGTA}C&=jXx6YVzX-0;^HY03lWyXO!V+>_t@QlTB?77 zSOkmVR;)#^4A|HU31}r)iA})5#=`OYb}vS-aN#rW*Szn%-Pvp5)r%n!Eq&U20wa$o zA_Hd{z@>9zdk}#G{|XS`Huw$rIi~GhdPYoB=6?EBwnPsm1Lkh`8}Op=y$V>njBZ|Y-^#l7d2b+tui0d zzOg;bg3HP3dS7GJi#QvT2p*2-n8BGGPW7^C6CGMxkMBf-ZZD2bQ?ngiZg^bKHMt?PjX)VvnGgXvn~IM>R3EXM}6W!PGUQcxv!LGY;1yNC#a^y00T@q0-Nf(E|%-n{Sq%1dsyZe42;(f9o~_ds$* z5g8bD047}qB+$mC1ilFfU=8>M7~mWnPl4yaXBLq#2C&BU9Pl2%(ldac7Xa5iW&@k+ zajjKg2iOD7wmaAFtn6+Fttg81y6(l%JdK3$7S+0Ol*VB|Dy4cq4VtM=dRRh17cIQTW>1wNelt&UtyrLQ8c%qS4DZK)@`&>?;)>p76z7LW38llYUpnNzpgg zFCFQ5UPV17BS(#>8mibzR<7{{~Q{Cx$LolFgteex4-oAQ|{ zR8QW l965Ae`(pF~KAt+1P2s`&-)_A9Vv3^EX*iZ&qTLA?e*ikijH& 0 } -variable2Type: Map { 72 => 0 } -============================== -bigC -/////// hoist pos ////////// - -37 ---node.text-- function newYigeClass() { - let bigC = new AA(); -} ---node.pos-- 37 ---node.type-- 77 -/////// decls pos ////////// - -0 -//// class decl //// ---node.text-- class AA { - public a:number = 4; -} - -function newYigeClass() { - let bigC = new AA(); -} - ---node.pos-- 0 ---node.type-- 50 -////////// methods ////////// -0 -////////// methods ////////// -37 -/////// decls pos ////////// - -72 -//// let decl //// ---node.text-- bigC ---node.pos-- 72 ---node.type-- 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - #1#AA -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: bigC -==== bindVreg typeIndex ====: 50 -\\\-= funcNmae =-\\\ - newYigeClass -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 3 -\\\\\\ vreg type \\\\\ 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - func_main_0 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 --=-=-=-length=-=-=-=-=-= -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { - tag: 5, - value: 'class AA {\n' + - ' public a:number = 4;\n' + - '}\n' + - '\n' + - 'function newYigeClass() {\n' + - ' let bigC = new AA();\n' + - '}\n' - }, - { tag: 2, value: 1 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/test_before.txt b/local_test/test_before.txt deleted file mode 100644 index 26c7825a76..0000000000 --- a/local_test/test_before.txt +++ /dev/null @@ -1,116 +0,0 @@ --------- source file -------- -class AA { - public a: number = 4; -} -function newYigeClass() { - let bigC = new AA(); -} - -=========== NodeKind ===========: 245 -class AA { - public a:number = 4; -} -=========== currIndex ===========: 0 -LiteralBuffer { - literalBuffer: [ - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 1 }, - Literal { tag: 5, value: 'a' }, - Literal { tag: 2, value: 1 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 }, - Literal { tag: 2, value: 0 } - ] -} -============================== -type2Index: Map { 0 => 0 } -variable2Type: Map { 21 => 1, 72 => 0 } -============================== -bigC -/////// hoist pos ////////// - -37 ---node.text-- function newYigeClass() { - let bigC = new AA(); -} ---node.pos-- 37 ---node.type-- 77 -/////// decls pos ////////// - -0 -//// class decl //// ---node.text-- class AA { - public a:number = 4; -} ---node.pos-- 0 ---node.type-- 50 -////////// methods ////////// -0 -////////// methods ////////// -37 -/////// decls pos ////////// - -72 -//// let decl //// ---node.text-- bigC ---node.pos-- 72 ---node.type-- 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - #1#AA -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: bigC -==== bindVreg typeIndex ====: 50 -\\\-= funcNmae =-\\\ - newYigeClass -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 3 -\\\\\\ vreg type \\\\\ 50 -==== bindVreg var Name ====: 4funcObj -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: 4newTarget -==== bindVreg typeIndex ====: 77 -==== bindVreg var Name ====: this -==== bindVreg typeIndex ====: 77 -\\\-= funcNmae =-\\\ - func_main_0 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 --=-=-=-length=-=-=-=-=-= -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 5, value: 'a' }, - { tag: 2, value: 1 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/test_c.abc b/local_test/test_c.abc deleted file mode 100644 index ac212629cfe4d8575bd2187f1600215bdb145f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmaJ;J#Q015S`t<&p3Qo!6d1$l7a#Y1p!sk7=r-GNeCbcgmj87=ip%9MZPnH4j~E( zmlP>doP0pRKcJ%F2c$s=3ZzJ(&0kpFtYaxf#7S@7?!KLQGkXu}E4S-J^lSfT4J6+v zqK{Zq04!;V4}l$QZ16om0MCF!fbY)XU=R2L`~@x`VGdx8>sjD;0N42d@V5u>e$3-K zhdAq^#zSBicn@4|26rAke!U&l<2cFIvvv|Ml0ScKzCms)NvP6KqiUM<+F?es&!bK! zsa0Pkz0L-ylvIN*asG0$(eFfv(IPA`gkXOju>=dAsoYLSmuR}xkHet5-j0I>nra4j zo2$3#&Eq^$$dgE@AjcC|%+BtDoLvMn)mN}5K8>W`EJ=3atZzm-hpi;L0dlrjIyxen z%Azz2!mC-z`?KcVBtM=>zGw=Z61aW)&-fa*V0s|Qg1mt+$%}DsWV_s#5l2lyoeq;2 zFW3*Wq&M<4`gKk`26<|UaygL;KPOL@3Rj;m934O=SHI-BX1*ijmZP@?iU@M8LJgIE zdw^qI_7UYkkpre>fGwEWfw_|5AFsBa^rB5@f(8&$V9mE`l&i^HmU1zXlMi!mC<_Nx zD8IwATRLOPEjhG4`{K+Neytj)s_<}nsvFPF7&{#pC$)eXPuOTxxI?#4I^`h>E4Qtg eeO@{GsUpm$%buC)zdkol_}qu-8ohwq58xk#y@gx= diff --git a/local_test/test_c.ts b/local_test/test_c.ts deleted file mode 100644 index 77f80c02eb..0000000000 --- a/local_test/test_c.ts +++ /dev/null @@ -1,10 +0,0 @@ -class C { - s: string; - constructor(input: string) { - this.s = input; - } -} - -function foo() : void { - var c = new C("hello, world"); -} diff --git a/local_test/test_classExpression.abc b/local_test/test_classExpression.abc deleted file mode 100644 index 8144bba121ae68ffd7a7358ae2ace05c61a3bb98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 724 zcmZuuJ!=$E6us}g`OHEv42!W4g&=ln>?9#DYS3b15){E|Sl5?zV4YcZ-X@zSkj}zF ztF(`u#M)lLLJSCk7XAVMKoA?Z8_%6htQ6p&-IQ8SMxTQ08N>%M2 zp-|0XnB+v(lC*|^m6+LxnZFWq)8HqpZ#^F9E^2}Xfbb?OtRtde8(HvA?cF^lz_iHsuQq4M8boH_2nb<wliiQ7x5$! zWXGUla-$*$3JOZ1OWis|bg4rpGpN8rbcvwp_x`gV3Sp-H-uusc|M&g=9_ZS?yNie} zzI(O`O!jo5S2#2R3eX8efGp&-;QIgxI0ua4z;~y>U&=&pfo>QTfGfZa;3E(KE8t`e zkidB@z;+x9BJu%<=pn#A&jGlqaE`+<*ybyE2b3mo8SsJDp7fqWhtCgLUAFCb887G9 z9hBH(59Vyk+(>oZnL=jJqPQg_n@Hy`J?{)sT_~c4)V5UVR{hMg$6u~Zm^)0FHE>JwD*ru9LTD*-0y(cg(gCr;yK5 zU1}qHC!I+=wV6LQks;_x&b`;k4(BaUs{M7Zf4jcT@BixTlJJDI0)G;va0e4x3pR7<#g{p6?YEXrW=r&BFl8H}P{Q|36 zX~L>b6RPcCS_VWoJR?+gs4BARb*Mrb!r}W+mBgsa4lzujYJm)~j#X5%vqa6F<$CFG zEbBa%W@qcE>BO)-kUpKs+35|ae`{EOJheSMh~fl^BCBMn9=M)=LZ+ntW*P6=94#MZ zL0G{))K;9de#i`{*w7FyujQQj`PVrV2Pc^) zAh^!`GsrBWUFV*;DAb1o(G(VzED#1C9gy?=mo{Zcv zq}T?etW2n;#C7~N5>I~%P>%9lL{VNyC~!`UKtUl(P>>#+Z9%ro*O&Na@MMZfKS-!Y zKEV(-Orj_fLT+PuD1}(UHdMtI%3_&fbHvlgDR9|_%Tbaa@QwZ*QP4jTIdJ)kP~PT& zR+O9$S}Y|bIX(^?eF9SYTY`)A6KZ30U9_($&cDs_KU&HQS7~YMBD%>tT<+#hOc*n3 zTWDtAI6&YrtIRErSHN>q7MvSzN;%Sfj`W{<$sy2l0D=o`*J4v=|cVlL@ zsjUk7WSKv0k{tQ1pE#>QK`N(v#-`{zV_CFS8lc1K`m&sTa)w{6C0KJ((cl+n(vL1 z%M)$s_}&gbSZve-+Sc-x4mak!ea)KhQ+D2KHrr%slq)?YK4gwjw&y(O1?5B-qkL&x z_%X_sCQ9WpJ;Ir%+Q&Oh52H7Uok=fIE$=qMj=0tNhMyQwakkT{S5MX&t?H9hs8sh? z4!%&X^!z9TKLdx);geB2(Lhc1MNH1O+)VVC#)P_&P}?0)qdZhFfY)?X_`?w4dWxyH zdH68pUlIP3gun7neq=3wbt7-+7D~*h>xuu*%uD`1v6B2J*7`fR4eRn73WOg9f%?uf z|1l3=VIW#vCE6Bveo&q5G@GM=PeZgyxq7WR^JZre{1B(n+zUO(13-Jyg-Dv4q<8V~ zG!M`4z>IwXOv17##`Z_76FZcZ=(Mc(L=w0CkP{tLJ+~RwNg^?pL4rQZCR~uIlQ}MT zAn_fCZV0gXd>j|XE`(c{odyfKpMwKQp7o32o;E4r9=BGMI(EbE0k&n6zL~uX7qTxF z>+KdkhE6?bFVg*np17~jyv=^1|6KiljsIrB?Mp)PW~FczlP0rDdYbHA+99XJC!8@S zDAa?Yazo0*+3r9*+;!qA8x6##__Nx&6GLb@@j}wU0jp~w6TiPBRU6vG);)DSRckrf zRDB5QIPa>0D!|xUvG)`;-&&diz{$)tv%Dq1Q+9Cn(4seoZ7KR1S33fx9okDM(vE#j z(>3veMOir5rmG{}rHHyZG&+6*7pJQt1&bx_4e0oYBFz=(+->-vg6$95d3;0iZX$`I zN2MU534WxA?KMbazwy=d$|AqT_TN~4_P zC`N5U6oV)_RCp4X-7^&9m*W7+eXlP#md;bC?2s&28_pT&<%cDaRLWTxa;R8wyMEyu z?z{ac#?=i(84SrqluT@J)JJh_+%SdnoJSGpS?H+9iRbx|?pmR?KIIJYY1!gNZtL^N z8lRTWKGZ5oBM~jTYN&!vR{=Hh`V{uMncNloA?u8FwotIrZga&+x7S~TWDl3{`b|@S Tom>VkU{?m3cYqPd-vECDr*RkE diff --git a/local_test/test_full.ts b/local_test/test_full.ts deleted file mode 100644 index 19ac529336..0000000000 --- a/local_test/test_full.ts +++ /dev/null @@ -1,34 +0,0 @@ -class base { - constructor() {} -} - -class base2 { - constructor() {} -} - -class base3 {} - -function newYigeClass () { - class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - } - - let yigeClass = new AA(); - yigeClass.getA(); -} diff --git a/local_test/test_full.txt b/local_test/test_full.txt deleted file mode 100644 index 4429d3a97c..0000000000 --- a/local_test/test_full.txt +++ /dev/null @@ -1,548 +0,0 @@ -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -undefined -variable2Type: -undefined -getTypeSet: -Set { 51, 52, 53 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -undefined -variable2Type: -undefined -getTypeSet: -Set { 51, 52, 53 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -undefined -variable2Type: -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -undefined -variable2Type: -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -class base3 {}: 56 -undefined -variable2Type: -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55, 56 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -class base3 {}: 56 -constructor() { - super(); - this.b = "hello"; - }: 57 -undefined -variable2Type: -a: 1 -b: 3 -c: 3 -d: 54 -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55, 56, 57 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -class base3 {}: 56 -constructor() { - super(); - this.b = "hello"; - }: 57 -public getA(): number { - return this.a; - }: 58 -undefined -variable2Type: -a: 1 -b: 3 -c: 3 -d: 54 -getA: 58 -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55, 56, 57, 58 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -class base3 {}: 56 -constructor() { - super(); - this.b = "hello"; - }: 57 -public getA(): number { - return this.a; - }: 58 -private static calSqur(num: number, str: string): base { - return num; - }: 59 -undefined -variable2Type: -a: 1 -b: 3 -c: 3 -d: 54 -getA: 58 -num: 1 -str: 3 -calSqur: 59 -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55, 56, 57, 58, 59 } -============================== -============================== -type2Index: -class AA extends base2 implements base, base3 { - public a: number = 4; - private readonly b: string; - protected static c: string; - private static d: base; - - constructor() { - super(); - this.b = "hello"; - } - - public getA(): number { - return this.a; - } - - private static calSqur(num: number, str: string): base { - return num; - } - }: 51 -class base2 { - constructor() {} -}: 52 -constructor() {}: 53 -class base { - constructor() {} -}: 54 -constructor() {}: 55 -class base3 {}: 56 -constructor() { - super(); - this.b = "hello"; - }: 57 -public getA(): number { - return this.a; - }: 58 -private static calSqur(num: number, str: string): base { - return num; - }: 59 -undefined -variable2Type: -a: 1 -b: 3 -c: 3 -d: 54 -getA: 58 -num: 1 -str: 3 -calSqur: 59 -yigeClass: 60 -undefined -getTypeSet: -Set { 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 } -============================== -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 3 -\\\\\\ vreg type \\\\\ 1 -\\\\\\ vreg num \\\\\ 4 -\\\\\\ vreg type \\\\\ 3 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 3 -\\\\\\ vreg type \\\\\ 51 -\\\\\\ vreg num \\\\\ 4 -\\\\\\ vreg type \\\\\ 60 -\\\\\\ vreg num \\\\\ 0 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 1 -\\\\\\ vreg type \\\\\ 77 -\\\\\\ vreg num \\\\\ 2 -\\\\\\ vreg type \\\\\ 77 --=-=-=- LiteralArrayBuffer =-=-=-=-=-= -{ literalBuffer: [ { tag: 2, value: 5 }, { tag: 2, value: 10 } ] } -{ - literalBuffer: [ - { tag: 2, value: 0 }, { tag: 2, value: 0 }, - { tag: 2, value: 3 }, { tag: 2, value: 52 }, - { tag: 2, value: 54 }, { tag: 2, value: 56 }, - { tag: 2, value: 2 }, { tag: 5, value: 'c' }, - { tag: 2, value: 3 }, { tag: 2, value: 2 }, - { tag: 2, value: 0 }, { tag: 5, value: 'd' }, - { tag: 2, value: 54 }, { tag: 2, value: 1 }, - { tag: 2, value: 0 }, { tag: 2, value: 1 }, - { tag: 2, value: 59 }, { tag: 2, value: 2 }, - { tag: 5, value: 'a' }, { tag: 2, value: 1 }, - { tag: 2, value: 0 }, { tag: 2, value: 0 }, - { tag: 5, value: 'b' }, { tag: 2, value: 3 }, - { tag: 2, value: 1 }, { tag: 2, value: 1 }, - { tag: 2, value: 2 }, { tag: 2, value: 57 }, - { tag: 2, value: 58 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 2, value: 53 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 }, - { tag: 2, value: 55 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'constructor' }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 0 }, - { tag: 2, value: 0 }, - { tag: 5, value: 'getA' }, - { tag: 2, value: 0 }, - { tag: 2, value: 1 } - ] -} -{ - literalBuffer: [ - { tag: 2, value: 2 }, - { tag: 2, value: 1 }, - { tag: 2, value: 1 }, - { tag: 5, value: 'calSqur' }, - { tag: 2, value: 2 }, - { tag: 2, value: 1 }, - { tag: 2, value: 3 }, - { tag: 2, value: 54 } - ] -} -{ literalBuffer: [ { tag: 2, value: 1 }, { tag: 2, value: 51 } ] } -{ - literalBuffer: [ - { tag: 5, value: 'getA' }, - { tag: 6, value: 'getA' }, - { tag: 9, value: 0 }, - { tag: 5, value: 'calSqur' }, - { tag: 6, value: 'calSqur' }, - { tag: 9, value: 2 }, - { tag: 2, value: 1 } - ] -} -{ literalBuffer: [ { tag: 2, value: 0 } ] } -{ literalBuffer: [ { tag: 2, value: 0 } ] } -{ literalBuffer: [ { tag: 2, value: 0 } ] } diff --git a/local_test/test_full_alt.ts b/local_test/test_full_alt.ts deleted file mode 100644 index 6bb915519c..0000000000 --- a/local_test/test_full_alt.ts +++ /dev/null @@ -1,33 +0,0 @@ -export class AA extends base2 implements base{ - public a: number = 4; - private readonly b: string; - protected static c: string; - private d: base; - - constructor() { - super(); - this.b = "hello"; - AA.c = "world"; - } - - public static getC(): string { - return AA.c; - } - - private calSqur(num: number, str: string): base { - return this.d; - } -} - -class base { - constructor() {} -} - -class base2 { - constructor() {} -} - -function newYigeClass () { - let bigpig = new AA(); -} - diff --git a/local_test/test_full_non-type.abc b/local_test/test_full_non-type.abc deleted file mode 100644 index 88626b451493470c3983438f346a18583b813c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmZuxOK2295Url>nc3Ni#<<29KNws@@gRQigNm|#(8I;z_}S7riJ*Jn79#1P_8<+E=|r;9u&!7-)PLgoSX8LhMw4<<8LjQ6j{LU#g>oEi zrGO1}*5jxrPR1*P33b<^iGj*+bf8*}V+u#2YIT%kncDN4Er;X<3TMc}QBr6wwjk$L z>)%3Qen-Agpw(Qtcl2Vt8exof^C?IOJ_R@GI7D)1Ix2B9h`NUAwZYQma-~+>5%)1T|Zi`Hp?{qtOJ=DPakxNwIMkP!n-)&#r$*6OykW)j|>!xEIYu6s>Z8}7F$gQlm6x|1kQ zN<;N(bz>4!`(U}+f2BT7@J-tQWwN)C;giwk(ZpXM#_(Z|LNBGz_1hQ@E+U!0|vHhT2eztfl~J zGbZMGP&~$0j!W=Tx8btD)YYDA&fpeP)li6-usup$b54-UQk?d$6ta}HOPnmY|CNHO zcAwkbl-iW@mgV?z732h3WHh=Jre4EIm6`a7Slgt@fV#+;Qsl}U0(~t!joM+Vv~(JB zGWb9SPdmrR;PdQ4`0jFaG1M|UKR=Gua3@#Tq`{|If|r$5RA|#8)RaYqz({oGJUWs} zt(=B3_|Kp#j`p2~Z$^lq)z#8{#3wV?ShM`sx9q$1@i!!`;+afDlYv-RLx5KryNJhyp8?Cg~LagBwir^RyJK!OEQG}-&s5U!EGQ8TVRm$tj)mr(K z94eJ(N^=*BrQLm^u+PCWj6H#~4$Bq)4TS!Qg-r4a2%O)Y&^(IhN36tMAJWhhnAr7& zA&(Q<*%3Jsht0TLZ&cT-C*vl4JAI6~=|X}Nw19&bX84~NrM92vZ_{L7fB8Prq`mL! zq@00o@ZX?+6^R|vclpyAftnHH_82E?B(S+8V+)D4 zWfEoV9nNLsEf(WxTjy(|B;zHjt?d2JaN8C$5@n~99mqOvKP+!kof{MlO=bZyQL-B4 zP>i=`Zgr^<-h$7OuL!&c7IL~I#xEGJ->5$0_8KQ|B!`xI+HMjU9iZq22dTTZXE!*+ zJ=?b%9H2JZZR_V*r+^171)?|Au|naVn@9A(rZ_x;cglwOS+U`6gEtUd$g2w&RiANs zjpS`6Nqe&@$+okYK$G)GJmY&K->B&=5+#{-E(z=nUobU{NczRyR8D}k)P zz%xD diff --git a/local_test/test_try/export.ts b/local_test/test_try/export.ts deleted file mode 100644 index ec726c2ec5..0000000000 --- a/local_test/test_try/export.ts +++ /dev/null @@ -1 +0,0 @@ -export let a = class A{}; diff --git a/local_test/test_try/import.ts b/local_test/test_try/import.ts deleted file mode 100644 index ce2a384ad7..0000000000 --- a/local_test/test_try/import.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { a } from "./export" - -let b = a; diff --git a/local_test/tmp/build/test_another_export.js b/local_test/tmp/build/test_another_export.js deleted file mode 100644 index d3b5a3a8aa..0000000000 --- a/local_test/tmp/build/test_another_export.js +++ /dev/null @@ -1,19 +0,0 @@ -export class AnotherClassA { - constructor() { - this.a = this.getA(); - } - getA() { - return 3; - } -} -export class AnotherClassB { -} -export class DistinctClass { - constructor() { - this.name = "I'm in another export"; - } -} -// export default class declarations -export default class AnotherDefaultClass { -} -; diff --git a/local_test/tmp/build/test_another_simpler_export.js b/local_test/tmp/build/test_another_simpler_export.js deleted file mode 100644 index eb8a75684a..0000000000 --- a/local_test/tmp/build/test_another_simpler_export.js +++ /dev/null @@ -1,6 +0,0 @@ -export class AnotherClassB { -} -; -export class AnotherClassC { -} -; diff --git a/local_test/tmp/build/test_export.js b/local_test/tmp/build/test_export.js deleted file mode 100644 index f9a1e21e47..0000000000 --- a/local_test/tmp/build/test_export.js +++ /dev/null @@ -1,42 +0,0 @@ -import { AnotherClassB, AnotherClassB as ClassC } from "./test_another_export"; -class DistinctClass { - constructor() { - this.name = "I'm in export"; - } -} -import * as anotherExport_1 from "./test_another_export"; -// --- 1. ExportDeclaration --- -// 1.1 re-export -export { anotherExport_1 as anotherExport }; -export { AnotherClassA, AnotherClassB, DistinctClass } from "./test_another_export"; -export { default as anotherDefaultClass } from "./test_another_export"; -// 1.2 named exporting via a clause -class ClassE { -} -; -export { ClassE }; -export { ClassC, ClassC as ClassD }; // exporte an imported class -// --- 2. ExportKeyword --- -// 2.1 inline named exports - ClassDeclaration -export class ClassF { -} -; -// export default class {} -// 2.2 inline named exports - VariableStatements -class ClassA { -} -; -export let InstanceA = new ClassA(); -export let InstanceB = new AnotherClassB(); -export let SomeClass = class { -}; -export let SomeClassInst = new class { -}; -// export default cLass AnotherDefaultClass{}; -// --- 3. ExportAssignment - default export --- -class defaultC { -} -export default defaultC; -// 4. VariableStatement/ClassExpression -//// export class as member of obj -// export default {defaultC, ClassA} diff --git a/local_test/tmp/build/test_import.js b/local_test/tmp/build/test_import.js deleted file mode 100644 index c281288b49..0000000000 --- a/local_test/tmp/build/test_import.js +++ /dev/null @@ -1,29 +0,0 @@ -// 1. default import -import DefaultClassA from "./test_export.js"; -// 2. namespace import -import * as Imported from "./test_export.js"; -import { anotherExport as anotherImport } from "./test_export.js"; -// 3. named import -import { InstanceA, InstanceB, } from "./test_export.js"; -// 3.1 rename imports: -import { ClassD as ClassDDD, default as defaultAlt, anotherDefaultClass as defualtClassAlt } from "./test_export.js"; -// 4. empty import -import "./test_export.js"; -// 5. combining default import with namespace: -import DefaultClassB, * as importedAlt from "./test_export.js"; -// 6. combining default with named imports: -import DefaultClassC, { ClassC, ClassE } from "./test_export.js"; -///////////// -let da = DefaultClassA; -let ita = Imported.AnotherClassA; -let ae = anotherImport.AnotherClassA; -let ia = InstanceA; -let ib = InstanceB; -let cddd = ClassDDD; -let dat = defaultAlt; -let dcat = defualtClassAlt; -let dcb = DefaultClassB; -let italt = importedAlt.AnotherClassA; -let dcc = DefaultClassC; -let cc = ClassC; -let cd = ClassE; diff --git a/local_test/tmp/build/test_simpler_export.js b/local_test/tmp/build/test_simpler_export.js deleted file mode 100644 index 9940293462..0000000000 --- a/local_test/tmp/build/test_simpler_export.js +++ /dev/null @@ -1,6 +0,0 @@ -class ClassA { -} -; -export let SomeClass = class { -}; -export let SomeOtherClass = ClassA; diff --git a/test262/config.py b/test262/config.py index a3e6935672..168d1a8907 100755 --- a/test262/config.py +++ b/test262/config.py @@ -61,14 +61,14 @@ ES5_LIST_FILE = os.path.join("test262", "es5_tests.txt") ES2015_LIST_FILE = os.path.join("test262", "es2015_tests.txt") CI_LIST_FILE = os.path.join("test262", "CI_tests.txt") -TEST262_GIT_HASH = "7e60f78958c89cb14e36f4f28de8fe8e9768743d" -HARNESS_GIT_HASH = "4092b799522ac20590c7b054632fe70494c32331" -ESHOST_GIT_HASH = "a71a29820b132ffcb6bb58061cabdba96e457da6" +TEST262_GIT_HASH = "9ca13b12728b7e0089c7eb03fa2bd17f8abe297f" +HARNESS_GIT_HASH = "9c499f028eb24e67781435c0bb442e00343eb39d" +ESHOST_GIT_HASH = "fa2d4d27d9d6152002bdef36ee2d17e98b886268" ESNEXT_GIT_HASH = "281eb10b2844929a7c0ac04527f5b42ce56509fd" -TEST262_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262" -ESHOST_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262_eshost" -HARNESS_GIT_URL = "http://mgit-tm.rnd.huawei.com/a/hmf/ark_test262_harness" +TEST262_GIT_URL = "https://gitee.com/Han00000000/test262.git" +ESHOST_GIT_URL = "https://gitee.com/Han00000000/eshost.git" +HARNESS_GIT_URL = "https://gitee.com/Han00000000/test262-harness.git" SKIP_LIST_FILE = os.path.join("test262", "skip_tests.json") ALL_SKIP_TESTS = [] diff --git a/ts2panda/src/cmdOptions.ts b/ts2panda/src/cmdOptions.ts index 77b983ac13..1191d7b79f 100644 --- a/ts2panda/src/cmdOptions.ts +++ b/ts2panda/src/cmdOptions.ts @@ -182,7 +182,7 @@ export class CmdOptions { if (!this.options) { return false; } - return this.options["record-type"]; + return !this.options["record-type"]; } static parseUserCmd(args: string[]): ts.ParsedCommandLine | undefined { diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index 9ab2909393..ae8595f957 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -146,10 +146,10 @@ export class Ts2Panda { static dumpConstantPool(ts2abc: any): void { let literalArrays = PandaGen.getLiteralArrayBuffer(); - console.log("-------- LiteralArrayBuffer --------"); - for (let e of PandaGen.getLiteralArrayBuffer()) { - console.log(JSON.parse(JSON.stringify(e))); - } + // console.log("-------- LiteralArrayBuffer --------"); + // for (let e of PandaGen.getLiteralArrayBuffer()) { + // console.log(JSON.parse(JSON.stringify(e))); + // } if (CmdOptions.isEnableDebugLog()) { Ts2Panda.jsonString += escapeUnicode(JSON.stringify(literalArrays, null, 2)); @@ -195,8 +195,8 @@ export class Ts2Panda { let typeOfVreg = new TypeOfVreg(vreg.num, vreg.getTypeIndex()); typeInfo.push(typeOfVreg); - console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); - console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); + // console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); + // console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); }); let exportedTypes = PandaGen.getExportedTypes(); diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index 15f1e00acc..801ac017e4 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -280,20 +280,20 @@ export class TypeRecorder { // console.log(jshelpers.getTextOfNode(node)); // console.log("=========== currIndex ===========: ", currIndex); // console.log(PandaGen.getLiteralArrayBuffer()[currIndex]); - console.log("=============================="); - console.log("type2Index: "); - console.log(this.printNodeMap(this.getType2Index())); - console.log("variable2Type: "); - console.log(this.printNodeMap(this.getVariable2Type())); - console.log("getTypeSet: "); - console.log(this.getTypeSet()); - console.log("=============================="); - console.log("exportedType:"); - console.log(this.printExportMap(this.getExportedType())); - console.log("AnoymousRedirect:"); - console.log(this.getAnonymousReExport()); - console.log("namespace Map:"); - console.log(this.getNamespaceMap()); - console.log("=============================="); + // console.log("=============================="); + // console.log("type2Index: "); + // console.log(this.printNodeMap(this.getType2Index())); + // console.log("variable2Type: "); + // console.log(this.printNodeMap(this.getVariable2Type())); + // console.log("getTypeSet: "); + // console.log(this.getTypeSet()); + // console.log("=============================="); + // console.log("exportedType:"); + // console.log(this.printExportMap(this.getExportedType())); + // console.log("AnoymousRedirect:"); + // console.log(this.getAnonymousReExport()); + // console.log("namespace Map:"); + // console.log(this.getNamespaceMap()); + // console.log("=============================="); } } \ No newline at end of file -- Gitee From fd4de7fb2f728abcc5ee4376d964d75ad259d38b Mon Sep 17 00:00:00 2001 From: zhuoli Date: Wed, 5 Jan 2022 18:55:45 +0800 Subject: [PATCH 17/21] Disable .d.ts typeInfo extraction by default Signed-off-by: zhuoli Change-Id: Ia13c351cc292fab67a7499cbbec942e2efbc6e64 --- ts2panda/src/base/typeSystem.ts | 2 +- ts2panda/src/cmdOptions.ts | 12 ++++++++++-- ts2panda/src/index.ts | 11 ++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 46f8935cb0..320370c40a 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -145,7 +145,7 @@ export abstract class BaseType { isUserDefinedType = true; } if (typeIndex == PrimitiveType.ANY) { - console.log("ERROR: Type cannot be found for: " + jshelpers.getTextOfNode(node)); + LOGD("WARNING: Type cannot be found for: " + jshelpers.getTextOfNode(node)); typeIndex = PrimitiveType.ANY; } // set variable if variable node is given; diff --git a/ts2panda/src/cmdOptions.ts b/ts2panda/src/cmdOptions.ts index 1191d7b79f..ef50707975 100644 --- a/ts2panda/src/cmdOptions.ts +++ b/ts2panda/src/cmdOptions.ts @@ -39,7 +39,8 @@ const ts2pandaOptions = [ { name: 'bc-version', alias: 'v', type: Boolean, defaultValue: false, description: "Print ark bytecode version" }, { name: 'bc-min-version', type: Boolean, defaultValue: false, description: "Print ark bytecode minimum supported version" }, { name: 'included-files', alias: 'i', type: String, lazyMultiple: true, defaultValue: [], description: "The list of dependent files." }, - { name: 'record-type', alias: 'p', type: Boolean, defaultValue: false, description: "Record type info. Default: false" } + { name: 'record-type', alias: 'p', type: Boolean, defaultValue: true, description: "Record type info. Default: true" }, + { name: 'dts-type-record', alias: 'q', type: Boolean, defaultValue: false, description: "Record type info for .d.ts files. Default: false" } ] @@ -182,7 +183,14 @@ export class CmdOptions { if (!this.options) { return false; } - return !this.options["record-type"]; + return this.options["record-type"]; + } + + static needRecordDtsType(): boolean { + if (!this.options) { + return false; + } + return this.options["dts-type-record"]; } static parseUserCmd(args: string[]): ts.ParsedCommandLine | undefined { diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index 787817e5da..dcfb2847bb 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -33,10 +33,12 @@ function main(fileNames: string[], options: ts.CompilerOptions) { let typeChecker = TypeChecker.getInstance(); typeChecker.setTypeChecker(program.getTypeChecker()); - for (let sourceFile of program.getSourceFiles()) { - if (sourceFile.isDeclarationFile && !program.isSourceFileDefaultLibrary(sourceFile)) { - setGlobalDeclare(checkIsGlobalDeclaration(sourceFile)); - generateDTs(sourceFile, options); + if (CmdOptions.needRecordDtsType()) { + for (let sourceFile of program.getSourceFiles()) { + if (sourceFile.isDeclarationFile && !program.isSourceFileDefaultLibrary(sourceFile)) { + setGlobalDeclare(checkIsGlobalDeclaration(sourceFile)); + generateDTs(sourceFile, options); + } } } @@ -84,7 +86,6 @@ function main(fileNames: string[], options: ts.CompilerOptions) { (ctx: ts.TransformationContext) => { return (node: ts.SourceFile) => { let outputBinName = getOutputBinName(node); - // console.log("<==============> " + outputBinName + " <================>"); let compilerDriver = new CompilerDriver(outputBinName); compilerDriver.compileForSyntaxCheck(node); return node; -- Gitee From 3ad492aa59510747b95458230fe9c6d3f83a9a9d Mon Sep 17 00:00:00 2001 From: zhuoli Date: Thu, 6 Jan 2022 21:04:46 +0800 Subject: [PATCH 18/21] 1. Remove redundent functions and files 2. format gn and fix other coding style problem 3. fix deprecated path in 262test Signed-off-by: zhuoli Change-Id: I7c4536a077fc64eab1a08c47b48516b75274fc66 --- README.md | 2 +- README_zh.md | 2 +- patches/AppPackage/ace-loader.diff.zip | Bin 1051 -> 0 bytes patches/AppPackage/build.diff.zip | Bin 2671 -> 0 bytes patches/AppPackage/ets-loader.diff.zip | Bin 2137 -> 0 bytes patches/DebugInfo/runtime.patch | 160 -- patches/DebugInfo/ts2abc.patch | 15 - patches/ModulesSupport/ESM.patch | 2235 ---------------------- test262/config.py | 6 +- ts2panda/BUILD.gn | 1 + ts2panda/src/addVariable2Scope.ts | 13 +- ts2panda/src/base/typeSystem.ts | 249 +-- ts2panda/src/cmdOptions.ts | 5 +- ts2panda/src/recorder.ts | 28 +- ts2panda/src/ts2panda.ts | 4 +- ts2panda/src/typeChecker.ts | 352 ++-- ts2panda/src/typeRecorder.ts | 81 +- ts2panda/src/variable.ts | 4 +- ts2panda/templates/irnodes.ts.erb | 12 +- ts2panda/ts2abc/BUILD.gn | 7 +- ts2panda/ts2abc/main.cpp | 68 +- ts2panda/ts2abc/tests/debuglog_test.cpp | 6 +- ts2panda/ts2abc/tests/debugmode_test.cpp | 6 +- ts2panda/ts2abc/tests/functions_test.cpp | 8 +- ts2panda/ts2abc/tests/stringarr_test.cpp | 6 +- ts2panda/ts2abc/ts2abc.cpp | 69 +- ts2panda/ts2abc/ts2abc.h | 11 +- ts2panda/ts2abc/ts2abc_options.h | 4 +- 28 files changed, 421 insertions(+), 2933 deletions(-) delete mode 100755 patches/AppPackage/ace-loader.diff.zip delete mode 100755 patches/AppPackage/build.diff.zip delete mode 100755 patches/AppPackage/ets-loader.diff.zip delete mode 100755 patches/DebugInfo/runtime.patch delete mode 100755 patches/DebugInfo/ts2abc.patch delete mode 100755 patches/ModulesSupport/ESM.patch diff --git a/README.md b/README.md index 209c267167..20a4727951 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Install `node` and `npm` convert JS to ARK bytecode ``` -$ cd out/ohos-arm-release/clang_x64/ark/ark/build +$ cd out//hi3516dv300/clang_x64/ark/ark/build $ npm install $ node --expose-gc src/index.js [options] file.js ``` diff --git a/README_zh.md b/README_zh.md index 447e2c2249..aa001701a5 100644 --- a/README_zh.md +++ b/README_zh.md @@ -43,7 +43,7 @@ $ ./build.sh --product-name Hi3516DV300 --build-target ark_ts2abc 使用ts2abc组件将JavaScript文件转换为方舟字节码文件 ``` -$ cd out/ohos-arm-release/clang_x64/ark/ark/build +$ cd out/hi3516dv300/clang_x64/ark/ark/build $ npm install $ node --expose-gc src/index.js [options] file.js ``` diff --git a/patches/AppPackage/ace-loader.diff.zip b/patches/AppPackage/ace-loader.diff.zip deleted file mode 100755 index ad03b2ec0e8486d08b5874300c56a79c0263b265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 zcmWIWW@Zs#;Nak3=uMj#%zy-VfNb*=6NA(w1HF{Yw6wJ$x&DtW1pdv7H;h`CyV~qv zrjzug$1L33$2}Fc6sXVjQ@^%ReWl{o#d{cHul(OvHrXt7x9IZAk)dyUj(sTh^m9+^UL)ewramW4bqbdd zr(|lsi6fuM>7auv0yQ4+z0~jd|9K z-g)xK)4FDrMcMyDN&ln1Zn?3^Z+VDXM*JrMJ>@=$AIVSRd>$D-75u1t-&Voo({Yt+ zk=z!&%0kiGa-+q>3wgH9?GSolmzuG>tLV)4?m2JOHT;#*(le)WytEM!*t)FUxE&t*o5*WQR0}mV(dYi_{wtgD#fs(VQ_9QJmwR@G; z=2d&-P1L?DWZdyS^Xb3pQ>Hig*B@9D6~6nX&8nqeopp0{Bv>-mWMn3q&zFKRVt%$SKOqsMTbFBEiPUQ94Hu!~fPPuJ- z%IcSM__3VRt6ncEshZ4|H`ge^cpY!8XQZ`+c-^xZPG>yhgu#9Ev6PvkwHRBGz9exFf?maF@T zh^vocV?Xswe3_>%p0nzCXOHWqtLpaGGp&w3eazr~r?AG#NvP7=I<?^PCY0X)qwJf&teATv3T2~LN`F?$K*?IN5_Pq7mt2B~cEUGCA zTe53*I)}Xdp=obkyx_2!e;N_A9%06d%yF9>fD8ivnRAAoL(;Mto4I2>i!E) zeeWqTw=;jew-vn+kRDJEEMMv*VU3+%s#n{c>(y?Vd3m<2(@kGhrez@57#f;$e zO|p(_KdSBMWxSBJ<$CwGAND_PC-9mHZ@;$3XzpGe19Rr(moFtVu2}vyZC^NJVT}+E zuc=SKeZ~N9b`G;c4zDLNGcbH&XJ82MW@Hj!KxAfQIZ$Rs1;|-Dz?+o~B+CedRzUhR I&_o6X0B3Q`-2eap diff --git a/patches/AppPackage/build.diff.zip b/patches/AppPackage/build.diff.zip deleted file mode 100755 index 1cd9438ef9d78820573a725cd978b4dcde42aff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2671 zcmV-#3Xt_sO9KQH00;;O010xDQvd(}000000000001N;C05WD~Fk>@gE@WwDX1!T` zZ`w=}|DR8>$5oGw0Am{n1RbZoUHkN;R#lrj>6DACwY>%>#n3+ z-XRi_^>1hAeP)MuNwg!T=jqPWVaus8Th4TPF>@Bv<iy+cRwPF$&37 z787GZbbZC&#ME`8_YTOc$ah_zF3q`dLH_c6OQQ{q9{iWvJv}gAbE4f}dv9sRR^)2W zM#Pwrx6Favra_F06})FU8R|=2?|t3dx6H{_+j$H z^UHhKoH~ggXMPl}Ub!^RNEVSzNMh>T(G7D6jpM*~C<0P)#prJJw~zn$K;AK$?Gr|# zguLEwJpbD&UwQ3^G6SS*VbqD%$V!co-K6Gw3kbldbaNM#^Z6X=lY&U#^a5j5ju&sQ91!G z@kiT)KCzFMdVc7#Z^WafXBZ1jGp3jH(q0fl*BA3S(rlsA8xDtUv|hd>V`I7;U63Ju zEXd23J@RKlhzEiP)|SRrOtbBZc>5qA_$P@x6792ipAmQpxBv`SN0aEDC5Ob%Sc(`c zq&ubwvbU*8ZD$349kwjnvIH%ZB{WREDA~bdV(&vYV7N?^J7Pa%%mH1Gh|4^>4>EF3 zgFO?(%9j@fL3F^)e&AZLQR@v6!Lt0k*5lyukDUkF4pKaozcaRr18@ShkNQNh`vdYQ zba^r3y1bZ=41+6^5K9P6)+Kwm?0ZCoL;R4rsvq7*cP!Baa)8vhT;!%4op#iHDy)Y~;SD3C#4(^vlVel{@ zzx_t?f5>_b4zOp1iV4|KKa}ioS4E=DHGzE+LSLY?LvvwPgeF|tFv@&~<+6^dj}n&h zB$76s-t@-ZVm4RFAAg(>INj2OxmMuY2~B*K4k|)&qYT%iiOB`)%tDqQW-Nj5Zb?VA zXEHA>rZZ-Grlu_!B&6kuyj0(PoS^E@x#p*H?rzh0P4gYEKF>! zrPRHf+@@oJ5Dbp9C`OrJBDc6UfyQVMP3hY3R}wtXX1BXhD4ePMcXMi?ano4j{?p z)Sg6im+|*Js>24c(gA;(>ZnG;W%n$I;?gdlJW(N671f6jB^WCEfTbmYg1uu;s0Ir9 zctC9yKzw_V`piSyqDcl4bSdbdP@9J!T7?oQrC;#+Y)_MRCc@G+JO6}Wc|B;+;rJJ8 zaD1e>|5|?-NqJ+D_Z407RT%7-#Mdy7um68YpukeO@aO*`CYsLuTrN&qwzB;S$3=vFHSgBA2fqTes;*)Xs(IJ}xgt%S!iA zt&+#Q9hJ+nDIAYQ5v=zdWgk+Q50GVv9HVTdX=|r9G|+YS&CmDB*iz(uEcR8PJ?T>$ z7UCJ)qh2)o8BOkyO~`VFx1-@yUyO{4iYkk;DK3~Yksh6Sljq!VF2-#=1(i$KFjo>( zE(PWQWOjWNdG&yKP7Y~OYQ|oke_=VV7~`?*EX%ynBHj5-PlUluuoIuRrL{ELYa&Yl z(EpOVv6n>9kcaLV*{{e~cR``q7T2rYFuMCxxCC@Rly?mG;?kpwrKU|U>6|Xz`W@rM zc5%r#0YLYhUgGr*ejDbAO9pjtinLZBR1&!HL6|6=O}m^Wtl!}Uy%V)%LA+MF<|2&& zg)$Jfi)oU=&7Hcg74gBBsuTuRI=iG+<~y(r<~vX)n8zv0G54gC`=+lcBT1dlmL#Pd zKoD?B7mdt$Osse=Ny(ZeC_w(UAWKNf{KLWsQSsNHhSUm2lBq?w*FN)uRPNk_aPdwv zwROjUJKt0dxAgEMhxBIJZH>s=m zXkQKANOdLnHS!8*DSaDGO7I!v17I#t6Ul}Chz(T9a;2j01iw0a{e1}~<#H@o*70^ZG09`pcI&rrpDukg$= zMO5(+6>z~39lEGR5KL>4SSktl^cLsft~=^YonFB*v=Y3hgn~Tc-#VqJO9-k14enH# zNCpk($4&go08qZCB{*4qe dWNBt*P)h{{000000RRC2IsgCw9|`~f008-M2nPTF diff --git a/patches/AppPackage/ets-loader.diff.zip b/patches/AppPackage/ets-loader.diff.zip deleted file mode 100755 index 604b782826eb99a9fd69da3251161b6a2ef8eea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2137 zcmY+G`9Bj51IMStga;$%=*zTKyhIPPYLhF;3ZrCl%(2Nd5fTcyCOL=2HpkMpea+*@ zkRv3wd!A7Q@Jb3SKl7Ww|@)G?wOyje4QFQDn#GC znLEQs>L;0ub}kkMf}(Y-k@9vOGeaGeY6hO0(ppf;AjU`r}fGV=7x!-DW zyUbt$W56`HFSZYeHZnPj#QYRIgsxT>zIF3~%d-4Kj*_ ztTjuCDQ%=$4nO`V0FoQWHh1{1+amTmlk4{U6{kBxAjQ0SM+eJ7VDMR48f59!&Zm~h zUXuTan~{^gSeNW7*Au;075%0ssAX7WpC-htI!j{j8>EP=HC#(GY&S!@BKEZbc7 z#M4N9>z*kkz_Ql95q8gF$@UIM!{)K`7Q}9L{S|!j<)`&+(u$+E7}C*L!zmt<#l(Xp zWrQ6+^-A!}HA`JwtOv1VC^luLCZ6p+@(AlMa{?Ff^u&*fz*2G7ttqK(zlnZ)_ z>Ds*W4oJ^*6fU}zk_Nj|yLa6~!noN;_kNy^75+Wit4_~~kkGAlXbFc0=$E6ynOn<)aPXdtEW<&RK$jS7S?N1*l&L+Z zpJUu^&#+lOl?3g1VOfJfj1|1*lWp>$)8bwmQr7=TiOWn$Sk-P4URG!tSEg-r=(>vC z(Cb>KQm;1r(^7LF!&i>BYn36hDs)B|R-pYRz=GPEiWs&=!XosF)L#nMDwny+0k=a4 zHMSP*mu`xzg$r%E?w8K>m^&u6rHb2i@C@%Ex-4Bgg0yqA>j(O|Q({si zLaSyz$x?UxAa9d-ge3m~Evo6RZq#}tg0GFnSDH6ACP(|n(lCS!n4o&32PsAaRit^! zpHF)}#fWA@q>_6fxXnppmN!fONPN^!T6rS|eLwL9UBO(m%2*iZ5Vl1;?~Tyi{pn~ys-Y@wR}?WtYPtu zf;GVSt>pq?2LRAVf@93vQUwnOj%LjivOlNu7{J8Xf$kDG+t}*DsLrx#C#+v{rLR=0 zdOQ&2Inm_hf(X+hyIfIf76-qZMq2|;yWsPk?&9U%zJ*Ln4G3_n(vm1h?xiT@@V;)a zv%ypjbdvoQjEq4f^3{4%Xk;*c+yo*9W$J&~LF(9`0_d5po5TcC!E{Qy%h!?*jwgt=w_8Jw1R8 z+$|65!e5IkC>%7W5)HSgMEU1Oxx5HB7qkzy1URTl683->=Xw LpZ%3$z~Ae?gEj^$ diff --git a/patches/DebugInfo/runtime.patch b/patches/DebugInfo/runtime.patch deleted file mode 100755 index 237b0b7970..0000000000 --- a/patches/DebugInfo/runtime.patch +++ /dev/null @@ -1,160 +0,0 @@ -diff --git a/assembler/assembly-debug.h b/assembler/assembly-debug.h -old mode 100644 -new mode 100755 -index cf1f325b..530c30fe ---- a/assembler/assembly-debug.h -+++ b/assembler/assembly-debug.h -@@ -24,6 +24,7 @@ namespace panda::pandasm::debuginfo { - - struct Ins { - size_t line_number = 0; -+ size_t column_number = 0; - std::string whole_line = ""; - size_t bound_left = 0; - size_t bound_right = 0; -@@ -33,6 +34,11 @@ struct Ins { - line_number = ln; - } - -+ void SetColumnNumber(size_t cn) -+ { -+ column_number = cn; -+ } -+ - Ins() = default; - Ins(size_t l_n, std::string &f_c, size_t b_l, size_t b_r) - : line_number(l_n), whole_line(std::move(f_c)), bound_left(b_l), bound_right(b_r) -diff --git a/assembler/assembly-emitter.cpp b/assembler/assembly-emitter.cpp -old mode 100644 -new mode 100755 -index 2e300c4f..939815e2 ---- a/assembler/assembly-emitter.cpp -+++ b/assembler/assembly-emitter.cpp -@@ -1621,6 +1621,11 @@ size_t Function::GetLineNumber(size_t i) const - return static_cast(ins[i].ins_debug.line_number); - } - -+size_t Function::GetColumnNumber(size_t i) const -+{ -+ return static_cast(ins[i].ins_debug.column_number); -+} -+ - void Function::EmitNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, - uint32_t pc_inc, int32_t line_inc) const - { -@@ -1649,6 +1654,22 @@ void Function::EmitLineNumber(panda_file::LineNumberProgramItem *program, std::v - } - } - -+void Function::EmitColumnNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, -+ int32_t &prev_column_number, uint32_t &pc_inc, size_t instruction_number, bool emit_debug_info) const -+{ -+ if (emit_debug_info) { -+ int32_t cn = GetColumnNumber(instruction_number); -+ if (cn != prev_column_number) { -+ program->EmitColumn(constant_pool, pc_inc, cn); -+ pc_inc = 0; -+ prev_column_number = cn; -+ } -+ return; -+ } -+ -+ -+} -+ - void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, const std::vector &bytecode, - ItemContainer *container, std::vector *constant_pool, - bool emit_debug_info) const -@@ -1662,6 +1683,7 @@ void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, con - - uint32_t pc_inc = 0; - int32_t prev_line_number = GetLineNumber(0); -+ int32_t prev_column_number = GetColumnNumber(0); - BytecodeInstruction bi(bytecode.data()); - debug_item->SetLineNumber(static_cast(prev_line_number)); - -@@ -1677,6 +1699,10 @@ void Function::BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, con - EmitLineNumber(program, constant_pool, prev_line_number, pc_inc, i); - } - -+ if (language == pandasm::extensions::Language::ECMASCRIPT) { -+ EmitColumnNumber(program, constant_pool, prev_column_number, pc_inc, i, emit_debug_info); -+ } -+ - pc_inc += bi.GetSize(); - bi = bi.GetNext(); - } -diff --git a/assembler/assembly-function.h b/assembler/assembly-function.h -old mode 100644 -new mode 100755 -index 91137d1b..c06a4f69 ---- a/assembler/assembly-function.h -+++ b/assembler/assembly-function.h -@@ -131,6 +131,8 @@ struct Function { - const std::unordered_map &literalarrays) const; - - size_t GetLineNumber(size_t i) const; -+ -+ size_t GetColumnNumber(size_t i) const; - - void EmitLocalVariable(panda_file::LineNumberProgramItem *program, panda_file::ItemContainer *container, - std::vector *constant_pool, uint32_t &pc_inc, size_t instruction_number) const; -@@ -138,6 +140,9 @@ struct Function { - int32_t line_inc) const; - void EmitLineNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, - int32_t &prev_line_number, uint32_t &pc_inc, size_t instruction_number) const; -+ // column number is only for javascript for now -+ void EmitColumnNumber(panda_file::LineNumberProgramItem *program, std::vector *constant_pool, -+ int32_t &prev_column_number, uint32_t &pc_inc, size_t instruction_number, bool emit_debug_info) const; - - void BuildLineNumberProgram(panda_file::DebugInfoItem *debug_item, const std::vector &bytecode, - panda_file::ItemContainer *container, std::vector *constant_pool, -diff --git a/libpandafile/file_items.cpp b/libpandafile/file_items.cpp -old mode 100644 -new mode 100755 -index 7f3e3b56..4dc7239f ---- a/libpandafile/file_items.cpp -+++ b/libpandafile/file_items.cpp -@@ -1387,6 +1387,15 @@ bool LineNumberProgramItem::EmitSpecialOpcode(uint32_t pc_inc, int32_t line_inc) - return true; - } - -+void LineNumberProgramItem::EmitColumn(std::vector *constant_pool, uint32_t pc_inc, int32_t column) -+{ -+ if (pc_inc != 0U) { -+ EmitAdvancePc(constant_pool, pc_inc); -+ } -+ EmitOpcode(Opcode::SET_COLUMN); -+ EmitUleb128(constant_pool, column); -+} -+ - void LineNumberProgramItem::EmitPrologEnd() - { - EmitOpcode(Opcode::SET_PROLOGUE_END); -diff --git a/libpandafile/file_items.h b/libpandafile/file_items.h -old mode 100644 -new mode 100755 -index 27a09082..1c3404cc ---- a/libpandafile/file_items.h -+++ b/libpandafile/file_items.h -@@ -489,6 +489,8 @@ public: - SET_EPILOGUE_BEGIN = 0x08, - SET_FILE = 0x09, - SET_SOURCE_CODE = 0x0a, -+ SET_COLUMN = 0X0b, // The SET_COLUMN opcode takes a single unsigned LEB128 operand and -+ // stores it in the column register of the state machine. - LAST - }; - -@@ -514,6 +516,8 @@ public: - - bool EmitSpecialOpcode(uint32_t pc_inc, int32_t line_inc); - -+ void EmitColumn(std::vector *constant_pool, uint32_t pc_inc, int32_t column); -+ - void EmitPrologEnd(); - - void EmitEpilogBegin(); -diff --git a/libpandafile/line_program_state.h b/libpandafile/line_program_state.h -old mode 100644 -new mode 100755 diff --git a/patches/DebugInfo/ts2abc.patch b/patches/DebugInfo/ts2abc.patch deleted file mode 100755 index c3b3022309..0000000000 --- a/patches/DebugInfo/ts2abc.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp -index 1f3e8c12..d25e479f 100755 ---- a/ts2panda/ts2abc/ts2abc.cpp -+++ b/ts2panda/ts2abc/ts2abc.cpp -@@ -402,6 +402,10 @@ static void ParseInstructionDebugInfo(const Json::Value &ins, panda::pandasm::In - if (debugPosInfo.isMember("wholeLine") && debugPosInfo["wholeLine"].isString()) { - insDebug.whole_line = debugPosInfo["wholeLine"].asString(); - } -+ -+ if (debugPosInfo.isMember("columnNum") && debugPosInfo["columnNum"].isInt()) { -+ insDebug.column_number = debugPosInfo["columnNum"].asInt(); -+ } - } - - if (debugPosInfo.isMember("lineNum") && debugPosInfo["lineNum"].isInt()) { diff --git a/patches/ModulesSupport/ESM.patch b/patches/ModulesSupport/ESM.patch deleted file mode 100755 index db92e92e43..0000000000 --- a/patches/ModulesSupport/ESM.patch +++ /dev/null @@ -1,2235 +0,0 @@ -diff --git a/test262/config.py b/test262/config.py -index 9af9c3b5..ee2a0ff9 100755 ---- a/test262/config.py -+++ b/test262/config.py -@@ -100,5 +100,663 @@ MODULE_FILES_LIST = [ - "parse-err-return.js", - "parse-err-yield.js", - "dup-bound-names.js", -- "await-module.js" -+ "await-module.js", -+ "comment-multi-line-html-close.js", -+ "comment-single-line-html-close.js", -+ "comment-single-line-html-open.js", -+ "early-dup-export-as-star-as.js", -+ "early-dup-export-decl.js", -+ "early-dup-export-dflt-id.js", -+ "early-dup-export-dflt.js", -+ "early-dup-export-id-as.js", -+ "early-dup-export-id.js", -+ "export-star-as-dflt.js", -+ "early-dup-lables.js", -+ "early-dup-lex.js", -+ "early-export-global.js", -+ "early-export-ill-formed-string.js", -+ "early-export-unresolvable.js", -+ "early-import-arguments.js", -+ "early-import-as-arguments.js", -+ "early-import-as-eval.js", -+ "early-import-eval.js", -+ "early-lex-and-var.js", -+ "early-new-target.js", -+ "early-strict-mode.js", -+ "early-super.js", -+ "early-undef-break.js", -+ "early-undef-continue.js", -+ "eval-export-cls-semi.js", -+ "eval-export-dflt-cls-anon.js", -+ "eval-export-dflt-cls-anon-semi.js", -+ "eval-export-dflt-cls-named.js", -+ "eval-export-dflt-cls-named-semi.js", -+ "eval-export-dflt-cls-name-meth.js", -+ "eval-export-dflt-expr-cls-anon.js", -+ "eval-export-dflt-expr-cls-named.js", -+ "eval-export-dflt-expr-cls-name-meth.js", -+ "eval-export-dflt-expr-err-eval.js", -+ "eval-export-dflt-expr-err-get-value.js", -+ "eval-export-dflt-expr-fn-anon.js", -+ "eval-export-dflt-expr-fn-named.js", -+ "eval-export-dflt-expr-gen-anon.js", -+ "eval-export-dflt-expr-gen-named.js", -+ "eval-export-dflt-expr-in.js", -+ "eval-export-dflt-fun-anon-semi.js", -+ "eval-export-dflt-fun-named-semi.js", -+ "eval-export-dflt-gen-anon-semi.js", -+ "eval-export-dflt-gen-named-semi.js", -+ "eval-export-fun-semi.js", -+ "eval-export-gen-semi.js", -+ "eval-gtbndng-indirect-trlng-comma_FIXTURE.js", -+ "eval-gtbndng-indirect-trlng-comma.js", -+ "eval-gtbndng-indirect-update-as_FIXTURE.js", -+ "eval-gtbndng-indirect-update-as.js", -+ "eval-gtbndng-indirect-update-dflt_FIXTURE.js", -+ "eval-gtbndng-indirect-update-dflt.js", -+ "eval-gtbndng-indirect-update_FIXTURE.js", -+ "eval-gtbndng-indirect-update.js", -+ "eval-gtbndng-local-bndng-cls.js", -+ "eval-gtbndng-local-bndng-const.js", -+ "eval-gtbndng-local-bndng-let.js", -+ "eval-gtbndng-local-bndng-var.js", -+ "eval-rqstd-abrupt-err-type_FIXTURE.js", -+ "eval-rqstd-abrupt-err-uri_FIXTURE.js", -+ "eval-rqstd-abrupt.js", -+ "eval-rqstd-once_FIXTURE.js", -+ "eval-rqstd-once.js", -+ "eval-rqstd-order-1_FIXTURE.js", -+ "eval-rqstd-order-2_FIXTURE.js", -+ "eval-rqstd-order-3_FIXTURE.js", -+ "eval-rqstd-order-4_FIXTURE.js", -+ "eval-rqstd-order-5_FIXTURE.js", -+ "eval-rqstd-order-6_FIXTURE.js", -+ "eval-rqstd-order-7_FIXTURE.js", -+ "eval-rqstd-order-8_FIXTURE.js", -+ "eval-rqstd-order-9_FIXTURE.js", -+ "eval-rqstd-order.js", -+ "eval-self-abrupt.js", -+ "eval-self-once.js", -+ "eval-this.js", -+ "export-default-asyncfunction-declaration-binding-exists.js", -+ "export-default-asyncfunction-declaration-binding.js", -+ "export-default-asyncgenerator-declaration-binding-exists.js", -+ "export-default-asyncgenerator-declaration-binding.js", -+ "export-default-function-declaration-binding-exists.js", -+ "export-default-function-declaration-binding.js", -+ "export-default-generator-declaration-binding-exists.js", -+ "export-default-generator-declaration-binding.js", -+ "export-expname-binding-string.js", -+ "export-expname_FIXTURE.js", -+ "export-expname-from-as-unpaired-surrogate.js", -+ "export-expname-from-binding-string.js", -+ "export-expname-from-star.js", -+ "export-expname-from-star-string.js", -+ "export-expname-from-star-unpaired-surrogate.js", -+ "export-expname-from-string-binding.js", -+ "export-expname-from-string.js", -+ "export-expname-from-string-string.js", -+ "export-expname-from-unpaired-surrogate.js", -+ "export-expname-import-string-binding.js", -+ "export-expname-import-unpaired-surrogate.js", -+ "export-expname-string-binding.js", -+ "export-expname-unpaired-surrogate.js", -+ "export-star-as-dflt_FIXTURE.js", -+ "export-star-as-dflt.js", -+ "instn-iee-bndng-cls_FIXTURE.js", -+ "instn-iee-bndng-cls.js", -+ "instn-iee-bndng-const_FIXTURE.js", -+ "instn-iee-bndng-const.js", -+ "instn-iee-bndng-fun_FIXTURE.js", -+ "instn-iee-bndng-fun.js", -+ "instn-iee-bndng-gen_FIXTURE.js", -+ "instn-iee-bndng-gen.js", -+ "instn-iee-bndng-let_FIXTURE.js", -+ "instn-iee-bndng-let.js", -+ "instn-iee-bndng-var_FIXTURE.js", -+ "instn-iee-bndng-var.js", -+ "instn-iee-err-ambiguous-1_FIXTURE.js", -+ "instn-iee-err-ambiguous-2_FIXTURE.js", -+ "instn-iee-err-ambiguous-as.js", -+ "instn-iee-err-ambiguous_FIXTURE.js", -+ "instn-iee-err-ambiguous.js", -+ "instn-iee-err-circular-as.js", -+ "instn-iee-err-circular_FIXTURE.js", -+ "instn-iee-err-circular.js", -+ "instn-iee-err-dflt-thru-star-as.js", -+ "instn-iee-err-dflt-thru-star-dflt_FIXTURE.js", -+ "instn-iee-err-dflt-thru-star-int_FIXTURE.js", -+ "instn-iee-err-dflt-thru-star.js", -+ "instn-iee-err-not-found-as.js", -+ "instn-iee-err-not-found-empty_FIXTURE.js", -+ "instn-iee-err-not-found.js", -+ "instn-iee-iee-cycle-2_FIXTURE.js", -+ "instn-iee-iee-cycle.js", -+ "instn-iee-star-cycle-2_FIXTURE.js", -+ "instn-iee-star-cycle-indirect-x_FIXTURE.js", -+ "instn-iee-star-cycle.js", -+ "instn-iee-trlng-comma_FIXTURE.js", -+ "instn-iee-trlng-comma.js", -+ "instn-local-bndng-cls.js", -+ "instn-local-bndng-const.js", -+ "instn-local-bndng-export-cls.js", -+ "instn-local-bndng-export-const.js", -+ "instn-local-bndng-export-fun.js", -+ "instn-local-bndng-export-gen.js", -+ "instn-local-bndng-export-let.js", -+ "instn-local-bndng-export-var.js", -+ "instn-local-bndng-for-dup.js", -+ "instn-local-bndng-for.js", -+ "instn-local-bndng-fun.js", -+ "instn-local-bndng-gen.js", -+ "instn-local-bndng-let.js", -+ "instn-local-bndng-var-dup.js", -+ "instn-local-bndng-var.js", -+ "instn-named-bndng-cls.js", -+ "instn-named-bndng-const.js", -+ "instn-named-bndng-dflt-cls.js", -+ "instn-named-bndng-dflt-expr.js", -+ "instn-named-bndng-dflt-fun-anon.js", -+ "instn-named-bndng-dflt-fun-named.js", -+ "instn-named-bndng-dflt-gen-anon.js", -+ "instn-named-bndng-dflt-gen-named.js", -+ "instn-named-bndng-dflt-named.js", -+ "instn-named-bndng-dflt-star.js", -+ "instn-named-bndng-fun.js", -+ "instn-named-bndng-gen.js", -+ "instn-named-bndng-let.js", -+ "instn-named-bndng-trlng-comma.js", -+ "instn-named-bndng-var.js", -+ "instn-named-err-ambiguous-1_FIXTURE.js", -+ "instn-named-err-ambiguous-2_FIXTURE.js", -+ "instn-named-err-ambiguous-as.js", -+ "instn-named-err-ambiguous_FIXTURE.js", -+ "instn-named-err-ambiguous.js", -+ "instn-named-err-dflt-thru-star-as.js", -+ "instn-named-err-dflt-thru-star-dflt_FIXTURE.js", -+ "instn-named-err-dflt-thru-star-dflt.js", -+ "instn-named-err-dflt-thru-star-int_FIXTURE.js", -+ "instn-named-err-not-found-as.js", -+ "instn-named-err-not-found-dflt.js", -+ "instn-named-err-not-found-empty_FIXTURE.js", -+ "instn-named-err-not-found.js", -+ "instn-named-id-name.js", -+ "instn-named-iee-cycle-2_FIXTURE.js", -+ "instn-named-iee-cycle.js", -+ "instn-named-star-cycle-2_FIXTURE.js", -+ "instn-named-star-cycle-indirect-x_FIXTURE.js", -+ "instn-named-star-cycle.js", -+ "instn-once.js", -+ "instn-resolve-empty-export_FIXTURE.js", -+ "instn-resolve-empty-export.js", -+ "instn-resolve-empty-import_FIXTURE.js", -+ "instn-resolve-empty-import.js", -+ "instn-resolve-err-syntax-1_FIXTURE.js", -+ "instn-resolve-err-syntax-1.js", -+ "instn-resolve-err-syntax-2_FIXTURE.js", -+ "instn-resolve-err-syntax-2.js", -+ "instn-resolve-order-depth-child_FIXTURE.js", -+ "instn-resolve-order-depth.js", -+ "instn-resolve-order-depth-reference_FIXTURE.js", -+ "instn-resolve-order-depth-syntax_FIXTURE.js", -+ "instn-resolve-order-src.js", -+ "instn-resolve-order-src-reference_FIXTURE.js", -+ "instn-resolve-order-src-syntax_FIXTURE.js", -+ "instn-resolve-order-src-valid_FIXTURE.js", -+ "instn-same-global.js", -+ "instn-same-global-set_FIXTURE.js", -+ "instn-star-ambiguous-1_FIXTURE.js", -+ "instn-star-ambiguous-2_FIXTURE.js", -+ "instn-star-ambiguous_FIXTURE.js", -+ "instn-star-ambiguous.js", -+ "instn-star-as-props-dflt-skip.js", -+ "instn-star-binding.js", -+ "instn-star-equality.js", -+ "instn-star-equality-other_FIXTURE.js", -+ "instn-star-err-not-found-empty_FIXTURE.js", -+ "instn-star-err-not-found-faulty_FIXTURE.js", -+ "instn-star-err-not-found.js", -+ "instn-star-id-name.js", -+ "instn-star-iee-cycle-2_FIXTURE.js", -+ "instn-star-iee-cycle.js", -+ "instn-star-props-circular-a_FIXTURE.js", -+ "instn-star-props-circular-b_FIXTURE.js", -+ "instn-star-props-circular.js", -+ "instn-star-props-dflt-keep-indirect-def_FIXTURE.js", -+ "instn-star-props-dflt-keep-indirect.js", -+ "instn-star-props-dflt-keep-indirect-reexport_FIXTURE.js", -+ "instn-star-props-dflt-keep-local.js", -+ "instn-star-props-dflt-keep-local-named_FIXTURE.js", -+ "instn-star-props-dflt-keep-local-prod_FIXTURE.js", -+ "instn-star-props-dflt-skip.js", -+ "instn-star-props-dflt-skip-named_FIXTURE.js", -+ "instn-star-props-dflt-skip-prod_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-as-named_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-as-prod_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-named_FIXTURE.js", -+ "instn-star-props-dflt-skip-star-prod_FIXTURE.js", -+ "instn-star-props-nrml-1_FIXTURE.js", -+ "instn-star-props-nrml-indirect_FIXTURE.js", -+ "instn-star-props-nrml.js", -+ "instn-star-props-nrml-star_FIXTURE.js", -+ "instn-star-star-cycle-2_FIXTURE.js", -+ "instn-star-star-cycle-indirect-x_FIXTURE.js", -+ "instn-star-star-cycle.js", -+ "instn-uniq-env-rec.js", -+ "instn-uniq-env-rec-other_FIXTURE.js", -+ "invalid-private-names-call-expression-bad-reference.js", -+ "invalid-private-names-call-expression-this.js", -+ "invalid-private-names-member-expression-bad-reference.js", -+ "invalid-private-names-member-expression-this.js", -+ "parse-err-decl-pos-export-arrow-function.js", -+ "parse-err-decl-pos-export-block-stmt.js", -+ "parse-err-decl-pos-export-block-stmt-list.js", -+ "parse-err-decl-pos-export-class-decl-meth.js", -+ "parse-err-decl-pos-export-class-decl-method-gen.js", -+ "parse-err-decl-pos-export-class-decl-method-gen-static.js", -+ "parse-err-decl-pos-export-class-decl-meth-static.js", -+ "parse-err-decl-pos-export-class-expr-meth-gen.js", -+ "parse-err-decl-pos-export-class-expr-meth-gen-static.js", -+ "parse-err-decl-pos-export-class-expr-meth.js", -+ "parse-err-decl-pos-export-class-expr-meth-static.js", -+ "parse-err-decl-pos-export-do-while.js", -+ "parse-err-decl-pos-export-for-const.js", -+ "parse-err-decl-pos-export-for-in-const.js", -+ "parse-err-decl-pos-export-for-in-let.js", -+ "parse-err-decl-pos-export-for-in-lhs.js", -+ "parse-err-decl-pos-export-for-in-var.js", -+ "parse-err-decl-pos-export-for-let.js", -+ "parse-err-decl-pos-export-for-lhs.js", -+ "parse-err-decl-pos-export-for-of-const.js", -+ "parse-err-decl-pos-export-for-of-let.js", -+ "parse-err-decl-pos-export-for-of-lhs.js", -+ "parse-err-decl-pos-export-for-of-var.js", -+ "parse-err-decl-pos-export-for-var.js", -+ "parse-err-decl-pos-export-function-decl.js", -+ "parse-err-decl-pos-export-function-expr.js", -+ "parse-err-decl-pos-export-generator-decl.js", -+ "parse-err-decl-pos-export-generator-expr.js", -+ "parse-err-decl-pos-export-if-else.js", -+ "parse-err-decl-pos-export-if-if.js", -+ "parse-err-decl-pos-export-labeled.js", -+ "parse-err-decl-pos-export-object-gen-method.js", -+ "parse-err-decl-pos-export-object-getter.js", -+ "parse-err-decl-pos-export-object-method.js", -+ "parse-err-decl-pos-export-object-setter.js", -+ "parse-err-decl-pos-export-switch-case-dflt.js", -+ "parse-err-decl-pos-export-switch-case.js", -+ "parse-err-decl-pos-export-switch-dftl.js", -+ "parse-err-decl-pos-export-try-catch-finally.js", -+ "parse-err-decl-pos-export-try-catch.js", -+ "parse-err-decl-pos-export-try-finally.js", -+ "parse-err-decl-pos-export-try-try.js", -+ "parse-err-decl-pos-export-while.js", -+ "parse-err-decl-pos-import-arrow-function.js", -+ "parse-err-decl-pos-import-block-stmt.js", -+ "parse-err-decl-pos-import-block-stmt-list.js", -+ "parse-err-decl-pos-import-class-decl-meth.js", -+ "parse-err-decl-pos-import-class-decl-method-gen.js", -+ "parse-err-decl-pos-import-class-decl-method-gen-static.js", -+ "parse-err-decl-pos-import-class-decl-meth-static.js", -+ "parse-err-decl-pos-import-class-expr-meth-gen.js", -+ "parse-err-decl-pos-import-class-expr-meth-gen-static.js", -+ "parse-err-decl-pos-import-class-expr-meth.js", -+ "parse-err-decl-pos-import-class-expr-meth-static.js", -+ "parse-err-decl-pos-import-do-while.js", -+ "parse-err-decl-pos-import-for-const.js", -+ "parse-err-decl-pos-import-for-in-const.js", -+ "parse-err-decl-pos-import-for-in-let.js", -+ "parse-err-decl-pos-import-for-in-lhs.js", -+ "parse-err-decl-pos-import-for-in-var.js", -+ "parse-err-decl-pos-import-for-let.js", -+ "parse-err-decl-pos-import-for-lhs.js", -+ "parse-err-decl-pos-import-for-of-const.js", -+ "parse-err-decl-pos-import-for-of-let.js", -+ "parse-err-decl-pos-import-for-of-lhs.js", -+ "parse-err-decl-pos-import-for-of-var.js", -+ "parse-err-decl-pos-import-for-var.js", -+ "parse-err-decl-pos-import-function-decl.js", -+ "parse-err-decl-pos-import-function-expr.js", -+ "parse-err-decl-pos-import-generator-decl.js", -+ "parse-err-decl-pos-import-generator-expr.js", -+ "parse-err-decl-pos-import-if-else.js", -+ "parse-err-decl-pos-import-if-if.js", -+ "parse-err-decl-pos-import-labeled.js", -+ "parse-err-decl-pos-import-object-gen-method.js", -+ "parse-err-decl-pos-import-object-getter.js", -+ "parse-err-decl-pos-import-object-method.js", -+ "parse-err-decl-pos-import-object-setter.js", -+ "parse-err-decl-pos-import-switch-case-dflt.js", -+ "parse-err-decl-pos-import-switch-case.js", -+ "parse-err-decl-pos-import-switch-dftl.js", -+ "parse-err-decl-pos-import-try-catch-finally.js", -+ "parse-err-decl-pos-import-try-catch.js", -+ "parse-err-decl-pos-import-try-finally.js", -+ "parse-err-decl-pos-import-try-try.js", -+ "parse-err-decl-pos-import-while.js", -+ "parse-err-export-dflt-const.js", -+ "parse-err-export-dflt-expr.js", -+ "parse-err-export-dflt-let.js", -+ "parse-err-export-dflt-var.js", -+ "parse-err-hoist-lex-fun.js", -+ "parse-err-hoist-lex-gen.js", -+ "parse-err-invoke-anon-fun-decl.js", -+ "parse-err-invoke-anon-gen-decl.js", -+ "parse-err-return.js", -+ "parse-err-semi-dflt-expr.js", -+ "parse-err-semi-export-star.js", -+ "parse-err-semi-named-export-from.js", -+ "parse-err-semi-named-export.js", -+ "parse-err-semi-name-space-export.js", -+ "parse-err-syntax-1.js", -+ "parse-err-syntax-2.js", -+ "parse-err-yield.js", -+ "parse-export-empty.js", -+ "private-identifiers-not-empty.js", -+ "privatename-not-valid-earlyerr-module-1.js", -+ "privatename-not-valid-earlyerr-module-2.js", -+ "privatename-not-valid-earlyerr-module-3.js", -+ "privatename-not-valid-earlyerr-module-4.js", -+ "privatename-not-valid-earlyerr-module-5.js", -+ "privatename-not-valid-earlyerr-module-6.js", -+ "privatename-not-valid-earlyerr-module-7.js", -+ "privatename-not-valid-earlyerr-module-8.js", -+ "privatename-valid-no-earlyerr.js", -+ "verify-dfs-a_FIXTURE.js", -+ "verify-dfs-b_FIXTURE.js", -+ "verify-dfs.js", -+ "Symbol.iterator.js", -+ "Symbol.toStringTag.js", -+ "define-own-property.js", -+ "delete-exported-init.js", -+ "delete-exported-uninit.js", -+ "delete-non-exported.js", -+ "enumerate-binding-uninit.js", -+ "get-nested-namespace-dflt-skip.js", -+ "get-nested-namespace-dflt-skip-named-end_FIXTURE.js", -+ "get-nested-namespace-dflt-skip-named_FIXTURE.js", -+ "get-nested-namespace-dflt-skip-prod-end_FIXTURE.js", -+ "get-nested-namespace-dflt-skip-prod_FIXTURE.js", -+ "get-nested-namespace-props-nrml-1_FIXTURE.js", -+ "get-nested-namespace-props-nrml-2_FIXTURE.js", -+ "get-nested-namespace-props-nrml-3_FIXTURE.js", -+ "get-nested-namespace-props-nrml.js", -+ "get-own-property-str-found-init.js", -+ "get-own-property-str-found-uninit.js", -+ "get-own-property-str-not-found.js", -+ "get-own-property-sym.js", -+ "get-prototype-of.js", -+ "get-str-found-init.js", -+ "get-str-found-uninit.js", -+ "get-str-initialize.js", -+ "get-str-not-found.js", -+ "get-str-update.js", -+ "get-sym-found.js", -+ "get-sym-not-found.js", -+ "has-property-str-found-init.js", -+ "has-property-str-found-uninit.js", -+ "has-property-str-not-found.js", -+ "has-property-sym-found.js", -+ "has-property-sym-not-found.js", -+ "is-extensible.js", -+ "object-hasOwnProperty-binding-uninit.js", -+ "object-keys-binding-uninit.js", -+ "object-propertyIsEnumerable-binding-uninit.js", -+ "own-property-keys-binding-types_FIXTURE.js", -+ "own-property-keys-binding-types.js", -+ "own-property-keys-sort.js", -+ "prevent-extensions.js", -+ "set.js", -+ "set-prototype-of.js", -+ "set-prototype-of-null.js", -+ "await-awaits-thenable-not-callable.js", -+ "await-awaits-thenables.js", -+ "await-awaits-thenables-that-throw.js", -+ "await-dynamic-import-rejection.js", -+ "await-dynamic-import-resolution.js", -+ "await-expr-func-expression.js", -+ "await-expr-new-expr.js", -+ "await-expr-new-expr-reject.js", -+ "await-expr-regexp.js", -+ "await-expr-reject-throws.js", -+ "await-expr-resolution.js", -+ "await-void-expr.js", -+ "dynamic-import-rejection.js", -+ "dynamic-import-resolution.js", -+ "early-errors-await-not-simple-assignment-target.js", -+ "if-await-expr.js", -+ "module-async-import-async-resolution-ticks.js", -+ "module-import-rejection-body_FIXTURE.js", -+ "module-import-rejection-body.js", -+ "module-import-rejection_FIXTURE.js", -+ "module-import-rejection.js", -+ "module-import-rejection-tick_FIXTURE.js", -+ "module-import-rejection-tick.js", -+ "module-import-resolution_FIXTURE.js", -+ "module-import-resolution.js", -+ "module-import-unwrapped_FIXTURE.js", -+ "module-import-unwrapped.js", -+ "module-self-import-async-resolution-ticks.js", -+ "module-sync-import-async-resolution-ticks.js", -+ "new-await.js", -+ "new-await-parens.js", -+ "new-await-script-code.js", -+ "no-operand.js", -+ "top-level-ticks-2.js", -+ "top-level-ticks.js", -+ "void-await-expr.js", -+ "while-dynamic-evaluation.js", -+ "await-expr-dyn-import.js", -+ "block-await-expr-array-literal.js", -+ "block-await-expr-func-expression.js", -+ "block-await-expr-identifier.js", -+ "block-await-expr-literal-number.js", -+ "block-await-expr-literal-string.js", -+ "block-await-expr-nested.js", -+ "block-await-expr-new-expr.js", -+ "block-await-expr-null.js", -+ "block-await-expr-obj-literal.js", -+ "block-await-expr-regexp.js", -+ "block-await-expr-template-literal.js", -+ "block-await-expr-this.js", -+ "catch-parameter.js", -+ "early-does-not-propagate-to-fn-declaration-body.js", -+ "early-does-not-propagate-to-fn-declaration-params.js", -+ "early-does-not-propagate-to-fn-expr-body.js", -+ "early-does-not-propagate-to-fn-expr-params.js", -+ "early-no-escaped-await.js", -+ "export-class-decl-await-expr-array-literal.js", -+ "export-class-decl-await-expr-func-expression.js", -+ "export-class-decl-await-expr-identifier.js", -+ "export-class-decl-await-expr-literal-number.js", -+ "export-class-decl-await-expr-literal-string.js", -+ "export-class-decl-await-expr-nested.js", -+ "export-class-decl-await-expr-new-expr.js", -+ "export-class-decl-await-expr-null.js", -+ "export-class-decl-await-expr-obj-literal.js", -+ "export-class-decl-await-expr-regexp.js", -+ "export-class-decl-await-expr-template-literal.js", -+ "export-class-decl-await-expr-this.js", -+ "export-dflt-assign-expr-await-expr-array-literal.js", -+ "export-dflt-assign-expr-await-expr-func-expression.js", -+ "export-dflt-assign-expr-await-expr-identifier.js", -+ "export-dflt-assign-expr-await-expr-literal-number.js", -+ "export-dflt-assign-expr-await-expr-literal-string.js", -+ "export-dflt-assign-expr-await-expr-nested.js", -+ "export-dflt-assign-expr-await-expr-new-expr.js", -+ "export-dflt-assign-expr-await-expr-null.js", -+ "export-dflt-assign-expr-await-expr-obj-literal.js", -+ "export-dflt-assign-expr-await-expr-regexp.js", -+ "export-dflt-assign-expr-await-expr-template-literal.js", -+ "export-dflt-assign-expr-await-expr-this.js", -+ "export-dft-class-decl-await-expr-array-literal.js", -+ "export-dft-class-decl-await-expr-func-expression.js", -+ "export-dft-class-decl-await-expr-identifier.js", -+ "export-dft-class-decl-await-expr-literal-number.js", -+ "export-dft-class-decl-await-expr-literal-string.js", -+ "export-dft-class-decl-await-expr-nested.js", -+ "export-dft-class-decl-await-expr-new-expr.js", -+ "export-dft-class-decl-await-expr-null.js", -+ "export-dft-class-decl-await-expr-obj-literal.js", -+ "export-dft-class-decl-await-expr-regexp.js", -+ "export-dft-class-decl-await-expr-template-literal.js", -+ "export-dft-class-decl-await-expr-this.js", -+ "export-lex-decl-await-expr-array-literal.js", -+ "export-lex-decl-await-expr-func-expression.js", -+ "export-lex-decl-await-expr-identifier.js", -+ "export-lex-decl-await-expr-literal-number.js", -+ "export-lex-decl-await-expr-literal-string.js", -+ "export-lex-decl-await-expr-nested.js", -+ "export-lex-decl-await-expr-new-expr.js", -+ "export-lex-decl-await-expr-null.js", -+ "export-lex-decl-await-expr-obj-literal.js", -+ "export-lex-decl-await-expr-regexp.js", -+ "export-lex-decl-await-expr-template-literal.js", -+ "export-lex-decl-await-expr-this.js", -+ "export-var-await-expr-array-literal.js", -+ "export-var-await-expr-func-expression.js", -+ "export-var-await-expr-identifier.js", -+ "export-var-await-expr-literal-number.js", -+ "export-var-await-expr-literal-string.js", -+ "export-var-await-expr-nested.js", -+ "export-var-await-expr-new-expr.js", -+ "export-var-await-expr-null.js", -+ "export-var-await-expr-obj-literal.js", -+ "export-var-await-expr-regexp.js", -+ "export-var-await-expr-template-literal.js", -+ "export-var-await-expr-this.js", -+ "for-await-await-expr-array-literal.js", -+ "for-await-await-expr-func-expression.js", -+ "for-await-await-expr-identifier.js", -+ "for-await-await-expr-literal-number.js", -+ "for-await-await-expr-literal-string.js", -+ "for-await-await-expr-nested.js", -+ "for-await-await-expr-new-expr.js", -+ "for-await-await-expr-null.js", -+ "for-await-await-expr-obj-literal.js", -+ "for-await-await-expr-regexp.js", -+ "for-await-await-expr-template-literal.js", -+ "for-await-await-expr-this.js", -+ "for-await-expr-array-literal.js", -+ "for-await-expr-func-expression.js", -+ "for-await-expr-identifier.js", -+ "for-await-expr-literal-number.js", -+ "for-await-expr-literal-string.js", -+ "for-await-expr-nested.js", -+ "for-await-expr-new-expr.js", -+ "for-await-expr-null.js", -+ "for-await-expr-obj-literal.js", -+ "for-await-expr-regexp.js", -+ "for-await-expr-template-literal.js", -+ "for-await-expr-this.js", -+ "for-in-await-expr-array-literal.js", -+ "for-in-await-expr-func-expression.js", -+ "for-in-await-expr-identifier.js", -+ "for-in-await-expr-literal-number.js", -+ "for-in-await-expr-literal-string.js", -+ "for-in-await-expr-nested.js", -+ "for-in-await-expr-new-expr.js", -+ "for-in-await-expr-null.js", -+ "for-in-await-expr-obj-literal.js", -+ "for-in-await-expr-regexp.js", -+ "for-in-await-expr-template-literal.js", -+ "for-in-await-expr-this.js", -+ "for-of-await-expr-array-literal.js", -+ "for-of-await-expr-func-expression.js", -+ "for-of-await-expr-identifier.js", -+ "for-of-await-expr-literal-number.js", -+ "for-of-await-expr-literal-string.js", -+ "for-of-await-expr-nested.js", -+ "for-of-await-expr-new-expr.js", -+ "for-of-await-expr-null.js", -+ "for-of-await-expr-obj-literal.js", -+ "for-of-await-expr-regexp.js", -+ "for-of-await-expr-template-literal.js", -+ "for-of-await-expr-this.js", -+ "if-block-await-expr-array-literal.js", -+ "if-block-await-expr-func-expression.js", -+ "if-block-await-expr-identifier.js", -+ "if-block-await-expr-literal-number.js", -+ "if-block-await-expr-literal-string.js", -+ "if-block-await-expr-nested.js", -+ "if-block-await-expr-new-expr.js", -+ "if-block-await-expr-null.js", -+ "if-block-await-expr-obj-literal.js", -+ "if-block-await-expr-regexp.js", -+ "if-block-await-expr-template-literal.js", -+ "if-block-await-expr-this.js", -+ "if-expr-await-expr-array-literal.js", -+ "if-expr-await-expr-func-expression.js", -+ "if-expr-await-expr-identifier.js", -+ "if-expr-await-expr-literal-number.js", -+ "if-expr-await-expr-literal-string.js", -+ "if-expr-await-expr-nested.js", -+ "if-expr-await-expr-new-expr.js", -+ "if-expr-await-expr-null.js", -+ "if-expr-await-expr-obj-literal.js", -+ "if-expr-await-expr-regexp.js", -+ "if-expr-await-expr-template-literal.js", -+ "if-expr-await-expr-this.js", -+ "top-level-await-expr-array-literal.js", -+ "top-level-await-expr-func-expression.js", -+ "top-level-await-expr-identifier.js", -+ "top-level-await-expr-literal-number.js", -+ "top-level-await-expr-literal-string.js", -+ "top-level-await-expr-nested.js", -+ "top-level-await-expr-new-expr.js", -+ "top-level-await-expr-null.js", -+ "top-level-await-expr-obj-literal.js", -+ "top-level-await-expr-regexp.js", -+ "top-level-await-expr-template-literal.js", -+ "top-level-await-expr-this.js", -+ "try-await-expr-array-literal.js", -+ "try-await-expr-func-expression.js", -+ "try-await-expr-identifier.js", -+ "try-await-expr-literal-number.js", -+ "try-await-expr-literal-string.js", -+ "try-await-expr-nested.js", -+ "try-await-expr-new-expr.js", -+ "try-await-expr-null.js", -+ "try-await-expr-obj-literal.js", -+ "try-await-expr-regexp.js", -+ "try-await-expr-template-literal.js", -+ "try-await-expr-this.js", -+ "typeof-await-expr-array-literal.js", -+ "typeof-await-expr-func-expression.js", -+ "typeof-await-expr-identifier.js", -+ "typeof-await-expr-literal-number.js", -+ "typeof-await-expr-literal-string.js", -+ "typeof-await-expr-nested.js", -+ "typeof-await-expr-new-expr.js", -+ "typeof-await-expr-null.js", -+ "typeof-await-expr-obj-literal.js", -+ "typeof-await-expr-regexp.js", -+ "typeof-await-expr-template-literal.js", -+ "typeof-await-expr-this.js", -+ "void-await-expr-array-literal.js", -+ "void-await-expr-func-expression.js", -+ "void-await-expr-identifier.js", -+ "void-await-expr-literal-number.js", -+ "void-await-expr-literal-string.js", -+ "void-await-expr-nested.js", -+ "void-await-expr-new-expr.js", -+ "void-await-expr-null.js", -+ "void-await-expr-obj-literal.js", -+ "void-await-expr-regexp.js", -+ "void-await-expr-template-literal.js", -+ "void-await-expr-this.js", -+ "while-await-expr-array-literal.js", -+ "while-await-expr-func-expression.js", -+ "while-await-expr-identifier.js", -+ "while-await-expr-literal-number.js", -+ "while-await-expr-literal-string.js", -+ "while-await-expr-nested.js", -+ "while-await-expr-new-expr.js", -+ "while-await-expr-null.js", -+ "while-await-expr-obj-literal.js", -+ "while-await-expr-regexp.js", -+ "while-await-expr-template-literal.js", -+ "while-await-expr-this.js" - ] -diff --git a/test262/es2015_tests.txt b/test262/es2015_tests.txt -index 92acde0d..69c4954f 100755 ---- a/test262/es2015_tests.txt -+++ b/test262/es2015_tests.txt -@@ -4405,6 +4405,664 @@ built-ins/WeakSet/iterator-close-after-add-failure.js - built-ins/WeakSet/prototype-of-weakset.js - language/expressions/generators/default-proto.js - language/statements/generators/default-proto.js -+language/module-code/comment-multi-line-html-close.js -+language/module-code/comment-single-line-html-close.js -+language/module-code/comment-single-line-html-open.js -+language/module-code/early-dup-export-as-star-as.js -+language/module-code/early-dup-export-decl.js -+language/module-code/early-dup-export-dflt-id.js -+language/module-code/early-dup-export-dflt.js -+language/module-code/early-dup-export-id-as.js -+language/module-code/early-dup-export-id.js -+language/module-code/early-dup-language/module-code/export-star-as-dflt.js -+language/module-code/early-dup-lables.js -+language/module-code/early-dup-lex.js -+language/module-code/early-export-global.js -+language/module-code/early-export-ill-formed-string.js -+language/module-code/early-export-unresolvable.js -+language/module-code/early-import-arguments.js -+language/module-code/early-import-as-arguments.js -+language/module-code/early-import-as-eval.js -+language/module-code/early-import-eval.js -+language/module-code/early-lex-and-var.js -+language/module-code/early-new-target.js -+language/module-code/early-strict-mode.js -+language/module-code/early-super.js -+language/module-code/early-undef-break.js -+language/module-code/early-undef-continue.js -+language/module-code/eval-export-cls-semi.js -+language/module-code/eval-export-dflt-cls-anon.js -+language/module-code/eval-export-dflt-cls-anon-semi.js -+language/module-code/eval-export-dflt-cls-named.js -+language/module-code/eval-export-dflt-cls-named-semi.js -+language/module-code/eval-export-dflt-cls-name-meth.js -+language/module-code/eval-export-dflt-expr-cls-anon.js -+language/module-code/eval-export-dflt-expr-cls-named.js -+language/module-code/eval-export-dflt-expr-cls-name-meth.js -+language/module-code/eval-export-dflt-expr-err-eval.js -+language/module-code/eval-export-dflt-expr-err-get-value.js -+language/module-code/eval-export-dflt-expr-fn-anon.js -+language/module-code/eval-export-dflt-expr-fn-named.js -+language/module-code/eval-export-dflt-expr-gen-anon.js -+language/module-code/eval-export-dflt-expr-gen-named.js -+language/module-code/eval-export-dflt-expr-in.js -+language/module-code/eval-export-dflt-fun-anon-semi.js -+language/module-code/eval-export-dflt-fun-named-semi.js -+language/module-code/eval-export-dflt-gen-anon-semi.js -+language/module-code/eval-export-dflt-gen-named-semi.js -+language/module-code/eval-export-fun-semi.js -+language/module-code/eval-export-gen-semi.js -+language/module-code/eval-gtbndng-indirect-trlng-comma_FIXTURE.js -+language/module-code/eval-gtbndng-indirect-trlng-comma.js -+language/module-code/eval-gtbndng-indirect-update-as_FIXTURE.js -+language/module-code/eval-gtbndng-indirect-update-as.js -+language/module-code/eval-gtbndng-indirect-update-dflt_FIXTURE.js -+language/module-code/eval-gtbndng-indirect-update-dflt.js -+language/module-code/eval-gtbndng-indirect-update_FIXTURE.js -+language/module-code/eval-gtbndng-indirect-update.js -+language/module-code/eval-gtbndng-local-bndng-cls.js -+language/module-code/eval-gtbndng-local-bndng-const.js -+language/module-code/eval-gtbndng-local-bndng-let.js -+language/module-code/eval-gtbndng-local-bndng-var.js -+language/module-code/eval-rqstd-abrupt-err-type_FIXTURE.js -+language/module-code/eval-rqstd-abrupt-err-uri_FIXTURE.js -+language/module-code/eval-rqstd-abrupt.js -+language/module-code/eval-rqstd-once_FIXTURE.js -+language/module-code/eval-rqstd-once.js -+language/module-code/eval-rqstd-order-1_FIXTURE.js -+language/module-code/eval-rqstd-order-2_FIXTURE.js -+language/module-code/eval-rqstd-order-3_FIXTURE.js -+language/module-code/eval-rqstd-order-4_FIXTURE.js -+language/module-code/eval-rqstd-order-5_FIXTURE.js -+language/module-code/eval-rqstd-order-6_FIXTURE.js -+language/module-code/eval-rqstd-order-7_FIXTURE.js -+language/module-code/eval-rqstd-order-8_FIXTURE.js -+language/module-code/eval-rqstd-order-9_FIXTURE.js -+language/module-code/eval-rqstd-order.js -+language/module-code/eval-self-abrupt.js -+language/module-code/eval-self-once.js -+language/module-code/eval-this.js -+language/module-code/export-default-asyncfunction-declaration-binding-exists.js -+language/module-code/export-default-asyncfunction-declaration-binding.js -+language/module-code/export-default-asyncgenerator-declaration-binding-exists.js -+language/module-code/export-default-asyncgenerator-declaration-binding.js -+language/module-code/export-default-function-declaration-binding-exists.js -+language/module-code/export-default-function-declaration-binding.js -+language/module-code/export-default-generator-declaration-binding-exists.js -+language/module-code/export-default-generator-declaration-binding.js -+language/module-code/export-expname-binding-string.js -+language/module-code/export-expname_FIXTURE.js -+language/module-code/export-expname-from-as-unpaired-surrogate.js -+language/module-code/export-expname-from-binding-string.js -+language/module-code/export-expname-from-star.js -+language/module-code/export-expname-from-star-string.js -+language/module-code/export-expname-from-star-unpaired-surrogate.js -+language/module-code/export-expname-from-string-binding.js -+language/module-code/export-expname-from-string.js -+language/module-code/export-expname-from-string-string.js -+language/module-code/export-expname-from-unpaired-surrogate.js -+language/module-code/export-expname-import-string-binding.js -+language/module-code/export-expname-import-unpaired-surrogate.js -+language/module-code/export-expname-string-binding.js -+language/module-code/export-expname-unpaired-surrogate.js -+language/module-code/export-star-as-dflt_FIXTURE.js -+language/module-code/export-star-as-dflt.js -+language/module-code/instn-iee-bndng-cls_FIXTURE.js -+language/module-code/instn-iee-bndng-cls.js -+language/module-code/instn-iee-bndng-const_FIXTURE.js -+language/module-code/instn-iee-bndng-const.js -+language/module-code/instn-iee-bndng-fun_FIXTURE.js -+language/module-code/instn-iee-bndng-fun.js -+language/module-code/instn-iee-bndng-gen_FIXTURE.js -+language/module-code/instn-iee-bndng-gen.js -+language/module-code/instn-iee-bndng-let_FIXTURE.js -+language/module-code/instn-iee-bndng-let.js -+language/module-code/instn-iee-bndng-var_FIXTURE.js -+language/module-code/instn-iee-bndng-var.js -+language/module-code/instn-iee-err-ambiguous-1_FIXTURE.js -+language/module-code/instn-iee-err-ambiguous-2_FIXTURE.js -+language/module-code/instn-iee-err-ambiguous-as.js -+language/module-code/instn-iee-err-ambiguous_FIXTURE.js -+language/module-code/instn-iee-err-ambiguous.js -+language/module-code/instn-iee-err-circular-as.js -+language/module-code/instn-iee-err-circular_FIXTURE.js -+language/module-code/instn-iee-err-circular.js -+language/module-code/instn-iee-err-dflt-thru-star-as.js -+language/module-code/instn-iee-err-dflt-thru-star-dflt_FIXTURE.js -+language/module-code/instn-iee-err-dflt-thru-star-int_FIXTURE.js -+language/module-code/instn-iee-err-dflt-thru-star.js -+language/module-code/instn-iee-err-not-found-as.js -+language/module-code/instn-iee-err-not-found-empty_FIXTURE.js -+language/module-code/instn-iee-err-not-found.js -+language/module-code/instn-iee-iee-cycle-2_FIXTURE.js -+language/module-code/instn-iee-iee-cycle.js -+language/module-code/instn-iee-star-cycle-2_FIXTURE.js -+language/module-code/instn-iee-star-cycle-indirect-x_FIXTURE.js -+language/module-code/instn-iee-star-cycle.js -+language/module-code/instn-iee-trlng-comma_FIXTURE.js -+language/module-code/instn-iee-trlng-comma.js -+language/module-code/instn-local-bndng-cls.js -+language/module-code/instn-local-bndng-const.js -+language/module-code/instn-local-bndng-export-cls.js -+language/module-code/instn-local-bndng-export-const.js -+language/module-code/instn-local-bndng-export-fun.js -+language/module-code/instn-local-bndng-export-gen.js -+language/module-code/instn-local-bndng-export-let.js -+language/module-code/instn-local-bndng-export-var.js -+language/module-code/instn-local-bndng-for-dup.js -+language/module-code/instn-local-bndng-for.js -+language/module-code/instn-local-bndng-fun.js -+language/module-code/instn-local-bndng-gen.js -+language/module-code/instn-local-bndng-let.js -+language/module-code/instn-local-bndng-var-dup.js -+language/module-code/instn-local-bndng-var.js -+language/module-code/instn-named-bndng-cls.js -+language/module-code/instn-named-bndng-const.js -+language/module-code/instn-named-bndng-dflt-cls.js -+language/module-code/instn-named-bndng-dflt-expr.js -+language/module-code/instn-named-bndng-dflt-fun-anon.js -+language/module-code/instn-named-bndng-dflt-fun-named.js -+language/module-code/instn-named-bndng-dflt-gen-anon.js -+language/module-code/instn-named-bndng-dflt-gen-named.js -+language/module-code/instn-named-bndng-dflt-named.js -+language/module-code/instn-named-bndng-dflt-star.js -+language/module-code/instn-named-bndng-fun.js -+language/module-code/instn-named-bndng-gen.js -+language/module-code/instn-named-bndng-let.js -+language/module-code/instn-named-bndng-trlng-comma.js -+language/module-code/instn-named-bndng-var.js -+language/module-code/instn-named-err-ambiguous-1_FIXTURE.js -+language/module-code/instn-named-err-ambiguous-2_FIXTURE.js -+language/module-code/instn-named-err-ambiguous-as.js -+language/module-code/instn-named-err-ambiguous_FIXTURE.js -+language/module-code/instn-named-err-ambiguous.js -+language/module-code/instn-named-err-dflt-thru-star-as.js -+language/module-code/instn-named-err-dflt-thru-star-dflt_FIXTURE.js -+language/module-code/instn-named-err-dflt-thru-star-dflt.js -+language/module-code/instn-named-err-dflt-thru-star-int_FIXTURE.js -+language/module-code/instn-named-err-not-found-as.js -+language/module-code/instn-named-err-not-found-dflt.js -+language/module-code/instn-named-err-not-found-empty_FIXTURE.js -+language/module-code/instn-named-err-not-found.js -+language/module-code/instn-named-id-name.js -+language/module-code/instn-named-iee-cycle-2_FIXTURE.js -+language/module-code/instn-named-iee-cycle.js -+language/module-code/instn-named-star-cycle-2_FIXTURE.js -+language/module-code/instn-named-star-cycle-indirect-x_FIXTURE.js -+language/module-code/instn-named-star-cycle.js -+language/module-code/instn-once.js -+language/module-code/instn-resolve-empty-export_FIXTURE.js -+language/module-code/instn-resolve-empty-export.js -+language/module-code/instn-resolve-empty-import_FIXTURE.js -+language/module-code/instn-resolve-empty-import.js -+language/module-code/instn-resolve-err-syntax-1_FIXTURE.js -+language/module-code/instn-resolve-err-syntax-1.js -+language/module-code/instn-resolve-err-syntax-2_FIXTURE.js -+language/module-code/instn-resolve-err-syntax-2.js -+language/module-code/instn-resolve-order-depth-child_FIXTURE.js -+language/module-code/instn-resolve-order-depth.js -+language/module-code/instn-resolve-order-depth-reference_FIXTURE.js -+language/module-code/instn-resolve-order-depth-syntax_FIXTURE.js -+language/module-code/instn-resolve-order-src.js -+language/module-code/instn-resolve-order-src-reference_FIXTURE.js -+language/module-code/instn-resolve-order-src-syntax_FIXTURE.js -+language/module-code/instn-resolve-order-src-valid_FIXTURE.js -+language/module-code/instn-same-global.js -+language/module-code/instn-same-global-set_FIXTURE.js -+language/module-code/instn-star-ambiguous-1_FIXTURE.js -+language/module-code/instn-star-ambiguous-2_FIXTURE.js -+language/module-code/instn-star-ambiguous_FIXTURE.js -+language/module-code/instn-star-ambiguous.js -+language/module-code/instn-star-as-props-dflt-skip.js -+language/module-code/instn-star-binding.js -+language/module-code/instn-star-equality.js -+language/module-code/instn-star-equality-other_FIXTURE.js -+language/module-code/instn-star-err-not-found-empty_FIXTURE.js -+language/module-code/instn-star-err-not-found-faulty_FIXTURE.js -+language/module-code/instn-star-err-not-found.js -+language/module-code/instn-star-id-name.js -+language/module-code/instn-star-iee-cycle-2_FIXTURE.js -+language/module-code/instn-star-iee-cycle.js -+language/module-code/instn-star-props-circular-a_FIXTURE.js -+language/module-code/instn-star-props-circular-b_FIXTURE.js -+language/module-code/instn-star-props-circular.js -+language/module-code/instn-star-props-dflt-keep-indirect-def_FIXTURE.js -+language/module-code/instn-star-props-dflt-keep-indirect.js -+language/module-code/instn-star-props-dflt-keep-indirect-reexport_FIXTURE.js -+language/module-code/instn-star-props-dflt-keep-local.js -+language/module-code/instn-star-props-dflt-keep-local-named_FIXTURE.js -+language/module-code/instn-star-props-dflt-keep-local-prod_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip.js -+language/module-code/instn-star-props-dflt-skip-named_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-prod_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-as-named_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-as-prod_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-named_FIXTURE.js -+language/module-code/instn-star-props-dflt-skip-star-prod_FIXTURE.js -+language/module-code/instn-star-props-nrml-1_FIXTURE.js -+language/module-code/instn-star-props-nrml-indirect_FIXTURE.js -+language/module-code/instn-star-props-nrml.js -+language/module-code/instn-star-props-nrml-star_FIXTURE.js -+language/module-code/instn-star-star-cycle-2_FIXTURE.js -+language/module-code/instn-star-star-cycle-indirect-x_FIXTURE.js -+language/module-code/instn-star-star-cycle.js -+language/module-code/instn-uniq-env-rec.js -+language/module-code/instn-uniq-env-rec-other_FIXTURE.js -+language/module-code/invalid-private-names-call-expression-bad-reference.js -+language/module-code/invalid-private-names-call-expression-this.js -+language/module-code/invalid-private-names-member-expression-bad-reference.js -+language/module-code/invalid-private-names-member-expression-this.js -+language/module-code/parse-err-decl-pos-export-arrow-function.js -+language/module-code/parse-err-decl-pos-export-block-stmt.js -+language/module-code/parse-err-decl-pos-export-block-stmt-list.js -+language/module-code/parse-err-decl-pos-export-class-decl-meth.js -+language/module-code/parse-err-decl-pos-export-class-decl-method-gen.js -+language/module-code/parse-err-decl-pos-export-class-decl-method-gen-static.js -+language/module-code/parse-err-decl-pos-export-class-decl-meth-static.js -+language/module-code/parse-err-decl-pos-export-class-expr-meth-gen.js -+language/module-code/parse-err-decl-pos-export-class-expr-meth-gen-static.js -+language/module-code/parse-err-decl-pos-export-class-expr-meth.js -+language/module-code/parse-err-decl-pos-export-class-expr-meth-static.js -+language/module-code/parse-err-decl-pos-export-do-while.js -+language/module-code/parse-err-decl-pos-export-for-const.js -+language/module-code/parse-err-decl-pos-export-for-in-const.js -+language/module-code/parse-err-decl-pos-export-for-in-let.js -+language/module-code/parse-err-decl-pos-export-for-in-lhs.js -+language/module-code/parse-err-decl-pos-export-for-in-var.js -+language/module-code/parse-err-decl-pos-export-for-let.js -+language/module-code/parse-err-decl-pos-export-for-lhs.js -+language/module-code/parse-err-decl-pos-export-for-of-const.js -+language/module-code/parse-err-decl-pos-export-for-of-let.js -+language/module-code/parse-err-decl-pos-export-for-of-lhs.js -+language/module-code/parse-err-decl-pos-export-for-of-var.js -+language/module-code/parse-err-decl-pos-export-for-var.js -+language/module-code/parse-err-decl-pos-export-function-decl.js -+language/module-code/parse-err-decl-pos-export-function-expr.js -+language/module-code/parse-err-decl-pos-export-generator-decl.js -+language/module-code/parse-err-decl-pos-export-generator-expr.js -+language/module-code/parse-err-decl-pos-export-if-else.js -+language/module-code/parse-err-decl-pos-export-if-if.js -+language/module-code/parse-err-decl-pos-export-labeled.js -+language/module-code/parse-err-decl-pos-export-object-gen-method.js -+language/module-code/parse-err-decl-pos-export-object-getter.js -+language/module-code/parse-err-decl-pos-export-object-method.js -+language/module-code/parse-err-decl-pos-export-object-setter.js -+language/module-code/parse-err-decl-pos-export-switch-case-dflt.js -+language/module-code/parse-err-decl-pos-export-switch-case.js -+language/module-code/parse-err-decl-pos-export-switch-dftl.js -+language/module-code/parse-err-decl-pos-export-try-catch-finally.js -+language/module-code/parse-err-decl-pos-export-try-catch.js -+language/module-code/parse-err-decl-pos-export-try-finally.js -+language/module-code/parse-err-decl-pos-export-try-try.js -+language/module-code/parse-err-decl-pos-export-while.js -+language/module-code/parse-err-decl-pos-import-arrow-function.js -+language/module-code/parse-err-decl-pos-import-block-stmt.js -+language/module-code/parse-err-decl-pos-import-block-stmt-list.js -+language/module-code/parse-err-decl-pos-import-class-decl-meth.js -+language/module-code/parse-err-decl-pos-import-class-decl-method-gen.js -+language/module-code/parse-err-decl-pos-import-class-decl-method-gen-static.js -+language/module-code/parse-err-decl-pos-import-class-decl-meth-static.js -+language/module-code/parse-err-decl-pos-import-class-expr-meth-gen.js -+language/module-code/parse-err-decl-pos-import-class-expr-meth-gen-static.js -+language/module-code/parse-err-decl-pos-import-class-expr-meth.js -+language/module-code/parse-err-decl-pos-import-class-expr-meth-static.js -+language/module-code/parse-err-decl-pos-import-do-while.js -+language/module-code/parse-err-decl-pos-import-for-const.js -+language/module-code/parse-err-decl-pos-import-for-in-const.js -+language/module-code/parse-err-decl-pos-import-for-in-let.js -+language/module-code/parse-err-decl-pos-import-for-in-lhs.js -+language/module-code/parse-err-decl-pos-import-for-in-var.js -+language/module-code/parse-err-decl-pos-import-for-let.js -+language/module-code/parse-err-decl-pos-import-for-lhs.js -+language/module-code/parse-err-decl-pos-import-for-of-const.js -+language/module-code/parse-err-decl-pos-import-for-of-let.js -+language/module-code/parse-err-decl-pos-import-for-of-lhs.js -+language/module-code/parse-err-decl-pos-import-for-of-var.js -+language/module-code/parse-err-decl-pos-import-for-var.js -+language/module-code/parse-err-decl-pos-import-function-decl.js -+language/module-code/parse-err-decl-pos-import-function-expr.js -+language/module-code/parse-err-decl-pos-import-generator-decl.js -+language/module-code/parse-err-decl-pos-import-generator-expr.js -+language/module-code/parse-err-decl-pos-import-if-else.js -+language/module-code/parse-err-decl-pos-import-if-if.js -+language/module-code/parse-err-decl-pos-import-labeled.js -+language/module-code/parse-err-decl-pos-import-object-gen-method.js -+language/module-code/parse-err-decl-pos-import-object-getter.js -+language/module-code/parse-err-decl-pos-import-object-method.js -+language/module-code/parse-err-decl-pos-import-object-setter.js -+language/module-code/parse-err-decl-pos-import-switch-case-dflt.js -+language/module-code/parse-err-decl-pos-import-switch-case.js -+language/module-code/parse-err-decl-pos-import-switch-dftl.js -+language/module-code/parse-err-decl-pos-import-try-catch-finally.js -+language/module-code/parse-err-decl-pos-import-try-catch.js -+language/module-code/parse-err-decl-pos-import-try-finally.js -+language/module-code/parse-err-decl-pos-import-try-try.js -+language/module-code/parse-err-decl-pos-import-while.js -+language/module-code/parse-err-export-dflt-const.js -+language/module-code/parse-err-export-dflt-expr.js -+language/module-code/parse-err-export-dflt-let.js -+language/module-code/parse-err-export-dflt-var.js -+language/module-code/parse-err-hoist-lex-fun.js -+language/module-code/parse-err-hoist-lex-gen.js -+language/module-code/parse-err-invoke-anon-fun-decl.js -+language/module-code/parse-err-invoke-anon-gen-decl.js -+language/module-code/parse-err-return.js -+language/module-code/parse-err-semi-dflt-expr.js -+language/module-code/parse-err-semi-export-star.js -+language/module-code/parse-err-semi-named-export-from.js -+language/module-code/parse-err-semi-named-export.js -+language/module-code/parse-err-semi-name-space-export.js -+language/module-code/parse-err-syntax-1.js -+language/module-code/parse-err-syntax-2.js -+language/module-code/parse-err-yield.js -+language/module-code/parse-export-empty.js -+language/module-code/private-identifiers-not-empty.js -+language/module-code/privatename-not-valid-earlyerr-module-1.js -+language/module-code/privatename-not-valid-earlyerr-module-2.js -+language/module-code/privatename-not-valid-earlyerr-module-3.js -+language/module-code/privatename-not-valid-earlyerr-module-4.js -+language/module-code/privatename-not-valid-earlyerr-module-5.js -+language/module-code/privatename-not-valid-earlyerr-module-6.js -+language/module-code/privatename-not-valid-earlyerr-module-7.js -+language/module-code/privatename-not-valid-earlyerr-module-8.js -+language/module-code/privatename-valid-no-earlyerr.js -+language/module-code/verify-dfs-a_FIXTURE.js -+language/module-code/verify-dfs-b_FIXTURE.js -+language/module-code/verify-dfs.js -+language/module-code/namespace/Symbol.iterator.js -+language/module-code/namespace/Symbol.toStringTag.js -+language/module-code/namespace/internals/define-own-property.js -+language/module-code/namespace/internals/delete-exported-init.js -+language/module-code/namespace/internals/delete-exported-uninit.js -+language/module-code/namespace/internals/delete-non-exported.js -+language/module-code/namespace/internals/enumerate-binding-uninit.js -+language/module-code/namespace/internals/get-nested-namespace-dflt-skip.js -+language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-props-nrml-1_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js -+language/module-code/namespace/internals/get-nested-namespace-props-nrml.js -+language/module-code/namespace/internals/get-own-property-str-found-init.js -+language/module-code/namespace/internals/get-own-property-str-found-uninit.js -+language/module-code/namespace/internals/get-own-property-str-not-found.js -+language/module-code/namespace/internals/get-own-property-sym.js -+language/module-code/namespace/internals/get-prototype-of.js -+language/module-code/namespace/internals/get-str-found-init.js -+language/module-code/namespace/internals/get-str-found-uninit.js -+language/module-code/namespace/internals/get-str-initialize.js -+language/module-code/namespace/internals/get-str-not-found.js -+language/module-code/namespace/internals/get-str-update.js -+language/module-code/namespace/internals/get-sym-found.js -+language/module-code/namespace/internals/get-sym-not-found.js -+language/module-code/namespace/internals/has-property-str-found-init.js -+language/module-code/namespace/internals/has-property-str-found-uninit.js -+language/module-code/namespace/internals/has-property-str-not-found.js -+language/module-code/namespace/internals/has-property-sym-found.js -+language/module-code/namespace/internals/has-property-sym-not-found.js -+language/module-code/namespace/internals/is-extensible.js -+language/module-code/namespace/internals/object-hasOwnProperty-binding-uninit.js -+language/module-code/namespace/internals/object-keys-binding-uninit.js -+language/module-code/namespace/internals/object-propertyIsEnumerable-binding-uninit.js -+language/module-code/namespace/internals/own-property-keys-binding-types_FIXTURE.js -+language/module-code/namespace/internals/own-property-keys-binding-types.js -+language/module-code/namespace/internals/own-property-keys-sort.js -+language/module-code/namespace/internals/prevent-extensions.js -+language/module-code/namespace/internals/set.js -+language/module-code/namespace/internals/set-prototype-of.js -+language/module-code/namespace/internals/set-prototype-of-null.js -+language/module-code/top-level-await/await-awaits-thenable-not-callable.js -+language/module-code/top-level-await/await-awaits-thenables.js -+language/module-code/top-level-await/await-awaits-thenables-that-throw.js -+language/module-code/top-level-await/await-dynamic-import-rejection.js -+language/module-code/top-level-await/await-dynamic-import-resolution.js -+language/module-code/top-level-await/await-expr-func-expression.js -+language/module-code/top-level-await/await-expr-new-expr.js -+language/module-code/top-level-await/await-expr-new-expr-reject.js -+language/module-code/top-level-await/await-expr-regexp.js -+language/module-code/top-level-await/await-expr-reject-throws.js -+language/module-code/top-level-await/await-expr-resolution.js -+language/module-code/top-level-await/await-void-expr.js -+language/module-code/top-level-await/dynamic-import-rejection.js -+language/module-code/top-level-await/dynamic-import-resolution.js -+language/module-code/top-level-await/early-errors-await-not-simple-assignment-target.js -+language/module-code/top-level-await/if-await-expr.js -+language/module-code/top-level-await/module-async-import-async-resolution-ticks.js -+language/module-code/top-level-await/module-import-rejection-body_FIXTURE.js -+language/module-code/top-level-await/module-import-rejection-body.js -+language/module-code/top-level-await/module-import-rejection_FIXTURE.js -+language/module-code/top-level-await/module-import-rejection.js -+language/module-code/top-level-await/module-import-rejection-tick_FIXTURE.js -+language/module-code/top-level-await/module-import-rejection-tick.js -+language/module-code/top-level-await/module-import-resolution_FIXTURE.js -+language/module-code/top-level-await/module-import-resolution.js -+language/module-code/top-level-await/module-import-unwrapped_FIXTURE.js -+language/module-code/top-level-await/module-import-unwrapped.js -+language/module-code/top-level-await/module-self-import-async-resolution-ticks.js -+language/module-code/top-level-await/module-sync-import-async-resolution-ticks.js -+language/module-code/top-level-await/new-await.js -+language/module-code/top-level-await/new-await-parens.js -+language/module-code/top-level-await/new-await-script-code.js -+language/module-code/top-level-await/no-operand.js -+language/module-code/top-level-await/top-level-ticks-2.js -+language/module-code/top-level-await/top-level-ticks.js -+language/module-code/top-level-await/void-await-expr.js -+language/module-code/top-level-await/while-dynamic-evaluation.js -+language/module-code/top-level-await/syntax/await-expr-dyn-import.js -+language/module-code/top-level-await/syntax/block-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/block-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/block-await-expr-identifier.js -+language/module-code/top-level-await/syntax/block-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/block-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/block-await-expr-nested.js -+language/module-code/top-level-await/syntax/block-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/block-await-expr-null.js -+language/module-code/top-level-await/syntax/block-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/block-await-expr-regexp.js -+language/module-code/top-level-await/syntax/block-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/block-await-expr-this.js -+language/module-code/top-level-await/syntax/catch-parameter.js -+language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-body.js -+language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-params.js -+language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-expr-body.js -+language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-expr-params.js -+language/module-code/top-level-await/syntax/early-no-escaped-await.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-identifier.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-nested.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-null.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-regexp.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/export-class-decl-await-expr-this.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-identifier.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-nested.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-null.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-regexp.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/export-dflt-assign-expr-await-expr-this.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-identifier.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-nested.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-null.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-regexp.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/export-dft-class-decl-await-expr-this.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-identifier.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-nested.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-null.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-regexp.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/export-lex-decl-await-expr-this.js -+language/module-code/top-level-await/syntax/export-var-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/export-var-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/export-var-await-expr-identifier.js -+language/module-code/top-level-await/syntax/export-var-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/export-var-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/export-var-await-expr-nested.js -+language/module-code/top-level-await/syntax/export-var-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/export-var-await-expr-null.js -+language/module-code/top-level-await/syntax/export-var-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/export-var-await-expr-regexp.js -+language/module-code/top-level-await/syntax/export-var-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/export-var-await-expr-this.js -+language/module-code/top-level-await/syntax/for-await-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/for-await-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/for-await-await-expr-identifier.js -+language/module-code/top-level-await/syntax/for-await-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/for-await-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/for-await-await-expr-nested.js -+language/module-code/top-level-await/syntax/for-await-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/for-await-await-expr-null.js -+language/module-code/top-level-await/syntax/for-await-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/for-await-await-expr-regexp.js -+language/module-code/top-level-await/syntax/for-await-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/for-await-await-expr-this.js -+language/module-code/top-level-await/syntax/for-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/for-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/for-await-expr-identifier.js -+language/module-code/top-level-await/syntax/for-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/for-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/for-await-expr-nested.js -+language/module-code/top-level-await/syntax/for-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/for-await-expr-null.js -+language/module-code/top-level-await/syntax/for-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/for-await-expr-regexp.js -+language/module-code/top-level-await/syntax/for-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/for-await-expr-this.js -+language/module-code/top-level-await/syntax/for-in-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/for-in-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/for-in-await-expr-identifier.js -+language/module-code/top-level-await/syntax/for-in-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/for-in-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/for-in-await-expr-nested.js -+language/module-code/top-level-await/syntax/for-in-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/for-in-await-expr-null.js -+language/module-code/top-level-await/syntax/for-in-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/for-in-await-expr-regexp.js -+language/module-code/top-level-await/syntax/for-in-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/for-in-await-expr-this.js -+language/module-code/top-level-await/syntax/for-of-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/for-of-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/for-of-await-expr-identifier.js -+language/module-code/top-level-await/syntax/for-of-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/for-of-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/for-of-await-expr-nested.js -+language/module-code/top-level-await/syntax/for-of-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/for-of-await-expr-null.js -+language/module-code/top-level-await/syntax/for-of-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/for-of-await-expr-regexp.js -+language/module-code/top-level-await/syntax/for-of-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/for-of-await-expr-this.js -+language/module-code/top-level-await/syntax/if-block-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/if-block-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/if-block-await-expr-identifier.js -+language/module-code/top-level-await/syntax/if-block-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/if-block-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/if-block-await-expr-nested.js -+language/module-code/top-level-await/syntax/if-block-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/if-block-await-expr-null.js -+language/module-code/top-level-await/syntax/if-block-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/if-block-await-expr-regexp.js -+language/module-code/top-level-await/syntax/if-block-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/if-block-await-expr-this.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-identifier.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-nested.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-null.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-regexp.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/if-expr-await-expr-this.js -+language/module-code/top-level-await/syntax/top-level-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/top-level-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/top-level-await-expr-identifier.js -+language/module-code/top-level-await/syntax/top-level-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/top-level-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/top-level-await-expr-nested.js -+language/module-code/top-level-await/syntax/top-level-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/top-level-await-expr-null.js -+language/module-code/top-level-await/syntax/top-level-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/top-level-await-expr-regexp.js -+language/module-code/top-level-await/syntax/top-level-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/top-level-await-expr-this.js -+language/module-code/top-level-await/syntax/try-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/try-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/try-await-expr-identifier.js -+language/module-code/top-level-await/syntax/try-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/try-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/try-await-expr-nested.js -+language/module-code/top-level-await/syntax/try-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/try-await-expr-null.js -+language/module-code/top-level-await/syntax/try-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/try-await-expr-regexp.js -+language/module-code/top-level-await/syntax/try-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/try-await-expr-this.js -+language/module-code/top-level-await/syntax/typeof-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/typeof-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/typeof-await-expr-identifier.js -+language/module-code/top-level-await/syntax/typeof-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/typeof-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/typeof-await-expr-nested.js -+language/module-code/top-level-await/syntax/typeof-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/typeof-await-expr-null.js -+language/module-code/top-level-await/syntax/typeof-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/typeof-await-expr-regexp.js -+language/module-code/top-level-await/syntax/typeof-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/typeof-await-expr-this.js -+language/module-code/top-level-await/syntax/void-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/void-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/void-await-expr-identifier.js -+language/module-code/top-level-await/syntax/void-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/void-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/void-await-expr-nested.js -+language/module-code/top-level-await/syntax/void-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/void-await-expr-null.js -+language/module-code/top-level-await/syntax/void-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/void-await-expr-regexp.js -+language/module-code/top-level-await/syntax/void-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/void-await-expr-this.js -+language/module-code/top-level-await/syntax/while-await-expr-array-literal.js -+language/module-code/top-level-await/syntax/while-await-expr-func-expression.js -+language/module-code/top-level-await/syntax/while-await-expr-identifier.js -+language/module-code/top-level-await/syntax/while-await-expr-literal-number.js -+language/module-code/top-level-await/syntax/while-await-expr-literal-string.js -+language/module-code/top-level-await/syntax/while-await-expr-nested.js -+language/module-code/top-level-await/syntax/while-await-expr-new-expr.js -+language/module-code/top-level-await/syntax/while-await-expr-null.js -+language/module-code/top-level-await/syntax/while-await-expr-obj-literal.js -+language/module-code/top-level-await/syntax/while-await-expr-regexp.js -+language/module-code/top-level-await/syntax/while-await-expr-template-literal.js -+language/module-code/top-level-await/syntax/while-await-expr-this.js - built-ins/Symbol/replace/cross-realm.js - built-ins/Symbol/split/cross-realm.js - built-ins/Symbol/species/cross-realm.js -diff --git a/ts2panda/scripts/diagnosticMessages.json b/ts2panda/scripts/diagnosticMessages.json -index b4142d71..7a2aef60 100755 ---- a/ts2panda/scripts/diagnosticMessages.json -+++ b/ts2panda/scripts/diagnosticMessages.json -@@ -243,6 +243,10 @@ - "category": "Error", - "code": 1210 - }, -+ "A class declaration without the 'default' modifier must have a name.": { -+ "category": "Error", -+ "code": 1211 -+ }, - "Identifier expected. '{0}' is a reserved word in strict mode.": { - "category": "Error", - "code": 1212 -@@ -423,6 +427,10 @@ - "category": "Error", - "code": 2501 - }, -+ "A module cannot have multiple default exports.": { -+ "category": "Error", -+ "code": 2528 -+ }, - "The 'super' can only be referenced in members of derived classes or object literal expressions.": { - "category": "Error", - "code": 2660 -diff --git a/ts2panda/src/addVariable2Scope.ts b/ts2panda/src/addVariable2Scope.ts -index c9f59db1..ed32f30b 100644 ---- a/ts2panda/src/addVariable2Scope.ts -+++ b/ts2panda/src/addVariable2Scope.ts -@@ -25,6 +25,8 @@ import { - FuncDecl, - InitStatus, - LetDecl, -+ ModuleDecl, -+ ModuleScope, - Scope, - VarDecl, - VariableScope -@@ -103,6 +105,11 @@ export function addVariableToScope(recorder: Recorder) { - scope.add(decl.name, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); - } else if (decl instanceof ConstDecl) { - scope.add(decl.name, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); -+ } else if (decl instanceof ModuleDecl) { -+ if (!(scope instanceof ModuleScope)) { -+ throw new Error("ModuleVariable can't exist without ModuleScope"); -+ } -+ scope.add(decls[j].name, VarDeclarationKind.MODULE); - } else if (decl instanceof FuncDecl) { - scope.add(decl.name, VarDeclarationKind.FUNCTION); - } else if (decl instanceof CatchParameter) { -diff --git a/ts2panda/src/base/bcGenUtil.ts b/ts2panda/src/base/bcGenUtil.ts -index 4f195377..f4f77e10 100755 ---- a/ts2panda/src/base/bcGenUtil.ts -+++ b/ts2panda/src/base/bcGenUtil.ts -@@ -43,7 +43,7 @@ import { - EcmaGetiteratornext, - EcmaGetnextpropname, - EcmaGetpropiterator, -- EcmaImportmodule, -+ EcmaGetModuleNamespace, - EcmaIsfalse, - EcmaIstrue, - EcmaLdglobalvar, -@@ -367,8 +367,8 @@ export function ldSuperByValue(obj: VReg, prop: VReg): IRNode { - return new EcmaLdsuperbyvalue(obj, prop); - } - --export function importModule(name: string) { -- return new EcmaImportmodule(name); -+export function getModuleNamespace(moduleIdx: number) { -+ return new EcmaGetModuleNamespace(moduleIdx); - } - - export function loadModuleVarByName(name: string, module: VReg) { -diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts -index c9230ee0..40571744 100755 ---- a/ts2panda/src/compiler.ts -+++ b/ts2panda/src/compiler.ts -@@ -505,10 +505,10 @@ export class Compiler { - } - - compileVariableDeclaration(decl: ts.VariableDeclaration, isExported: boolean = false) { -- if (isExported) { -- let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); -- setVariableExported(name, this.getCurrentScope()); -- } -+ // if (isExported) { -+ // let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); -+ // setVariableExported(name, this.getCurrentScope()); -+ // } - - let lref = LReference.generateLReference(this, decl.name, true); - if (decl.initializer) { -@@ -690,7 +690,7 @@ export class Compiler { - let internalName = this.compilerDriver.getFuncInternalName(decl, this.recorder); - let env = this.getCurrentEnv(); - this.pandaGen.defineFunction(NodeKind.FirstNodeOfFunction, decl, internalName, env); -- this.pandaGen.storeModuleVar(decl, "default"); -+ this.pandaGen.storeModuleVar(decl, "*default*"); - } else { - throw new Error("SyntaxError: export function declaration cannot in other scope except ModuleScope"); - } -@@ -702,7 +702,7 @@ export class Compiler { - - private compileExportAssignment(stmt: ts.ExportAssignment) { - this.compileExpression(stmt.expression); -- this.pandaGen.storeModuleVar(stmt, "default"); -+ this.pandaGen.storeModuleVar(stmt, "*default*"); - } - - compileCondition(expr: ts.Expression, ifFalseLabel: Label) { -diff --git a/ts2panda/src/lexenv.ts b/ts2panda/src/lexenv.ts -index d4c1cc77..36ceab6c 100644 ---- a/ts2panda/src/lexenv.ts -+++ b/ts2panda/src/lexenv.ts -@@ -165,7 +165,7 @@ export class VariableAcessStore extends VariableAccessBase { - insns.push(storeAccumulator(bindVreg)); - - if (v.isExportVar()) { -- insns.push(storeModuleVariable(v.getExportedName())); -+ insns.push(storeModuleVariable(v.getName())); - } - - return insns; -diff --git a/ts2panda/src/modules.ts b/ts2panda/src/modules.ts -index a4a8aff2..edb796dd 100644 ---- a/ts2panda/src/modules.ts -+++ b/ts2panda/src/modules.ts -@@ -15,115 +15,259 @@ - - import * as ts from "typescript"; - import { PandaGen } from "./pandagen"; --import jshelpers from "./jshelpers"; -+// import jshelpers from "./jshelpers"; - import { LocalVariable } from "./variable"; - import { DiagnosticCode, DiagnosticError } from "./diagnostic"; - import { ModuleScope } from "./scope"; - --export class ModuleStmt { -- private node: ts.Node -- private moduleRequest: string; -- private namespace: string = ""; -- private bingdingNameMap: Map = new Map(); -- private isCopy: boolean = true; -+class Entry { -+ node: ts.Node; -+ exportName: string | undefined; -+ localName: string | undefined; -+ importName: string | undefined; -+ moduleRequest: number = -1; - -- constructor(node: ts.Node, moduleRequest: string = "") { -+ constructor(node: ts.Node, exportName: string | undefined, localName: string | undefined, importName: string | undefined, moduleRequest?: number) { - this.node = node; -- this.moduleRequest = moduleRequest; -+ this.exportName = exportName; -+ this.localName = localName; -+ this.importName = importName; -+ if (moduleRequest !== undefined) { -+ this.moduleRequest = moduleRequest; -+ } -+ } -+} -+ -+export class SourceTextModuleRecord { -+ private moduleRequests: Array = []; -+ private moduleRequestIdxMap: Map = new Map(); -+ -+ private regularImportEntries: Map = new Map(); -+ private namespaceImportEntries: Array = []; -+ -+ private localExportEntries: Map> = new Map>(); -+ private starExportEntries: Array = []; -+ private indirectExportEntries: Array = []; -+ -+ addModuleRequest(moduleRequest: string): number { -+ if (this.moduleRequestIdxMap.has(moduleRequest)) { -+ return this.moduleRequestIdxMap.get(moduleRequest)!; -+ } -+ let index = this.moduleRequests.length; -+ this.moduleRequests.push(moduleRequest); -+ this.moduleRequestIdxMap.set(moduleRequest, index); -+ return index; - } - -- getNode() { -- return this.node; -+ // import x from "foo.js"; -+ // import {x} from "foo.js"; -+ // import {x as y} from "foo.js"; -+ // import defaultExport from "foo.js" -+ addImportEntry(node: ts.Node, importName: string, localName: string, moduleRequest: string) { -+ let importEntry: Entry = new Entry(node, undefined, localName, importName, this.addModuleRequest(moduleRequest)); -+ // We don't care if there's already an entry for this local name, as in that -+ // case we will report an error when declaring the variable. -+ this.regularImportEntries.set(localName, importEntry); - } - -- getModuleRequest() { -- return this.moduleRequest; -+ // import * as x from "foo.js"; -+ addStarImportEntry(node: ts.Node, localName: string, moduleRequest: string) { -+ let starImportEntry: Entry = new Entry(node, undefined, localName, undefined, this.addModuleRequest(moduleRequest)); -+ this.namespaceImportEntries.push(starImportEntry); - } - -- addLocalName(localName: string, importName: string) { -- if (this.bingdingNameMap.has(localName)) { -- throw new DiagnosticError(this.node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(this.node), [localName]); -+ // export {x}; -+ // export {x as y}; -+ // export VariableStatement -+ // export Declaration -+ // export default ... -+ addLocalExportEntry(node: ts.Node, exportName: string, localName: string) { -+ let localExportEntry: Entry = new Entry(node, exportName, localName, undefined); -+ if (this.localExportEntries.has(localName)) { -+ this.localExportEntries.get(localName)!.push(localExportEntry); -+ } else { -+ this.localExportEntries.set(localName, [localExportEntry]); - } -- this.bingdingNameMap.set(localName, importName); - } - -- getBindingNameMap() { -- return this.bingdingNameMap; -+ // export {x} from "foo.js"; -+ // export {x as y} from "foo.js"; -+ // import { x } from "foo.js"; export { x } -+ addIndirectExportEntry(node: ts.Node, importName: string, exportName: string, moduleRequest: string) { -+ let indirectExportEntry: Entry = new Entry(node, exportName, undefined, importName, this.addModuleRequest(moduleRequest)); -+ this.indirectExportEntries.push(indirectExportEntry); - } - -- setNameSpace(namespace: string) { -- this.namespace = namespace; -+ // export * from "foo.js"; -+ addStarExportEntry(node: ts.Node, moduleRequest: string) { -+ let starExportEntry: Entry = new Entry(node, undefined, undefined, undefined, this.addModuleRequest(moduleRequest)); -+ this.starExportEntries.push(starExportEntry); - } - -- getNameSpace() { -- return this.namespace; -+ getModuleRequests() { -+ return this.moduleRequests; - } - -- setCopyFlag(isCopy: boolean) { -- this.isCopy = isCopy; -+ getRegularImportEntries() { -+ return this.regularImportEntries; - } - -- getCopyFlag() { -- return this.isCopy; -+ getNamespaceImportEntries() { -+ return this.namespaceImportEntries; - } --} - --export function setImport(importStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { -- importStmts.forEach((importStmt) => { -- pandagen.importModule(importStmt.getNode(), importStmt.getModuleRequest()); -- // import * as xxx from "a.js" -- if (importStmt.getNameSpace()) { -- let v = moduleScope.findLocal(importStmt.getNameSpace())!; -- pandagen.storeAccToLexEnv(importStmt.getNode(), moduleScope, 0, v, true); -- (v).initialize(); -- } -+ getLocalExportEntries() { -+ return this.localExportEntries; -+ } - -- // import { ... } from "a.js" -- // import defaultExport, * as a from "a.js" -- let moduleReg = pandagen.allocLocalVreg(); -- pandagen.storeAccumulator(importStmt.getNode(), moduleReg); -- -- let bindingNameMap = importStmt.getBindingNameMap(); -- bindingNameMap.forEach((value: string, key: string) => { -- let v = moduleScope.findLocal(key)!; -- pandagen.loadModuleVariable(importStmt.getNode(), moduleReg, value); -- pandagen.storeAccToLexEnv(importStmt.getNode(), moduleScope, 0, v, true); -- (v).initialize(); -- }); -- }) --} -+ getStarExportEntries() { -+ return this.starExportEntries; -+ } -+ -+ getIndirectExportEntries() { -+ return this.indirectExportEntries; -+ } -+ -+ searchDuplicateExport(): Entry | undefined { - --export function setExportBinding(exportStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { -- exportStmts.forEach((exportStmt) => { -- if (exportStmt.getModuleRequest()) { -- pandagen.importModule(exportStmt.getNode(), exportStmt.getModuleRequest()); -- let moduleReg = pandagen.allocLocalVreg(); -- pandagen.storeAccumulator(exportStmt.getNode(), moduleReg); -- -- if (!exportStmt.getCopyFlag()) { -- if (exportStmt.getNameSpace()) { -- pandagen.storeModuleVar(exportStmt.getNode(), exportStmt.getNameSpace()); -- } -- -- let bindingNameMap = exportStmt.getBindingNameMap(); -- bindingNameMap.forEach((value: string, key: string) => { -- pandagen.loadModuleVariable(exportStmt.getNode(), moduleReg, value); -- pandagen.storeModuleVar(exportStmt.getNode(), key); -- }); -- } else { -- pandagen.copyModule(exportStmt.getNode(), moduleReg); -+ } -+ -+ validateModuleRecordEntries(moduleScope: ModuleScope): boolean { -+ // check module is well-formed and report errors if not -+ { -+ let dupExportEntry: Entry | undefined = this.searchDuplicateExport(); -+ if (dupExportEntry !== undefined) { -+ -+ return false; - } -- } else { -- let bindingNameMap = exportStmt.getBindingNameMap(); -- bindingNameMap.forEach((value: string, key: string) => { -- let v = moduleScope.findLocal(value); -- if (typeof v == 'undefined') { -- throw new DiagnosticError(exportStmt.getNode(), DiagnosticCode.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, jshelpers.getSourceFileOfNode(exportStmt.getNode()), [value]); -- } -- -- (v).setExport(); -- (v).setExportedName(key); -- }); - } -+ -+ } -+ -+ -+ -+ -+ // Find any implicitly indirect exports and make them explicit. -+ // -+ // An explicitly indirect export is an export entry arising from an export -+ // statement of the following form: -+ // export {a as c} from "X"; -+ // An implicitly indirect export corresponds to -+ // export {b as c}; -+ // in the presence of an import statement of the form -+ // import {a as b} from "X"; -+ // This function finds such implicitly indirect export entries and rewrites -+ // them by filling in the import name and module request, as well as nulling -+ // out the local name. Effectively, it turns -+ // import {a as b} from "X"; export {b as c}; -+ // into: -+ // import {a as b} from "X"; export {a as c} from "X"; -+ // (The import entry is never deleted.) -+ makeIndirectExportsExplicit() { -+ -+ } -+} -+ -+// export class ModuleStmt { -+// private node: ts.Node -+// private moduleRequest: string; -+// private namespace: string = ""; -+// private bingdingNameMap: Map = new Map(); -+// private isCopy: boolean = true; -+ -+// constructor(node: ts.Node, moduleRequest: string = "") { -+// this.node = node; -+// this.moduleRequest = moduleRequest; -+// } -+ -+// getNode() { -+// return this.node; -+// } -+ -+// getModuleRequest() { -+// return this.moduleRequest; -+// } -+ -+// addLocalName(localName: string, importName: string) { -+// if (this.bingdingNameMap.has(localName)) { -+// throw new DiagnosticError(this.node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(this.node), [localName]); -+// } -+// this.bingdingNameMap.set(localName, importName); -+// } -+ -+// getBindingNameMap() { -+// return this.bingdingNameMap; -+// } -+ -+// setNameSpace(namespace: string) { -+// this.namespace = namespace; -+// } -+ -+// getNameSpace() { -+// return this.namespace; -+// } -+ -+// setCopyFlag(isCopy: boolean) { -+// this.isCopy = isCopy; -+// } -+ -+// getCopyFlag() { -+// return this.isCopy; -+// } -+// } -+ -+export function setModuleNamespaceImports(namespaceImportEntries: Array, moduleScope: ModuleScope, pandagen: PandaGen) { -+ if (!(moduleScope instanceof ModuleScope)) { -+ return; -+ } -+ namespaceImportEntries.forEach(entry => { -+ pandagen.getModuleNamespace(entry.node, entry.moduleRequest); -+ let v = moduleScope.findLocal(entry.localName!)!; -+ pandagen.storeAccToLexEnv(entry.node, moduleScope, 0, v, true); -+ (v).initialize(); - }) --} -\ No newline at end of file -+} -+ -+// export function setImportNameBindings(regularImportEntries: Map, moduleScope: ModuleScope, pandagen: PandaGen) { -+// regularImportEntries.forEach((importEntry: Entry, localName: string) => { -+// let v = moduleScope.findLocal(localName)!; -+// v.setExport(); -+// // pandagen.storeAccToLexEnv(importEntry.node, moduleScope, 0, v, true); -+// (v).initialize(); -+// }); -+// } -+ -+// export function setExportBinding(exportStmts: Array, moduleScope: ModuleScope, pandagen: PandaGen) { -+// exportStmts.forEach((exportStmt) => { -+// if (exportStmt.getModuleRequest()) { -+// pandagen.importModule(exportStmt.getNode(), exportStmt.getModuleRequest()); -+// let moduleReg = pandagen.allocLocalVreg(); -+// pandagen.storeAccumulator(exportStmt.getNode(), moduleReg); -+ -+// if (!exportStmt.getCopyFlag()) { -+// if (exportStmt.getNameSpace()) { -+// pandagen.storeModuleVar(exportStmt.getNode(), exportStmt.getNameSpace()); -+// } -+ -+// let bindingNameMap = exportStmt.getBindingNameMap(); -+// bindingNameMap.forEach((value: string, key: string) => { -+// pandagen.loadModuleVariable(exportStmt.getNode(), moduleReg, value); -+// pandagen.storeModuleVar(exportStmt.getNode(), key); -+// }); -+// } else { -+// pandagen.copyModule(exportStmt.getNode(), moduleReg); -+// } -+// } else { -+// let bindingNameMap = exportStmt.getBindingNameMap(); -+// bindingNameMap.forEach((value: string, key: string) => { -+// let v = moduleScope.findLocal(value); -+// if (typeof v == 'undefined') { -+// throw new DiagnosticError(exportStmt.getNode(), DiagnosticCode.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, jshelpers.getSourceFileOfNode(exportStmt.getNode()), [value]); -+// } -+ -+// (v).setExport(); -+// (v).setExportedName(key); -+// }); -+// } -+// }) -+// } -diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts -index 1b56905a..f8b54128 100644 ---- a/ts2panda/src/pandagen.ts -+++ b/ts2panda/src/pandagen.ts -@@ -51,7 +51,7 @@ import { - getIteratorNext, - getNextPropName, - getPropIterator, -- importModule, -+ getModuleNamespace, - isFalse, - isTrue, - jumpTarget, -@@ -1052,8 +1052,8 @@ export class PandaGen { - ) - } - -- importModule(node: ts.Node, moduleName: string) { -- this.add(node, importModule(moduleName)); -+ getModuleNamespace(node: ts.Node, moduleIdx: number) { -+ this.add(node, getModuleNamespace(moduleIdx)); - } - - loadModuleVariable(node: ts.Node, module: VReg, varName: string) { -diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts -index 387ddf83..2d42c247 100644 ---- a/ts2panda/src/recorder.ts -+++ b/ts2panda/src/recorder.ts -@@ -15,14 +15,18 @@ - - import ts from "typescript"; - import * as astutils from "./astutils"; --import { isAnonymousFunctionDefinition } from "./base/util"; -+import { -+ isAnonymousFunctionDefinition, -+ hasDefaultKeywordModifier, -+ hasExportKeywordModifier -+} from "./base/util"; - import { CmdOptions } from "./cmdOptions"; - import { CompilerDriver } from "./compilerDriver"; - import { DiagnosticCode, DiagnosticError } from "./diagnostic"; - import { findOuterNodeOfParenthesis } from "./expression/parenthesizedExpression"; - import * as jshelpers from "./jshelpers"; - import { LOGD } from "./log"; --import { ModuleStmt } from "./modules"; -+import { SourceTextModuleRecord } from "./modules"; - import { - CatchParameter, - ClassDecl, -@@ -35,6 +39,7 @@ import { - LetDecl, - LocalScope, - LoopScope, -+ ModuleDecl, - ModuleScope, - Scope, - VarDecl, -@@ -58,9 +63,7 @@ export class Recorder { - private parametersMap: Map = new Map(); - private funcNameMap: Map; - private ClassGroupOfNoCtor: Array = new Array(); -- private importStmts: Array = []; -- private exportStmts: Array = []; -- private defaultUsed: boolean = false; -+ private moduleRecord: SourceTextModuleRecord | undefined; - - constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver) { - this.node = node; -@@ -68,6 +71,9 @@ export class Recorder { - this.compilerDriver = compilerDriver; - this.funcNameMap = new Map(); - this.funcNameMap.set("main", 1); -+ if (CmdOptions.isModules() && scope instanceof ModuleScope) { -+ this.moduleRecord = new SourceTextModuleRecord(); -+ } - } - - record() { -@@ -100,6 +106,12 @@ export class Recorder { - this.compilerDriver.getFuncId(childNode); - let functionScope = this.buildVariableScope(scope, childNode); - this.recordFuncDecl(childNode, scope); -+ if (hasExportKeywordModifier(childNode)) { -+ if (!CmdOptions.isModules()) { -+ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); -+ } -+ this.recordExportInfo(childNode); -+ } - this.recordInfo(childNode, functionScope); - break; - } -@@ -120,16 +132,35 @@ export class Recorder { - case ts.SyntaxKind.ForStatement: - case ts.SyntaxKind.ForInStatement: - case ts.SyntaxKind.ForOfStatement: { -- let loopScope: LoopScope = new LoopScope(scope);; -+ let loopScope: LoopScope = new LoopScope(scope); - this.setScopeMap(childNode, loopScope); - this.recordInfo(childNode, loopScope); - break; - } -- case ts.SyntaxKind.ClassDeclaration: -+ case ts.SyntaxKind.ClassDeclaration: { -+ if (hasExportKeywordModifier(childNode) && scope instanceof ModuleScope) { -+ if (!CmdOptions.isModules()) { -+ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); -+ } -+ this.recordExportInfo(childNode); -+ } -+ this.recordClassInfo(childNode, scope); -+ break; -+ } - case ts.SyntaxKind.ClassExpression: { - this.recordClassInfo(childNode, scope); - break; - } -+ case ts.SyntaxKind.VariableStatement: { -+ if (hasExportKeywordModifier(childNode)) { -+ this.recordExportInfo(childNode); -+ } -+ // if (this.recordType) { -+ // TypeChecker.getInstance().formatNodeType(childNode); -+ // } -+ this.recordInfo(childNode, scope); -+ break; -+ } - case ts.SyntaxKind.Identifier: { - this.recordVariableDecl(childNode, scope); - break; -@@ -144,22 +175,19 @@ export class Recorder { - this.recordImportInfo(childNode, scope); - break; - } -- case ts.SyntaxKind.ExportDeclaration: { -+ case ts.SyntaxKind.ExportAssignment: { - if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); - } -- if (!(scope instanceof ModuleScope)) { -- throw new Error("SyntaxError: export statement cannot in other scope except ModuleScope"); -- } - this.recordExportInfo(childNode); -+ this.recordInfo(childNode, scope); - break; - } -- case ts.SyntaxKind.ExportAssignment: { -- if (this.defaultUsed) { -- throw new DiagnosticError(childNode, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(childNode), ["default"]); -+ case ts.SyntaxKind.ExportDeclaration: { -+ if (!CmdOptions.isModules()) { -+ throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); - } -- this.defaultUsed = true; -- this.recordInfo(childNode, scope); -+ this.recordExportInfo(childNode); - break; - } - default: -@@ -282,81 +310,117 @@ export class Recorder { - if (!ts.isStringLiteral(node.moduleSpecifier)) { - throw new Error("moduleSpecifier must be a stringLiteral"); - } -- let moduleRequest = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); -- let importStmt = new ModuleStmt(node, moduleRequest); -+ let moduleRequest: string = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); - - if (node.importClause) { - let importClause: ts.ImportClause = node.importClause; -- - // import defaultExport from "a.js" - if (importClause.name) { -- let name = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); -- scope.setDecls(new ConstDecl(name, importClause.name)); -- importStmt.addLocalName(name, "default"); -+ let localName = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); -+ scope.setDecls(new ModuleDecl(localName, importClause.name)); -+ this.moduleRecord!.addImportEntry(node.importClause, "default", localName, moduleRequest); - } - -- // import { ... } from "a.js" -- // import * as a from "a.js" -- // import defaultExport, * as a from "a.js" - if (importClause.namedBindings) { - let namedBindings = importClause.namedBindings; - // import * as a from "a.js" - if (ts.isNamespaceImport(namedBindings)) { - let nameSpace = jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name); -- scope.setDecls(new ConstDecl(nameSpace, namedBindings)); -- importStmt.setNameSpace(nameSpace); -- } -- -- // import { ... } from "a.js" -- if (ts.isNamedImports(namedBindings)) { -- namedBindings.elements.forEach((element) => { -- let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); -- let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; -- scope.setDecls(new ConstDecl(name, element)); -- importStmt.addLocalName(name, exoticName); -+ scope.setDecls(new ModuleDecl(nameSpace, namedBindings)); -+ this.moduleRecord!.addStarImportEntry(importClause.namedBindings, nameSpace, moduleRequest); -+ } else if (ts.isNamedImports(namedBindings)) { -+ // import { ... } from "a.js" -+ namedBindings.elements.forEach((element: any) => { -+ let localName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); -+ let importName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : localName; -+ scope.setDecls(new ModuleDecl(localName, element)); -+ this.moduleRecord!.addImportEntry(element, importName, localName, moduleRequest); - }); -+ } else { -+ throw new Error("Unreachable kind for namedBindings"); - } - } - } -- -- this.importStmts.push(importStmt); - } - -- private recordExportInfo(node: ts.ExportDeclaration) { -- let exportStmt: ModuleStmt; -- if (node.moduleSpecifier) { -- if (!ts.isStringLiteral(node.moduleSpecifier)) { -- throw new Error("moduleSpecifier must be a stringLiteral"); -- } -- exportStmt = new ModuleStmt(node, jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier)); -- } else { -- exportStmt = new ModuleStmt(node); -- } -- -- if (node.exportClause) { -- exportStmt.setCopyFlag(false); -- let namedBindings: ts.NamedExportBindings = node.exportClause; -- if (ts.isNamespaceExport(namedBindings)) { -- exportStmt.setNameSpace(jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name)); -- } -- -- if (ts.isNamedExports(namedBindings)) { -- namedBindings.elements.forEach((element) => { -- let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); -- if (name == 'default') { -- if (this.defaultUsed) { -- throw new DiagnosticError(node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(node), [name]); -- } else { -- this.defaultUsed = true; -+ private recordExportInfo(node: ts.ExportDeclaration | ts.ExportAssignment | ts.VariableStatement | ts.FunctionDeclaration | ts.ClassDeclaration) { -+ switch (node.kind) { -+ case ts.SyntaxKind.ExportDeclaration: { -+ if (node.moduleSpecifier) { -+ if (!ts.isStringLiteral(node.moduleSpecifier)) { -+ throw new Error("moduleSpecifier must be a stringLiteral"); -+ } -+ let moduleRequest: string = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); -+ -+ if (node.exportClause) { -+ let namedBindings: ts.NamedExportBindings = node.exportClause; -+ if (ts.isNamespaceExport(namedBindings)) { -+ // export * as m from "mod"; -+ // `export namespace` is not the ECMA2018's feature -+ } else if (ts.isNamedExports(namedBindings)) { -+ // export {x} from "mod"; -+ // export {v as x} from "mod"; -+ namedBindings.elements.forEach((element: any) => { -+ let exportName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); -+ let importName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : exportName; -+ this.moduleRecord!.addIndirectExportEntry(element, importName, exportName, moduleRequest); -+ }); - } -+ } else { -+ // export * from "mod"; -+ this.moduleRecord!.addStarExportEntry(node, moduleRequest); - } -- let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; -- exportStmt.addLocalName(name, exoticName); -+ } else if (node.exportClause && ts.isNamedExports(node.exportClause)) { -+ // export {x}; -+ // export {v as x}; -+ node.exportClause.elements.forEach((element: any) => { -+ let exportName: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); -+ let localName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : exportName; -+ this.moduleRecord!.addLocalExportEntry(element, exportName, localName); -+ }); -+ } else { -+ throw new Error("Unreachable node kind for Export Declaration"); -+ } -+ break; -+ } -+ case ts.SyntaxKind.ExportAssignment: { -+ // export default 42; -+ // export default v; -+ // "*default*" is used within this specification as a synthetic name for anonymous default export values. -+ this.moduleRecord!.addLocalExportEntry(node, "default", "*default*"); -+ break; -+ } -+ case ts.SyntaxKind.VariableStatement: { -+ // export var a,b; -+ node.declarationList.declarations.forEach(decl => { -+ let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); -+ this.moduleRecord!.addLocalExportEntry(decl, name, name); - }); -+ break; - } -+ case ts.SyntaxKind.FunctionDeclaration: -+ case ts.SyntaxKind.ClassDeclaration: { -+ if (hasDefaultKeywordModifier(node)) { -+ // HoistableDeclaration : FunctionDecl/GeneratorDecl/AsyncFunctionDecl/AsyncGeneratorDecl -+ // export default function f(){} -+ // export default function(){} -+ // export default class{} -+ let localName = node.name ? jshelpers.getTextOfIdentifierOrLiteral(node.name) : "*default*"; -+ this.moduleRecord!.addLocalExportEntry(node, "default", localName); -+ } else { -+ // export function f(){} -+ // export class c{} -+ if (!node.name) { -+ // throw an syntax Error !!! -+ } -+ let name = jshelpers.getTextOfIdentifierOrLiteral(node.name!); -+ this.moduleRecord!.addLocalExportEntry(node, name, name); -+ } -+ break; -+ } -+ default: -+ throw new Error("Unreachable syntax kind for static exporting"); - } -- -- this.exportStmts.push(exportStmt); - } - - private recordFuncDecl(node: ts.FunctionDeclaration, scope: Scope) { -@@ -371,6 +435,7 @@ export class Recorder { - let funcDecl = new FuncDecl(funcName, node, this.compilerDriver.getFuncId(node)); - scope.setDecls(funcDecl); - let hoistScope = scope; -+ // Wrong logic with ModuleScope - if (scope instanceof GlobalScope || scope instanceof ModuleScope) { - this.collectHoistDecls(node, hoistScope, funcDecl); - } else if (scope instanceof LocalScope) { -@@ -523,12 +588,8 @@ export class Recorder { - return this.scopeMap.get(node); - } - -- getImportStmts() { -- return this.importStmts; -- } -- -- getExportStmts() { -- return this.exportStmts; -+ getModuleRecord() { -+ return this.moduleRecord; - } - - setHoistMap(scope: VariableScope, decl: Decl) { -@@ -568,4 +629,4 @@ export class Recorder { - getFuncNameMap() { - return this.funcNameMap; - } --} -\ No newline at end of file -+} -diff --git a/ts2panda/src/scope.ts b/ts2panda/src/scope.ts -index 44cde853..dc9979d2 100644 ---- a/ts2panda/src/scope.ts -+++ b/ts2panda/src/scope.ts -@@ -54,6 +54,12 @@ export class ConstDecl extends Decl { - } - } - -+export class ModuleDecl extends Decl { -+ constructor(constName: string, node: ts.Node) { -+ super(constName, node); -+ } -+} -+ - export class FuncDecl extends Decl { - readonly index: number; - constructor(funcName: string, node: ts.Node, index: number) { -@@ -386,7 +392,13 @@ export class ModuleScope extends VariableScope { - } else if (declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { - v = new LocalVariable(declKind, name); - this.locals.push(v); -- } else { -+ } -+ -+ else if (declKind == VarDeclarationKind.MODULE) { -+ -+ } -+ -+ else { - v = new LocalVariable(declKind, name, status); - this.locals.push(v); - } -diff --git a/ts2panda/src/variable.ts b/ts2panda/src/variable.ts -index eba622a9..779eac3c 100644 ---- a/ts2panda/src/variable.ts -+++ b/ts2panda/src/variable.ts -@@ -101,8 +101,7 @@ export abstract class Variable { - - export class LocalVariable extends Variable { - status: InitStatus | null; -- isExport: boolean = false; -- exportedName: string = ""; -+ private isExport: boolean = false; - - constructor(declKind: VarDeclarationKind, name: string, status?: InitStatus) { - super(declKind, name); -@@ -127,17 +126,10 @@ export class LocalVariable extends Variable { - isExportVar() { - return this.isExport; - } -+} - -- setExportedName(name: string) { -- this.exportedName = name; -- } -- -- getExportedName() { -- if (!this.exportedName) { -- throw new Error("Exported Variable " + this.getName() + " doesn't have exported name"); -- } -- return this.exportedName; -- } -+export class ModuleVariable extends Variable { -+ - } - - export class GlobalVariable extends Variable { diff --git a/test262/config.py b/test262/config.py index 168d1a8907..34670ad68a 100755 --- a/test262/config.py +++ b/test262/config.py @@ -29,10 +29,10 @@ BASE_OUT_DIR = os.path.join("out", "test262") CUR_FILE_DIR = os.path.dirname(__file__) CODE_ROOT = os.path.abspath(os.path.join(CUR_FILE_DIR, "../../..")) -ARK_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/ark/ark" -ICUI_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/global/i18n_standard" +ARK_DIR = f"{CODE_ROOT}/out/hi3516dv300/clang_x64/ark/ark" +ICUI_DIR = f"{CODE_ROOT}/out/hi3516dv300/clang_x64/global/i18n_standard" LLVM_DIR = f"{CODE_ROOT}/prebuilts/clang/ohos/linux-x86_64/llvm/lib/" -ARK_JS_RUNTIME_DIR = f"{CODE_ROOT}/out/ohos-arm-release/clang_x64/ark/ark_js_runtime" +ARK_JS_RUNTIME_DIR = f"{CODE_ROOT}/out/hi3516dv300/clang_x64/ark/ark_js_runtime" # " mode_type": { # "1": "only default", diff --git a/ts2panda/BUILD.gn b/ts2panda/BUILD.gn index 7b2bbfed9d..0c7ce27427 100755 --- a/ts2panda/BUILD.gn +++ b/ts2panda/BUILD.gn @@ -344,6 +344,7 @@ ohos_copy("copy_ts2abc_tests") { group("ts2abc_unittests") { testonly = true deps = [ "tests:ts2abc_tests(${buildtool_linux})" ] + # if (host_os == "linux") { # deps += [ "${ts2abc_root}/ts2abc/tests:unittest" ] # } diff --git a/ts2panda/src/addVariable2Scope.ts b/ts2panda/src/addVariable2Scope.ts index fe4e1a763a..a441654999 100644 --- a/ts2panda/src/addVariable2Scope.ts +++ b/ts2panda/src/addVariable2Scope.ts @@ -36,26 +36,19 @@ import { } from "./variable"; import { TypeRecorder } from "./typeRecorder"; import { CmdOptions } from "./cmdOptions"; +import { PrimitiveType } from "./base/typeSystem"; function setVariableOrParameterType(node: ts.Node, v: Variable | undefined) { if (v) { let typeIndex = TypeRecorder.getInstance().tryGetVariable2Type(ts.getOriginalNode(node)); - if (typeIndex != -1) { - v.setTypeIndex(typeIndex); - } - // console.log("--node--", jshelpers.getTextOfNode(ts.getOriginalNode(node))); - // console.log("--node.type--", v.getTypeIndex()); + v.setTypeIndex(typeIndex); } } function setClassOrFunctionType(node: ts.Node, v: Variable | undefined) { if (v) { let typeIndex = TypeRecorder.getInstance().tryGetTypeIndex(ts.getOriginalNode(node)); - if (typeIndex != -1) { - v.setTypeIndex(typeIndex); - } - // console.log("--node--", jshelpers.getTextOfNode(ts.getOriginalNode(node))); - // console.log("--node.type--", v.getTypeIndex()); + v.setTypeIndex(typeIndex); } } diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index 320370c40a..dbaeee6644 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -27,7 +27,7 @@ import * as jshelpers from "../jshelpers"; import { access } from "fs"; export enum PrimitiveType { - ANY = -1, + ANY, NUMBER, BOOLEAN, BIGINT, @@ -80,82 +80,24 @@ export abstract class BaseType { protected typeChecker = TypeChecker.getInstance(); protected typeRecorder = TypeRecorder.getInstance(); - // this is needed for type like class, since it's declaration is in a certain place - // other types like primitives don't need this protected addCurrentType(node: ts.Node, index: number) { this.typeRecorder.addType2Index(node, index); } - protected setVariable2Type(variableNode: ts.Node, index: number, isUserDefinedType: boolean) { - this.typeRecorder.setVariable2Type(variableNode, index, isUserDefinedType); + protected setVariable2Type(variableNode: ts.Node, index: number) { + this.typeRecorder.setVariable2Type(variableNode, index); } protected tryGetTypeIndex(typeNode: ts.Node) { return this.typeRecorder.tryGetTypeIndex(typeNode); } - protected createType(node: ts.Node, newExpressionFlag: boolean, variableNode?: ts.Node) { - switch (node.kind) { - case ts.SyntaxKind.MethodDeclaration: - case ts.SyntaxKind.Constructor: - case ts.SyntaxKind.GetAccessor: - case ts.SyntaxKind.SetAccessor: { - new FunctionType(node, variableNode); - break; - } - case ts.SyntaxKind.ClassDeclaration: { - new ClassType(node, newExpressionFlag, variableNode); - break; - } - // create other type as project goes on; - default: - LOGD("Error: Currently this type is not supported"); - // throw new Error("Currently this type is not supported"); - } - } - - protected getOrCreateUserDefinedType(node: ts.Identifier, newExpressionFlag: boolean, variableNode?: ts.Node) { - let typeIndex = PrimitiveType.ANY; - let declNode = this.typeChecker.getTypeDeclForIdentifier(node); - if (declNode) { - typeIndex = this.tryGetTypeIndex(declNode); - if (typeIndex == PrimitiveType.ANY) { - this.createType(declNode, newExpressionFlag, variableNode); - typeIndex = this.tryGetTypeIndex(declNode); - } - } - return typeIndex; + protected getOrCreateRecordForDeclNode(typeNode: ts.Node, variableNode?: ts.Node) { + return this.typeChecker.getOrCreateRecordForDeclNode(typeNode, variableNode); } - protected getTypeIndexForDeclWithType( - node: ts.FunctionLikeDeclaration | ts.ParameterDeclaration | ts.PropertyDeclaration | ts.PropertySignature | ts.MethodSignature, variableNode?: ts.Node): number { - if (node.type) { - // check for newExpression - let newExpressionFlag = false; - if (node.kind == ts.SyntaxKind.PropertyDeclaration && node.initializer && node.initializer.kind == ts.SyntaxKind.NewExpression) { - newExpressionFlag = true; - } - // get typeFlag to check if its a primitive type - let typeRef = node.type; - let typeIndex = this.typeChecker.checkDeclarationType(typeRef); - let isUserDefinedType = false; - if (typeIndex == PrimitiveType.ANY) { - let identifier = typeRef.getChildAt(0); - typeIndex = this.getOrCreateUserDefinedType(identifier, newExpressionFlag, variableNode); - isUserDefinedType = true; - } - if (typeIndex == PrimitiveType.ANY) { - LOGD("WARNING: Type cannot be found for: " + jshelpers.getTextOfNode(node)); - typeIndex = PrimitiveType.ANY; - } - // set variable if variable node is given; - if (variableNode) { - this.setVariable2Type(variableNode, typeIndex, isUserDefinedType); - } - return typeIndex!; - } - LOGD("WARNING: node type not found for: " + jshelpers.getTextOfNode(node)); - return PrimitiveType.ANY; + protected getOrCreateRecordForTypeNode(typeNode: ts.TypeNode | undefined, variableNode?: ts.Node) { + return this.typeChecker.getOrCreateRecordForTypeNode(typeNode, variableNode); } protected getIndexFromTypeArrayBuffer(type: BaseType): number { @@ -204,8 +146,8 @@ export class TypeSummary extends BaseType { } export class ClassType extends BaseType { - modifier: number = 0; // 0 -> unabstract, 1 -> abstract; - extendsHeritage: number = -1; + modifier: number = ModifierAbstract.NONABSTRACT; // 0 -> unabstract, 1 -> abstract; + extendsHeritage: number = PrimitiveType.ANY; implementsHeritages: Array = new Array(); // fileds Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] staticFields: Map> = new Map>(); @@ -213,35 +155,19 @@ export class ClassType extends BaseType { fields: Map> = new Map>(); methods: Map = new Map(); typeIndex: number; + shiftedTypeIndex: number; - constructor(classNode: ts.ClassDeclaration | ts.ClassExpression, newExpressionFlag: boolean, variableNode?: ts.Node) { + constructor(classNode: ts.ClassDeclaration | ts.ClassExpression) { super(); this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); - let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; // record type before its initialization, so its index can be recorded // in case there's recursive reference of this type - this.addCurrentType(classNode, shiftedIndex); - + this.addCurrentType(classNode, this.shiftedTypeIndex); this.fillInModifiers(classNode); this.fillInHeritages(classNode); this.fillInFieldsAndMethods(classNode); - - // initialization finished, add variable to type if variable is given - if (variableNode) { - // if the variable is a instance, create another classInstType instead of current classType itself - if (newExpressionFlag) { - new ClassInstType(variableNode, this.typeIndex); - } else { - this.setVariable2Type(variableNode, shiftedIndex, true); - } - } this.setTypeArrayBuffer(this, this.typeIndex); - // check typeRecorder - // this.typeRecorder.getLog(classNode, this.typeIndex); - } - - public getTypeIndex() { - return this.typeIndex; } private fillInModifiers(node: ts.ClassDeclaration | ts.ClassExpression) { @@ -266,7 +192,7 @@ export class ClassType extends BaseType { let heritageFullName = heritage.getText(); for (let heritageType of heritage.types) { let heritageIdentifier = heritageType.expression; - let heritageTypeIndex = this.getOrCreateUserDefinedType(heritageIdentifier, false); + let heritageTypeIndex = this.getOrCreateRecordForDeclNode(heritageIdentifier, heritageIdentifier); if (heritageFullName.startsWith("extends ")) { this.extendsHeritage = heritageTypeIndex; } else if (heritageFullName.startsWith("implements ")) { @@ -278,22 +204,7 @@ export class ClassType extends BaseType { } private fillInFields(member: ts.PropertyDeclaration) { - // collect modifier info - let fieldName: string = ""; - switch (member.name.kind) { - case ts.SyntaxKind.Identifier: - case ts.SyntaxKind.StringLiteral: - case ts.SyntaxKind.NumericLiteral: - fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); - break; - case ts.SyntaxKind.ComputedPropertyName: - fieldName = "#computed"; - break; - default: - throw new Error("Invalid proerty name"); - } - - // Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + let fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); let fieldInfo = Array(PrimitiveType.ANY, AccessFlag.PUBLIC, ModifierReadonly.NONREADONLY); let isStatic: boolean = false; if (member.modifiers) { @@ -318,9 +229,10 @@ export class ClassType extends BaseType { } } } - // collect type info - let variableNode = member.name ? member.name : undefined; - fieldInfo[0] = this.getTypeIndexForDeclWithType(member, variableNode); + + let typeNode = member.type + let memberName = member.name + fieldInfo[0] = this.getOrCreateRecordForTypeNode(typeNode, memberName); if (isStatic) { this.staticFields.set(fieldName, fieldInfo); @@ -335,7 +247,10 @@ export class ClassType extends BaseType { * create this type and add it into typeRecorder */ let variableNode = member.name ? member.name : undefined; - let funcType = new FunctionType(member, variableNode); + let funcType = new FunctionType(member); + if (variableNode) { + this.setVariable2Type(variableNode, funcType.shiftedTypeIndex); + } // Then, get the typeIndex and fill in the methods array let typeIndex = this.tryGetTypeIndex(member); @@ -416,16 +331,15 @@ export class ClassType extends BaseType { } export class ClassInstType extends BaseType { - shiftedReferredClassIndex: number = 0; // the referred class in the type system; - constructor(variableNode: ts.Node, referredClassIndex: number) { + shiftedReferredClassIndex: number; // the referred class in the type system; + typeIndex: number; + shiftedTypeIndex: number; + constructor(referredClassIndex: number) { super(); - // use referedClassIndex to point to the actually class type of this instance - this.shiftedReferredClassIndex = referredClassIndex + PrimitiveType._LENGTH; - - // map variable to classInstType, which has a newly generated index - let currIndex = this.getIndexFromTypeArrayBuffer(this); - let shiftedIndex = currIndex + PrimitiveType._LENGTH; - this.setVariable2Type(variableNode, shiftedIndex, true); + this.shiftedReferredClassIndex = referredClassIndex; + this.typeIndex = this.getIndexFromTypeArrayBuffer(this); + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; + this.typeRecorder.setClass2InstanceMap(this.shiftedReferredClassIndex, this.shiftedTypeIndex); } transfer2LiteralBuffer(): LiteralBuffer { @@ -442,19 +356,20 @@ export class ClassInstType extends BaseType { export class FunctionType extends BaseType { name: string = ''; - accessFlag: number = 0; // 0 -> public -> 0, private -> 1, protected -> 2 - modifierStatic: number = 0; // 0 -> unstatic, 1 -> static + accessFlag: number = AccessFlag.PUBLIC; // 0 -> public -> 0, private -> 1, protected -> 2 + modifierStatic: number = ModifierStatic.NONSTATIC; // 0 -> unstatic, 1 -> static parameters: Array = new Array(); - returnType: number = 0; + returnType: number = PrimitiveType.ANY; typeIndex: number; + shiftedTypeIndex: number; - constructor(funcNode: ts.FunctionLikeDeclaration | ts.MethodSignature, variableNode?: ts.Node) { + constructor(funcNode: ts.FunctionLikeDeclaration | ts.MethodSignature) { super(); this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); - let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; // record type before its initialization, so its index can be recorded // in case there's recursive reference of this type - this.addCurrentType(funcNode, shiftedIndex); + this.addCurrentType(funcNode, this.shiftedTypeIndex); if (funcNode.name) { this.name = jshelpers.getTextOfIdentifierOrLiteral(funcNode.name); @@ -464,25 +379,13 @@ export class FunctionType extends BaseType { this.fillInModifiers(funcNode); this.fillInParameters(funcNode); this.fillInReturn(funcNode); - - // initialization finished, add variable to type if variable is given - if (variableNode) { - this.setVariable2Type(variableNode, shiftedIndex, true); - } this.setTypeArrayBuffer(this, this.typeIndex); - - // check typeRecorder - // this.typeRecorder.getLog(funcNode, this.typeIndex); } public getFunctionName() { return this.name; } - public getTypeIndex() { - return this.typeIndex; - } - private fillInModifiers(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { if (node.modifiers) { for (let modifier of node.modifiers) { @@ -506,15 +409,17 @@ export class FunctionType extends BaseType { private fillInParameters(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { if (node.parameters) { for (let parameter of node.parameters) { + let typeNode = parameter.type; let variableNode = parameter.name; - let typeIndex = this.getTypeIndexForDeclWithType(parameter, variableNode); + let typeIndex = this.getOrCreateRecordForTypeNode(typeNode, variableNode); this.parameters.push(typeIndex); } } } private fillInReturn(node: ts.FunctionLikeDeclaration | ts.MethodSignature) { - let typeIndex = this.getTypeIndexForDeclWithType(node); + let typeNode = node.type; + let typeIndex = this.getOrCreateRecordForTypeNode(typeNode, typeNode); this.returnType = typeIndex; } @@ -543,15 +448,13 @@ export class FunctionType extends BaseType { export class ExternalType extends BaseType { fullRedirectNath: string; typeIndex: number; + shiftedTypeIndex: number; constructor(importName: string, redirectPath: string) { super(); this.fullRedirectNath = `#${importName}#${redirectPath}`; this.typeIndex = this.getIndexFromTypeArrayBuffer(this); - } - - public getTypeIndex() { - return this.typeIndex; + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; } transfer2LiteralBuffer(): LiteralBuffer { @@ -602,7 +505,7 @@ export class UnionType extends BaseType { fillInUnionArray(typeNode: ts.Node, unionedTypeArray: Array) { for (let element of (typeNode).types) { let elementNode = element; - let typeIndex = this.typeChecker.getOrCreateRecordForTypeNode(elementNode); + let typeIndex = this.getOrCreateRecordForTypeNode(elementNode, elementNode); unionedTypeArray.push(typeIndex!); } } @@ -617,7 +520,7 @@ export class UnionType extends BaseType { } UnionTypeBuf.addLiterals(...UnionTypeLiterals); return UnionTypeBuf; - } + } } export class ArrayType extends BaseType { @@ -627,7 +530,7 @@ export class ArrayType extends BaseType { constructor(typeNode: ts.Node) { super(); let elementNode = (typeNode).elementType; - this.referedTypeIndex = this.typeChecker.getOrCreateRecordForTypeNode(elementNode); + this.referedTypeIndex = this.getOrCreateRecordForTypeNode(elementNode, elementNode); this.setOrReadFromArrayRecord(); } @@ -649,7 +552,7 @@ export class ArrayType extends BaseType { getFromArrayTypeMap(referedTypeIndex: number) { return this.typeRecorder.getFromArrayTypeMap(referedTypeIndex); } - + setArrayTypeMap(referedTypeIndex: number, shiftedTypeIndex: number) { return this.typeRecorder.setArrayTypeMap(referedTypeIndex, shiftedTypeIndex); } @@ -680,8 +583,8 @@ export class ObjectType extends BaseType { fillInMembers(objNode: ts.TypeLiteralNode) { for (let member of objNode.members) { let propertySig = member; - let name = member.name? member.name.getText() : "#undefined"; - let typeIndex = this.typeChecker.getOrCreateRecordForTypeNode(propertySig.type); + let name = member.name ? member.name.getText() : "#undefined"; + let typeIndex = this.getOrCreateRecordForTypeNode(propertySig.type, member.name); this.properties.set(name, typeIndex); } } @@ -706,36 +609,26 @@ export class InterfaceType extends BaseType { fields: Map> = new Map>(); methods: Array = new Array(); typeIndex: number; + shiftedTypeIndex: number; - constructor(interfaceNode: ts.InterfaceDeclaration, variableNode?: ts.Node) { + constructor(interfaceNode: ts.InterfaceDeclaration) { super(); this.typeIndex = this.getIndexFromTypeArrayBuffer(new PlaceHolderType()); - let shiftedIndex = this.typeIndex + PrimitiveType._LENGTH; + this.shiftedTypeIndex = this.typeIndex + PrimitiveType._LENGTH; // record type before its initialization, so its index can be recorded // in case there's recursive reference of this type - this.addCurrentType(interfaceNode, shiftedIndex); - + this.addCurrentType(interfaceNode, this.shiftedTypeIndex); this.fillInHeritages(interfaceNode); this.fillInFieldsAndMethods(interfaceNode); - - // initialization finished, add variable to type if variable is given - if (variableNode) { - // if the variable is a instance, create another classInstType instead of current classType itself - this.setVariable2Type(variableNode, shiftedIndex, true); - } this.setTypeArrayBuffer(this, this.typeIndex); } - public getTypeIndex() { - return this.typeIndex; - } - private fillInHeritages(node: ts.InterfaceDeclaration) { if (node.heritageClauses) { for (let heritage of node.heritageClauses) { for (let heritageType of heritage.types) { let heritageIdentifier = heritageType.expression; - let heritageTypeIndex = this.getOrCreateUserDefinedType(heritageIdentifier, false); + let heritageTypeIndex = this.getOrCreateRecordForDeclNode(heritageIdentifier, heritageIdentifier); this.heritages.push(heritageTypeIndex); } } @@ -743,22 +636,7 @@ export class InterfaceType extends BaseType { } private fillInFields(member: ts.PropertySignature) { - // collect modifier info - let fieldName: string = ""; - switch (member.name.kind) { - case ts.SyntaxKind.Identifier: - case ts.SyntaxKind.StringLiteral: - case ts.SyntaxKind.NumericLiteral: - fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); - break; - case ts.SyntaxKind.ComputedPropertyName: - fieldName = "#computed"; - break; - default: - throw new Error("Invalid proerty name"); - } - - // Array: [typeIndex] [public -> 0, private -> 1, protected -> 2] [readonly -> 1] + let fieldName = jshelpers.getTextOfIdentifierOrLiteral(member.name); let fieldInfo = Array(PrimitiveType.ANY, AccessFlag.PUBLIC, ModifierReadonly.NONREADONLY); if (member.modifiers) { for (let modifier of member.modifiers) { @@ -778,10 +656,9 @@ export class InterfaceType extends BaseType { } } } - // collect type info - let variableNode = member.name ? member.name : undefined; - fieldInfo[0] = this.getTypeIndexForDeclWithType(member, variableNode); - + let typeNode = member.type; + let memberName = member.name; + fieldInfo[0] = this.getOrCreateRecordForTypeNode(typeNode, memberName); this.fields.set(fieldName, fieldInfo); } @@ -791,8 +668,10 @@ export class InterfaceType extends BaseType { * create this type and add it into typeRecorder */ let variableNode = member.name ? member.name : undefined; - let funcType = new FunctionType(member, variableNode); - + let funcType = new FunctionType(member); + if (variableNode) { + this.setVariable2Type(variableNode, funcType.shiftedTypeIndex); + } // Then, get the typeIndex and fill in the methods array let typeIndex = this.tryGetTypeIndex(member); this.methods.push(typeIndex!); @@ -802,7 +681,7 @@ export class InterfaceType extends BaseType { if (node.members) { for (let member of node.members) { switch (member.kind) { - case ts.SyntaxKind.MethodSignature:{ + case ts.SyntaxKind.MethodSignature: { this.fillInMethods(member); break; } diff --git a/ts2panda/src/cmdOptions.ts b/ts2panda/src/cmdOptions.ts index ef50707975..b84914671e 100644 --- a/ts2panda/src/cmdOptions.ts +++ b/ts2panda/src/cmdOptions.ts @@ -39,7 +39,7 @@ const ts2pandaOptions = [ { name: 'bc-version', alias: 'v', type: Boolean, defaultValue: false, description: "Print ark bytecode version" }, { name: 'bc-min-version', type: Boolean, defaultValue: false, description: "Print ark bytecode minimum supported version" }, { name: 'included-files', alias: 'i', type: String, lazyMultiple: true, defaultValue: [], description: "The list of dependent files." }, - { name: 'record-type', alias: 'p', type: Boolean, defaultValue: true, description: "Record type info. Default: true" }, + { name: 'record-type', alias: 'p', type: Boolean, defaultValue: false, description: "Record type info. Default: true" }, { name: 'dts-type-record', alias: 'q', type: Boolean, defaultValue: false, description: "Record type info for .d.ts files. Default: false" } ] @@ -183,7 +183,8 @@ export class CmdOptions { if (!this.options) { return false; } - return this.options["record-type"]; + + return !this.options["record-type"]; } static needRecordDtsType(): boolean { diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index f7a996f8bf..e5b6b119a4 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -308,7 +308,7 @@ export class Recorder { case VarDeclarationKind.VAR: break; case VarDeclarationKind.LET: - if (parent.parent.kind == ts.SyntaxKind.CatchClause) { + if (parent.parent.kind == ts.SyntaxKind.CatchClause) { decl = new CatchParameter(name, node); } else { decl = new LetDecl(name, node); @@ -345,9 +345,13 @@ export class Recorder { if (!ts.isStringLiteral(node.moduleSpecifier)) { throw new Error("moduleSpecifier must be a stringLiteral"); } - let moduleRequest = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); - let importStmt = new ModuleStmt(node, moduleRequest); - + let importStmt: ModuleStmt; + if (node.moduleSpecifier) { + let moduleRequest = jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier); + importStmt = new ModuleStmt(node, moduleRequest); + } else { + importStmt = new ModuleStmt(node); + } if (node.importClause) { let importClause: ts.ImportClause = node.importClause; @@ -389,20 +393,20 @@ export class Recorder { } private recordExportInfo(node: ts.ExportDeclaration): ModuleStmt { - var node = ts.getOriginalNode(node); + let origNode = ts.getOriginalNode(node); let exportStmt: ModuleStmt; - if (node.moduleSpecifier) { - if (!ts.isStringLiteral(node.moduleSpecifier)) { + if (origNode.moduleSpecifier) { + if (!ts.isStringLiteral(origNode.moduleSpecifier)) { throw new Error("moduleSpecifier must be a stringLiteral"); } - exportStmt = new ModuleStmt(node, jshelpers.getTextOfIdentifierOrLiteral(node.moduleSpecifier)); + exportStmt = new ModuleStmt(origNode, jshelpers.getTextOfIdentifierOrLiteral(origNode.moduleSpecifier)); } else { - exportStmt = new ModuleStmt(node); + exportStmt = new ModuleStmt(origNode); } - if (node.exportClause) { + if (origNode.exportClause) { exportStmt.setCopyFlag(false); - let namedBindings: ts.NamedExportBindings = node.exportClause; + let namedBindings: ts.NamedExportBindings = origNode.exportClause; if (ts.isNamespaceExport(namedBindings)) { exportStmt.setNameSpace(jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name)); } @@ -412,7 +416,7 @@ export class Recorder { let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); if (name == 'default') { if (this.defaultUsed) { - throw new DiagnosticError(node, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(node), [name]); + throw new DiagnosticError(origNode, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(origNode), [name]); } else { this.defaultUsed = true; } diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index ae8595f957..2d5908f6a5 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -194,8 +194,8 @@ export class Ts2Panda { typeRecord.forEach((vreg) => { let typeOfVreg = new TypeOfVreg(vreg.num, vreg.getTypeIndex()); typeInfo.push(typeOfVreg); - - // console.log("\\\\\\\\\\\\ vreg num \\\\\\\\\\", vreg.num); + // console.log("---------------------------------------"); + // console.log("\\\\\\\\\\\\ vreg name \\\\\\\\\\", vreg.getVariableName()); // console.log("\\\\\\\\\\\\ vreg type \\\\\\\\\\", vreg.getTypeIndex()); }); diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index f51a49940a..f856aeae8e 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -14,18 +14,8 @@ import { TypeRecorder } from "./typeRecorder"; import * as jshelpers from "./jshelpers"; import { LOGD } from "./log"; import { PrimitiveType } from "./base/typeSystem"; - -export enum PrimitiveFlags { - ANY = 1, - NUMBER = 8, - BOOLEAN = 1048592, - STRING = 4, - SYMBOL = 4096, - NULL = 65536, - UNDEFINED = 32768, - _LENGTH = 50 -} import { isGlobalDeclare } from "./strictMode"; +import { syncBuiltinESMExports } from "module"; export class TypeChecker { private static instance: TypeChecker; @@ -47,35 +37,50 @@ export class TypeChecker { return this.compiledTypeChecker; } + public getTypeAtLocation(node: ts.Node) { + if (!node) { + return undefined; + } + try { + return this.compiledTypeChecker.getTypeAtLocation(node); + } catch { + LOGD("Get getTypeAtLocation filed for : " + node.getFullText()); + return undefined; + } + } + public getTypeDeclForIdentifier(node: ts.Node) { if (!node) { return undefined; } - if (node.kind == ts.SyntaxKind.ClassExpression) { - return node; + let symbol; + try { + symbol = this.compiledTypeChecker.getSymbolAtLocation(node); + } catch { + LOGD("Get getSymbolAtLocation filed for : " + node.getFullText()); + return undefined; } - let symbol = this.compiledTypeChecker.getSymbolAtLocation(node); if (symbol && symbol.declarations) { return symbol.declarations[0]; } - LOGD("TypeDecl NOT FOUND for: " + node.getFullText()); return undefined; } - public getTypeFlagsAtLocation(node: ts.Node): string | undefined { - let typeFlag = this.compiledTypeChecker.getTypeAtLocation(node).getFlags(); - if (typeFlag) { - return PrimitiveFlags[typeFlag]; - } else { - LOGD("typeFlag not found: ", typeFlag); - return undefined + public hasExportKeyword(node: ts.Node): boolean { + if (node.modifiers) { + for (let modifier of node.modifiers) { + if (modifier.kind === ts.SyntaxKind.ExportKeyword) { + return true; + } + } } + return false; } - public checkExportKeyword(node: ts.Node): boolean { + public hasDeclareKeyword(node: ts.Node): boolean { if (node.modifiers) { for (let modifier of node.modifiers) { - if (modifier.kind === ts.SyntaxKind.ExportKeyword) { + if (modifier.kind === ts.SyntaxKind.DeclareKeyword) { return true; } } @@ -83,34 +88,78 @@ export class TypeChecker { return false; } - public checkPotentialPrimitiveType(node: ts.TypeNode): number | undefined { - let typeFlagName = this.getTypeFlagsAtLocation(node); - let typeIndex = undefined; - if (typeFlagName && typeFlagName in PrimitiveType) { - typeIndex = PrimitiveType[typeFlagName as keyof typeof PrimitiveType]; + public getDeclNodeForInitializer(initializer: ts.Node) { + switch (initializer.kind) { + case ts.SyntaxKind.Identifier: + return this.getTypeDeclForIdentifier(initializer); + case ts.SyntaxKind.NewExpression: + let initializerExpression = initializer; + let expression = initializerExpression.expression; + if (expression.kind == ts.SyntaxKind.ClassExpression) { + return expression; + } + return this.getTypeDeclForIdentifier(expression); + case ts.SyntaxKind.ClassExpression: + return initializer; + case ts.SyntaxKind.PropertyAccessExpression: + return initializer; + default: + return undefined; } - return typeIndex; } - public getOrCreateRecordForTypeNode(typeNode: ts.TypeNode | undefined) { - if (!typeNode) { - return PrimitiveType.ANY; + public getTypeForClassDeclOrExp(typeDeclNode: ts.Node, getTypeForInstace: boolean): number { + let classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); + if (classTypeIndex == PrimitiveType.ANY) { + let classType = new ClassType(typeDeclNode); + classTypeIndex = classType.shiftedTypeIndex; } - let typeIndex = PrimitiveType.ANY; - typeIndex = this.checkDeclarationType(typeNode); - if (typeIndex == PrimitiveType.ANY && typeNode.kind == ts.SyntaxKind.TypeReference) { - let typeName = typeNode.getChildAt(0); - let typeDecl = this.getTypeDeclForInitializer(typeName, false); - if (typeDecl) { - typeIndex = this.checkForTypeDecl(typeName, typeDecl, false, true); - } else { - typeIndex = PrimitiveType.ANY; + if (getTypeForInstace) { + // class type was already created, need to get the classInstance + if (!TypeRecorder.getInstance().hasClass2InstanceMap(classTypeIndex)) { + new ClassInstType(classTypeIndex); } + classTypeIndex = TypeRecorder.getInstance().getClass2InstanceMap(classTypeIndex)!; } - return typeIndex; + return classTypeIndex; + } + + public getTypeForPropertyAccessExpression(typeDeclNode: ts.Node) { + let propertyAccessExpression = typeDeclNode; + let localName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.expression); + let externalName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.name); + if (TypeRecorder.getInstance().inNampespaceMap(localName)) { + let redirectPath = TypeRecorder.getInstance().getPathForNamespace(localName)!; + let externalType = new ExternalType(externalName, redirectPath); + let ImportTypeIndex = externalType.shiftedTypeIndex; + return ImportTypeIndex; + } + return PrimitiveType.ANY; + } + + public getTypeFromDecl(typeDeclNode: ts.Node, getTypeForInstace: boolean): number { + if (!typeDeclNode) { + return PrimitiveType.ANY; + } + switch (typeDeclNode.kind) { + // Type found to be defined a classDeclaration or classExpression + case ts.SyntaxKind.ClassDeclaration: + case ts.SyntaxKind.ClassExpression: + return this.getTypeForClassDeclOrExp(typeDeclNode, getTypeForInstace); + case ts.SyntaxKind.ImportSpecifier: + case ts.SyntaxKind.ImportClause: + let ImportTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); + if (ImportTypeIndex != PrimitiveType.ANY) { + return ImportTypeIndex; + } + return PrimitiveType.ANY; + case ts.SyntaxKind.PropertyAccessExpression: + return this.getTypeForPropertyAccessExpression(typeDeclNode); + } + return PrimitiveType.ANY; } - public checkDeclarationType(typeNode: ts.TypeNode | undefined) { + public getTypeFromAnotation(typeNode: ts.TypeNode | undefined) { if (!typeNode) { return PrimitiveType.ANY; } @@ -149,164 +198,101 @@ export class TypeChecker { } } - public getTypeDeclForInitializer(initializer: ts.Node, exportNeeded:boolean) { - switch (initializer.kind) { - // only create the type when it was used (initialized) or TODO: exported - // NewExpression initializer means that the type is a new class (TODO: or other object later, but is there any?) - case ts.SyntaxKind.NewExpression: - let initializerExpression = initializer; - return this.getTypeDeclForIdentifier(initializerExpression.expression); - case ts.SyntaxKind.ClassExpression: - if (exportNeeded) { - return initializer; - } - break; - // Or the initializer is a variable - case ts.SyntaxKind.Identifier: - // other types, functions/primitives... - return this.getTypeDeclForIdentifier(initializer); - case ts.SyntaxKind.PropertyAccessExpression: - return initializer; - default: - return null; + public getOrCreateRecordForDeclNode(initializer: ts.Node | undefined, variableNode?: ts.Node) { + if (!initializer) { + return PrimitiveType.ANY; } + let typeIndex = PrimitiveType.ANY; + let declNode = this.getDeclNodeForInitializer(initializer); + typeIndex = this.getTypeFromDecl(declNode, initializer.kind == ts.SyntaxKind.NewExpression); + if (variableNode) { + TypeRecorder.getInstance().setVariable2Type(variableNode, typeIndex); + } + return typeIndex; } - // If newExpressionFlag is ture, the type has to be created no matter the export is needed or not; - // while newExpressionFlag if false, the export has to be needed. - public checkForTypeDecl(originalName: ts.Node, typeDeclNode: ts.Node, exportNeeded: boolean, newExpressionFlag: boolean): number { - if (!typeDeclNode) { + public getOrCreateRecordForTypeNode(typeNode: ts.TypeNode | undefined, variableNode?: ts.Node) { + if (!typeNode) { return PrimitiveType.ANY; } - switch (typeDeclNode.kind) { - // Type found to be defined a classDeclaration or classExpression - case ts.SyntaxKind.ClassDeclaration: - case ts.SyntaxKind.ClassExpression: - let origTypeDeclNode = ts.getOriginalNode(typeDeclNode); - let classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); - if (classTypeIndex == PrimitiveType.ANY) { - new ClassType(origTypeDeclNode, newExpressionFlag, originalName); - if (newExpressionFlag) { - classTypeIndex = TypeRecorder.getInstance().tryGetVariable2Type(originalName); - } else { - classTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(origTypeDeclNode); - } - } else if (newExpressionFlag) { - // class type is created, need to add current variable to classInstance - classTypeIndex = classTypeIndex + 1; - TypeRecorder.getInstance().setVariable2Type(originalName, classTypeIndex, true); - } - if (exportNeeded) { - let exportedName = jshelpers.getTextOfIdentifierOrLiteral(originalName); - TypeRecorder.getInstance().setExportedType(exportedName, classTypeIndex, true); - } - return classTypeIndex; - // The type was passed by a variable, need to keep search in deep - case ts.SyntaxKind.VariableDeclaration: - let varDeclNode = typeDeclNode; - let nextInitializer = varDeclNode.initializer; - if (nextInitializer) { - let nextTypeDeclNode = this.getTypeDeclForInitializer(nextInitializer, exportNeeded); - if (nextTypeDeclNode) { - return this.checkForTypeDecl(originalName, nextTypeDeclNode, exportNeeded, newExpressionFlag); - } - } - return PrimitiveType.ANY; - case ts.SyntaxKind.ImportSpecifier: - case ts.SyntaxKind.ImportClause: - let ImportTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); - if (ImportTypeIndex != PrimitiveType.ANY) { - TypeRecorder.getInstance().setVariable2Type(originalName, ImportTypeIndex, true); - return ImportTypeIndex; - } - // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); - return PrimitiveType.ANY; - case ts.SyntaxKind.PropertyAccessExpression: - let propertyAccessExpression = typeDeclNode; - let localName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.expression); - let externalName = jshelpers.getTextOfIdentifierOrLiteral(propertyAccessExpression.name); - if (TypeRecorder.getInstance().inNampespaceMap(localName)) { - let redirectPath = TypeRecorder.getInstance().getPathForNamespace(localName)!; - let externalType = new ExternalType(externalName, redirectPath); - let ImportTypeIndex = externalType.getTypeIndex(); - let shiftedTypeIndex = TypeRecorder.getInstance().shiftType(ImportTypeIndex); - TypeRecorder.getInstance().setVariable2Type(originalName, shiftedTypeIndex, true); - return shiftedTypeIndex; - } - // console.log("-> ERROR: missing imported type for: ", jshelpers.getTextOfIdentifierOrLiteral(originalName)); - return PrimitiveType.ANY; + let typeIndex = PrimitiveType.ANY; + typeIndex = this.getTypeFromAnotation(typeNode); + if (typeIndex == PrimitiveType.ANY && typeNode.kind == ts.SyntaxKind.TypeReference) { + let typeName = typeNode.getChildAt(0); + let typeDecl = this.getDeclNodeForInitializer(typeName); + typeIndex = this.getTypeFromDecl(typeDecl, true); } - return PrimitiveType.ANY; + if (variableNode) { + TypeRecorder.getInstance().setVariable2Type(variableNode, typeIndex); + } + return typeIndex; } - public checkTypeForVariableDeclaration(node: ts.VariableDeclaration, exportNeeded: boolean) { - let name = node.name; - let initializer = node.initializer; - let type = (ts.getOriginalNode(node)).type; - // first check if this is a primitive or union declaration - let typeIndex = this.checkDeclarationType(type); - if (typeIndex != PrimitiveType.ANY) { - let isUserDefinedType = typeIndex <= PrimitiveType._LENGTH ? false : true; - TypeRecorder.getInstance().setVariable2Type(name, typeIndex, isUserDefinedType); - } else if (initializer) { - let typeDeclNode = this.getTypeDeclForInitializer(initializer, exportNeeded); - let newExpressionFlag = initializer.kind == ts.SyntaxKind.NewExpression; - if (typeDeclNode) { - this.checkForTypeDecl(name, typeDeclNode, exportNeeded, newExpressionFlag); + public formatVariableStatement(variableStatementNode: ts.VariableStatement) { + let decList = variableStatementNode.declarationList; + decList.declarations.forEach(declaration => { + let variableNode = declaration.name; + let typeNode = declaration.type; + let initializer = declaration.initializer; + let typeIndex = this.getOrCreateRecordForTypeNode(typeNode, variableNode); + if (typeIndex == PrimitiveType.ANY) { + typeIndex = this.getOrCreateRecordForDeclNode(initializer, variableNode); } + if (this.hasExportKeyword(variableStatementNode) && typeIndex != PrimitiveType.ANY) { + let exportedName = jshelpers.getTextOfIdentifierOrLiteral(variableNode); + TypeRecorder.getInstance().setExportedType(exportedName, typeIndex); + } + }); + } + + public formatClassDeclaration(classDeclNode: ts.ClassDeclaration) { + let classType = new ClassType(classDeclNode); + let typeIndex = classType.shiftedTypeIndex; + let className = classDeclNode.name; + let exportedName = "default"; + if (className) { + exportedName = jshelpers.getTextOfIdentifierOrLiteral(className); + } + if (this.hasExportKeyword(classDeclNode)) { + TypeRecorder.getInstance().setExportedType(exportedName, typeIndex); + } else if (this.hasDeclareKeyword(classDeclNode) && isGlobalDeclare()) { + TypeRecorder.getInstance().setDeclaredType(exportedName, typeIndex); } } - // Entry for type recording, only process node that will need a type to be created + // Entry for type recording public formatNodeType(node: ts.Node, importOrExportStmt?: ModuleStmt) { if (this.compiledTypeChecker === null) { return; } - switch(node.kind) { + switch (node.kind) { case ts.SyntaxKind.VariableStatement: - // For varibaleStatemnt, need to check what kind of type the variable was set to - const variableStatementNode = node; - const decList = variableStatementNode.declarationList; - let exportNeeded = this.checkExportKeyword(node); - decList.declarations.forEach(declaration => { - this.checkTypeForVariableDeclaration(declaration, exportNeeded); - }); + let variableStatementNode = ts.getOriginalNode(node); + this.formatVariableStatement(variableStatementNode); break; case ts.SyntaxKind.FunctionDeclaration: let functionDeclNode = ts.getOriginalNode(node); - let functionName = functionDeclNode.name? functionDeclNode.name : undefined; - new FunctionType(functionDeclNode, functionName); + let functionName = functionDeclNode.name ? functionDeclNode.name : undefined; + let funcType = new FunctionType(functionDeclNode); + if (functionName) { + TypeRecorder.getInstance().setVariable2Type(functionName, funcType.shiftedTypeIndex); + } break; case ts.SyntaxKind.ClassDeclaration: - // Only create the type if it is exported. - // Otherwise, waite until it gets instantiated + // Create the type if it is exported or declared. Otherwise, waite until it gets instantiated let classDeclNode = ts.getOriginalNode(node); - if (this.checkExportKeyword(node) || this.checkDeclareKeyword(node)) { - let classType = new ClassType(classDeclNode, false); - let typeIndex = classType.getTypeIndex(); - let className = classDeclNode.name; - let exportedName = "default"; - if (className) { - exportedName = jshelpers.getTextOfIdentifierOrLiteral(className); - } else { - LOGD("ClassName NOT FOUND for:" + node.getFullText()); - } - if (this.checkExportKeyword(node)) { - TypeRecorder.getInstance().setExportedType(exportedName, typeIndex, false); - } else if (this.checkDeclareKeyword(node) && isGlobalDeclare()){ - TypeRecorder.getInstance().setDeclaredType(exportedName, typeIndex, false); - } + if (this.hasExportKeyword(node) || this.hasDeclareKeyword(node)) { + this.formatClassDeclaration(classDeclNode); } break; case ts.SyntaxKind.InterfaceDeclaration: if (isGlobalDeclare()) { - let interfaceDeclNode : ts.InterfaceDeclaration = ts.getOriginalNode(node); + let interfaceDeclNode = ts.getOriginalNode(node); let interfaceType = new InterfaceType(interfaceDeclNode); let interfaceName = interfaceDeclNode.name; if (interfaceName) { - TypeRecorder.getInstance().setDeclaredType(jshelpers.getTextOfIdentifierOrLiteral(interfaceName), interfaceType.getTypeIndex(), false); - } else { - LOGD("InterfaceName NOT FOUND for:" + node.getFullText()); + let name = jshelpers.getTextOfIdentifierOrLiteral(interfaceName); + TypeRecorder.getInstance().setDeclaredType(name, interfaceType.shiftedTypeIndex); } } break; @@ -321,24 +307,16 @@ export class TypeChecker { } break; case ts.SyntaxKind.ExportAssignment: - let exportAssignmentNode = node; - let expression = exportAssignmentNode.expression; + let expression = (node).expression; let exportedName = "default"; - let expressionType = this.compiledTypeChecker.getTypeAtLocation(expression); - let typeNode = expressionType.getSymbol()?.valueDeclaration; - TypeRecorder.getInstance().addNonReExportedType(exportedName, typeNode); + let expressionType = this.getTypeAtLocation(expression); + if (expressionType) { + let typeNode = expressionType.getSymbol().valueDeclaration; + TypeRecorder.getInstance().addNonReExportedType(exportedName, typeNode, expression); + } break; } } - public checkDeclareKeyword(node: ts.Node): boolean { - if (node.modifiers) { - for (let modifier of node.modifiers) { - if (modifier.kind === ts.SyntaxKind.DeclareKeyword) { - return true; - } - } - } - return false; - } + } diff --git a/ts2panda/src/typeRecorder.ts b/ts2panda/src/typeRecorder.ts index 801ac017e4..73f5018552 100755 --- a/ts2panda/src/typeRecorder.ts +++ b/ts2panda/src/typeRecorder.ts @@ -30,20 +30,18 @@ export class TypeRecorder { private variable2Type: Map = new Map(); private userDefinedTypeSet: Set = new Set();; private typeSummary: TypeSummary = new TypeSummary(); + private class2InstanceMap: Map = new Map(); private arrayTypeMap: Map = new Map(); private unionTypeMap: Map = new Map(); - // ---> export/import - // exportedType: exportedName -> typeIndex private exportedType: Map = new Map(); - // declaredType: declaredName -> typeIndex private declaredType: Map = new Map(); // namespace mapping: namepace -> filepath (import * as sth from "...") - // later in PropertyAccessExpression we'll need this to map the symbol to filepath + // In PropertyAccessExpression we'll need this to map the symbol to filepath private namespaceMap: Map = new Map(); // (export * from "..."), if the symbol isn't in the reExportedType map, search here. private anonymousReExport: Array = new Array(); - private constructor() {} + private constructor() { } public static getInstance(): TypeRecorder { return TypeRecorder.instance; @@ -71,9 +69,9 @@ export class TypeRecorder { this.addUserDefinedTypeSet(index); } - public setVariable2Type(variableNode: ts.Node, index: number, isUserDefinedType: boolean) { + public setVariable2Type(variableNode: ts.Node, index: number) { this.variable2Type.set(variableNode, index); - if (isUserDefinedType) { + if (index > PrimitiveType._LENGTH) { this.addUserDefinedTypeSet(index); } } @@ -122,17 +120,33 @@ export class TypeRecorder { return this.unionTypeMap.get(unionStr); } - // ---> exported/imported + public setClass2InstanceMap(classIndex: number, instanceIndex: number) { + this.class2InstanceMap.set(classIndex, instanceIndex) + } + + public hasClass2InstanceMap(classIndex: number) { + return this.class2InstanceMap.has(classIndex); + } + + public getClass2InstanceMap(classIndex: number) { + return this.class2InstanceMap.get(classIndex); + } + + // exported/imported public addImportedType(moduleStmt: ModuleStmt) { moduleStmt.getBindingNodeMap().forEach((externalNode, localNode) => { let externalName = jshelpers.getTextOfIdentifierOrLiteral(externalNode); let importDeclNode = TypeChecker.getInstance().getTypeDeclForIdentifier(localNode); let externalType = new ExternalType(externalName, moduleStmt.getModuleRequest()); - this.addType2Index(importDeclNode, this.shiftType(externalType.getTypeIndex())); + this.addType2Index(importDeclNode, externalType.shiftedTypeIndex); + this.setVariable2Type(localNode, externalType.shiftedTypeIndex); }); if (moduleStmt.getNameSpace() != "") { this.setNamespaceMap(moduleStmt.getNameSpace(), moduleStmt.getModuleRequest()); + let externalType = new ExternalType("*", moduleStmt.getNameSpace()); + let ImportTypeIndex = externalType.shiftedTypeIndex; + this.addUserDefinedTypeSet(ImportTypeIndex); } } @@ -142,17 +156,15 @@ export class TypeRecorder { if (moduleStmt.getNameSpace() != "") { // re-export * as namespace let externalType = new ExternalType("*", moduleStmt.getModuleRequest()); - let typeIndex = this.shiftType(externalType.getTypeIndex()); - this.setExportedType(moduleStmt.getNameSpace(), typeIndex, true); + let typeIndex = externalType.shiftedTypeIndex; + this.setExportedType(moduleStmt.getNameSpace(), typeIndex); this.addUserDefinedTypeSet(typeIndex); } else if (moduleStmt.getBindingNameMap().size != 0) { // re-export via clause moduleStmt.getBindingNameMap().forEach((originalName, exportedName) => { - // let redirectName = this.createRedirectName(originalName, moduleStmt.getModuleRequest()); - // this.setReExportedType(exportedName, redirectName); let externalType = new ExternalType(originalName, moduleStmt.getModuleRequest()); - let typeIndex = this.shiftType(externalType.getTypeIndex()); - this.setExportedType(exportedName, typeIndex, true); + let typeIndex = externalType.shiftedTypeIndex; + this.setExportedType(exportedName, typeIndex); this.addUserDefinedTypeSet(typeIndex); }); } else { @@ -161,54 +173,39 @@ export class TypeRecorder { } } else { // named export via clause, could came from imported or local - // propertyName is local name, name is external name moduleStmt.getBindingNodeMap().forEach((localNode, externalNode) => { let exportedName = jshelpers.getTextOfIdentifierOrLiteral(externalNode); - let nodeType = TypeChecker.getInstance().getTypeChecker().getTypeAtLocation(localNode); + let nodeType = TypeChecker.getInstance().getTypeAtLocation(localNode); let typeNode = nodeType.getSymbol()?.valueDeclaration; - this.addNonReExportedType(exportedName, typeNode!); + if (typeNode) { + this.addNonReExportedType(exportedName, typeNode!, localNode); + } }); } } - public addNonReExportedType(exportedName: string, typeNode: ts.Node) { + public addNonReExportedType(exportedName: string, typeNode: ts.Node, localNode: ts.Node) { // Check if type of localName was already stroed in typeRecord // Imported type should already be stored in typeRecord by design let typeIndexForType = this.tryGetTypeIndex(typeNode); let typeIndexForVariable = this.tryGetVariable2Type(typeNode); if (typeIndexForType != PrimitiveType.ANY) { - this.setExportedType(exportedName, typeIndexForType, true); + this.setExportedType(exportedName, typeIndexForType); } else if (typeIndexForVariable != PrimitiveType.ANY) { - this.setExportedType(exportedName, typeIndexForVariable, true); + this.setExportedType(exportedName, typeIndexForVariable); } else { // not found in typeRecord. Need to create the type and // add to typeRecord with its localName and to exportedType with its exportedName - if (typeNode.kind == ts.SyntaxKind.ClassDeclaration) { - let classType = new ClassType(typeNode, false); - let typeIndex = classType.getTypeIndex(); - this.setExportedType(exportedName, typeIndex, false); - } - - // Checking for duplicated export name should already be done by - // some kind of syntax checker, so no need to worry about duplicated export + let typeIndex = TypeChecker.getInstance().getTypeFromDecl(typeNode, localNode.kind == ts.SyntaxKind.NewExpression); + this.setExportedType(exportedName, typeIndex); } } - public shiftType(typeIndex: number) { - return typeIndex + PrimitiveType._LENGTH; - } - - public setExportedType(exportedName: string, typeIndex: number, shifted: boolean) { - if (!shifted) { - typeIndex = this.shiftType(typeIndex); - } + public setExportedType(exportedName: string, typeIndex: number) { this.exportedType.set(exportedName, typeIndex); } - public setDeclaredType(exportedName: string, typeIndex: number, shifted: boolean) { - if (!shifted) { - typeIndex = this.shiftType(typeIndex); - } + public setDeclaredType(exportedName: string, typeIndex: number) { this.declaredType.set(exportedName, typeIndex); } @@ -287,6 +284,8 @@ export class TypeRecorder { // console.log(this.printNodeMap(this.getVariable2Type())); // console.log("getTypeSet: "); // console.log(this.getTypeSet()); + // console.log("class instance Map:"); + // console.log(this.class2InstanceMap); // console.log("=============================="); // console.log("exportedType:"); // console.log(this.printExportMap(this.getExportedType())); diff --git a/ts2panda/src/variable.ts b/ts2panda/src/variable.ts index 1c1ed7f3fb..5563f6dfea 100644 --- a/ts2panda/src/variable.ts +++ b/ts2panda/src/variable.ts @@ -42,13 +42,13 @@ export abstract class Variable { ) { this.name = name; this.vreg = undefined; - this.name = name; - this.typeIndex = 77; + this.typeIndex = 0; } bindVreg(vreg: VReg) { this.vreg = vreg; this.vreg.setTypeIndex(this.typeIndex); + this.vreg.setVariableName(this.name); } hasAlreadyBinded(): boolean { diff --git a/ts2panda/templates/irnodes.ts.erb b/ts2panda/templates/irnodes.ts.erb index 2e73c9cee4..bbe51f5d1f 100755 --- a/ts2panda/templates/irnodes.ts.erb +++ b/ts2panda/templates/irnodes.ts.erb @@ -185,7 +185,8 @@ export abstract class Intrinsic extends IRNode { export class VReg { private static global_id = 0; - private typeIndex: number; + private typeIndex: number = 0; + private variableName: string = ""; readonly id: number; // used for debug purpose to distinguish one instance from another num: number = -1; @@ -202,7 +203,6 @@ export class VReg { constructor() { this.id = VReg.global_id++; - this.typeIndex = 0; // for debug purposes this.setStackTrace(null); @@ -235,6 +235,14 @@ export class VReg { setTypeIndex(typeIndex: number) { this.typeIndex = typeIndex; } + + getVariableName() { + return this.variableName; + } + + setVariableName(variableName: string) { + this.variableName = variableName; + } } export class Imm extends IRNode { diff --git a/ts2panda/ts2abc/BUILD.gn b/ts2panda/ts2abc/BUILD.gn index 4c1d44e515..7e9b058c91 100755 --- a/ts2panda/ts2abc/BUILD.gn +++ b/ts2panda/ts2abc/BUILD.gn @@ -21,7 +21,7 @@ config("ts2abc_config") { include_dirs = [ ".", "$jsoncpp_root/include", - "$ark_root/libpandabase" + "$ark_root/libpandabase", ] if (enable_bytecode_optimizer) { @@ -47,7 +47,10 @@ config("ts2abc_config") { } ohos_executable("ts2abc") { - sources = [ "ts2abc.cpp","main.cpp" ] + sources = [ + "main.cpp", + "ts2abc.cpp", + ] configs = [ ":ts2abc_config" ] diff --git a/ts2panda/ts2abc/main.cpp b/ts2panda/ts2abc/main.cpp index 587f2310e2..724a6536d2 100644 --- a/ts2panda/ts2abc/main.cpp +++ b/ts2panda/ts2abc/main.cpp @@ -1,4 +1,5 @@ -/* * Copyright (c) 2021 Huawei Device Co., Ltd. +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,6 +20,39 @@ #include "ts2abc_options.h" #include "ts2abc.h" +int Preprocess(const panda::ts2abc::Options &options, const panda::PandArgParser &argParser, std::string &output, + std::string &data, std::string &usage) +{ + std::string input; + if (!options.GetCompileByPipeArg()) { + input = options.GetTailArg1(); + output = options.GetTailArg2(); + if (input.empty() || output.empty()) { + std::cerr << "Incorrect args number" << std::endl; + std::cerr << "Usage example: ts2abc test.json test.abc"<< std::endl; + std::cerr << usage << std::endl; + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + if (!HandleJsonFile(input, data)) { + return RETURN_FAILED; + } + } else { + output = options.GetTailArg1(); + if (output.empty()) { + std::cerr << usage << std::endl; + std::cerr << argParser.GetHelpString(); + return RETURN_FAILED; + } + + if (!ReadFromPipe(data)) { + return RETURN_FAILED; + } + } + return RETURN_SUCCESS; +} + int main(int argc, const char *argv[]) { panda::PandArgParser argParser; @@ -46,41 +80,19 @@ int main(int argc, const char *argv[]) return RETURN_SUCCESS; } - if ((options.GetOptLevelArg() < OptLevel::O_LEVEL0) || (options.GetOptLevelArg() > OptLevel::O_LEVEL2)) { + if ((options.GetOptLevelArg() < static_cast(OptLevel::O_LEVEL0)) || + (options.GetOptLevelArg() > static_cast(OptLevel::O_LEVEL2))) { std::cerr << "Incorrect optimization level value" << std::endl; std::cerr << usage << std::endl; std::cerr << argParser.GetHelpString(); return RETURN_FAILED; } - std::string input, output; + std::string output; std::string data = ""; - if (!options.GetCompileByPipeArg()) { - input = options.GetTailArg1(); - output = options.GetTailArg2(); - if (input.empty() || output.empty()) { - std::cerr << "Incorrect args number" << std::endl; - std::cerr << "Usage example: ts2abc test.json test.abc"<< std::endl; - std::cerr << usage << std::endl; - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - - if (!HandleJsonFile(input, data)) { - return RETURN_FAILED; - } - } else { - output = options.GetTailArg1(); - if (output.empty()) { - std::cerr << usage << std::endl; - std::cerr << argParser.GetHelpString(); - return RETURN_FAILED; - } - - if (!ReadFromPipe(data)) { - return RETURN_FAILED; - } + if (Preprocess(options, argParser, output, data, usage) == RETURN_FAILED) { + return RETURN_FAILED; } if (!GenerateProgram(data, output, options.GetOptLevelArg(), options.GetOptLogLevelArg())) { diff --git a/ts2panda/ts2abc/tests/debuglog_test.cpp b/ts2panda/ts2abc/tests/debuglog_test.cpp index 2c829cee4f..71a6f87955 100644 --- a/ts2panda/ts2abc/tests/debuglog_test.cpp +++ b/ts2panda/ts2abc/tests/debuglog_test.cpp @@ -30,8 +30,8 @@ namespace ARK::Ts2Abc::Ts2Abc { void DebugLogTest::SetUpTestCase() {} void DebugLogTest::TearDownTestCase() {} - void DebugLogTest::SetUp() {} - void DebugLogTest::TearDown() {} + const void DebugLogTest::SetUp() {} + const void DebugLogTest::TearDown() {} HWTEST_F(DebugLogTest, DebugLogTest_True, TestSize.Level0) { @@ -48,4 +48,4 @@ namespace ARK::Ts2Abc::Ts2Abc { ParseLogEnable(rootValue); ASSERT_TRUE(GetDebugLog() == false); } -} \ No newline at end of file +} diff --git a/ts2panda/ts2abc/tests/debugmode_test.cpp b/ts2panda/ts2abc/tests/debugmode_test.cpp index 39b9099f53..dd75cdbcc4 100644 --- a/ts2panda/ts2abc/tests/debugmode_test.cpp +++ b/ts2panda/ts2abc/tests/debugmode_test.cpp @@ -30,8 +30,8 @@ namespace ARK::Ts2Abc::Ts2Abc { void DebugModeTest::SetUpTestCase() {} void DebugModeTest::TearDownTestCase() {} - void DebugModeTest::SetUp() {} - void DebugModeTest::TearDown() {} + const void DebugModeTest::SetUp() {} + const void DebugModeTest::TearDown() {} HWTEST_F(DebugModeTest, DebugModeTest_True, TestSize.Level0) { @@ -48,4 +48,4 @@ namespace ARK::Ts2Abc::Ts2Abc { ParseDebugMode(rootValue); ASSERT_TRUE(GetDebugModeEnabled() == false); } -} \ No newline at end of file +} diff --git a/ts2panda/ts2abc/tests/functions_test.cpp b/ts2panda/ts2abc/tests/functions_test.cpp index 700b36d696..02b71d91e6 100644 --- a/ts2panda/ts2abc/tests/functions_test.cpp +++ b/ts2panda/ts2abc/tests/functions_test.cpp @@ -35,8 +35,8 @@ namespace ARK::Ts2Abc::Ts2Abc { void FunctionTest::SetUpTestCase() {} void FunctionTest::TearDownTestCase() {} - void FunctionTest::SetUp() - { + const void FunctionTest::SetUp() + { std::string file = "../../ark/ts2abc/ts2panda/ts2abc/tests/sources/add.json"; std::string data = ""; int ret = HandleJsonFile(file, data); @@ -46,7 +46,7 @@ namespace ARK::Ts2Abc::Ts2Abc { EXPECT_EQ(ret, RETURN_SUCCESS); function = rootValue["func_body"]; } - void FunctionTest::TearDown() {} + const void FunctionTest::TearDown() {} HWTEST_F(FunctionTest, FunctionTest_GetFunctionDefintion, TestSize.Level0) { @@ -57,4 +57,4 @@ namespace ARK::Ts2Abc::Ts2Abc { EXPECT_EQ(pandaFunc.params.size(), signature["params"].asUInt()); EXPECT_EQ(pandaFunc.regs_num, function["regs_num"].asUInt()); } -} \ No newline at end of file +} diff --git a/ts2panda/ts2abc/tests/stringarr_test.cpp b/ts2panda/ts2abc/tests/stringarr_test.cpp index bc08e8698e..1505caf54a 100644 --- a/ts2panda/ts2abc/tests/stringarr_test.cpp +++ b/ts2panda/ts2abc/tests/stringarr_test.cpp @@ -30,8 +30,8 @@ namespace ARK::Ts2Abc::Ts2Abc { void StringArrTest::SetUpTestCase() {} void StringArrTest::TearDownTestCase() {} - void StringArrTest::SetUp() {} - void StringArrTest::TearDown() {} + const void StringArrTest::SetUp() {} + const void StringArrTest::TearDown() {} HWTEST_F(StringArrTest, StringArrTest_With0, TestSize.Level0) { @@ -48,4 +48,4 @@ namespace ARK::Ts2Abc::Ts2Abc { std::string output = ParseString(input); EXPECT_EQ(output, expected); } -} \ No newline at end of file +} diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 413006bdd5..24bcaca070 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -1,4 +1,5 @@ -/* * Copyright (c) 2021 Huawei Device Co., Ltd. +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -140,6 +141,7 @@ static void Logd(const char *format, ...) char logMsg[LOG_BUFFER_SIZE]; int ret = vsnprintf_s(logMsg, sizeof(logMsg) - 1, sizeof(logMsg) - 1, format, valist); if (ret == -1) { + va_end(valist); return; } std::cout << logMsg << std::endl; @@ -620,9 +622,12 @@ static void ParseFunctionCallType(const Json::Value &function, panda::pandasm::F } panda::pandasm::AnnotationData callTypeAnnotation("_ESCallTypeAnnotation"); std::string annotationName = "callType"; - panda::pandasm::AnnotationElement callTypeAnnotationElement(annotationName, std::make_unique(panda::pandasm::ScalarValue::Create(callType))); + panda::pandasm::AnnotationElement callTypeAnnotationElement( + annotationName, std::make_unique( + panda::pandasm::ScalarValue::Create(callType))); callTypeAnnotation.AddElement(std::move(callTypeAnnotationElement)); - const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(callTypeAnnotation)); + const_cast&>( + pandaFunc.metadata->GetAnnotations()).push_back(std::move(callTypeAnnotation)); } static void ParseFunctionTypeInfo(const Json::Value &function, panda::pandasm::Function &pandaFunc) @@ -637,7 +642,6 @@ static void ParseFunctionTypeInfo(const Json::Value &function, panda::pandasm::F continue; } - // TODO add type-vreg info to function annotation uint32_t vregNum = 0; if (type.isMember("vregNum") && type["vregNum"].isInt()) { vregNum = type["vregNum"].asUInt(); @@ -648,16 +652,21 @@ static void ParseFunctionTypeInfo(const Json::Value &function, panda::pandasm::F typeIndex = type["typeIndex"].asUInt(); } - panda::pandasm::ScalarValue vNum(panda::pandasm::ScalarValue::Create(vregNum)); + panda::pandasm::ScalarValue vNum( + panda::pandasm::ScalarValue::Create(vregNum)); elements.emplace_back(std::move(vNum)); - panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + panda::pandasm::ScalarValue tIndex( + panda::pandasm::ScalarValue::Create(typeIndex)); elements.emplace_back(std::move(tIndex)); } std::string annotationName = "typeOfVreg"; - panda::pandasm::AnnotationElement typeOfVregElement(annotationName, std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, elements))); + panda::pandasm::AnnotationElement typeOfVregElement( + annotationName, std::make_unique(panda::pandasm::ArrayValue( + panda::pandasm::Value::Type::U32, elements))); funcAnnotation.AddElement(std::move(typeOfVregElement)); - const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back( + std::move(funcAnnotation)); } } @@ -692,23 +701,28 @@ static void ParseFunctionExportedType(const Json::Value &function, panda::pandas typeIndex = exportedType["type"].asUInt(); } - panda::pandasm::ScalarValue symbol(panda::pandasm::ScalarValue::Create(exportedSymbol)); + panda::pandasm::ScalarValue symbol( + panda::pandasm::ScalarValue::Create(exportedSymbol)); symbolElements.emplace_back(std::move(symbol)); - panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + panda::pandasm::ScalarValue tIndex( + panda::pandasm::ScalarValue::Create(typeIndex)); symbolTypeElements.emplace_back(std::move(tIndex)); } std::string symbolAnnotationName = "exportedSymbols"; panda::pandasm::AnnotationElement exportedSymbolsElement(symbolAnnotationName, - std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::STRING, symbolElements))); + std::make_unique(panda::pandasm::ArrayValue( + panda::pandasm::Value::Type::STRING, symbolElements))); funcAnnotation.AddElement(std::move(exportedSymbolsElement)); std::string symbolTypeAnnotationName = "exportedSymbolTypes"; panda::pandasm::AnnotationElement exportedSymbolTypesElement(symbolTypeAnnotationName, - std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, symbolTypeElements))); + std::make_unique(panda::pandasm::ArrayValue( + panda::pandasm::Value::Type::U32, symbolTypeElements))); funcAnnotation.AddElement(std::move(exportedSymbolTypesElement)); - const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + const_cast&>( + pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); } } @@ -743,23 +757,28 @@ static void ParseFunctionDeclaredType(const Json::Value &function, panda::pandas typeIndex = declaredType["type"].asUInt(); } - panda::pandasm::ScalarValue symbol(panda::pandasm::ScalarValue::Create(declaredSymbol)); + panda::pandasm::ScalarValue symbol( + panda::pandasm::ScalarValue::Create(declaredSymbol)); symbolElements.emplace_back(std::move(symbol)); - panda::pandasm::ScalarValue tIndex(panda::pandasm::ScalarValue::Create(typeIndex)); + panda::pandasm::ScalarValue tIndex( + panda::pandasm::ScalarValue::Create(typeIndex)); symbolTypeElements.emplace_back(std::move(tIndex)); } std::string symbolAnnotationName = "declaredSymbols"; panda::pandasm::AnnotationElement declaredSymbolsElement(symbolAnnotationName, - std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::STRING, symbolElements))); + std::make_unique(panda::pandasm::ArrayValue( + panda::pandasm::Value::Type::STRING, symbolElements))); funcAnnotation.AddElement(std::move(declaredSymbolsElement)); std::string symbolTypeAnnotationName = "declaredSymbolTypes"; panda::pandasm::AnnotationElement declaredSymbolTypesElement(symbolTypeAnnotationName, - std::make_unique(panda::pandasm::ArrayValue(panda::pandasm::Value::Type::U32, symbolTypeElements))); + std::make_unique(panda::pandasm::ArrayValue( + panda::pandasm::Value::Type::U32, symbolTypeElements))); funcAnnotation.AddElement(std::move(declaredSymbolTypesElement)); - const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back(std::move(funcAnnotation)); + const_cast&>(pandaFunc.metadata->GetAnnotations()).push_back( + std::move(funcAnnotation)); } } @@ -941,31 +960,31 @@ static int ParseSmallPieceJson(const std::string &subJson, panda::pandasm::Progr type = rootValue["type"].asInt(); } switch (type) { - case JsonType::FUNCTION: { + case static_cast(JsonType::FUNCTION): { if (rootValue.isMember("func_body") && rootValue["func_body"].isObject()) { ParseSingleFunc(rootValue, prog); } break; } - case JsonType::RECORD: { + case static_cast(JsonType::RECORD): { if (rootValue.isMember("rec_body") && rootValue["rec_body"].isObject()) { ParseSingleRec(rootValue, prog); } break; } - case JsonType::STRING: { + case static_cast(JsonType::STRING): { if (rootValue.isMember("string") && rootValue["string"].isString()) { ParseSingleStr(rootValue, prog); } break; } - case JsonType::LITERALBUFFER: { + case static_cast(JsonType::LITERALBUFFER): { if (rootValue.isMember("literalArray") && rootValue["literalArray"].isObject()) { ParseSingleLiteralBuf(rootValue, prog); } break; } - case JsonType::OPTIONS: { + case static_cast(JsonType::OPTIONS): { ParseOptions(rootValue, prog); break; } @@ -1008,7 +1027,7 @@ static bool ParseData(const std::string &data, panda::pandasm::Program &prog) return true; } -bool GenerateProgram(const std::string &data, std::string output, int optLevel, std::string optLogLevel) +bool GenerateProgram(const std::string &data, std::string output, int optLevel, const std::string &optLogLevel) { panda::pandasm::Program prog = panda::pandasm::Program(); prog.lang = panda::pandasm::extensions::Language::ECMASCRIPT; @@ -1020,7 +1039,7 @@ bool GenerateProgram(const std::string &data, std::string output, int optLevel, Logd("parsing done, calling pandasm\n"); #ifdef ENABLE_BYTECODE_OPT - if (g_optLevel != O_LEVEL0 || optLevel != O_LEVEL0) { + if (g_optLevel != OptLevel::O_LEVEL0 || optLevel != OptLevel::O_LEVEL0) { optLogLevel = (optLogLevel != "error") ? optLogLevel : g_optLogLevel; const uint32_t componentMask = panda::Logger::Component::CLASS2PANDA | panda::Logger::Component::ASSEMBLER | diff --git a/ts2panda/ts2abc/ts2abc.h b/ts2panda/ts2abc/ts2abc.h index 90826ef448..d1a2ed60af 100644 --- a/ts2panda/ts2abc/ts2abc.h +++ b/ts2panda/ts2abc/ts2abc.h @@ -1,4 +1,5 @@ -/* * Copyright (c) 2021 Huawei Device Co., Ltd. +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -27,7 +28,7 @@ #include "assembly-emitter.h" #include "json/json.h" -enum JsonType { +enum class JsonType { FUNCTION = 0, RECORD, STRING, @@ -38,7 +39,7 @@ enum JsonType { constexpr int RETURN_SUCCESS = 0; constexpr int RETURN_FAILED = 1; -enum OptLevel { +enum class OptLevel { O_LEVEL0 = 0, O_LEVEL1, O_LEVEL2 @@ -48,7 +49,7 @@ bool HandleJsonFile(const std::string &input, std::string &data); bool ReadFromPipe(std::string &data); bool GenerateProgram(const std::string &data, std::string output, int optLevel, - std::string optLogLevel); + const std::string &optLogLevel); bool GetDebugLog(); void ParseLogEnable(const Json::Value &rootValue); bool GetDebugModeEnabled(); @@ -57,4 +58,4 @@ std::string ParseString(const std::string &data); int ParseJson(const std::string &data, Json::Value &rootValue); panda::pandasm::Function GetFunctionDefintion(const Json::Value &function); -#endif // PANDA_TS2ABC_GEN_H_ \ No newline at end of file +#endif // PANDA_TS2ABC_GEN_H_ diff --git a/ts2panda/ts2abc/ts2abc_options.h b/ts2panda/ts2abc/ts2abc_options.h index 4ec2d2adbf..577166e624 100755 --- a/ts2panda/ts2abc/ts2abc_options.h +++ b/ts2panda/ts2abc/ts2abc_options.h @@ -191,7 +191,7 @@ namespace panda::ts2abc { panda::PandArg help_arg_{ "help", false, R"(Print this message and exit)"}; panda::PandArg opt_level_arg_{ "opt-level", 0, - R"("Optimization level. Possible values: [0, 1, 2]. Default: 0\n" + R"("Optimization level. Possible values: [0, 1, 2]. Default: 0\n" "0: no optimizations\n " "1: basic bytecode optimizations, including valueNumber," "lowering, constantResolver, regAccAllocator\n " @@ -214,4 +214,4 @@ namespace panda::ts2abc { }; } // namespace panda::ts2abc -#endif // PANDA_TS2ABC_OPTIONS_GEN_H_ \ No newline at end of file +#endif // PANDA_TS2ABC_OPTIONS_GEN_H_ -- Gitee From 25106ebe2c58a946568fb20c4cb06a1890c90f50 Mon Sep 17 00:00:00 2001 From: zhuoli Date: Tue, 11 Jan 2022 15:17:25 +0800 Subject: [PATCH 19/21] Update ut testcase for removing getFunctionId in recorder of commit 30e2d7512ca51cf6583dea79cb74929568e06e01 Change-Id: Ibad1d9252e5076fc26deaa8ba22beaa196ef9cb5 Signed-off-by: zhuoli --- ts2panda/tests/lexenv.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ts2panda/tests/lexenv.test.ts b/ts2panda/tests/lexenv.test.ts index 612e7b4aa9..64bd73f9d4 100644 --- a/ts2panda/tests/lexenv.test.ts +++ b/ts2panda/tests/lexenv.test.ts @@ -505,7 +505,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { new LdaDyn(new VReg()), new StaDyn(new VReg()), ...insnsStoreLexVar_outer_2, - new EcmaDefinefuncdyn("#2#", new Imm(ResultType.Int, 0), new VReg()), + new EcmaDefinefuncdyn("#1#", new Imm(ResultType.Int, 0), new VReg()), // returnStatement new StaDyn(new VReg()), new LdaDyn(new VReg()), @@ -542,7 +542,7 @@ describe("lexenv-compile-testcase in lexenv.test.ts", function () { expect(outerA instanceof LocalVariable, "a in outer is local variable").to.be.true; // expect((outerScope).hasLexEnv(), "outer scope need to create lex env").to.be.true; expect((outerScope).getNumLexEnv(), "number of lexvar at outer scope").to.be.equal(2); - let anonymousPg = snippetCompiler.getPandaGenByName("#2#"); + let anonymousPg = snippetCompiler.getPandaGenByName("#1#"); let anonymousScope = anonymousPg!.getScope(); let anonymousA = anonymousScope!.findLocal("a"); let searchRlt = anonymousScope!.find("a"); -- Gitee From 71556c434c98f8c09e2abee740188fdc66b62ad3 Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Tue, 11 Jan 2022 15:32:06 +0800 Subject: [PATCH 20/21] interface type add extends info Signed-off-by: zhangrengao Change-Id: I00f2cb28b57e7c4fe999445095e68ebe5ffe3d11 --- ts2panda/src/base/typeSystem.ts | 36 ++++++++++++++++----------------- ts2panda/src/typeChecker.ts | 11 ++++++++++ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/ts2panda/src/base/typeSystem.ts b/ts2panda/src/base/typeSystem.ts index dbaeee6644..bd80b4607b 100755 --- a/ts2panda/src/base/typeSystem.ts +++ b/ts2panda/src/base/typeSystem.ts @@ -695,42 +695,42 @@ export class InterfaceType extends BaseType { } transfer2LiteralBuffer() { - let classTypeBuf = new LiteralBuffer(); - let classTypeLiterals: Array = new Array(); + let interfaceTypeBuf = new LiteralBuffer(); + let interfaceTypeLiterals: Array = new Array(); // the first element is to determine the L2 type - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.INTERFACE)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, L2Type.INTERFACE)); - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, this.heritages.length)); this.heritages.forEach(heritage => { - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, heritage)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, heritage)); }); // record fields and methods - this.transferFields2Literal(classTypeLiterals); - this.transferMethods2Literal(classTypeLiterals); + this.transferFields2Literal(interfaceTypeLiterals); + this.transferMethods2Literal(interfaceTypeLiterals); - classTypeBuf.addLiterals(...classTypeLiterals); - return classTypeBuf; + interfaceTypeBuf.addLiterals(...interfaceTypeLiterals); + return interfaceTypeBuf; } - private transferFields2Literal(classTypeLiterals: Array) { + private transferFields2Literal(interfaceTypeLiterals: Array) { let transferredTarget: Map> = this.fields; - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.size)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.size)); transferredTarget.forEach((typeInfo, name) => { - classTypeLiterals.push(new Literal(LiteralTag.STRING, name)); - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[0])); // typeIndex - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[1])); // accessFlag - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[2])); // readonly + interfaceTypeLiterals.push(new Literal(LiteralTag.STRING, name)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[0])); // typeIndex + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[1])); // accessFlag + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, typeInfo[2])); // readonly }); } - private transferMethods2Literal(classTypeLiterals: Array) { + private transferMethods2Literal(interfaceTypeLiterals: Array) { let transferredTarget: Array = this.methods; - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.length)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, transferredTarget.length)); transferredTarget.forEach(method => { - classTypeLiterals.push(new Literal(LiteralTag.INTEGER, method)); + interfaceTypeLiterals.push(new Literal(LiteralTag.INTEGER, method)); }); } } diff --git a/ts2panda/src/typeChecker.ts b/ts2panda/src/typeChecker.ts index f856aeae8e..a405d1f179 100755 --- a/ts2panda/src/typeChecker.ts +++ b/ts2panda/src/typeChecker.ts @@ -137,6 +137,15 @@ export class TypeChecker { return PrimitiveType.ANY; } + public getInterfaceDeclaration(typeDeclNode: ts.Node) { + let interfaceTypeIndex = TypeRecorder.getInstance().tryGetTypeIndex(typeDeclNode); + if (interfaceTypeIndex == PrimitiveType.ANY) { + let interefaceType = new InterfaceType(typeDeclNode); + interfaceTypeIndex = interefaceType.shiftedTypeIndex; + } + return interfaceTypeIndex; + } + public getTypeFromDecl(typeDeclNode: ts.Node, getTypeForInstace: boolean): number { if (!typeDeclNode) { return PrimitiveType.ANY; @@ -155,6 +164,8 @@ export class TypeChecker { return PrimitiveType.ANY; case ts.SyntaxKind.PropertyAccessExpression: return this.getTypeForPropertyAccessExpression(typeDeclNode); + case ts.SyntaxKind.InterfaceDeclaration: + return this.getInterfaceDeclaration(typeDeclNode); } return PrimitiveType.ANY; } -- Gitee From 8062d50831b9bdf8b0f3765577f6f3636454d4eb Mon Sep 17 00:00:00 2001 From: zhuoli Date: Tue, 11 Jan 2022 20:55:18 +0800 Subject: [PATCH 21/21] Fix missing type cast for enum class Signed-off-by: zhuoli Change-Id: I3f433c4a300a390bef3ea4fa9ccb2db531a869c0 --- ts2panda/ts2abc/ts2abc.cpp | 4 ++-- ts2panda/ts2abc/ts2abc.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 24bcaca070..41e2a6d190 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -1027,7 +1027,7 @@ static bool ParseData(const std::string &data, panda::pandasm::Program &prog) return true; } -bool GenerateProgram(const std::string &data, std::string output, int optLevel, const std::string &optLogLevel) +bool GenerateProgram(const std::string &data, std::string output, int optLevel, std::string optLogLevel) { panda::pandasm::Program prog = panda::pandasm::Program(); prog.lang = panda::pandasm::extensions::Language::ECMASCRIPT; @@ -1039,7 +1039,7 @@ bool GenerateProgram(const std::string &data, std::string output, int optLevel, Logd("parsing done, calling pandasm\n"); #ifdef ENABLE_BYTECODE_OPT - if (g_optLevel != OptLevel::O_LEVEL0 || optLevel != OptLevel::O_LEVEL0) { + if (g_optLevel != static_cast(OptLevel::O_LEVEL0) || optLevel != static_cast(OptLevel::O_LEVEL0)) { optLogLevel = (optLogLevel != "error") ? optLogLevel : g_optLogLevel; const uint32_t componentMask = panda::Logger::Component::CLASS2PANDA | panda::Logger::Component::ASSEMBLER | diff --git a/ts2panda/ts2abc/ts2abc.h b/ts2panda/ts2abc/ts2abc.h index d1a2ed60af..691e87a0de 100644 --- a/ts2panda/ts2abc/ts2abc.h +++ b/ts2panda/ts2abc/ts2abc.h @@ -49,7 +49,7 @@ bool HandleJsonFile(const std::string &input, std::string &data); bool ReadFromPipe(std::string &data); bool GenerateProgram(const std::string &data, std::string output, int optLevel, - const std::string &optLogLevel); + std::string optLogLevel); bool GetDebugLog(); void ParseLogEnable(const Json::Value &rootValue); bool GetDebugModeEnabled(); -- Gitee