From 2b85348581f78d6054fd7292ba16ab8fe7d9b3ed Mon Sep 17 00:00:00 2001 From: gavin1012_hw Date: Wed, 8 Feb 2023 10:45:28 +0800 Subject: [PATCH] Fix generated partiallyEmitted node and temporary name of autoGeneratedIdentifier by tsc Issue: I6DMQ0 Signed-off-by: gavin1012_hw Change-Id: I83140a0b5785a363fe65e0b2a8524336aba84826 --- ts2panda/src/base/lreference.ts | 5 +- ts2panda/src/base/util.ts | 22 ++- ts2panda/src/compiler.ts | 2 +- ts2panda/src/expression/callExpression.ts | 12 +- .../expression/partiallyEmittedExpression.ts | 23 --- ts2panda/src/index.ts | 12 +- ts2panda/src/log.ts | 19 +- .../tests/autoGeneratedIdentifierName.test.ts | 183 ++++++++++++++++++ ts2panda/tests/expression/commalist.test.ts | 22 +-- .../tests/expression/partiallyemitted.test.ts | 86 +++++++- ts2panda/tests/utils/base.ts | 11 +- 11 files changed, 340 insertions(+), 57 deletions(-) delete mode 100644 ts2panda/src/expression/partiallyEmittedExpression.ts create mode 100644 ts2panda/tests/autoGeneratedIdentifierName.test.ts diff --git a/ts2panda/src/base/lreference.ts b/ts2panda/src/base/lreference.ts index 1a89aa46626..f51dc6f7748 100644 --- a/ts2panda/src/base/lreference.ts +++ b/ts2panda/src/base/lreference.ts @@ -20,7 +20,6 @@ import { compileDestructuring } from "../compilerUtils"; import { DiagnosticCode, DiagnosticError } from "../diagnostic"; import { getObjAndProp } from "../expression/memberAccessExpression"; import { findInnerExprOfParenthesis } from "../expression/parenthesizedExpression"; -import { findInnerExprOfPartiallyEmittedExpr } from "../expression/partiallyEmittedExpression"; import { VReg } from "../irnodes"; import * as jshelpers from "../jshelpers"; import { Scope } from "../scope"; @@ -132,9 +131,7 @@ export class LReference { let realNode: ts.Node = node; - if (ts.isPartiallyEmittedExpression(node)) { - realNode = findInnerExprOfPartiallyEmittedExpr(node); - } + realNode = ts.skipPartiallyEmittedExpressions(node); if (ts.isParenthesizedExpression(realNode)) { realNode = findInnerExprOfParenthesis(realNode); diff --git a/ts2panda/src/base/util.ts b/ts2panda/src/base/util.ts index 4cbbb292a68..6f5d787e481 100644 --- a/ts2panda/src/base/util.ts +++ b/ts2panda/src/base/util.ts @@ -473,21 +473,34 @@ function generateNameCached(node: ts.Node): string { return generatedName; } -function generateNameForTempAndLoopVariable(autoGenerateId: number): string { +function generateNameForTempAndLoopVariable(node: ts.Node): string { + // Auto, Loop and Unique names are generated and cached based on their unique autoGenerateId. + // @ts-ignore + const autoGenerateId = node.autoGenerateId!; if (tempAndLoopVariablesNameMap.get(autoGenerateId)) { return tempAndLoopVariablesNameMap.get(autoGenerateId); } let generatedName = generateUniqueName(); + // @ts-ignore + if ((node.autoGenerateFlags & ts.GeneratedIdentifierFlags.KindMask) == ts.GeneratedIdentifierFlags.Unique) { + // Unique names are generated and cached based on their unique autoGenerateId and original idText. + // @ts-ignore + generatedName = (node).escapedText + generatedName; + } tempAndLoopVariablesNameMap.set(autoGenerateId, generatedName); return generatedName; } +export function resetUniqueNameIndex() { + uniqueNameIndex = 0; +} + export function makeNameForGeneratedNode(node: ts.Node) { node.forEachChild(childNode => { switch (childNode.kind) { case ts.SyntaxKind.Identifier: { // @ts-ignore - if (ts.isGeneratedIdentifier(childNode) && (childNode).escapedText == "") { + if (ts.isGeneratedIdentifier(childNode)) { // Node names generate unique names based on their original node and are cached based on that node's id. // @ts-ignore if ((childNode.autoGenerateFlags & ts.GeneratedIdentifierFlags.KindMask) === @@ -497,11 +510,8 @@ export function makeNameForGeneratedNode(node: ts.Node) { // @ts-ignore (childNode).escapedText = generateNameCached(originalNode); } else { - // Auto, Loop, and Unique names are cached based on their unique autoGenerateId. - // @ts-ignore - const autoGenerateId = childNode.autoGenerateId!; // @ts-ignore - (childNode).escapedText = generateNameForTempAndLoopVariable(autoGenerateId); + (childNode).escapedText = generateNameForTempAndLoopVariable(childNode); } } break; diff --git a/ts2panda/src/compiler.ts b/ts2panda/src/compiler.ts index 09c3a4ac27c..3f50b1a0bcf 100644 --- a/ts2panda/src/compiler.ts +++ b/ts2panda/src/compiler.ts @@ -798,7 +798,7 @@ export class Compiler { compileExpression(expr: ts.Expression) { // Please keep order of cases the same as in types.ts - LOGD(this.debugTag, "compile expr:" + expr.kind); + LOGD(this.debugTag, "compile expr: " + ts.SyntaxKind[expr.kind] + " " + expr.kind); switch (expr.kind) { case ts.SyntaxKind.NumericLiteral: // line 34 compileNumericLiteral(this.pandaGen, expr); diff --git a/ts2panda/src/expression/callExpression.ts b/ts2panda/src/expression/callExpression.ts index 26c5aeea59e..a42cb042966 100644 --- a/ts2panda/src/expression/callExpression.ts +++ b/ts2panda/src/expression/callExpression.ts @@ -27,20 +27,22 @@ import { getObjAndProp } from "./memberAccessExpression"; export function compileCallExpression(expr: ts.CallExpression, compiler: Compiler, inTailPos?: boolean) { let pandaGen = compiler.getPandaGen(); - if (expr.expression.kind == ts.SyntaxKind.ImportKeyword) { + let innerExpression = ts.skipPartiallyEmittedExpressions(expr.expression); + + if (innerExpression.kind == ts.SyntaxKind.ImportKeyword) { compiler.compileExpression(expr.arguments[0]); pandaGen.dynamicImportCall(expr); return; } - if (ts.isCallExpression(expr.expression) || ts.isNewExpression(expr.expression)) { - let processed = compiler.compileFunctionReturnThis(expr.expression); + if (ts.isCallExpression(innerExpression) || ts.isNewExpression(innerExpression)) { + let processed = compiler.compileFunctionReturnThis(innerExpression); if (processed) { return; } } - if (expr.expression.kind == ts.SyntaxKind.SuperKeyword) { + if (innerExpression.kind == ts.SyntaxKind.SuperKeyword) { let args: VReg[] = []; let hasSpread = emitCallArguments(compiler, expr, args); compileSuperCall(compiler, expr, args, hasSpread); @@ -48,7 +50,7 @@ export function compileCallExpression(expr: ts.CallExpression, compiler: Compile return; } - let { arguments: args, passThis: passThis } = getHiddenParameters(expr.expression, compiler); + let { arguments: args, passThis: passThis } = getHiddenParameters(innerExpression, compiler); // compile arguments of function call emitCall(expr, args, passThis, compiler); diff --git a/ts2panda/src/expression/partiallyEmittedExpression.ts b/ts2panda/src/expression/partiallyEmittedExpression.ts deleted file mode 100644 index d1521a7f512..00000000000 --- a/ts2panda/src/expression/partiallyEmittedExpression.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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"; - -export function findInnerExprOfPartiallyEmittedExpr(expr: ts.PartiallyEmittedExpression): ts.Expression { - while (expr.expression.kind == ts.SyntaxKind.PartiallyEmittedExpression) { - expr = expr.expression; - } - return expr.expression; -} diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index 65d1334a557..cc975bd19d3 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -21,7 +21,10 @@ import commandLineArgs from "command-line-args"; import { CompilerDriver } from "./compilerDriver"; import * as diag from "./diagnostic"; import * as jshelpers from "./jshelpers"; -import { LOGE } from "./log"; +import { + LOGE, + printAstRecursively +} from "./log"; import { setGlobalDeclare, setGlobalStrict @@ -35,7 +38,8 @@ import { getRecordName, getOutputBinName, terminateWritePipe, - makeNameForGeneratedNode + makeNameForGeneratedNode, + resetUniqueNameIndex } from "./base/util"; function checkIsGlobalDeclaration(sourceFile: ts.SourceFile) { @@ -140,7 +144,10 @@ function main(fileNames: string[], options: ts.CompilerOptions, inputJsonFiles?: return node; } } + resetUniqueNameIndex(); makeNameForGeneratedNode(node); + printAstRecursively(node, 0, node); + if (ts.getEmitHelpers(node)) { let newStatements = []; ts.getEmitHelpers(node)?.forEach( @@ -417,6 +424,7 @@ function compileWatchExpression(jsFileName: string, errorMsgFileName: string, op // @ts-ignore (ctx: ts.TransformationContext) => { return (node: ts.SourceFile) => { + resetUniqueNameIndex(); makeNameForGeneratedNode(node); if (ts.getEmitHelpers(node)) { let newStatements = []; diff --git a/ts2panda/src/log.ts b/ts2panda/src/log.ts index 33abfb8800b..88a49b074c7 100644 --- a/ts2panda/src/log.ts +++ b/ts2panda/src/log.ts @@ -14,6 +14,7 @@ */ // singleton to print debug logs +import * as ts from "typescript"; import { CmdOptions } from "./cmdOptions"; export function LOGD(tag: any, ...args: any[]) { @@ -32,4 +33,20 @@ export function LOGE(tag: any, ...args: any[]) { } else { console.error(args); } -} \ No newline at end of file +} + +export function printAstRecursively(node: ts.Node, indentLevel: number, sourceFile: ts.SourceFile) { + if (CmdOptions.isEnableDebugLog()) { + const indentation = "-".repeat(indentLevel); + let nodeContent = ts.SyntaxKind[node.kind] + ": "; + if (node.kind == ts.SyntaxKind.Identifier) { + // @ts-ignore + nodeContent += (node).escapedText; + } + console.log(`${indentation}${nodeContent}`); + + node.forEachChild(child => + printAstRecursively(child, indentLevel + 1, sourceFile) + ); + } +} diff --git a/ts2panda/tests/autoGeneratedIdentifierName.test.ts b/ts2panda/tests/autoGeneratedIdentifierName.test.ts new file mode 100644 index 00000000000..b66432c6648 --- /dev/null +++ b/ts2panda/tests/autoGeneratedIdentifierName.test.ts @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2023 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 { + Returnundefined, + Sttoglobalrecord, + Tryldglobalbyname, + Lda, + VReg, + Imm, + IRNode, + Sta, + Mov, + Stobjbyname, + Dec, + Definefunc, + Label, + Stglobalvar, + Newobjrange, + Createobjectwithbuffer, + Ldglobalvar, + Eq, + Jeqz, + Ldai, + Jmp, + Trystglobalbyname, + LdaStr, + Defineclasswithbuffer, + Stlexvar, + Createemptyarray, + Callarg1, + Stownbyindex, + Callargs2 +} from "../src/irnodes"; +import { checkInstructions, SnippetCompiler } from "./utils/base"; +import { creatAstFromSnippet } from "./utils/asthelper" +import { PandaGen } from '../src/pandagen'; + +describe("AutoGeneratedIdNameTest", function () { + it("noNameForAutoGeneratedId", function () { + let snippetCompiler = new SnippetCompiler(); + snippetCompiler.compileAfter( + ` + let kk = new Date(); + let list; + let hh = {name:2}; + + function fu(a) { + return a; + } + let uu = fu(((list = kk) == null ? void 0 : hh) ?? []); + `, 'test.js'); + IRNode.pg = new PandaGen("", creatAstFromSnippet(""), 0, undefined); + let insns = snippetCompiler.getGlobalInsns(); + let expected = [ + new Definefunc(new Imm(0), 'UnitTest.fu', new Imm(1)), + new Stglobalvar(new Imm(0), 'fu'), + new Tryldglobalbyname(new Imm(0), 'Date'), + new Sta(new VReg()), + new Newobjrange(new Imm(0), new Imm(1), [new VReg()]), + new Sttoglobalrecord(new Imm(0), 'kk'), + new Lda(new VReg()), + new Sttoglobalrecord(new Imm(0), 'list'), + new Createobjectwithbuffer(new Imm(0), 'test_0'), + new Sta(new VReg()), + new Lda(new VReg()), + new Sttoglobalrecord(new Imm(0), 'hh'), + new Ldglobalvar(new Imm(0), 'fu'), + new Sta(new VReg()), + new Tryldglobalbyname(new Imm(0), 'kk'), + new Trystglobalbyname(new Imm(0), 'list'), + new Sta(new VReg()), + new Lda(new VReg()), + new Eq(new Imm(0), new VReg()), + new Jeqz(new Label()), + new Ldai(new Imm(0)), + new Lda(new VReg()), + new Jmp(new Label()), + new Label(), + new Tryldglobalbyname(new Imm(0), 'hh'), + new Label(), + new Stglobalvar(new Imm(0), '#a') + ]; + expect(checkInstructions(insns.slice(0, 27), expected)).to.be.true; + }); + + it("sameNameForDifferentNodeWithSameOrigin", function () { + let snippetCompiler = new SnippetCompiler(); + snippetCompiler.compileAfter( + ` + enum hiddenItemAction { + str = "string" + } + let a = hiddenItemAction.str; + `, 'test.js'); + IRNode.pg = new PandaGen("", creatAstFromSnippet(""), 0, undefined); + let insns = snippetCompiler.getPandaGenByName("UnitTest.#1#").getInsns(); + let expected = [ + new Lda(new VReg()), + new Sta(new VReg()), + new Mov(new VReg(), new VReg()), + new LdaStr('string'), + new Stobjbyname(new Imm(0), 'str', new VReg()), + new Returnundefined() + ]; + expect(checkInstructions(insns, expected)).to.be.true; + }); + + it("allocUniqueNameForAutoGenratedIdWithName", function () { + let snippetCompiler = new SnippetCompiler(); + snippetCompiler.compileAfter( + ` + function ccclass(name: string) { + return function ccclass(target :any) { + target.prototype.name = name; + } + } + + @ccclass('cc.ClickEvent') + class EventHandler { + public static emitEvent(event: EventHandler): boolean { + if (!(event instanceof EventHandler)) { + return false; + } + return true; + } + } + `, 'test.ts'); + IRNode.pg = new PandaGen("", creatAstFromSnippet(""), 0, undefined); + let insns = snippetCompiler.getGlobalInsns(); + let expected = [ + new Definefunc(new Imm(0), 'UnitTest.#2#ccclass', new Imm(1)), + new Stglobalvar(new Imm(0), 'ccclass'), + new Mov(new VReg(), new VReg()), + new Defineclasswithbuffer(new Imm(0), 'UnitTest.#3#EventHandler', 'test_1', new Imm(0), new VReg()), + new Sta(new VReg()), + new Lda(new VReg()), + new Sta(new VReg()), + new Lda(new VReg()), + new Stlexvar(new Imm(0), new Imm(0)), + new Lda(new VReg()), + new Stglobalvar(new Imm(0), 'EventHandler#a'), + new Sttoglobalrecord(new Imm(0), 'EventHandler'), + new Tryldglobalbyname(new Imm(0), '__decorate'), + new Sta(new VReg()), + new Createemptyarray(new Imm(0)), + new Sta(new VReg()), + new Ldglobalvar(new Imm(0), 'ccclass'), + new Sta(new VReg()), + new LdaStr('cc.ClickEvent'), + new Sta(new VReg()), + new Lda(new VReg()), + new Callarg1(new Imm(0), new VReg()), + new Stownbyindex(new Imm(0), new VReg(), new Imm(0)), + new Lda(new VReg()), + new Sta(new VReg()), + new Tryldglobalbyname(new Imm(0), 'EventHandler'), + new Sta(new VReg()), + new Lda(new VReg()), + new Callargs2(new Imm(0), new VReg(), new VReg()), + new Stglobalvar(new Imm(0), 'EventHandler#a'), + new Trystglobalbyname(new Imm(0), 'EventHandler'), + new Returnundefined() + ]; + expect(checkInstructions(insns, expected)).to.be.true; + }); +}); diff --git a/ts2panda/tests/expression/commalist.test.ts b/ts2panda/tests/expression/commalist.test.ts index 5e90db7bf41..93471173401 100644 --- a/ts2panda/tests/expression/commalist.test.ts +++ b/ts2panda/tests/expression/commalist.test.ts @@ -81,47 +81,47 @@ describe("CommaListExpression", function () { new Tryldglobalbyname(new Imm(2), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(3), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(4), '_filed1'), + new Stglobalvar(new Imm(4), '_filed1#a'), new Tryldglobalbyname(new Imm(5), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(6), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(7), '_filed2'), + new Stglobalvar(new Imm(7), '_filed2#b'), new Tryldglobalbyname(new Imm(8), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(9), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(10), '_filed3'), + new Stglobalvar(new Imm(10), '_filed3#c'), new Tryldglobalbyname(new Imm(11), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(12), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(13), '_filed4'), + new Stglobalvar(new Imm(13), '_filed4#d'), new Tryldglobalbyname(new Imm(14), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(15), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(16), '_filed5'), + new Stglobalvar(new Imm(16), '_filed5#e'), new Tryldglobalbyname(new Imm(17), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(18), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(19), '_filed6'), + new Stglobalvar(new Imm(19), '_filed6#f'), new Tryldglobalbyname(new Imm(20), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(21), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(22), '_filed7'), + new Stglobalvar(new Imm(22), '_filed7#g'), new Tryldglobalbyname(new Imm(23), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(24), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(25), '_filed8'), + new Stglobalvar(new Imm(25), '_filed8#h'), new Tryldglobalbyname(new Imm(26), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(27), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(28), '_filed9'), + new Stglobalvar(new Imm(28), '_filed9#i'), new Tryldglobalbyname(new Imm(29), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(30), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(31), '_filed10'), + new Stglobalvar(new Imm(31), '_filed10#j'), new Tryldglobalbyname(new Imm(32), 'WeakMap'), new Sta(new VReg()), new Newobjrange(new Imm(33), new Imm(1), [new VReg()]), - new Stglobalvar(new Imm(34), '_filed11'), + new Stglobalvar(new Imm(34), '_filed11#k'), new Returnundefined() ] expect(checkInstructions(insns, expected)).to.be.true; diff --git a/ts2panda/tests/expression/partiallyemitted.test.ts b/ts2panda/tests/expression/partiallyemitted.test.ts index 770b44a0735..19265a89390 100644 --- a/ts2panda/tests/expression/partiallyemitted.test.ts +++ b/ts2panda/tests/expression/partiallyemitted.test.ts @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2023 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'; @@ -13,7 +28,17 @@ import { Sta, Mov, Stobjbyname, - Dec + Dec, + LdaStr, + Callarg1, + Stconsttoglobalrecord, + Defineclasswithbuffer, + Ldobjbyname, + Definemethod, + Stownbyvaluewithnameset, + Newobjrange, + Ldobjbyvalue, + Callthis0 } from "../../src/irnodes"; import { checkInstructions, SnippetCompiler } from "../utils/base"; import { creatAstFromSnippet } from "../utils/asthelper" @@ -40,7 +65,7 @@ describe("PartiallyEmittedExpressionTest", function () { expect(checkInstructions(insns, expected)).to.be.true; }); - it("nestingParenthesizedPartiallyExprTest", function () { + it("nestingParenthesizedPartiallyEmittedExprTest", function () { let snippetCompiler = new SnippetCompiler(); snippetCompiler.compileAfter( ` @@ -60,4 +85,61 @@ describe("PartiallyEmittedExpressionTest", function () { ]; expect(checkInstructions(insns, expected)).to.be.true; }); + + it("callPartiallyEmittedExprTest", function () { + let snippetCompiler = new SnippetCompiler(); + snippetCompiler.compileAfter( + ` + const sayHello = Symbol('sayHello') + class A { + [sayHello]() { + } + } + let a = new A(); + a[sayHello]!(); + `, 'test.ts'); + IRNode.pg = new PandaGen("", creatAstFromSnippet(""), 0, undefined); + let insns = snippetCompiler.getGlobalInsns(); + let expected = [ + new Tryldglobalbyname(new Imm(1), 'Symbol'), + new Sta(new VReg()), + new LdaStr('sayHello'), + new Sta(new VReg()), + new Lda(new VReg()), + new Callarg1(new Imm(1), new VReg()), + new Stconsttoglobalrecord(new Imm(1), 'sayHello'), + new Mov(new VReg(), new VReg()), + new Defineclasswithbuffer(new Imm(0), 'UnitTest.#1#A', 'test_1', new Imm(0), new VReg()), + new Sta(new VReg()), + new Tryldglobalbyname(new Imm(1), 'sayHello'), + new Sta(new VReg()), + new Sta(new VReg()), + new Lda(new VReg()), + new Ldobjbyname(new Imm(1), 'prototype'), + new Sta(new VReg()), + new Lda(new VReg()), + new Lda(new VReg()), + new Definemethod(new Imm(0), 'UnitTest.#2#', new Imm(0)), + new Sta(new VReg()), + new Stownbyvaluewithnameset(new Imm(1), new VReg(), new VReg()), + new Lda(new VReg()), + new Sttoglobalrecord(new Imm(1), 'A'), + new Tryldglobalbyname(new Imm(1), 'A'), + new Sta(new VReg()), + new Newobjrange(new Imm(1), new Imm(1), [new VReg()]), + new Sttoglobalrecord(new Imm(1), 'a'), + new Tryldglobalbyname(new Imm(1), 'a'), + new Sta(new VReg()), + new Tryldglobalbyname(new Imm(1), 'sayHello'), + new Sta(new VReg()), + new Lda(new VReg()), + new Ldobjbyvalue(new Imm(1), new VReg()), + new Sta(new VReg()), + new Lda(new VReg()), + new Callthis0(new Imm(1), new VReg()), + new Returnundefined() + ]; + expect(checkInstructions(insns, expected)).to.be.true; + + }); }); diff --git a/ts2panda/tests/utils/base.ts b/ts2panda/tests/utils/base.ts index 31017db4ad7..82def169076 100644 --- a/ts2panda/tests/utils/base.ts +++ b/ts2panda/tests/utils/base.ts @@ -32,7 +32,11 @@ import { setGlobalStrict } from "../../src/strictMode"; import { creatAstFromSnippet } from "./asthelper"; import { LiteralBuffer } from "../../src/base/literal"; import { CmdOptions } from "../../src/cmdOptions"; -import { transformCommonjsModule } from "../../src/base/util"; +import { + transformCommonjsModule, + makeNameForGeneratedNode, + resetUniqueNameIndex +} from "../../src/base/util"; const compileOptions = { outDir: "../tmp/build", @@ -189,13 +193,16 @@ export function compileAfterSnippet(snippet: string, name:string, isCommonJs: bo snippet, { compilerOptions : { - "target": ts.ScriptTarget.ES2015 + "target": ts.ScriptTarget.ES2015, + "experimentalDecorators": true }, fileName : name, transformers : { after : [ (ctx: ts.TransformationContext) => { return (sourceFile: ts.SourceFile) => { + resetUniqueNameIndex(); + makeNameForGeneratedNode(sourceFile); if (isCommonJs) { sourceFile = transformCommonjsModule(sourceFile); } -- Gitee