diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index a8057b1eca6f3467d787544167fcda5fe9479204..ded4a5b4440e82746327981c6c1fb96114ad9c85 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -117,6 +117,9 @@ import { VarDeclarationKind, Variable } from "./variable"; +import { + compileCommaListExpression +} from "./expression/compileCommaListExpression" export enum ControlFlowChange { Continue, Break } export class Compiler { @@ -877,6 +880,9 @@ export class Compiler { break; case ts.SyntaxKind.PartiallyEmittedExpression: break; + case ts.SyntaxKind.CommaListExpression: + compileCommaListExpression(this, expr); + break; default: throw new Error("Expression of type " + this.getNodeName(expr) + " is unimplemented"); } diff --git a/ts2panda/src/expression/compileCommaListExpression.ts b/ts2panda/src/expression/compileCommaListExpression.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f1ab59b648eb701c6d8af65e5608b8f9ce080a9 --- /dev/null +++ b/ts2panda/src/expression/compileCommaListExpression.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022 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 { Compiler } from "../compiler"; + + +export function compileCommaListExpression(compiler: Compiler, exprList: ts.CommaListExpression) { + exprList.elements.forEach(expr => { + compiler.compileExpression(expr); + }) +} diff --git a/ts2panda/tests/expression/commalist.test.ts b/ts2panda/tests/expression/commalist.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..5163fded64bb57bf427a5643c90c899cc5b69504 --- /dev/null +++ b/ts2panda/tests/expression/commalist.test.ts @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2022 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 { + expect +} from 'chai'; +import 'mocha'; +import { + EcmaReturnundefined, + EcmaStglobalvar, + EcmaTryldglobalbyname, + Imm, + LdaDyn, + MovDyn, + StaDyn, + EcmaDefineclasswithbuffer, + EcmaStclasstoglobalrecord, + EcmaNewobjdynrange, + VReg +} from "../../src/irnodes"; +import { checkInstructions, SnippetCompiler } from "../utils/base"; + +describe("CommaListExpression", function () { + it("computedPropertyName", function () { + let snippetCompiler = new SnippetCompiler(); + snippetCompiler.compileAfter(" \ + class Test { \ + #filed1; \ + #filed2; \ + #filed3; \ + #filed4; \ + #filed5; \ + #filed6; \ + #filed7; \ + #filed8; \ + #filed9; \ + #filed10; \ + #filed11; \ + } \ + ", + "test.ts"); + let insns = snippetCompiler.getGlobalInsns(); + let expected = [ + new MovDyn(new VReg(), new VReg()), + new EcmaDefineclasswithbuffer("#1#Test", new Imm(0), new Imm(0), new VReg(), new VReg()), + new StaDyn(new VReg()), + new LdaDyn(new VReg()), + new EcmaStclasstoglobalrecord("Test"), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed1'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed2'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed3'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed4'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed5'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed6'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed7'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed8'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed9'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed10'), + new EcmaTryldglobalbyname('WeakMap'), + new StaDyn(new VReg()), + new MovDyn(new VReg(), new VReg()), + new EcmaNewobjdynrange(new Imm(2), [new VReg(), new VReg()]), + new EcmaStglobalvar('_Test_filed11'), + new EcmaReturnundefined() + ] + expect(checkInstructions(insns, expected)).to.be.true; + }); + +}); diff --git a/ts2panda/tests/utils/base.ts b/ts2panda/tests/utils/base.ts index 94b1a99f008d1b9c5645fe9bea47d3f522c74227..6d505a9c56b19a06fd14a64e36a1ccdd358d6843 100644 --- a/ts2panda/tests/utils/base.ts +++ b/ts2panda/tests/utils/base.ts @@ -170,6 +170,36 @@ export function compileMainSnippet(snippet: string, pandaGen?: PandaGen, scope?: return compileUnits[0].getInsns(); } +export function compileAfterSnippet(snippet: string, name:string) { + let compileUnits = null; + ts.transpileModule( + snippet, + { + compilerOptions : { + "target": ts.ScriptTarget.ES2015 + }, + fileName : name, + transformers : { + after : [ + (ctx: ts.TransformationContext) => { + return (sourceFile: ts.SourceFile) => { + jshelpers.bindSourceFile(sourceFile, {}); + setGlobalStrict(jshelpers.isEffectiveStrictModeSourceFile(sourceFile, compileOptions)); + let compilerDriver = new CompilerDriver('UnitTest'); + compilerDriver.setCustomPasses([]); + compilerDriver.compileUnitTest(sourceFile, []); + compileUnits = compilerDriver.getCompilationUnits(); + return sourceFile; + } + } + ] + } + } + ); + + return compileUnits; +} + export function getCompileOptions(): ts.CompilerOptions { return compileOptions; } @@ -181,6 +211,11 @@ export class SnippetCompiler { return this.pandaGens; } + compileAfter(snippet: string, name: string, passes?: Pass[], literalBufferArray?: Array) { + this.pandaGens = compileAfterSnippet(snippet, name); + return this.pandaGens; + } + getGlobalInsns(): IRNode[] { let root = this.getPandaGenByName("func_main_0"); if (root) {