From 6eb84c7406a4f28e069bbbb0557e170fbc9b2a86 Mon Sep 17 00:00:00 2001 From: zhangyouyou Date: Tue, 1 Mar 2022 20:31:48 +0800 Subject: [PATCH 1/9] Signed-off-by: zhangyouyou Please enter the commit message for your changes. Lines starting with '#' will be ignored, and an empty message aborts the commit. On branch weekly_20220301 Your branch is up to date with 'origin/weekly_20220301'. --- ts2panda/src/base/bcGenUtil.ts | 5 +++++ ts2panda/src/compiler.ts | 2 ++ ts2panda/src/expression/bigIntLiteral.ts | 24 ++++++++++++++++++++++++ ts2panda/src/pandagen.ts | 9 ++++++++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 ts2panda/src/expression/bigIntLiteral.ts diff --git a/ts2panda/src/base/bcGenUtil.ts b/ts2panda/src/base/bcGenUtil.ts index 4f19537799..5410714703 100755 --- a/ts2panda/src/base/bcGenUtil.ts +++ b/ts2panda/src/base/bcGenUtil.ts @@ -101,6 +101,7 @@ import { EcmaStclasstoglobalrecord, EcmaStconsttoglobalrecord, EcmaStlettoglobalrecord, + EcmaLdbigint, VReg } from "../irnodes"; @@ -429,4 +430,8 @@ export function stConstToGlobalRecord (name: string) { export function stClassToGlobalRecord (name: string) { return new EcmaStclasstoglobalrecord(name); +} + +export function loadAccumulatorBigInt(value: string): IRNode { + return new EcmaLdbigint(value); } \ No newline at end of file diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index b323fc7b57..be4e025412 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -37,6 +37,7 @@ import { CompilerDriver } from "./compilerDriver"; import { DebugInfo, NodeKind } from "./debuginfo"; import { DiagnosticCode, DiagnosticError } from "./diagnostic"; import { compileArrayLiteralExpression } from "./expression/arrayLiteralExpression"; +import { compileBigIntLiteral } from "./expression/bigIntLiteral"; import { compileCallExpression, getHiddenParameters @@ -778,6 +779,7 @@ export class Compiler { compileNumericLiteral(this.pandaGen, expr); break; case ts.SyntaxKind.BigIntLiteral: // line 35 + compileBigIntLiteral(this.pandaGen, expr); break; case ts.SyntaxKind.StringLiteral: // line 36 compileStringLiteral(this.pandaGen, expr); diff --git a/ts2panda/src/expression/bigIntLiteral.ts b/ts2panda/src/expression/bigIntLiteral.ts new file mode 100644 index 0000000000..32575be578 --- /dev/null +++ b/ts2panda/src/expression/bigIntLiteral.ts @@ -0,0 +1,24 @@ +/* + * 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 * as jshelpers from "../jshelpers"; +import { PandaGen } from "../pandagen"; + +export function compileBigIntLiteral(pandaGen: PandaGen, lit: ts.BigIntLiteral) { + let text = jshelpers.getTextOfIdentifierOrLiteral(lit); + text = text.substring(0, text.length-1); + pandaGen.loadAccumulatorBigInt(lit, text); +} \ No newline at end of file diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts index d7b0bfceb7..51a48dc385 100644 --- a/ts2panda/src/pandagen.ts +++ b/ts2panda/src/pandagen.ts @@ -101,7 +101,8 @@ import { throwThrowNotExists, throwUndefinedIfHole, tryLoadGlobalByName, - tryStoreGlobalByName + tryStoreGlobalByName, + loadAccumulatorBigInt } from "./base/bcGenUtil"; import { LiteralBuffer } from "./base/literal"; import { getParamLengthOfFunc } from "./base/util"; @@ -1254,6 +1255,12 @@ export class PandaGen { stClassToGlobalRecord(string_id)); } + loadAccumulatorBigInt(node: ts.Node | NodeKind, str: string) { + this.add( + node, + loadAccumulatorBigInt(str)); + } + private binaryRelation(node: ts.Node, op: BinaryOperator, lhs: VReg) { let falseLabel = new Label(); let endLabel = new Label(); -- Gitee From 9f9015a37d5f772753c395837ac79c1339396ded Mon Sep 17 00:00:00 2001 From: ctw Date: Wed, 2 Mar 2022 14:37:20 +0800 Subject: [PATCH 2/9] Fix incorrect scope location of catch block Signed-off-by: ctw Change-Id: If1d40d8bbe7c10e384862ebc3fbd6e9cad5566ab --- ts2panda/src/statement/tryStatement.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ts2panda/src/statement/tryStatement.ts b/ts2panda/src/statement/tryStatement.ts index d720e5420d..c5a8177115 100644 --- a/ts2panda/src/statement/tryStatement.ts +++ b/ts2panda/src/statement/tryStatement.ts @@ -206,8 +206,10 @@ export class TryBuilder extends TryBuilderBase { this.compiler.pushScope(catchClause); compileCatchClauseVariableDeclaration(this.compiler, catchClause.variableDeclaration); let catchBlock = catchClause.block; + this.compiler.pushScope(catchBlock); catchBlock.statements.forEach((stmt) => this.compiler.compileStatement(stmt)); this.compiler.popScope(); + this.compiler.popScope(); } else { // finallyBlock rethrow exception when it catch the exception let exceptionVreg = this.pandaGen.getTemp(); -- Gitee From 6df7fd400102d04f8ce782ffdfcaed8d228eebbd Mon Sep 17 00:00:00 2001 From: hufeng Date: Fri, 11 Mar 2022 11:12:46 +0800 Subject: [PATCH 3/9] fixed fbb2cd0 from https://gitee.com/hufeng20/ark_ts2abc/pulls/155 fix compiling issue on release br in yellow zone Signed-off-by: hufeng Change-Id: Icccf9d33203bef51da13ce0bedbbd5c511df936c --- ts2panda/ts2abc/BUILD.gn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ts2panda/ts2abc/BUILD.gn b/ts2panda/ts2abc/BUILD.gn index 803df05e5b..bb00179e70 100755 --- a/ts2panda/ts2abc/BUILD.gn +++ b/ts2panda/ts2abc/BUILD.gn @@ -53,6 +53,8 @@ ohos_executable("ts2abc") { configs = [ ":ts2abc_config" ] + cflags = [ "-Wno-c++20-designator" ] + deps = [ sdk_libc_secshared_dep ] if (is_linux || is_mingw || is_mac) { -- Gitee From 3f600599eaed2f2df3790f4306ea653268dd116f Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Sat, 12 Mar 2022 18:10:13 +0800 Subject: [PATCH 4/9] Revert "EcmaScript Standard Module Implementation" Signed-off-by: zhangrengao Change-Id: I06a9a648e97c3f10366fc7040b5cdfb00e353b6d --- test262/config.py | 25 +- test262/es2015_tests.txt | 412 +------------------- test262/module_tests.txt | 431 --------------------- test262/run_sunspider.py | 8 +- test262/run_test262.py | 4 - test262/skip_tests.json | 62 +-- ts2panda/scripts/diagnosticMessages.json | 50 +-- ts2panda/src/addVariable2Scope.ts | 16 +- ts2panda/src/base/bcGenUtil.ts | 23 +- ts2panda/src/base/util.ts | 14 +- ts2panda/src/compiler.ts | 79 ++-- ts2panda/src/compilerDriver.ts | 30 +- ts2panda/src/ecmaModule.ts | 225 ----------- ts2panda/src/hoisting.ts | 27 +- ts2panda/src/index.ts | 3 +- ts2panda/src/lexenv.ts | 13 +- ts2panda/src/modules.ts | 64 ++- ts2panda/src/pandagen.ts | 24 +- ts2panda/src/pandasm.ts | 56 +-- ts2panda/src/recorder.ts | 284 +++----------- ts2panda/src/scope.ts | 104 ++--- ts2panda/src/statement/classStatement.ts | 47 +-- ts2panda/src/syntaxChecker.ts | 36 +- ts2panda/src/syntaxCheckerForStrcitMode.ts | 69 +--- ts2panda/src/ts2panda.ts | 65 +--- ts2panda/src/variable.ts | 38 +- ts2panda/templates/diagnostic.ts.erb | 40 +- ts2panda/ts2abc/ts2abc.cpp | 172 +------- ts2panda/ts2abc/ts2abc.h | 1 - 29 files changed, 394 insertions(+), 2028 deletions(-) delete mode 100644 test262/module_tests.txt delete mode 100644 ts2panda/src/ecmaModule.ts diff --git a/test262/config.py b/test262/config.py index d4903397a7..e04e869ae8 100755 --- a/test262/config.py +++ b/test262/config.py @@ -55,7 +55,6 @@ DEFAULT_TIMEOUT = 60000 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") -MODULE_FILES_LIST = os.path.join("test262", "module_tests.txt") TEST262_GIT_HASH = "9ca13b12728b7e0089c7eb03fa2bd17f8abe297f" HARNESS_GIT_HASH = "9c499f028eb24e67781435c0bb442e00343eb39d" @@ -82,3 +81,27 @@ ARK_ARCH_LIST = [ ] DEFAULT_ARK_ARCH = ARK_ARCH_LIST[0] + +MODULE_FILES_LIST = [ + "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", + "early-dup-lables.js", + "early-dup-lex.js", + "early-export-global.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", + "parse-err-export-dflt-const.js", + "parse-err-export-dflt-let.js", + "parse-err-export-dflt-var.js", + "parse-err-return.js", + "parse-err-yield.js", + "dup-bound-names.js", + "await-module.js" +] diff --git a/test262/es2015_tests.txt b/test262/es2015_tests.txt index b23ac30a0d..92acde0ddc 100755 --- a/test262/es2015_tests.txt +++ b/test262/es2015_tests.txt @@ -5227,414 +5227,4 @@ intl402/Date/prototype/toLocaleString/builtin.js intl402/Date/prototype/toLocaleString/length.js intl402/Date/prototype/toLocaleString/default-options-object-prototype.js intl402/language-tags-valid.js -intl402/language-tags-canonicalized.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 +intl402/language-tags-canonicalized.js \ No newline at end of file diff --git a/test262/module_tests.txt b/test262/module_tests.txt deleted file mode 100644 index fc9cd67a51..0000000000 --- a/test262/module_tests.txt +++ /dev/null @@ -1,431 +0,0 @@ -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 -early-dup-lables.js -early-dup-lex.js -early-export-global.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 -parse-err-export-dflt-const.js -parse-err-export-dflt-let.js -parse-err-export-dflt-var.js -parse-err-return.js -parse-err-yield.js -dup-bound-names.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 \ No newline at end of file diff --git a/test262/run_sunspider.py b/test262/run_sunspider.py index 1e8c42ad24..3186621dc8 100755 --- a/test262/run_sunspider.py +++ b/test262/run_sunspider.py @@ -50,9 +50,6 @@ def parse_args(): required=False, nargs='?', choices=ARK_FRONTEND_LIST, type=str, help="Choose one of them") - parser.add_argument('--module-list', - required=True, - help="module file list") parser.add_argument('--ark-arch', default=DEFAULT_ARK_ARCH, required=False, @@ -138,7 +135,6 @@ class ArkProgram(): self.ark_frontend_tool = ARK_FRONTEND_TOOL self.libs_dir = LIBS_DIR self.ark_frontend = ARK_FRONTEND - self.module_list = [] self.js_file = "" self.arch = ARK_ARCH self.arch_root = "" @@ -156,8 +152,6 @@ class ArkProgram(): if self.args.ark_frontend: self.ark_frontend = self.args.ark_frontend - self.module_list = self.args.module_list.splitlines() - self.js_file = self.args.js_file self.arch = self.args.ark_arch @@ -181,7 +175,7 @@ class ArkProgram(): cmd_args = [frontend_tool, '-c', '-e', 'js', '-o', out_file, '-i', js_file] - if file_name in self.module_list: + if file_name in MODULE_FILES_LIST: cmd_args.insert(mod_opt_index, "-m") retcode = exec_command(cmd_args) diff --git a/test262/run_test262.py b/test262/run_test262.py index 1ab65ab091..baa936b005 100755 --- a/test262/run_test262.py +++ b/test262/run_test262.py @@ -395,9 +395,6 @@ def get_host_args(args, host_type): libs_dir = DEFAULT_LIBS_DIR ark_frontend = DEFAULT_ARK_FRONTEND ark_arch = DEFAULT_ARK_ARCH - module_list = '' - with open(MODULE_FILES_LIST) as fopen: - module_list = fopen.read() if args.hostArgs: host_args = args.hostArgs @@ -420,7 +417,6 @@ def get_host_args(args, host_type): host_args += f"--ark-frontend-tool={ark_frontend_tool} " host_args += f"--libs-dir={libs_dir} " host_args += f"--ark-frontend={ark_frontend} " - host_args += f"--module-list={module_list}" if args.ark_arch != ark_arch: host_args += f"--ark-arch={args.ark_arch} " diff --git a/test262/skip_tests.json b/test262/skip_tests.json index f5c6b7d2c2..c99bd2a5a1 100755 --- a/test262/skip_tests.json +++ b/test262/skip_tests.json @@ -421,7 +421,6 @@ "language/literals/regexp/S7.8.5_A2.1_T2.js", "language/literals/regexp/S7.8.5_A2.4_T2.js", "language/literals/string/legacy-non-octal-escape-sequence-strict.js", - "language/module-code/export-default-asyncgenerator-declaration-binding.js", "language/statements/break/S12.8_A7.js", "language/statements/const/cptn-value.js", "language/statements/continue/S12.7_A7.js", @@ -971,7 +970,6 @@ "language/expressions/unary-minus/S11.4.7_A3_T5.js", "language/expressions/unary-plus/S11.4.6_A3_T5.js", "language/expressions/unsigned-right-shift/S11.7.3_A3_T1.5.js", - "language/module-code/eval-gtbndng-indirect-update-dflt.js", "language/statements/switch/S12.11_A1_T4.js", "language/statements/switch/S12.11_A1_T4.js", "built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js", @@ -1267,7 +1265,7 @@ ] }, { - "reason": "Not support TypedArrayConstructors ecma2020 features", + "reason": "Not support TypedArrayConstructors ecma2021 features", "files": [ "built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js", "built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js", @@ -1325,63 +1323,5 @@ "intl402/Intl/getCanonicalLocales/canonicalized-tags.js", "intl402/Intl/getCanonicalLocales/transformed-ext-invalid.js" ] - }, - { - "reason": "Not support with Class's Privatename(#)", - "files": [ - "language/module-code/invalid-private-names-member-expression-bad-reference.js", - "language/module-code/invalid-private-names-member-expression-this.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/privatename-valid-no-earlyerr.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/private-identifiers-not-empty.js" - ] - }, - { - "reason": "Special unicode character that tsc can not recognize", - "files" : [ - "language/module-code/export-expname-binding-string.js", - "language/module-code/export-expname-from-binding-string.js", - "language/module-code/export-expname-from-star-string.js", - "language/module-code/export-expname-from-string-binding.js", - "language/module-code/export-expname-from-star.js", - "language/module-code/export-expname-from-string-string.js", - "language/module-code/export-expname-from-string.js", - "language/module-code/export-expname-import-string-binding.js" - ] - }, - { - "reason": "Not support Dynamic Import", - "files": [ - "language/module-code/verify-dfs.js" - ] - }, - { - "reason": "Unused node will be eliminated when tsc emiting in [after], So module won't get correct entries", - "files": [ - "language/module-code/instn-named-err-ambiguous.js", - "language/module-code/instn-named-err-ambiguous-as.js", - "language/module-code/instn-named-err-not-found.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-dflt-thru-star-as.js", - "language/module-code/instn-named-err-dflt-thru-star-dflt.js", - "language/module-code/eval-rqstd-order.js" - ] - }, - { - "reason": "Not support further ecma-2015's feature in module code", - "files": [ - "language/module-code/namespace/internals/define-own-property.js", - "language/module-code/early-dup-export-as-star-as.js" - ] } ] diff --git a/ts2panda/scripts/diagnosticMessages.json b/ts2panda/scripts/diagnosticMessages.json index 6fa9df1efc..b4142d717d 100755 --- a/ts2panda/scripts/diagnosticMessages.json +++ b/ts2panda/scripts/diagnosticMessages.json @@ -143,10 +143,6 @@ "category": "Error", "code": 1119 }, - "An export assignment cannot have modifiers.": { - "category": "Error", - "code": 1120 - }, "Octal literals are not allowed in strict mode.": { "category": "Error", "code": 1121 @@ -163,10 +159,6 @@ "category": "Error", "code": 1142 }, - "Cannot use imports, exports, or module augmentations when '--module' is 'none'.": { - "category": "Error", - "code": 1148 - }, "The 'const' declarations can only be declared inside a block.": { "category": "Error", "code": 1156 @@ -235,14 +227,6 @@ "category": "Error", "code": 1190 }, - "An import declaration cannot have modifiers.": { - "category": "Error", - "code": 1191 - }, - "An export declaration cannot have modifiers.": { - "category": "Error", - "code": 1193 - }, "Line terminator not permitted before arrow.": { "category": "Error", "code": 1200 @@ -259,10 +243,6 @@ "category": "Error", "code": 1210 }, - "A class or function 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 @@ -275,10 +255,6 @@ "category": "Error", "code": 1214 }, - "An export assignment must be at the top level of a file or module declaration.": { - "category": "Error", - "code": 1231 - }, "An import declaration can only be used in a namespace or module.": { "category": "Error", "code": 1232 @@ -363,18 +339,6 @@ "category": "Error", "code": 2300 }, - "Module '{0}' has no exported member '{1}'.": { - "category": "Error", - "code": 2305 - }, - "Module '{0}' has already exported a member named '{1}'.": { - "category": "Error", - "code": 2308 - }, - "An export assignment cannot be used in a module with other exported elements.": { - "category": "Error", - "code": 2309 - }, "The 'super' can only be referenced in a derived class.": { "category": "Error", "code": 2335 @@ -431,10 +395,6 @@ "category": "Error", "code": 2404 }, - "Import declaration conflicts with local declaration of '{0}'.": { - "category": "Error", - "code": 2440 - }, "The 'super' cannot be referenced in a computed property name.": { "category": "Error", "code": 2466 @@ -463,10 +423,6 @@ "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 @@ -556,12 +512,8 @@ "category": "Error", "code": 19009 }, - "Invalid regular expression flag '{0}'": { + "Invalid regular expression flag '{0}'":{ "category": "Error", "code": 19010 - }, - "Unexpected eval or arguments in strict mode": { - "category": "Error", - "code": 20000 } } \ No newline at end of file diff --git a/ts2panda/src/addVariable2Scope.ts b/ts2panda/src/addVariable2Scope.ts index b966e6ccf7..8d65f686c1 100644 --- a/ts2panda/src/addVariable2Scope.ts +++ b/ts2panda/src/addVariable2Scope.ts @@ -105,9 +105,9 @@ export function addVariableToScope(recorder: Recorder, enableTypeRecord: boolean hoistDecls.forEach(hoistDecl => { let v: Variable | undefined; if (hoistDecl instanceof VarDecl) { - v = scope.add(hoistDecl, VarDeclarationKind.VAR); + v = scope.add(hoistDecl.name, VarDeclarationKind.VAR); } else if (hoistDecl instanceof FuncDecl) { - v = scope.add(hoistDecl, VarDeclarationKind.FUNCTION); + v = scope.add(hoistDecl.name, VarDeclarationKind.FUNCTION); } else { throw new Error("Wrong type of declaration to be hoisted") } @@ -131,20 +131,20 @@ export function addVariableToScope(recorder: Recorder, enableTypeRecord: boolean } let v: Variable | undefined; if (decl instanceof LetDecl) { - v = scope.add(decl, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.LET, InitStatus.UNINITIALIZED); } else if (decl instanceof ConstDecl) { - v = scope.add(decl, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.CONST, InitStatus.UNINITIALIZED); } else if (decl instanceof FuncDecl) { - v = scope.add(decl, VarDeclarationKind.FUNCTION); + v = scope.add(decl.name, VarDeclarationKind.FUNCTION); } else if (decl instanceof CatchParameter) { - v = scope.add(decl, VarDeclarationKind.LET); + v = scope.add(decl.name, VarDeclarationKind.LET); } else if (decl instanceof ClassDecl) { let classNode = decl.node; if (ts.isClassDeclaration(classNode)) { - v = scope.add(decl, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); + v = scope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); } else { let classScope = recorder.getScopeOfNode(classNode); - v = classScope.add(decl, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); + v = classScope.add(decl.name, VarDeclarationKind.CLASS, InitStatus.UNINITIALIZED); } } else { /** diff --git a/ts2panda/src/base/bcGenUtil.ts b/ts2panda/src/base/bcGenUtil.ts index ebde0fb137..43e6ceba2c 100755 --- a/ts2panda/src/base/bcGenUtil.ts +++ b/ts2panda/src/base/bcGenUtil.ts @@ -22,6 +22,7 @@ import { EcmaCallithisrangedyn, EcmaCloseiterator, EcmaCopydataproperties, + EcmaCopymodule, EcmaCreatearraywithbuffer, EcmaCreateemptyarray, EcmaCreateemptyobject, @@ -42,14 +43,14 @@ import { EcmaGetiteratornext, EcmaGetnextpropname, EcmaGetpropiterator, - EcmaGetmodulenamespace, + EcmaImportmodule, EcmaIsfalse, EcmaIstrue, EcmaLdglobalvar, EcmaLdhomeobject, EcmaLdlexenvdyn, EcmaLdlexvardyn, - EcmaLdmodulevar, + EcmaLdmodvarbyname, EcmaLdobjbyindex, EcmaLdobjbyname, EcmaLdobjbyvalue, @@ -370,16 +371,20 @@ export function ldSuperByValue(obj: VReg, prop: VReg): IRNode { return new EcmaLdsuperbyvalue(obj, prop); } -export function loadModuleVariable(name: string, isLocal: number) { - return new EcmaLdmodulevar(name, new Imm(isLocal)); +export function importModule(name: string) { + return new EcmaImportmodule(name); +} + +export function loadModuleVarByName(name: string, module: VReg) { + return new EcmaLdmodvarbyname(name, module); } export function storeModuleVariable(name: string) { return new EcmaStmodulevar(name); } -export function getModuleNamespace(localName: string) { - return new EcmaGetmodulenamespace(localName); +export function copyModuleIntoCurrentModule(mod: VReg) { + return new EcmaCopymodule(mod); } export function loadHomeObject() { @@ -418,15 +423,15 @@ export function createRegExpWithLiteral(pattern: string, flags: number) { return new EcmaCreateregexpwithliteral(pattern, new Imm(flags)); } -export function stLetToGlobalRecord(name: string) { +export function stLetToGlobalRecord (name: string) { return new EcmaStlettoglobalrecord(name); } -export function stConstToGlobalRecord(name: string) { +export function stConstToGlobalRecord (name: string) { return new EcmaStconsttoglobalrecord(name); } -export function stClassToGlobalRecord(name: string) { +export function stClassToGlobalRecord (name: string) { return new EcmaStclasstoglobalrecord(name); } diff --git a/ts2panda/src/base/util.ts b/ts2panda/src/base/util.ts index 775d2df143..f13a1906b5 100644 --- a/ts2panda/src/base/util.ts +++ b/ts2panda/src/base/util.ts @@ -15,6 +15,7 @@ import * as path from "path"; import { extractCtorOfClass } from "../statement/classStatement"; +import { LocalVariable, Variable } from "../variable"; import * as ts from "typescript"; import { EcmaCallirangedyn, @@ -25,6 +26,7 @@ import { } from "../irnodes"; import * as jshelpers from "../jshelpers"; import { LOGD } from "../log"; +import { ModuleScope, Scope } from "../scope"; import { isFunctionLikeDeclaration } from "../syntaxCheckHelper"; export function containSpreadElement(args?: ts.NodeArray): boolean { @@ -67,6 +69,16 @@ export function hasDefaultKeywordModifier(node: ts.Node): boolean { return hasDefault; } +export function setVariableExported(varName: string, scope: Scope) { + if (!(scope instanceof ModuleScope)) { + throw new Error("variable can't be exported out of module scope"); + } + + let variable: { scope: Scope | undefined, level: number, v: Variable | undefined } = scope.find(varName); + (variable.v!).setExport(); + (variable.v!).setExportedName(varName); +} + export function execute(cmd: string, args: Array) { var spawn = require('child_process').spawn; @@ -292,4 +304,4 @@ export function setPos(node: ts.Node) { setPos(childNode); }); return node; -} +} \ No newline at end of file diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 94cbf605af..6557c69929 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -27,8 +27,10 @@ import { AssignmentOperator } from "typescript"; import * as astutils from "./astutils"; import { LReference } from "./base/lreference"; import { + hasDefaultKeywordModifier, hasExportKeywordModifier, isBindingPattern, + setVariableExported } from "./base/util"; import { CacheList, getVregisterCache } from "./base/vregisterCache"; import { CmdOptions } from "./cmdOptions"; @@ -113,7 +115,6 @@ import { isAssignmentOperator } from "./syntaxCheckHelper"; import { GlobalVariable, LocalVariable, - ModuleVariable, VarDeclarationKind, Variable } from "./variable"; @@ -216,7 +217,7 @@ export class Compiler { }) this.pandaGen.setLocals(tempLocals); - this.pandaGen.setParametersCount(this.pandaGen.getParametersCount() - count); + this.pandaGen.setParametersCount(this.pandaGen.getParametersCount()-count); if (scope.getArgumentsOrRestargs()) { callType += CallMap.get("argumentsOrRestargs") ?? 0; @@ -527,12 +528,18 @@ export class Compiler { private compileVariableStatement(stmt: ts.VariableStatement) { let declList = stmt.declarationList; + let isExported: boolean = hasExportKeywordModifier(stmt); declList.declarations.forEach((decl) => { - this.compileVariableDeclaration(decl) + this.compileVariableDeclaration(decl, isExported) }); } - compileVariableDeclaration(decl: ts.VariableDeclaration) { + compileVariableDeclaration(decl: ts.VariableDeclaration, isExported: boolean = false) { + if (isExported) { + let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); + setVariableExported(name, this.getCurrentScope()); + } + let lref = LReference.generateLReference(this, decl.name, true); if (decl.initializer) { this.compileExpression(decl.initializer); @@ -546,6 +553,7 @@ export class Compiler { && decl.parent.kind != ts.SyntaxKind.CatchClause) { this.pandaGen.loadAccumulator(decl, getVregisterCache(this.pandaGen, CacheList.undefined)); } + } lref.setValue(); } @@ -700,16 +708,26 @@ export class Compiler { private compileFunctionDeclaration(decl: ts.FunctionDeclaration) { if (!decl.name) { - if (hasExportKeywordModifier(decl) && this.scope instanceof ModuleScope) { - return; + let hasExport: boolean = hasExportKeywordModifier(decl); + let hasDefault: boolean = hasDefaultKeywordModifier(decl); + if (hasExport && hasDefault) { + if (this.scope instanceof ModuleScope) { + 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"); + } else { + throw new Error("SyntaxError: export function declaration cannot in other scope except ModuleScope"); + } + } else { + throw new Error("Function declaration without name is unimplemented"); } - throw new Error("Function declaration without name is unimplemented"); } } private compileExportAssignment(stmt: ts.ExportAssignment) { this.compileExpression(stmt.expression); - this.pandaGen.storeModuleVariable(stmt, "*default*"); + this.pandaGen.storeModuleVar(stmt, "default"); } compileCondition(expr: ts.Expression, ifFalseLabel: Label) { @@ -1477,43 +1495,13 @@ export class Compiler { } else { this.pandaGen.storeGlobalVar(node, variable.v.getName()); } - } else if (variable.v instanceof ModuleVariable) { - // import module variable is const, throw `const assignment error` - if (!isDeclaration && variable.v.isConst()) { - let nameReg = this.pandaGen.getTemp(); - this.pandaGen.loadAccumulatorString(node, variable.v.getName()); - this.pandaGen.storeAccumulator(node, nameReg); - this.pandaGen.throwConstAssignment(node, nameReg); - this.pandaGen.freeTemps(nameReg); - return; - } - - if (isDeclaration) { - variable.v.initialize(); - } - - if ((variable.v.isLet() || variable.v.isClass()) && !variable.v.isInitialized()) { - let valueReg = this.pandaGen.getTemp(); - let holeReg = this.pandaGen.getTemp(); - let nameReg = this.pandaGen.getTemp(); - this.pandaGen.storeAccumulator(node, valueReg); - this.pandaGen.loadModuleVariable(node, variable.v.getName(), true); - this.pandaGen.storeAccumulator(node, holeReg); - this.pandaGen.loadAccumulatorString(node, variable.v.getName()); - this.pandaGen.storeAccumulator(node, nameReg); - this.pandaGen.throwUndefinedIfHole(node, holeReg, nameReg); - this.pandaGen.loadAccumulator(node, valueReg); - this.pandaGen.freeTemps(valueReg, holeReg, nameReg); - } - - this.pandaGen.storeModuleVariable(node, variable.v.getName()); } else { throw new Error("invalid lhsRef to store"); } } loadTarget(node: ts.Node, variable: { scope: Scope | undefined, level: number, v: Variable | undefined }) { - if (variable.v instanceof LocalVariable) { + if (variable.v instanceof LocalVariable) { if (variable.v.isLetOrConst() || variable.v.isClass()) { if (variable.scope instanceof GlobalScope) { this.pandaGen.tryLoadGlobalByName(node, variable.v.getName()); @@ -1550,19 +1538,6 @@ export class Compiler { } else { this.pandaGen.loadGlobalVar(node, variable.v.getName()); } - } else if (variable.v instanceof ModuleVariable) { - let isLocal: boolean = variable.v.isExportVar() ? true : false; - this.pandaGen.loadModuleVariable(node, variable.v.getName(), isLocal); - if ((variable.v.isLetOrConst() || variable.v.isClass()) && !variable.v.isInitialized()) { - let valueReg = this.pandaGen.getTemp(); - let nameReg = this.pandaGen.getTemp(); - this.pandaGen.storeAccumulator(node, valueReg); - this.pandaGen.loadAccumulatorString(node, variable.v.getName()); - this.pandaGen.storeAccumulator(node, nameReg); - this.pandaGen.throwUndefinedIfHole(node, valueReg, nameReg); - this.pandaGen.loadAccumulator(node, valueReg); - this.pandaGen.freeTemps(valueReg, nameReg); - } } else { // Handle the variables from lexical scope throw new Error("Only local and global variables are implemented"); diff --git a/ts2panda/src/compilerDriver.ts b/ts2panda/src/compilerDriver.ts index fc4f34063f..99d7568ac9 100644 --- a/ts2panda/src/compilerDriver.ts +++ b/ts2panda/src/compilerDriver.ts @@ -17,7 +17,7 @@ import { writeFileSync } from "fs"; import * as ts from "typescript"; import { addVariableToScope } from "./addVariable2Scope"; import { AssemblyDumper } from "./assemblyDumper"; -import { hasDefaultKeywordModifier, hasExportKeywordModifier, initiateTs2abc, listenChildExit, listenErrorEvent, terminateWritePipe } from "./base/util"; +import { initiateTs2abc, listenChildExit, listenErrorEvent, terminateWritePipe } from "./base/util"; import { CmdOptions } from "./cmdOptions"; import { Compiler @@ -26,7 +26,7 @@ import { CompilerStatistics } from "./compilerStatistics"; import { DebugInfo } from "./debuginfo"; import { hoisting } from "./hoisting"; import { LOGD } from "./log"; -import { setModuleNamespaceImports } from "./ecmaModule"; +import { setExportBinding, setImport } from "./modules"; import { PandaGen } from "./pandagen"; import { Pass } from "./pass"; import { CacheExpander } from "./pass/cacheExpander"; @@ -40,11 +40,10 @@ import { VariableScope } from "./scope"; import { getClassNameForConstructor } from "./statement/classStatement"; -import { checkDuplicateDeclaration } from "./syntaxChecker"; +import { checkDuplicateDeclaration, checkExportEntries } from "./syntaxChecker"; import { Ts2Panda } from "./ts2panda"; import { TypeRecorder } from "./typeRecorder"; import { LiteralBuffer } from "./base/literal"; -import { findOuterNodeOfParenthesis } from "./expression/parenthesizedExpression"; export class PendingCompilationUnit { constructor( @@ -150,6 +149,7 @@ export class CompilerDriver { compileForSyntaxCheck(node: ts.SourceFile): void { let recorder = this.compilePrologue(node, false); checkDuplicateDeclaration(recorder); + checkExportEntries(recorder); } compile(node: ts.SourceFile): void { @@ -184,7 +184,6 @@ export class CompilerDriver { Ts2Panda.dumpStringsArray(ts2abcProc); Ts2Panda.dumpConstantPool(ts2abcProc); - Ts2Panda.dumpModuleRecords(ts2abcProc); terminateWritePipe(ts2abcProc); if (CmdOptions.isEnableDebugLog()) { @@ -220,9 +219,13 @@ export class CompilerDriver { let compiler = new Compiler(node, pandaGen, this, recorder); + if (CmdOptions.isModules() && ts.isSourceFile(node) && scope instanceof ModuleScope) { + setImport(recorder.getImportStmts(), scope, pandaGen); + setExportBinding(recorder.getExportStmts(), scope, pandaGen); + } + // because of para vreg, don't change hosting's position hoisting(node, pandaGen, recorder, compiler); - setModuleNamespaceImports(compiler, scope, pandaGen); compiler.compile(); this.passes.forEach((pass) => pass.run(pandaGen)); @@ -262,8 +265,12 @@ export class CompilerDriver { let pandaGen = new PandaGen(internalName, this.getParametersCount(node), scope); let compiler = new Compiler(node, pandaGen, this, recorder); + if (CmdOptions.isModules() && ts.isSourceFile(node) && scope instanceof ModuleScope) { + setImport(recorder.getImportStmts(), scope, pandaGen); + setExportBinding(recorder.getExportStmts(), scope, pandaGen); + } + hoisting(node, pandaGen, recorder, compiler); - setModuleNamespaceImports(compiler, scope, pandaGen); compiler.compile(); this.passes.forEach((pass) => pass.run(pandaGen)); @@ -294,11 +301,8 @@ export class CompilerDriver { } let recorder = new Recorder(node, topLevelScope, this, enableTypeRecord, CompilerDriver.isTsFile); recorder.record(); - if (topLevelScope instanceof ModuleScope) { - topLevelScope.module().setModuleEnvironment(topLevelScope); - } + addVariableToScope(recorder, enableTypeRecord); - let postOrderVariableScopes = this.postOrderAnalysis(topLevelScope); for (let variableScope of postOrderVariableScopes) { @@ -349,10 +353,6 @@ export class CompilerDriver { let funcNode = node; name = (recorder.getScopeOfNode(funcNode)).getFuncName(); if (name == '') { - if ((ts.isFunctionDeclaration(node) && hasExportKeywordModifier(node) && hasDefaultKeywordModifier(node)) - || ts.isExportAssignment(findOuterNodeOfParenthesis(node))) { - return 'default'; - } return `#${this.getFuncId(funcNode)}#`; } diff --git a/ts2panda/src/ecmaModule.ts b/ts2panda/src/ecmaModule.ts deleted file mode 100644 index dae40da02d..0000000000 --- a/ts2panda/src/ecmaModule.ts +++ /dev/null @@ -1,225 +0,0 @@ -import * as ts from "typescript"; -import { PandaGen } from "./pandagen"; -import { DiagnosticCode, DiagnosticError } from "./diagnostic"; -import { ModuleScope, Scope } from "./scope"; -import { getSourceFileOfNode } from "./jshelpers"; -import { LReference } from "./base/lreference"; -import { Compiler } from "./compiler"; - -class Entry { - node: ts.Node; - exportName: string | undefined; - localName: string | undefined; - importName: string | undefined; - moduleRequest: number = -1; - - constructor(node: ts.Node, exportName: string | undefined, localName: string | undefined, importName: string | undefined, moduleRequest?: number) { - this.node = node; - this.exportName = exportName; - this.localName = localName; - this.importName = importName; - if (moduleRequest !== undefined) { - this.moduleRequest = moduleRequest; - } - } -} - -export class SourceTextModuleRecord { - private moduleName: string; - 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 = []; - - constructor(moduleName: string) { - this.moduleName = moduleName; - } - - 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; - } - - // import x from 'test.js'; - // import {x} from 'test.js'; - // import {x as y} from 'test.js'; - // import defaultExport from 'test.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); - } - - // import 'test.js' - // import {} from 'test.js' - // export {} from 'test.js' - addEmptyImportEntry(moduleRequest: string) { - this.addModuleRequest(moduleRequest); - } - - // import * as x from 'test.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); - } - - // 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]); - } - } - - // export {x} from 'test.js'; - // export {x as y} from 'test.js'; - // import { x } from 'test.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); - } - - // export * from 'test.js'; - addStarExportEntry(node: ts.Node, moduleRequest: string) { - let starExportEntry: Entry = new Entry(node, undefined, undefined, undefined, this.addModuleRequest(moduleRequest)); - this.starExportEntries.push(starExportEntry); - } - - getModuleName() { - return this.moduleName; - } - - getModuleRequests() { - return this.moduleRequests; - } - - getRegularImportEntries() { - return this.regularImportEntries; - } - - getNamespaceImportEntries() { - return this.namespaceImportEntries; - } - - getLocalExportEntries() { - return this.localExportEntries; - } - - getStarExportEntries() { - return this.starExportEntries; - } - - getIndirectExportEntries() { - return this.indirectExportEntries; - } - - makeIndirectExportsExplicit() { - // @ts-ignore - this.localExportEntries.forEach((entries: Array, localName: string) => { - for (let idx = 0; idx < entries.length;) { - let importEntry: Entry | undefined = this.regularImportEntries.get(entries[idx].localName!); - // get an indirect export entry - if (importEntry) { - entries[idx].importName = importEntry.importName; - entries[idx].moduleRequest = importEntry.moduleRequest; - entries[idx].localName = undefined; - - this.indirectExportEntries.push(entries[idx]); - entries.splice(idx, 1); - } else { - idx += 1; - } - } - }); - } - - nextDuplicateExportEntry(candidate: Entry, exportNameEntry: Map, currentCandidate: Entry | undefined) { - if (!exportNameEntry.has(candidate.exportName!)) { - exportNameEntry.set(candidate.exportName!, candidate); - return currentCandidate; - } - - if (currentCandidate === undefined) { - currentCandidate = candidate; - } - - return candidate.node.pos > currentCandidate.node.pos ? candidate : currentCandidate; - } - - searchDuplicateExport(): Entry | undefined { - let duplicateEntry: Entry | undefined; - let exportNameEntry: Map = new Map(); - - // @ts-ignore - this.localExportEntries.forEach((entries: Array, localName: string) => { - entries.forEach((e: Entry) => { - duplicateEntry = this.nextDuplicateExportEntry(e, exportNameEntry, duplicateEntry); - }); - }); - - this.indirectExportEntries.forEach((e: Entry) => { - duplicateEntry = this.nextDuplicateExportEntry(e, exportNameEntry, duplicateEntry); - }); - - return duplicateEntry; - } - - validateModuleRecordEntries(moduleScope: ModuleScope) { - // check module is well-formed and report errors if not - { - let dupExportEntry: Entry | undefined = this.searchDuplicateExport(); - if (dupExportEntry !== undefined) { - throw new DiagnosticError(dupExportEntry.node, DiagnosticCode.Module_0_has_already_exported_a_member_named_1, getSourceFileOfNode(dupExportEntry.node), [getSourceFileOfNode(dupExportEntry.node).fileName, dupExportEntry.exportName]); - } - } - - this.localExportEntries.forEach((entry: Array, localName: string) => { - if (!moduleScope.hasDecl(localName) && localName != '*default*') { - throw new DiagnosticError(entry[0].node, DiagnosticCode.Module_0_has_no_exported_member_1, getSourceFileOfNode(entry[0].node), [getSourceFileOfNode(entry[0].node).fileName, localName]); - } - }); - - this.makeIndirectExportsExplicit(); - } - - setExportedDecls(moduleScope: ModuleScope) { - // @ts-ignore - this.localExportEntries.forEach((entry: Array, localName: string) => { - moduleScope.setExportDecl(localName); - }) - } - - setModuleEnvironment(moduleScope: ModuleScope) { - this.validateModuleRecordEntries(moduleScope); - this.setExportedDecls(moduleScope); - } -} - -export function setModuleNamespaceImports(compiler: Compiler, moduleScope: Scope, pandagen: PandaGen) { - if (!(moduleScope instanceof ModuleScope)) { - return; - } - - moduleScope.module().getNamespaceImportEntries().forEach(entry => { - let namespace_lref = LReference.generateLReference(compiler, (entry.node).name, true); - pandagen.getModuleNamespace(entry.node, entry.localName!); - namespace_lref.setValue(); - }); -} \ No newline at end of file diff --git a/ts2panda/src/hoisting.ts b/ts2panda/src/hoisting.ts index 2ff281e88d..c18cab39dc 100644 --- a/ts2panda/src/hoisting.ts +++ b/ts2panda/src/hoisting.ts @@ -14,6 +14,7 @@ */ import * as ts from "typescript"; +import { hasExportKeywordModifier, hasDefaultKeywordModifier } from "./base/util"; import { CacheList, getVregisterCache } from "./base/vregisterCache"; import { Compiler } from "./compiler"; import { CompilerDriver } from "./compilerDriver"; @@ -26,14 +27,14 @@ import { GlobalScope, LocalScope, ModuleScope, - ModuleVarKind, Scope, VarDecl, VariableScope } from "./scope"; +import { LocalVariable } from "./variable"; export function hoisting(rootNode: ts.SourceFile | ts.FunctionLikeDeclaration, pandaGen: PandaGen, - recorder: Recorder, compiler: Compiler) { + recorder: Recorder, compiler: Compiler) { let variableScope = recorder.getScopeOfNode(rootNode); let hoistDecls = recorder.getHoistDeclsOfScope(variableScope); @@ -58,11 +59,7 @@ export function hoistVar(decl: VarDecl, scope: Scope, pandaGen: PandaGen) { } else if (scope instanceof FunctionScope || scope instanceof ModuleScope) { let v = scope.findLocal(name)!; pandaGen.loadAccumulator(NodeKind.FirstNodeOfFunction, getVregisterCache(pandaGen, CacheList.undefined)); - if (decl.isModule !== ModuleVarKind.NOT) { - pandaGen.storeModuleVariable(NodeKind.FirstNodeOfFunction, name); - } else { - pandaGen.storeAccToLexEnv(NodeKind.FirstNodeOfFunction, scope, 0, v, true); - } + pandaGen.storeAccToLexEnv(NodeKind.FirstNodeOfFunction, scope, 0, v, true); } else { throw new Error("Wrong scope to hoist"); } @@ -77,13 +74,19 @@ export function hoistFunction(decl: FuncDecl, scope: Scope, pandaGen: PandaGen, pandaGen.defineFunction(NodeKind.FirstNodeOfFunction, decl.node, internalName, env); pandaGen.storeGlobalVar(NodeKind.FirstNodeOfFunction, funcName); } else if ((scope instanceof FunctionScope) || (scope instanceof LocalScope) || (scope instanceof ModuleScope)) { + let hasExport: boolean = hasExportKeywordModifier(decl.node); + let hasDefault: boolean = hasDefaultKeywordModifier(decl.node); let v = scope.findLocal(funcName)!; - pandaGen.defineFunction(NodeKind.FirstNodeOfFunction, decl.node, internalName, env); - if (decl.isModule !== ModuleVarKind.NOT) { - pandaGen.storeModuleVariable(NodeKind.FirstNodeOfFunction, funcName); - } else { - pandaGen.storeAccToLexEnv(NodeKind.FirstNodeOfFunction, scope, 0, v, true); + if (hasExport && scope instanceof ModuleScope) { + (v).setExport(); + if (hasDefault) { + (v).setExportedName("default"); + } else { + (v).setExportedName(v.getName()); + } } + pandaGen.defineFunction(NodeKind.FirstNodeOfFunction, decl.node, internalName, env); + pandaGen.storeAccToLexEnv(NodeKind.FirstNodeOfFunction, scope, 0, v, true); } else { throw new Error("Wrong scope to hoist"); } diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index 0342f1b209..af110c62a6 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -165,8 +165,7 @@ namespace Compiler { module: ts.ModuleKind.ES2015, strictNullChecks: true, skipLibCheck: true, - alwaysStrict: true, - importsNotUsedAsValues: ts.ImportsNotUsedAsValues.Preserve + alwaysStrict: true }; } } diff --git a/ts2panda/src/lexenv.ts b/ts2panda/src/lexenv.ts index bcc822013d..f7ada0a787 100644 --- a/ts2panda/src/lexenv.ts +++ b/ts2panda/src/lexenv.ts @@ -20,6 +20,7 @@ import { loadLexicalVar, storeAccumulator, storeLexicalVar, + storeModuleVariable, throwConstAssignment, throwUndefinedIfHole } from "./base/bcGenUtil"; @@ -107,7 +108,7 @@ export class VariableAccessLoad extends VariableAccessBase { insns.push(loadLexicalVar(this.level, slot)); // check TDZ - if (v.isLetOrConst() || v.isClass()) { + if (v.isLetOrConst()) { let tempReg = pandaGen.getTemp(); insns.push(storeAccumulator(tempReg)); @@ -165,6 +166,10 @@ export class VariableAcessStore extends VariableAccessBase { } insns.push(storeAccumulator(bindVreg)); + if (v.isExportVar()) { + insns.push(storeModuleVariable(v.getExportedName())); + } + return insns; } @@ -197,7 +202,9 @@ export class VariableAcessStore extends VariableAccessBase { insns.push(storeLexicalVar(this.level, slot, valueReg)); insns.push(loadAccumulator(valueReg)); - + if (v.isExportVar()) { + insns.push(storeModuleVariable(v.getExportedName())); + } pandaGen.freeTemps(valueReg); return insns; @@ -241,4 +248,4 @@ function checkConstAssignment(pg: PandaGen, v: Variable, expansion: IRNode[], no } pg.freeTemps(nameReg); -} +} \ No newline at end of file diff --git a/ts2panda/src/modules.ts b/ts2panda/src/modules.ts index ddb83fa5f6..90113f6969 100644 --- a/ts2panda/src/modules.ts +++ b/ts2panda/src/modules.ts @@ -13,10 +13,12 @@ * limitations under the License. */ -// [delete it when type system adapts for ESM] import * as ts from "typescript"; +import { PandaGen } from "./pandagen"; import * as jshelpers from "./jshelpers"; +import { LocalVariable } from "./variable"; import { DiagnosticCode, DiagnosticError } from "./diagnostic"; +import { ModuleScope } from "./scope"; export class ModuleStmt { private node: ts.Node @@ -74,3 +76,63 @@ export class ModuleStmt { return this.isCopy; } } + +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(); + } + + // 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(); + }); + }) +} + +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); + }); + } + }) +} \ No newline at end of file diff --git a/ts2panda/src/pandagen.ts b/ts2panda/src/pandagen.ts index 4a18ebfff9..d6b57c1817 100644 --- a/ts2panda/src/pandagen.ts +++ b/ts2panda/src/pandagen.ts @@ -30,6 +30,7 @@ import { call, closeIterator, copyDataProperties, + copyModuleIntoCurrentModule, creatDebugger, createArrayWithBuffer, createEmptyArray, @@ -50,7 +51,7 @@ import { getIteratorNext, getNextPropName, getPropIterator, - getModuleNamespace, + importModule, isFalse, isTrue, jumpTarget, @@ -63,7 +64,7 @@ import { loadGlobalVar, loadHomeObject, loadLexicalVar, - loadModuleVariable, + loadModuleVarByName, loadObjByIndex, loadObjByName, loadObjByValue, @@ -91,7 +92,6 @@ import { stSuperByValue, superCall, superCallSpread, - throwConstAssignment, throwDeleteSuperProperty, throwException, throwIfNotObject, @@ -878,10 +878,6 @@ export class PandaGen { this.add(node, throwDeleteSuperProperty()); } - throwConstAssignment(node: ts.Node, nameReg: VReg) { - this.add(node, throwConstAssignment(nameReg)); - } - return(node: ts.Node | NodeKind) { this.add(node, new ReturnDyn()); } @@ -1088,16 +1084,20 @@ export class PandaGen { ) } - loadModuleVariable(node: ts.Node, moduleVarName: string, isLocal: boolean) { - this.add(node, loadModuleVariable(moduleVarName, isLocal ? 1 : 0)); + importModule(node: ts.Node, moduleName: string) { + this.add(node, importModule(moduleName)); + } + + loadModuleVariable(node: ts.Node, module: VReg, varName: string) { + this.add(node, loadModuleVarByName(varName, module)); } - storeModuleVariable(node: ts.Node | NodeKind, moduleVarName: string) { + storeModuleVar(node: ts.Node, moduleVarName: string) { this.add(node, storeModuleVariable(moduleVarName)); } - getModuleNamespace(node: ts.Node, localName: string) { - this.add(node, getModuleNamespace(localName)); + copyModule(node: ts.Node, module: VReg) { + this.add(node, copyModuleIntoCurrentModule(module)); } defineClassWithBuffer(node: ts.Node, name: string, idx: number, parameterLength: number, base: VReg) { diff --git a/ts2panda/src/pandasm.ts b/ts2panda/src/pandasm.ts index 9b368824b9..3b1ecdfa8d 100644 --- a/ts2panda/src/pandasm.ts +++ b/ts2panda/src/pandasm.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import { LiteralBuffer } from "./base/literal"; import { DebugPosInfo, VariableDebugInfo } from "./debuginfo"; +import { LiteralBuffer } from "./base/literal"; export class Metadata { public attribute: string; @@ -213,60 +213,6 @@ export class DeclaredSymbol2Type { } } -export class RegularImportEntry { - public localName: string; - public importName: string; - public moduleRequest: number; - - constructor(localName: string, importName: string, moduleRequest: number) { - this.localName = localName; - this.importName = importName; - this.moduleRequest = moduleRequest; - } -} - -export class NamespaceImportEntry { - public localName: string; - public moduleRequest: number; - - constructor(localName: string, moduleRequest: number) { - this.localName = localName; - this.moduleRequest = moduleRequest; - } -} - -export class LocalExportEntry { - public localName: string; - public exportName: string; - - constructor(localName: string, exportName: string) { - this.localName = localName; - this.exportName = exportName; - } -} - -export class IndirectExportEntry { - public exportName: string; - public importName: string; - public moduleRequest: number; - - constructor(exportName: string, importName: string, moduleRequest: number) { - this.exportName = exportName; - this.importName = importName; - this.moduleRequest = moduleRequest; - } -} - -export class ModuleRecord { - public moduleName: string = ""; - public moduleRequests: Array = []; - public regularImportEntries: Array = []; - public namespaceImportEntries: Array = []; - public localExportEntries: Array = []; - public indirectExportEntries: Array = []; - public starExportEntries: Array = []; -} - export interface Emmiter { generate_program: (filename: string, program: Program) => string; } diff --git a/ts2panda/src/recorder.ts b/ts2panda/src/recorder.ts index 6ca5732434..61f5689708 100644 --- a/ts2panda/src/recorder.ts +++ b/ts2panda/src/recorder.ts @@ -15,18 +15,14 @@ import * as ts from "typescript"; import * as astutils from "./astutils"; -import { - hasDefaultKeywordModifier, - hasExportKeywordModifier, - isAnonymousFunctionDefinition -} from "./base/util"; +import { isAnonymousFunctionDefinition } 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"; // [delete it when type system adapts for ESM] +import { ModuleStmt } from "./modules"; import { CatchParameter, ClassDecl, @@ -40,7 +36,6 @@ import { LocalScope, LoopScope, ModuleScope, - ModuleVarKind, Scope, VarDecl, VariableScope @@ -56,7 +51,6 @@ import { TypeChecker } from "./typeChecker"; import { VarDeclarationKind } from "./variable"; import { TypeRecorder } from "./typeRecorder"; import { PandaGen } from "./pandagen"; -import path from "path"; export class Recorder { node: ts.Node; @@ -68,10 +62,10 @@ export class Recorder { private parametersMap: Map = new Map(); private funcNameMap: Map; private class2Ctor: Map = new Map(); - private isTsFile: boolean; - // [delete it when type system adapts for ESM] private importStmts: Array = []; private exportStmts: Array = []; + private defaultUsed: boolean = false; + private isTsFile: boolean; constructor(node: ts.Node, scope: Scope, compilerDriver: CompilerDriver, recordType: boolean, isTsFile: boolean) { this.node = node; @@ -122,7 +116,7 @@ export class Recorder { private recordInfo(node: ts.Node, scope: Scope) { node.forEachChild(childNode => { if (!this.recordType) { - checkSyntaxError(childNode, scope); + checkSyntaxError(childNode); } switch (childNode.kind) { case ts.SyntaxKind.FunctionExpression: @@ -138,17 +132,7 @@ export class Recorder { } case ts.SyntaxKind.FunctionDeclaration: { let functionScope = this.buildVariableScope(scope, childNode); - let isExport: boolean = false; - if (hasExportKeywordModifier(childNode)) { - if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); - } - this.recordEcmaExportInfo(childNode, scope); - isExport = true; - } - // recordFuncDecl must behind recordEcmaExportInfo() cause function without name - // should be SyntaxChecked in recordEcmaExportInfo - this.recordFuncDecl(childNode, scope, isExport); + this.recordFuncDecl(childNode, scope); if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode); } @@ -177,23 +161,9 @@ export class Recorder { this.recordInfo(childNode, loopScope); break; } - case ts.SyntaxKind.ClassDeclaration: { - let isExport: boolean = false; - if (hasExportKeywordModifier(childNode)) { - if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); - } - this.recordEcmaExportInfo(childNode, scope); - isExport = true; - } - this.recordClassInfo(childNode, scope, isExport); - if (this.recordType) { - TypeChecker.getInstance().formatNodeType(childNode); - } - break; - } + case ts.SyntaxKind.ClassDeclaration: case ts.SyntaxKind.ClassExpression: { - this.recordClassInfo(childNode, scope, false); + this.recordClassInfo(childNode, scope); if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode); } @@ -211,11 +181,12 @@ export class Recorder { } case ts.SyntaxKind.ImportDeclaration: { if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); + throw new DiagnosticError(childNode, DiagnosticCode.An_import_declaration_can_only_be_used_in_a_namespace_or_module, jshelpers.getSourceFileOfNode(childNode)); } - this.recordEcmaImportInfo(childNode, scope); - - let importStmt = this.recordImportInfo(childNode); // [delete it when type system adapts for ESM] + if (!(scope instanceof ModuleScope)) { + throw new Error("SyntaxError: import statement cannot in other scope except ModuleScope"); + } + let importStmt = this.recordImportInfo(childNode, scope); if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode, importStmt); } @@ -223,22 +194,22 @@ export class Recorder { } case ts.SyntaxKind.ExportDeclaration: { if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); + throw new DiagnosticError(childNode, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module, jshelpers.getSourceFileOfNode(childNode)); } - this.recordEcmaExportInfo(childNode, scope); - - let exportStmt = this.recordExportInfo(childNode); // [delete it when type system adapts for ESM] + if (!(scope instanceof ModuleScope)) { + throw new Error("SyntaxError: export statement cannot in other scope except ModuleScope"); + } + let exportStmt = this.recordExportInfo(childNode); if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode, exportStmt); } break; } case ts.SyntaxKind.ExportAssignment: { - if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); + if (this.defaultUsed) { + throw new DiagnosticError(childNode, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(childNode), ["default"]); } - this.recordEcmaExportInfo(childNode, scope); - + this.defaultUsed = true; this.recordInfo(childNode, scope); if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode); @@ -246,12 +217,6 @@ export class Recorder { break; } case ts.SyntaxKind.VariableStatement: { - if (hasExportKeywordModifier(childNode)) { - if (!CmdOptions.isModules()) { - throw new DiagnosticError(childNode, DiagnosticCode.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none, jshelpers.getSourceFileOfNode(childNode)); - } - this.recordEcmaExportInfo(childNode, scope); - } if (this.recordType) { TypeChecker.getInstance().formatNodeType(childNode); } @@ -264,7 +229,7 @@ export class Recorder { }); } - private recordClassInfo(childNode: ts.ClassLikeDeclaration, scope: Scope, isExport: boolean) { + private recordClassInfo(childNode: ts.ClassLikeDeclaration, scope: Scope) { let localScope = new LocalScope(scope); this.setScopeMap(childNode, localScope); let ctor = extractCtorOfClass(childNode); @@ -275,9 +240,8 @@ export class Recorder { } if (childNode.name) { let name = jshelpers.getTextOfIdentifierOrLiteral(childNode.name); - let moduleKind = isExport ? ModuleVarKind.EXPORTED : ModuleVarKind.NOT; - let classDecl = new ClassDecl(name, childNode, moduleKind); - scope.setDecls(classDecl); + let calssDecl = new ClassDecl(name, childNode); + scope.setDecls(calssDecl); } this.recordInfo(childNode, localScope); } @@ -297,13 +261,9 @@ export class Recorder { if (parent) { let declKind = astutils.getVarDeclarationKind(parent); - let isExportDecl: boolean = false; - if ((parent).parent.parent.kind == ts.SyntaxKind.VariableStatement) { - isExportDecl = hasExportKeywordModifier((parent).parent.parent); - } // collect declaration information to corresponding scope - let decl = this.addVariableDeclToScope(scope, id, parent, name, declKind, isExportDecl); + let decl = this.addVariableDeclToScope(scope, id, parent, name, declKind); if (declKind == VarDeclarationKind.VAR) { let variableScopeParent = scope.getNearestVariableScope(); this.collectHoistDecls(id, variableScopeParent, decl); @@ -343,10 +303,8 @@ export class Recorder { } } - private addVariableDeclToScope(scope: Scope, node: ts.Node, parent: ts.Node, name: string, declKind: VarDeclarationKind, isExportDecl: boolean): Decl { - let moduleKind = isExportDecl ? ModuleVarKind.EXPORTED : ModuleVarKind.NOT; - let decl = new VarDecl(name, node, moduleKind); - + private addVariableDeclToScope(scope: Scope, node: ts.Node, parent: ts.Node, name: string, declKind: VarDeclarationKind): Decl { + let decl = new VarDecl(name, node); switch (declKind) { case VarDeclarationKind.VAR: break; @@ -354,11 +312,11 @@ export class Recorder { if (parent.parent.kind == ts.SyntaxKind.CatchClause) { decl = new CatchParameter(name, node); } else { - decl = new LetDecl(name, node, moduleKind); + decl = new LetDecl(name, node); } break; case VarDeclarationKind.CONST: - decl = new ConstDecl(name, node, moduleKind); + decl = new ConstDecl(name, node); break; default: throw new Error("Wrong type of declaration"); @@ -384,8 +342,7 @@ export class Recorder { } } - // [delete it when type system adapts for ESM] - private recordImportInfo(node: ts.ImportDeclaration): ModuleStmt { + private recordImportInfo(node: ts.ImportDeclaration, scope: ModuleScope): ModuleStmt { if (!ts.isStringLiteral(node.moduleSpecifier)) { throw new Error("moduleSpecifier must be a stringLiteral"); } @@ -402,6 +359,7 @@ export class Recorder { // 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"); importStmt.addNodeMap(importClause.name, importClause.name); } @@ -414,6 +372,7 @@ export class Recorder { // 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); } @@ -422,6 +381,7 @@ export class Recorder { 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); importStmt.addNodeMap(element.name, element.propertyName ? element.propertyName : element.name); }); @@ -433,7 +393,6 @@ export class Recorder { return importStmt; } - // [delete it when type system adapts for ESM] private recordExportInfo(node: ts.ExportDeclaration): ModuleStmt { let origNode = ts.getOriginalNode(node); let exportStmt: ModuleStmt; @@ -456,6 +415,13 @@ export class Recorder { if (ts.isNamedExports(namedBindings)) { namedBindings.elements.forEach((element) => { let name: string = jshelpers.getTextOfIdentifierOrLiteral(element.name); + if (name == 'default') { + if (this.defaultUsed) { + throw new DiagnosticError(origNode, DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(origNode), [name]); + } else { + this.defaultUsed = true; + } + } let exoticName: string = element.propertyName ? jshelpers.getTextOfIdentifierOrLiteral(element.propertyName) : name; exportStmt.addLocalName(name, exoticName); exportStmt.addNodeMap(element.name, element.propertyName ? element.propertyName : element.name); @@ -466,166 +432,16 @@ export class Recorder { return exportStmt; } - private getNormalizeModuleSpecifier(moduleSpecifier: ts.Expression): string { - if (!ts.isStringLiteral(moduleSpecifier)) { - throw new Error("moduleSpecifier must be a stringLiteral"); - } - return path.normalize(jshelpers.getTextOfIdentifierOrLiteral(moduleSpecifier)); - } - - private recordEcmaNamedBindings(namedBindings: ts.NamedImportBindings, scope: ModuleScope, moduleRequest: string) { - // import * as a from "a.js" - if (ts.isNamespaceImport(namedBindings)) { - let nameSpace = jshelpers.getTextOfIdentifierOrLiteral((namedBindings).name); - scope.setDecls(new ConstDecl(nameSpace, namedBindings, ModuleVarKind.NOT)); - scope.module().addStarImportEntry(namedBindings, nameSpace, moduleRequest); - } else if (ts.isNamedImports(namedBindings)) { - if (namedBindings.elements.length == 0) { - // import {} from "a.js" - scope.module().addEmptyImportEntry(moduleRequest); - } - // 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 ConstDecl(localName, element, ModuleVarKind.IMPORTED)); - scope.module().addImportEntry(element, importName, localName, moduleRequest); - }); - } else { - throw new Error("Unreachable kind for namedBindings"); - } - } - - private recordEcmaImportClause(importClause: ts.ImportClause, scope: ModuleScope, moduleRequest: string) { - // import defaultExport from "a.js" - if (importClause.name) { - let localName = jshelpers.getTextOfIdentifierOrLiteral(importClause.name); - scope.setDecls(new ConstDecl(localName, importClause.name, ModuleVarKind.IMPORTED)); - scope.module().addImportEntry(importClause, "default", localName, moduleRequest); - } - if (importClause.namedBindings) { - let namedBindings = importClause.namedBindings; - this.recordEcmaNamedBindings(namedBindings, scope, moduleRequest); - } - } - - private recordEcmaImportInfo(node: ts.ImportDeclaration, scope: Scope) { - if (!(scope instanceof ModuleScope)) { - return; - } - - let moduleRequest: string = this.getNormalizeModuleSpecifier(node.moduleSpecifier); - - if (node.importClause) { - let importClause: ts.ImportClause = node.importClause; - this.recordEcmaImportClause(importClause, scope, moduleRequest); - } else { - // import "a.js" - scope.module().addEmptyImportEntry(moduleRequest); - } - } - - private recordEcmaExportDecl(node: ts.ExportDeclaration, scope: ModuleScope) { - if (node.moduleSpecifier) { - let moduleRequest: string = this.getNormalizeModuleSpecifier(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)) { - if (namedBindings.elements.length == 0) { - // export {} from "mod"; - scope.module().addEmptyImportEntry(moduleRequest); - } - // 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; - scope.module().addIndirectExportEntry(element, importName, exportName, moduleRequest); - }); - } - } else { - // export * from "mod"; - scope.module().addStarExportEntry(node, moduleRequest); - } - } 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; - scope.module().addLocalExportEntry(element, exportName, localName); - }); - } else { - throw new Error("Unreachable node kind for Export Declaration"); - } - } - - private recordEcmaExportInfo(node: ts.ExportDeclaration | ts.ExportAssignment | ts.VariableStatement | ts.FunctionDeclaration | ts.ClassDeclaration, scope: Scope) { - if (!(scope instanceof ModuleScope)) { - return; - } - - switch (node.kind) { - case ts.SyntaxKind.ExportDeclaration: { - this.recordEcmaExportDecl(node, scope); - 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. - scope.module().addLocalExportEntry(node, "default", "*default*"); - break; - } - case ts.SyntaxKind.VariableStatement: { - // export var a,b; - node.declarationList.declarations.forEach(decl => { - let name = jshelpers.getTextOfIdentifierOrLiteral(decl.name); - scope.module().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*"; - scope.module().addLocalExportEntry(node, "default", localName); - } else { - // export function f(){} - // export class c{} - if (!node.name) { - throw new DiagnosticError(node, DiagnosticCode.A_class_or_function_declaration_without_the_default_modifier_must_have_a_name, jshelpers.getSourceFileOfNode(node)); - } - let name = jshelpers.getTextOfIdentifierOrLiteral(node.name!); - scope.module().addLocalExportEntry(node, name, name); - } - break; - } - default: - throw new Error("Unreachable syntax kind for static exporting"); - } - } - - private recordFuncDecl(node: ts.FunctionDeclaration, scope: Scope, isExport: boolean) { + private recordFuncDecl(node: ts.FunctionDeclaration, scope: Scope) { this.recordFuncInfo(node); let funcId = (node).name; - if (!funcId && !isExport) { - // unexported function declaration without name doesn't need to record hoisting. + if (!funcId) { + // function declaration without name doesn't need to record hoisting. return; } - // if function without name must has modifiers of 'export' & 'default' - let funcName = funcId ? jshelpers.getTextOfIdentifierOrLiteral(funcId) : '*default*'; - let moduleKind = isExport ? ModuleVarKind.EXPORTED : ModuleVarKind.NOT; - let funcDecl = new FuncDecl(funcName, node, moduleKind); + let funcName = jshelpers.getTextOfIdentifierOrLiteral(funcId); + let funcDecl = new FuncDecl(funcName, node); scope.setDecls(funcDecl); let hoistScope = scope; if (scope instanceof GlobalScope || scope instanceof ModuleScope) { @@ -787,6 +603,14 @@ export class Recorder { return this.scopeMap.get(node); } + getImportStmts() { + return this.importStmts; + } + + getExportStmts() { + return this.exportStmts; + } + setHoistMap(scope: VariableScope, decl: Decl) { if (!this.hoistMap.has(scope)) { this.hoistMap.set(scope, [decl]); @@ -824,4 +648,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 92f7f8dac2..52cf3bbcde 100644 --- a/ts2panda/src/scope.ts +++ b/ts2panda/src/scope.ts @@ -14,12 +14,10 @@ */ import * as ts from "typescript"; -import { SourceTextModuleRecord } from "./ecmaModule"; import { LOGD, LOGE } from "./log"; import { GlobalVariable, LocalVariable, - ModuleVariable, VarDeclarationKind, Variable } from "./variable"; @@ -28,66 +26,61 @@ export enum InitStatus { INITIALIZED, UNINITIALIZED } -export enum ModuleVarKind { - IMPORTED, EXPORTED, NOT -} - export abstract class Decl { name: string; node: ts.Node; - isModule: ModuleVarKind; - - constructor(name: string, node: ts.Node, isModule: ModuleVarKind) { + constructor(name: string, node: ts.Node) { this.name = name; this.node = node; - this.isModule = isModule; } } export class VarDecl extends Decl { - constructor(varName: string, node: ts.Node, isModule: ModuleVarKind) { - super(varName, node, isModule); + constructor(varName: string, node: ts.Node) { + super(varName, node); } } export class LetDecl extends Decl { - constructor(letName: string, node: ts.Node, isModule: ModuleVarKind) { - super(letName, node, isModule); + constructor(letName: string, node: ts.Node) { + super(letName, node); } } export class ConstDecl extends Decl { - constructor(constName: string, node: ts.Node, isModule: ModuleVarKind) { - super(constName, node, isModule); + constructor(constName: string, node: ts.Node) { + super(constName, node); } } export class FuncDecl extends Decl { - constructor(funcName: string, node: ts.Node, isModule: ModuleVarKind) { - super(funcName, node, isModule); + constructor(funcName: string, node: ts.Node) { + super(funcName, node); } } export class ClassDecl extends Decl { - constructor(className: string, node: ts.Node, isModule: ModuleVarKind) { - super(className, node, isModule); + constructor(className: string, node: ts.Node) { + super(className, node); } } export class CatchParameter extends Decl { - constructor(CpName: string, node: ts.Node, isModule: ModuleVarKind = ModuleVarKind.NOT) { - super(CpName, node, isModule); + constructor(CpName: string, node: ts.Node) { + super(CpName, node); } } export class FunctionParameter extends Decl { - constructor(FpName: string, node: ts.Node, isModule: ModuleVarKind = ModuleVarKind.NOT) { - super(FpName, node, isModule); + constructor(FpName: string, node: ts.Node) { + super(FpName, node); } } export abstract class Scope { protected debugTag = "scope"; + protected globals: Variable[] = []; + protected locals: Variable[] = []; protected name2variable: Map = new Map(); protected decls: Decl[] = []; protected parent: Scope | undefined = undefined; @@ -99,7 +92,7 @@ export abstract class Scope { constructor() { } - abstract add(decl: Decl | string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined; + abstract add(name: string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined; getName2variable(): Map { return this.name2variable; @@ -395,14 +388,15 @@ export class GlobalScope extends VariableScope { this.node = node ? node : undefined; } - add(decl: Decl | string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { - let name = decl instanceof Decl ? decl.name : decl; + add(name: string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { LOGD(this.debugTag, "globalscope.add (" + name + "), kind:" + declKind); let v: Variable | undefined; if (declKind == VarDeclarationKind.NONE || declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { v = new GlobalVariable(declKind, name); + this.globals.push(v); } else { v = new LocalVariable(declKind, name, status); + this.locals.push(v); } this.name2variable.set(name, v); return v; @@ -410,45 +404,24 @@ export class GlobalScope extends VariableScope { } export class ModuleScope extends VariableScope { - private moduleRecord: SourceTextModuleRecord; - - constructor(node: ts.SourceFile) { + constructor(node?: ts.SourceFile | ts.ModuleBlock) { super(); - this.node = node; - this.moduleRecord = new SourceTextModuleRecord(node.fileName); - } - - setExportDecl(exportedLocalName: string) { - let decl = this.getDecl(exportedLocalName); - if (decl) { - decl.isModule = ModuleVarKind.EXPORTED; - } - } - - module() { - return this.moduleRecord; + this.node = node ? node : undefined; } - add(decl: Decl | string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { - let [name, isModule] = decl instanceof Decl ? [decl.name, decl.isModule] : [decl, ModuleVarKind.NOT]; + add(name: string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { LOGD(this.debugTag, "modulescope.add (" + name + "), kind:" + declKind); let v: Variable | undefined; - - if (isModule !== ModuleVarKind.NOT) { - v = new ModuleVariable(declKind, name, InitStatus.UNINITIALIZED); - if (isModule == ModuleVarKind.EXPORTED) { - (v).setExport(); - } + if (declKind == VarDeclarationKind.NONE) { + v = new GlobalVariable(declKind, name); + this.globals.push(v); + } else if (declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { + v = new LocalVariable(declKind, name); + this.locals.push(v); } else { - if (declKind === VarDeclarationKind.NONE) { - v = new GlobalVariable(declKind, name); - } else if (declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { - v = new LocalVariable(declKind, name); - } else { - v = new LocalVariable(declKind, name, status); - } + v = new LocalVariable(declKind, name, status); + this.locals.push(v); } - this.name2variable.set(name, v); return v; } @@ -483,8 +456,7 @@ export class FunctionScope extends VariableScope { return this.parent; } - add(decl: Decl | string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { - let name = decl instanceof Decl ? decl.name : decl; + add(name: string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { let v: Variable | undefined; LOGD(this.debugTag, "functionscope.add (" + name + "), kind:" + declKind); @@ -492,7 +464,7 @@ export class FunctionScope extends VariableScope { // the variable declared without anything should be global // See EcmaStandard: 13.3.2 Variable Statement let globalScope = this.getRootScope(); - if (globalScope instanceof GlobalScope) { + if (globalScope instanceof GlobalScope || globalScope instanceof ModuleScope) { v = globalScope.add(name, declKind); } else { v = undefined; @@ -500,9 +472,11 @@ export class FunctionScope extends VariableScope { } } else if (declKind == VarDeclarationKind.VAR || declKind == VarDeclarationKind.FUNCTION) { v = new LocalVariable(declKind, name); + this.locals.push(v); this.name2variable.set(name, v); } else { v = new LocalVariable(declKind, name, status); + this.locals.push(v); this.name2variable.set(name, v); } return v; @@ -521,15 +495,14 @@ export class LocalScope extends Scope { } - add(decl: Decl | string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { - let name = decl instanceof Decl ? decl.name : decl; + add(name: string, declKind: VarDeclarationKind, status?: InitStatus): Variable | undefined { let v: Variable | undefined; LOGD(this.debugTag, "localscope.add (" + name + "), kind:" + declKind); if (declKind == VarDeclarationKind.NONE) { let root = this.getRootScope(); - if (root instanceof GlobalScope) { + if (root instanceof GlobalScope || root instanceof ModuleScope) { return root.add(name, declKind, status); } else { LOGE(undefined, "Error: the root of this scope is not global scope, it is wrong"); @@ -545,6 +518,7 @@ export class LocalScope extends Scope { v = functionScope!.add(name, declKind); } else { v = new LocalVariable(declKind, name, status); + this.locals.push(v); this.name2variable.set(name, v); } diff --git a/ts2panda/src/statement/classStatement.ts b/ts2panda/src/statement/classStatement.ts index 6e977d831a..880f4a5f64 100644 --- a/ts2panda/src/statement/classStatement.ts +++ b/ts2panda/src/statement/classStatement.ts @@ -23,13 +23,7 @@ import { propertyKeyAsString, PropertyKind } from "../base/properties"; -import { - getParameterLength4Ctor, - getParamLengthOfFunc, - hasDefaultKeywordModifier, - hasExportKeywordModifier, - isUndefinedIdentifier -} from "../base/util"; +import { getParameterLength4Ctor, getParamLengthOfFunc, isUndefinedIdentifier } from "../base/util"; import { CacheList, getVregisterCache } from "../base/vregisterCache"; import { Compiler } from "../compiler"; import { createArrayFromElements } from "../expression/arrayLiteralExpression"; @@ -48,7 +42,7 @@ import { Scope, VariableScope } from "../scope"; -import { LocalVariable, ModuleVariable, Variable } from "../variable"; +import { LocalVariable, Variable } from "../variable"; export function compileClassDeclaration(compiler: Compiler, stmt: ts.ClassLikeDeclaration) { compiler.pushScope(stmt); @@ -118,30 +112,15 @@ export function compileClassDeclaration(compiler: Compiler, stmt: ts.ClassLikeDe compileUnCompiledProperty(compiler, properties, classReg); pandaGen.loadAccumulator(stmt, classReg); - let classScope = compiler.getRecorder().getScopeOfNode(stmt); - if (hasExportKeywordModifier(stmt)) { - if (stmt.name) { - let className = jshelpers.getTextOfIdentifierOrLiteral(stmt.name); - let classInfo = classScope.find(className); - (classInfo.v).initialize(); - pandaGen.storeModuleVariable(stmt, className); - } else if (hasDefaultKeywordModifier(stmt)) { - pandaGen.storeModuleVariable(stmt, "*default*"); - } else { - // throw SyntaxError in Recorder - } - } else { - if (stmt.name) { - let className = jshelpers.getTextOfIdentifierOrLiteral(stmt.name); - if (!ts.isClassExpression(stmt) && classScope.getParent() instanceof GlobalScope) { - pandaGen.stClassToGlobalRecord(stmt, className); - } else { - let classInfo = classScope.find(className); - (classInfo.v).initialize(); - pandaGen.storeAccToLexEnv(stmt, classInfo.scope!, classInfo.level, classInfo.v!, true); - } + if (stmt.name) { + let className = jshelpers.getTextOfIdentifierOrLiteral(stmt.name); + let classScope = compiler.getRecorder().getScopeOfNode(stmt); + if (!ts.isClassExpression(stmt) && classScope.getParent() instanceof GlobalScope) { + pandaGen.stClassToGlobalRecord(stmt, className); } else { - // throw SyntaxError in SyntaxChecker + let classInfo = classScope.find(className); + (classInfo.v).initialize(); + pandaGen.storeAccToLexEnv(stmt, classInfo.scope!, classInfo.level, classInfo.v!, true); } } @@ -518,10 +497,6 @@ export function getClassNameForConstructor(classNode: ts.ClassLikeDeclaration) { if (!isAnonymousClass(classNode)) { className = jshelpers.getTextOfIdentifierOrLiteral(classNode.name!); } else { - if (ts.isClassDeclaration(classNode) && hasExportKeywordModifier(classNode) && hasDefaultKeywordModifier(classNode)) { - return 'default'; - } - let outerNode = findOuterNodeOfParenthesis(classNode); if (ts.isVariableDeclaration(outerNode)) { @@ -539,8 +514,6 @@ export function getClassNameForConstructor(classNode: ts.ClassLikeDeclaration) { if (ts.isIdentifier(propName) || ts.isStringLiteral(propName) || ts.isNumericLiteral(propName)) { className = jshelpers.getTextOfIdentifierOrLiteral(propName); } - } else if (ts.isExportAssignment(outerNode)) { - className = 'default'; } } diff --git a/ts2panda/src/syntaxChecker.ts b/ts2panda/src/syntaxChecker.ts index e7311cf8ee..b8eadcc202 100644 --- a/ts2panda/src/syntaxChecker.ts +++ b/ts2panda/src/syntaxChecker.ts @@ -144,7 +144,6 @@ function hasDuplicateEntryInScope(decl1: Decl, decl2: Decl, scope: Scope) { return decl1.name == decl2.name; } // Var and FunctionDeclaration with same names, FunctionDeclaration and FunctionDeclaration with same names are illegal in strict mode - // and Module /** * eg1. * if (true) { @@ -157,16 +156,15 @@ function hasDuplicateEntryInScope(decl1: Decl, decl2: Decl, scope: Scope) { * function a() {}; * function a() {}; * } - * eg3. [module] - * var a; - * function a(){}; */ - if (scope instanceof LocalScope && isStrictMode(decl1.node) || scope instanceof ModuleScope) { - if (decl1 instanceof FuncDecl || decl2 instanceof FuncDecl) { - if (isFunctionLikeDeclaration(decl1.node.parent.parent) || isFunctionLikeDeclaration(decl2.node.parent.parent)) { - return false; + if (scope instanceof LocalScope) { + if (isStrictMode(decl1.node)) { + if (decl1 instanceof FuncDecl || decl2 instanceof FuncDecl) { + if (isFunctionLikeDeclaration(decl1.node.parent.parent) || isFunctionLikeDeclaration(decl2.node.parent.parent)) { + return false; + } + return decl1.name == decl2.name; } - return decl1.name == decl2.name; } } @@ -268,10 +266,10 @@ function throwDupIdError(decl: Decl) { } //**********************************Part 2: Implementing syntax check except declaration******************************************// -export function checkSyntaxError(node: ts.Node, scope:Scope) { +export function checkSyntaxError(node: ts.Node) { checkSyntaxErrorForSloppyAndStrictMode(node); if (isStrictMode(node) || CmdOptions.isModules()) { - checkSyntaxErrorForStrictMode(node, scope); + checkSyntaxErrorForStrictMode(node); } } @@ -1424,3 +1422,19 @@ function checkBindingPattern(node: ts.BindingPattern) { } } } + +export function checkExportEntries(recorder: Recorder) { + let exportStmts = recorder.getExportStmts(); + let exportNames: Set = new Set(); + exportStmts.forEach(exportStmt => { + let bindingNameMap = exportStmt.getBindingNameMap(); + // @ts-ignore + bindingNameMap.forEach((value: string, key: string) => { + if (!exportNames.has(key)) { + exportNames.add(key); + } else { + throw new DiagnosticError(exportStmt.getNode(), DiagnosticCode.Duplicate_identifier_0, jshelpers.getSourceFileOfNode(exportStmt.getNode()), [key]); + } + }) + }) +} \ No newline at end of file diff --git a/ts2panda/src/syntaxCheckerForStrcitMode.ts b/ts2panda/src/syntaxCheckerForStrcitMode.ts index 2b35fc1d15..c251b517f4 100644 --- a/ts2panda/src/syntaxCheckerForStrcitMode.ts +++ b/ts2panda/src/syntaxCheckerForStrcitMode.ts @@ -14,12 +14,10 @@ */ import * as ts from "typescript"; -import { hasDefaultKeywordModifier, hasExportKeywordModifier } from "./base/util"; import { CmdOptions } from "./cmdOptions"; import { DiagnosticCode, DiagnosticError } from "./diagnostic"; import { findInnerExprOfParenthesis } from "./expression/parenthesizedExpression"; import * as jshelpers from "./jshelpers"; -import { ModuleScope, Scope } from "./scope"; import { checkStrictModeStatementList } from "./strictMode"; import { isAssignmentOperator, @@ -173,6 +171,7 @@ function checkNoSubstitutionTemplateLiteral(expr: ts.NoSubstitutionTemplateLiter } function checkFunctionDeclaration(node: ts.FunctionDeclaration) { + checkEvalOrArgumentsOrOriginalKeyword(node, node.name); checkParameters(node); if (!isInBlockScope(node.parent!)) { @@ -180,57 +179,7 @@ function checkFunctionDeclaration(node: ts.FunctionDeclaration) { } } -function checkClassDeclaration(node: ts.ClassDeclaration) { - if (!hasExportKeywordModifier(node) && !node.name) { - if (!node.name && !hasDefaultKeywordModifier(node)) { - throw new DiagnosticError(node, DiagnosticCode.Identifier_expected); - } - } -} - -function checkImportDeclaration(node: ts.ImportDeclaration, scope: Scope) { - if (!(scope instanceof ModuleScope)) { - throw new DiagnosticError(node, DiagnosticCode.An_import_declaration_can_only_be_used_in_a_namespace_or_module); - } - - if (node.modifiers) { - throw new DiagnosticError(node, DiagnosticCode.An_import_declaration_cannot_have_modifiers); - } - - if (node.importClause && node.importClause.namedBindings) { - let namedBindings = node.importClause.namedBindings; - if (ts.isNamedImports(namedBindings)) { - namedBindings.elements.forEach((element: any) => { - if (jshelpers.getTextOfIdentifierOrLiteral(element.name) == 'arguments' - || jshelpers.getTextOfIdentifierOrLiteral(element.name) == 'eval') { - throw new DiagnosticError(node, DiagnosticCode.Unexpected_eval_or_arguments_in_strict_mode); - } - }); - } - } -} - -function checkExportAssignment(node: ts.ExportAssignment, scope: Scope) { - if (!(scope instanceof ModuleScope)) { - throw new DiagnosticError(node, DiagnosticCode.An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration); - } - - if (node.modifiers) { - throw new DiagnosticError(node, DiagnosticCode.An_export_assignment_cannot_have_modifiers); - } -} - -function checkExportDeclaration(node: ts.ExportDeclaration, scope: Scope) { - if (!(scope instanceof ModuleScope)) { - throw new DiagnosticError(node, DiagnosticCode.An_export_declaration_can_only_be_used_in_a_module); - } - - if (node.modifiers) { - throw new DiagnosticError(node, DiagnosticCode.An_export_declaration_cannot_have_modifiers); - } -} - -export function checkSyntaxErrorForStrictMode(node: ts.Node, scope: Scope) { +export function checkSyntaxErrorForStrictMode(node: ts.Node) { switch (node.kind) { case ts.SyntaxKind.NumericLiteral: checkNumericLiteral(node); @@ -250,9 +199,6 @@ export function checkSyntaxErrorForStrictMode(node: ts.Node, scope: Scope) { case ts.SyntaxKind.ArrowFunction: checkParameters(node); break; - case ts.SyntaxKind.ClassDeclaration: - checkClassDeclaration(node); - break; case ts.SyntaxKind.VariableDeclaration: let varNode = node; checkEvalOrArgumentsOrOriginalKeyword(varNode, varNode.name); @@ -283,16 +229,7 @@ export function checkSyntaxErrorForStrictMode(node: ts.Node, scope: Scope) { case ts.SyntaxKind.LastLiteralToken: checkNoSubstitutionTemplateLiteral(node); break; - case ts.SyntaxKind.ImportDeclaration: - checkImportDeclaration(node, scope); - break; - case ts.SyntaxKind.ExportAssignment: - checkExportAssignment(node, scope); - break; - case ts.SyntaxKind.ExportDeclaration: - checkExportDeclaration(node, scope); - break; default: break; } -} +} \ No newline at end of file diff --git a/ts2panda/src/ts2panda.ts b/ts2panda/src/ts2panda.ts index 660637b88c..dd1555e4fd 100644 --- a/ts2panda/src/ts2panda.ts +++ b/ts2panda/src/ts2panda.ts @@ -14,7 +14,6 @@ */ import { CmdOptions } from "./cmdOptions"; -import { SourceTextModuleRecord } from "./ecmaModule"; import { Imm, IRNode, @@ -31,11 +30,6 @@ import { ExportedSymbol2Type, Function, Ins, - IndirectExportEntry, - LocalExportEntry, - ModuleRecord, - NamespaceImportEntry, - RegularImportEntry, Signature } from "./pandasm"; import { generateCatchTables } from "./statement/tryStatement"; @@ -46,7 +40,6 @@ import { } from "./base/util"; import { LiteralBuffer } from "./base/literal"; import { CompilerDriver } from "./compilerDriver"; -import { ModuleScope } from "./scope"; const dollarSign: RegExp = /\$/g; @@ -55,14 +48,13 @@ const JsonType = { "record": 1, "string": 2, "literal_arr": 3, - "module": 4, - "options": 5 + "options": 4, + "type_arr": 5 }; export class Ts2Panda { static strings: Set = new Set(); static labelPrefix = "L_"; static jsonString: string = ""; - static moduleRecordlist: Array = []; constructor() { } @@ -242,12 +234,6 @@ export class Ts2Panda { } } - if (pg.getScope() instanceof ModuleScope) { - Ts2Panda.moduleRecordlist.push( - makeModuleRecord((pg.getScope()).module()) - ); - } - let variables, sourceCode; if (CmdOptions.isDebugMode()) { variables = pg.getVariableDebugInfoArray(); @@ -306,55 +292,8 @@ export class Ts2Panda { ts2abc.stdio[3].write(jsonFuncUnicode + '\n'); } - static dumpModuleRecords(ts2abc: any): void { - Ts2Panda.moduleRecordlist.forEach(function(module){ - let moduleObject = { - "t": JsonType.module, - "mod": module - }; - let jsonModuleUnicode = escapeUnicode(JSON.stringify(moduleObject, null, 2)); - jsonModuleUnicode = "$" + jsonModuleUnicode.replace(dollarSign, '#$') + "$"; - if (CmdOptions.isEnableDebugLog()) { - Ts2Panda.jsonString += jsonModuleUnicode; - } - ts2abc.stdio[3].write(jsonModuleUnicode + '\n'); - }); - } - static clearDumpData() { Ts2Panda.strings.clear(); Ts2Panda.jsonString = ""; - Ts2Panda.moduleRecordlist = []; } } - -function makeModuleRecord(sourceTextModule: SourceTextModuleRecord): ModuleRecord { - let moduleRecord = new ModuleRecord(); - moduleRecord.moduleName = sourceTextModule.getModuleName(); - - moduleRecord.moduleRequests = [...sourceTextModule.getModuleRequests()]; - - sourceTextModule.getRegularImportEntries().forEach(e => { - moduleRecord.regularImportEntries.push(new RegularImportEntry(e.localName!, e.importName!, e.moduleRequest!)); - }); - - sourceTextModule.getNamespaceImportEntries().forEach(e => { - moduleRecord.namespaceImportEntries.push(new NamespaceImportEntry(e.localName!, e.moduleRequest!)); - }); - - sourceTextModule.getLocalExportEntries().forEach(entries => { - entries.forEach(e => { - moduleRecord.localExportEntries.push(new LocalExportEntry(e.localName!, e.exportName!)); - }); - }); - - sourceTextModule.getIndirectExportEntries().forEach(e => { - moduleRecord.indirectExportEntries.push(new IndirectExportEntry(e.exportName!, e.importName!, e.moduleRequest!)); - }); - - sourceTextModule.getStarExportEntries().forEach(e => { - moduleRecord.starExportEntries.push(e.moduleRequest!); - }); - - return moduleRecord; -} diff --git a/ts2panda/src/variable.ts b/ts2panda/src/variable.ts index 37c7953090..d06957d00b 100644 --- a/ts2panda/src/variable.ts +++ b/ts2panda/src/variable.ts @@ -26,6 +26,7 @@ export enum VarDeclarationKind { CONST, VAR, FUNCTION, + MODULE, CLASS } @@ -112,28 +113,8 @@ export abstract class Variable { export class LocalVariable extends Variable { status: InitStatus | null; - - constructor(declKind: VarDeclarationKind, name: string, status?: InitStatus) { - super(declKind, name); - this.status = status ? status : null; - } - - initialize() { - this.status = InitStatus.INITIALIZED; - } - - isInitialized() { - if (this.status != null) { - return this.status == InitStatus.INITIALIZED; - } - return true; - } -} - -export class ModuleVariable extends Variable { - private isExport: boolean = false; - private status: InitStatus | null; - + isExport: boolean = false; + exportedName: string = ""; constructor(declKind: VarDeclarationKind, name: string, status?: InitStatus) { super(declKind, name); @@ -158,10 +139,21 @@ export class ModuleVariable 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 GlobalVariable extends Variable { constructor(declKind: VarDeclarationKind, name: string) { super(declKind, name); } -} +} \ No newline at end of file diff --git a/ts2panda/templates/diagnostic.ts.erb b/ts2panda/templates/diagnostic.ts.erb index 1de13a9524..b489f8f98d 100755 --- a/ts2panda/templates/diagnostic.ts.erb +++ b/ts2panda/templates/diagnostic.ts.erb @@ -46,26 +46,26 @@ export function createDiagnosticOnFirstToken(file:ts.SourceFile, node: ts.Node , return diagnostic; } -export function createFileDiagnostic(node: ts.Node, message: ts.DiagnosticMessage, ...args: (string | number | undefined)[]) { - let diagnostic; - let soureceFile: ts.SourceFile = jshelpers.getSourceFileOfNode(node); - let span = jshelpers.getErrorSpanForNode(soureceFile, node); - switch (node.kind) { - case ts.SyntaxKind.Identifier: - diagnostic = jshelpers.createFileDiagnostic(soureceFile, span.start, span.length, message, ts.idText(node)); - break; - case ts.SyntaxKind.PrivateIdentifier: - diagnostic = jshelpers.createFileDiagnostic(soureceFile, span.start, span.length, message, ts.idText(node)); - break; - case ts.SyntaxKind.ReturnStatement: - diagnostic = createDiagnosticOnFirstToken(soureceFile, node, message, ...args); - break; - default: - diagnostic = jshelpers.createDiagnosticForNode(node, message, ...args); - break; - } +export function createFileDiagnostic(file:ts.SourceFile, node: ts.Node, message: ts.DiagnosticMessage,...args:(string | number | undefined)[]) { + + let diagnostic; + let span = jshelpers.getErrorSpanForNode(file, node); + switch (node.kind) { + case ts.SyntaxKind.Identifier: + diagnostic = jshelpers.createFileDiagnostic(file,span.start,span.length,message,ts.idText(node)); + break; + case ts.SyntaxKind.PrivateIdentifier: + diagnostic = jshelpers.createFileDiagnostic(file,span.start,span.length,message,ts.idText(node)); + break; + case ts.SyntaxKind.ReturnStatement: + diagnostic = createDiagnosticOnFirstToken(file,node,message,...args); + break; + default: + diagnostic = jshelpers.createFileDiagnostic(file,span.start,span.length,message,...args); + break; + } - return diagnostic; + return diagnostic; } export function createDiagnostic(file:ts.SourceFile | undefined, location: ts.Node | undefined, message: ts.DiagnosticMessage,...args:(string | number | undefined)[]) { @@ -76,7 +76,7 @@ export function createDiagnostic(file:ts.SourceFile | undefined, location: ts.No } if (file) { - diagnostic = createFileDiagnostic(location, message, ...args); + diagnostic = createFileDiagnostic(file, location, message, ...args); } else { diagnostic = jshelpers.createDiagnosticForNode(location, message, ...args) } diff --git a/ts2panda/ts2abc/ts2abc.cpp b/ts2panda/ts2abc/ts2abc.cpp index 8fe7847262..50d9c60b07 100644 --- a/ts2panda/ts2abc/ts2abc.cpp +++ b/ts2panda/ts2abc/ts2abc.cpp @@ -40,7 +40,10 @@ namespace { bool g_debugLogEnabled = false; int g_optLevel = 0; std::string g_optLogLevel = "error"; - uint32_t g_literalArrayCount = 0; + bool g_moduleModeEnabled = false; + const int BASE = 16; + + int g_literalArrayCount = 0; constexpr std::size_t BOUND_LEFT = 0; constexpr std::size_t BOUND_RIGHT = 0; @@ -174,7 +177,6 @@ static std::string ParseUnicodeEscapeString(const std::string &data) { const int unicodeEscapeSymbolLen = 2; const int unicodeCharacterLen = 4; - const int base = 16; std::string::size_type startIdx = 0; std::string newData = ""; std::string::size_type len = data.length(); @@ -193,7 +195,7 @@ static std::string ParseUnicodeEscapeString(const std::string &data) std::string tmpStr = data.substr(startIdx, index - startIdx); newData += ConvertUtf8ToMUtf8(tmpStr); std::string uStr = data.substr(index + unicodeEscapeSymbolLen, unicodeCharacterLen); - uint16_t u16Data = static_cast(std::stoi(uStr.c_str(), NULL, base)); + uint16_t u16Data = static_cast(std::stoi(uStr.c_str(), NULL, BASE)); newData += ConvertUtf16ToMUtf8(&u16Data, 1); startIdx = index + unicodeEscapeSymbolLen + unicodeCharacterLen; } @@ -794,26 +796,20 @@ static void GenerateESTypeAnnotationRecord(panda::pandasm::Program &prog) prog.record_table.emplace(tsTypeAnnotationRecord.name, std::move(tsTypeAnnotationRecord)); } -static void GenerateESModuleRecord(panda::pandasm::Program &prog) +static void GenrateESModuleModeRecord(panda::pandasm::Program &prog, bool moduleMode) { - auto ecmaModuleRecord = panda::pandasm::Record("_ESModuleRecord", LANG_EXT); - ecmaModuleRecord.metadata->SetAccessFlags(panda::ACC_PUBLIC); - prog.record_table.emplace(ecmaModuleRecord.name, std::move(ecmaModuleRecord)); -} + auto ecmaModuleModeRecord = panda::pandasm::Record("_ESModuleMode", LANG_EXT); + ecmaModuleModeRecord.metadata->SetAccessFlags(panda::ACC_PUBLIC); -static void AddModuleRecord(panda::pandasm::Program &prog, std::string &moduleName, uint32_t moduleIdx) -{ - auto iter = prog.record_table.find("_ESModuleRecord"); - if (iter != prog.record_table.end()) { - auto &rec = iter->second; - auto moduleIdxField = panda::pandasm::Field(LANG_EXT); - moduleIdxField.name = moduleName; - moduleIdxField.type = panda::pandasm::Type("u32", 0); - moduleIdxField.metadata->SetValue(panda::pandasm::ScalarValue::Create( - static_cast(moduleIdx))); + auto modeField = panda::pandasm::Field(LANG_EXT); + modeField.name = "isModule"; + modeField.type = panda::pandasm::Type("u8", 0); + modeField.metadata->SetValue(panda::pandasm::ScalarValue::Create( + static_cast(moduleMode))); - rec.field_list.emplace_back(std::move(moduleIdxField)); - } + ecmaModuleModeRecord.field_list.emplace_back(std::move(modeField)); + + prog.record_table.emplace(ecmaModuleModeRecord.name, std::move(ecmaModuleModeRecord)); } int ParseJson(const std::string &data, Json::Value &rootValue) @@ -841,10 +837,10 @@ static void ParseModuleMode(const Json::Value &rootValue, panda::pandasm::Progra { Logd("----------------parse module_mode-----------------"); if (rootValue.isMember("module_mode") && rootValue["module_mode"].isBool()) { - if (rootValue["module_mode"].asBool()) { - GenerateESModuleRecord(prog); - } + g_moduleModeEnabled = rootValue["module_mode"].asBool(); } + + GenrateESModuleModeRecord(prog, g_moduleModeEnabled); } void ParseLogEnable(const Json::Value &rootValue) @@ -936,130 +932,6 @@ static void ParseSingleLiteralBuf(const Json::Value &rootValue, panda::pandasm:: prog.literalarray_table.emplace(std::to_string(g_literalArrayCount++), std::move(literalarrayInstance)); } -static void ParseModuleRequests(const Json::Value &moduleRequests, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal moduleSize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, .value_ = static_cast(moduleRequests.size())}; - moduleLiteralArray.emplace_back(moduleSize); - for (Json::ArrayIndex i = 0; i < moduleRequests.size(); ++i) { - panda::pandasm::LiteralArray::Literal moduleRequest = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(moduleRequests[i].asString())}; - moduleLiteralArray.emplace_back(moduleRequest); - } -} - -static void ParseRegularImportEntries(const Json::Value ®ularImportEntries, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal entrySize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, .value_ = static_cast(regularImportEntries.size())}; - moduleLiteralArray.emplace_back(entrySize); - for (Json::ArrayIndex i = 0; i < regularImportEntries.size(); ++i) { - auto entry = regularImportEntries[i]; - panda::pandasm::LiteralArray::Literal localName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["localName"].asString())}; - moduleLiteralArray.emplace_back(localName); - panda::pandasm::LiteralArray::Literal importName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["importName"].asString())}; - moduleLiteralArray.emplace_back(importName); - panda::pandasm::LiteralArray::Literal moduleRequest = { - .tag_ = panda::panda_file::LiteralTag::METHODAFFILIATE, - .value_ = static_cast(entry["moduleRequest"].asUInt())}; - moduleLiteralArray.emplace_back(moduleRequest); - } -} - -static void ParseNamespaceImportEntries(const Json::Value &namespaceImportEntries, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal entrySize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, - .value_ = static_cast(namespaceImportEntries.size())}; - moduleLiteralArray.emplace_back(entrySize); - for (Json::ArrayIndex i = 0; i < namespaceImportEntries.size(); ++i) { - auto entry = namespaceImportEntries[i]; - panda::pandasm::LiteralArray::Literal localName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["localName"].asString())}; - moduleLiteralArray.emplace_back(localName); - panda::pandasm::LiteralArray::Literal moduleRequest = { - .tag_ = panda::panda_file::LiteralTag::METHODAFFILIATE, - .value_ = static_cast(entry["moduleRequest"].asUInt())}; - moduleLiteralArray.emplace_back(moduleRequest); - } -} - -static void ParseLocalExportEntries(const Json::Value &localExportEntries, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal entrySize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, .value_ = static_cast(localExportEntries.size())}; - moduleLiteralArray.emplace_back(entrySize); - for (Json::ArrayIndex i = 0; i < localExportEntries.size(); ++i) { - auto entry = localExportEntries[i]; - panda::pandasm::LiteralArray::Literal localName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["localName"].asString())}; - moduleLiteralArray.emplace_back(localName); - panda::pandasm::LiteralArray::Literal exportName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["exportName"].asString())}; - moduleLiteralArray.emplace_back(exportName); - } -} - -static void ParseIndirectExportEntries(const Json::Value &indirectExportEntries, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal entrySize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, .value_ = static_cast(indirectExportEntries.size())}; - moduleLiteralArray.emplace_back(entrySize); - for (Json::ArrayIndex i = 0; i < indirectExportEntries.size(); ++i) { - auto entry = indirectExportEntries[i]; - panda::pandasm::LiteralArray::Literal exportName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["exportName"].asString())}; - moduleLiteralArray.emplace_back(exportName); - panda::pandasm::LiteralArray::Literal importName = { - .tag_ = panda::panda_file::LiteralTag::STRING, .value_ = ParseString(entry["importName"].asString())}; - moduleLiteralArray.emplace_back(importName); - panda::pandasm::LiteralArray::Literal moduleRequest = { - .tag_ = panda::panda_file::LiteralTag::METHODAFFILIATE, - .value_ = static_cast(entry["moduleRequest"].asUInt())}; - moduleLiteralArray.emplace_back(moduleRequest); - } -} - -static void ParseStarExportEntries(const Json::Value &starExportEntries, - std::vector &moduleLiteralArray) -{ - panda::pandasm::LiteralArray::Literal entrySize = { - .tag_ = panda::panda_file::LiteralTag::INTEGER, .value_ = static_cast(starExportEntries.size())}; - moduleLiteralArray.emplace_back(entrySize); - for (Json::ArrayIndex i = 0; i < starExportEntries.size(); ++i) { - panda::pandasm::LiteralArray::Literal moduleRequest = { - .tag_ = panda::panda_file::LiteralTag::METHODAFFILIATE, - .value_ = static_cast(starExportEntries[i].asUInt())}; - moduleLiteralArray.emplace_back(moduleRequest); - } -} - -static void ParseSingleModule(const Json::Value &rootValue, panda::pandasm::Program &prog) -{ - std::vector moduleLiteralArray; - - auto moduleRecord = rootValue["mod"]; - ParseModuleRequests(moduleRecord["moduleRequests"], moduleLiteralArray); - ParseRegularImportEntries(moduleRecord["regularImportEntries"], moduleLiteralArray); - ParseNamespaceImportEntries(moduleRecord["namespaceImportEntries"], moduleLiteralArray); - ParseLocalExportEntries(moduleRecord["localExportEntries"], moduleLiteralArray); - ParseIndirectExportEntries(moduleRecord["indirectExportEntries"], moduleLiteralArray); - ParseStarExportEntries(moduleRecord["starExportEntries"], moduleLiteralArray); - - auto moduleName = ParseString(moduleRecord["moduleName"].asString()); - AddModuleRecord(prog, moduleName, g_literalArrayCount); - - auto moduleLiteralarrayInstance = panda::pandasm::LiteralArray(moduleLiteralArray); - prog.literalarray_table.emplace(std::to_string(g_literalArrayCount++), std::move(moduleLiteralarrayInstance)); -} - static int ParseSmallPieceJson(const std::string &subJson, panda::pandasm::Program &prog) { Json::Value rootValue; @@ -1096,12 +968,6 @@ static int ParseSmallPieceJson(const std::string &subJson, panda::pandasm::Progr } break; } - case static_cast(JsonType::MODULE): { - if (rootValue.isMember("mod") && rootValue["mod"].isObject()) { - ParseSingleModule(rootValue, prog); - } - break; - } case static_cast(JsonType::OPTIONS): { ParseOptions(rootValue, prog); break; diff --git a/ts2panda/ts2abc/ts2abc.h b/ts2panda/ts2abc/ts2abc.h index fdfe86e704..37c83d29ce 100644 --- a/ts2panda/ts2abc/ts2abc.h +++ b/ts2panda/ts2abc/ts2abc.h @@ -33,7 +33,6 @@ enum class JsonType { RECORD, STRING, LITERALBUFFER, - MODULE, OPTIONS }; -- Gitee From 2c4577b3b946fada32c61e77dd4bf97b6e6e4353 Mon Sep 17 00:00:00 2001 From: hufeng Date: Sat, 12 Mar 2022 17:32:20 +0800 Subject: [PATCH 5/9] fix Bug of Scope when inserting FinallyBlocks Signed-off-by: hufeng Change-Id: I9df65de7affdad92961ca54c01e9fbae5a4a7aff --- ts2panda/src/compiler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 6557c69929..9b328bc084 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -636,6 +636,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; + let currentScope = this.scope; for (; startTry != endTry; startTry = startTry?.getOuterTryStatement()) { if (startTry && startTry.trybuilder) { @@ -655,6 +656,7 @@ export class Compiler { updateCatchTables(originTry, startTry, inlinedLabelPair); } } + this.scope = currentScope; } constructTry(node: ts.Node, tryBuilder: TryBuilderBase, endLabel?: Label) { -- Gitee From 5e48d25f17b126ef548920ca72fa67e8371639ca Mon Sep 17 00:00:00 2001 From: zhangrengao Date: Thu, 10 Mar 2022 10:05:29 +0800 Subject: [PATCH 6/9] modify es2015 to es2017 Signed-off-by: zhangrengao Change-Id: I951538c829b23b6f76ac9abd1ff5a4f1fccb6184 --- ts2panda/src/compiler.ts | 4 ++-- ts2panda/src/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 9b328bc084..3da2de382a 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -305,9 +305,9 @@ export class Compiler { if (!unreachableFlag) { // exit GlobalScopefunction or Function Block return if (this.funcBuilder instanceof AsyncFunctionBuilder) { this.funcBuilder.resolve(NodeKind.Invalid, getVregisterCache(pandaGen, CacheList.undefined)); - pandaGen.return(DebugInfo.getLastNode()); + pandaGen.return(NodeKind.Invalid); } else { - pandaGen.returnUndefined(DebugInfo.getLastNode()); + pandaGen.returnUndefined(NodeKind.Invalid); } } } diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index af110c62a6..1486ff516d 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -161,7 +161,7 @@ namespace Compiler { allowJs: true, noEmitOnError: true, noImplicitAny: true, - target: ts.ScriptTarget.ES2015, + target: ts.ScriptTarget.ES2017, module: ts.ModuleKind.ES2015, strictNullChecks: true, skipLibCheck: true, -- Gitee From ff1c7d1ae03fc68f5b3826734548d02e7c6839c2 Mon Sep 17 00:00:00 2001 From: wuhailong Date: Wed, 9 Mar 2022 16:02:07 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9D=83?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E4=BB=A5=E5=8F=8A=E5=8D=95=E8=AF=8D=E6=8B=BC?= =?UTF-8?q?=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wuhailong --- OAT.xml | 2 +- README.md | 6 ++-- test262/config.py | 5 +--- testTs/README.en.md | 19 ------------ testTs/README.md | 30 +++++++++---------- testTs/README_zh.md | 21 +++++++++++++ testTs/config.py | 3 -- testTs/run_testTs.py | 3 -- testTs/utils.py | 3 -- ts2panda/BUILD.gn | 2 +- ts2panda/scripts/generate_plugin.py | 8 ++--- ts2panda/src/addVariable2Scope.ts | 2 +- ts2panda/src/base/literal.ts | 2 +- ts2panda/src/base/typeSystem.ts | 2 +- ts2panda/src/base/util.ts | 2 +- ts2panda/src/compiler.ts | 2 +- ts2panda/src/compilerDriver.ts | 2 +- ts2panda/src/debuginfo.ts | 2 +- ts2panda/src/hoisting.ts | 2 +- ts2panda/src/index.ts | 2 +- ts2panda/src/jshelpers.d.ts | 2 +- ts2panda/src/lexenv.ts | 4 +-- ts2panda/src/pandagen.ts | 2 +- ts2panda/src/pandasm.ts | 2 +- ts2panda/src/recorder.ts | 2 +- ts2panda/src/scope.ts | 2 +- ts2panda/src/statement/classStatement.ts | 2 +- ts2panda/src/statement/returnStatement.ts | 2 +- ts2panda/src/statement/tryStatement.ts | 2 +- ts2panda/src/strictMode.ts | 2 +- ts2panda/src/syntaxCheckHelper.ts | 2 +- ts2panda/src/syntaxChecker.ts | 2 +- ts2panda/src/syntaxCheckerForStrcitMode.ts | 2 +- ts2panda/src/ts2panda.ts | 2 +- ts2panda/src/typeChecker.ts | 15 ++++++++++ ts2panda/src/typeRecorder.ts | 2 +- ts2panda/src/variable.ts | 2 +- ts2panda/templates/diagnostic.ts.erb | 2 +- ts2panda/templates/irnodes.ts.erb | 2 +- ts2panda/tests/BUILD.gn | 2 +- .../expression/functionExpression.test.ts | 2 +- ts2panda/tests/lexenv.test.ts | 10 +++---- ts2panda/tests/types/array.test.ts | 2 +- ts2panda/tests/types/array/array_object.ts | 2 +- .../tests/types/array/array_primitives.ts | 2 +- ts2panda/tests/types/array/array_union.ts | 2 +- ts2panda/tests/types/class.test.ts | 2 +- ts2panda/tests/types/class/class_abstract.ts | 2 +- .../tests/types/class/class_constr_no_para.ts | 2 +- .../tests/types/class/class_constr_para.ts | 2 +- ts2panda/tests/types/class/class_fields.ts | 2 +- .../tests/types/class/class_implements.ts | 2 +- ts2panda/tests/types/class/class_methods.ts | 2 +- .../tests/types/class/class_static_fields.ts | 2 +- .../tests/types/class/class_static_methods.ts | 2 +- ts2panda/tests/types/function.test.ts | 2 +- .../types/function/function_class_para.ts | 2 +- .../types/function/function_class_return.ts | 2 +- .../types/function/function_multi_para.ts | 2 +- .../tests/types/function/function_no_para.ts | 2 +- .../function/function_same_para_and_return.ts | 2 +- ts2panda/tests/types/object.test.ts | 2 +- ts2panda/tests/types/object/object_class.ts | 2 +- ts2panda/tests/types/object/object_primi.ts | 2 +- ts2panda/tests/types/primitives.test.ts | 2 +- .../types/primitives/primitives_in_block.ts | 2 +- .../types/primitives/primitives_in_class.ts | 2 +- .../types/primitives/primitives_in_for.ts | 2 +- .../primitives/primitives_in_function.ts | 2 +- .../types/primitives/primitives_in_if.ts | 2 +- .../primitives_no_type_annotation.ts | 2 +- .../primitives_only_type_annotation.ts | 2 +- ts2panda/tests/types/typeUtils.ts | 2 +- ts2panda/tests/types/union.test.ts | 2 +- .../types/union/union_multi_same_primi.ts | 2 +- .../union/union_multi_userDefinedType.ts | 2 +- .../tests/types/union/union_primitives.ts | 2 +- .../types/union/union_userDefinedType.ts | 2 +- ts2panda/tests/utils/base.ts | 2 +- ts2panda/ts2abc/BUILD.gn | 2 +- ts2panda/ts2abc/main.cpp | 2 +- ts2panda/ts2abc/tests/BUILD.gn | 2 +- ts2panda/ts2abc/tests/debuglog_test.cpp | 2 +- ts2panda/ts2abc/tests/debugmode_test.cpp | 2 +- ts2panda/ts2abc/tests/functions_test.cpp | 2 +- ts2panda/ts2abc/tests/stringarr_test.cpp | 2 +- ts2panda/ts2abc/ts2abc.cpp | 2 +- ts2panda/ts2abc/ts2abc.h | 2 +- ts2panda/ts2abc/ts2abc_options.h | 2 +- 89 files changed, 142 insertions(+), 139 deletions(-) delete mode 100644 testTs/README.en.md create mode 100644 testTs/README_zh.md diff --git a/OAT.xml b/OAT.xml index 4b2b68b1e1..9a4623d36b 100644 --- a/OAT.xml +++ b/OAT.xml @@ -1,5 +1,5 @@ -