From 538e6753666c0b67285a74766fce7c8d521ef581 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 26 Apr 2021 15:23:03 +0200 Subject: [PATCH 1/4] Failing test --- .../plugins/__snapshots__/plugins.spec.ts.snap | 10 ++++++++++ test/transpile/plugins/plugins.spec.ts | 13 +++++++++++++ test/transpile/plugins/transformer-plugin.js | 15 +++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 test/transpile/plugins/transformer-plugin.js diff --git a/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap b/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap index 9902416ab..edbd699d1 100644 --- a/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap +++ b/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap @@ -1,5 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`namespace with TS transformer plugin 1`] = ` +"local ____exports = {} +do + function ns.returnsBool(self) + return true + end +end +return ____exports" +`; + exports[`statement comments 1`] = ` "local ____exports = {} function ____exports.__main(self) diff --git a/test/transpile/plugins/plugins.spec.ts b/test/transpile/plugins/plugins.spec.ts index 46988dae0..721c9d3ac 100644 --- a/test/transpile/plugins/plugins.spec.ts +++ b/test/transpile/plugins/plugins.spec.ts @@ -40,3 +40,16 @@ test("statement comments", () => { .setOptions({ luaPlugins: [{ name: path.join(__dirname, "add-comments.ts") }] }) .expectLuaToMatchSnapshot(); }); + +test("namespace with TS transformer plugin", () => { + util.testModule` + export namespace ns { + export function returnsBool() { + return false; + } + } + ` + .setOptions({ plugins: [{ transform: path.join(__dirname, "transformer-plugin.js") }] }) + .expectNoExecutionError() + .expectLuaToMatchSnapshot(); +}); diff --git a/test/transpile/plugins/transformer-plugin.js b/test/transpile/plugins/transformer-plugin.js new file mode 100644 index 000000000..83089e07d --- /dev/null +++ b/test/transpile/plugins/transformer-plugin.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +const ts = tslib_1.__importStar(require("typescript")); + +const replaceNode = (node) => { + if (ts.isReturnStatement(node)) { + return ts.factory.createReturnStatement(ts.factory.createTrue()); + } +}; +const createTransformer = () => (context) => { + const visit = (node) => replaceNode(node) || ts.visitEachChild(node, visit, context); + return (file) => ts.visitNode(file, visit); +}; +exports.default = createTransformer; \ No newline at end of file From 4bba5a718f87911b7d5ee8b5842991e809e2e06c Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 26 Apr 2021 16:31:46 +0200 Subject: [PATCH 2/4] Fixed bug #1013 --- src/transformation/visitors/namespace.ts | 2 +- .../__snapshots__/plugins.spec.ts.snap | 10 ---------- test/transpile/plugins/plugins.spec.ts | 20 +++++++++++-------- test/transpile/plugins/transformer-plugin.js | 3 +++ 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/transformation/visitors/namespace.ts b/src/transformation/visitors/namespace.ts index 0244ac21c..7ee32adac 100644 --- a/src/transformation/visitors/namespace.ts +++ b/src/transformation/visitors/namespace.ts @@ -76,7 +76,7 @@ export const transformModuleDeclaration: FunctionVisitor = const isFirstDeclaration = symbol === undefined || (!symbol.declarations.some(d => ts.isClassLike(d) || ts.isFunctionDeclaration(d)) && - node === symbol.declarations.find(ts.isModuleDeclaration)); + ts.getOriginalNode(node) === symbol.declarations.find(ts.isModuleDeclaration)); if (isNonModuleMergeable) { // 'local NS = NS or {}' or 'exportTable.NS = exportTable.NS or {}' diff --git a/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap b/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap index edbd699d1..9902416ab 100644 --- a/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap +++ b/test/transpile/plugins/__snapshots__/plugins.spec.ts.snap @@ -1,15 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`namespace with TS transformer plugin 1`] = ` -"local ____exports = {} -do - function ns.returnsBool(self) - return true - end -end -return ____exports" -`; - exports[`statement comments 1`] = ` "local ____exports = {} function ____exports.__main(self) diff --git a/test/transpile/plugins/plugins.spec.ts b/test/transpile/plugins/plugins.spec.ts index 721c9d3ac..5768cba0f 100644 --- a/test/transpile/plugins/plugins.spec.ts +++ b/test/transpile/plugins/plugins.spec.ts @@ -41,15 +41,19 @@ test("statement comments", () => { .expectLuaToMatchSnapshot(); }); -test("namespace with TS transformer plugin", () => { +// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1013 +test.each(["namespace", "module"])("%s with TS transformer plugin", moduleOrNamespace => { util.testModule` - export namespace ns { - export function returnsBool() { - return false; - } - } + import { ns } from "module"; + export const result = ns.returnsBool(); ` + .addExtraFile("module.ts", ` + export ${moduleOrNamespace} ns { + export function returnsBool() { + return false; + } + } + `) .setOptions({ plugins: [{ transform: path.join(__dirname, "transformer-plugin.js") }] }) - .expectNoExecutionError() - .expectLuaToMatchSnapshot(); + .expectNoExecutionError(); }); diff --git a/test/transpile/plugins/transformer-plugin.js b/test/transpile/plugins/transformer-plugin.js index 83089e07d..6b98be544 100644 --- a/test/transpile/plugins/transformer-plugin.js +++ b/test/transpile/plugins/transformer-plugin.js @@ -1,3 +1,6 @@ +/** + * This is a TS tranformer plugin that replaces any return statement to 'return true'. + */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); From 1d1a8c786b41eebbeb33eca782f3cb2977d4ce64 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 26 Apr 2021 16:37:47 +0200 Subject: [PATCH 3/4] Fix prettier --- test/transpile/plugins/plugins.spec.ts | 7 +++++-- test/transpile/plugins/transformer-plugin.js | 10 +++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/test/transpile/plugins/plugins.spec.ts b/test/transpile/plugins/plugins.spec.ts index 5768cba0f..045ad1360 100644 --- a/test/transpile/plugins/plugins.spec.ts +++ b/test/transpile/plugins/plugins.spec.ts @@ -47,13 +47,16 @@ test.each(["namespace", "module"])("%s with TS transformer plugin", moduleOrName import { ns } from "module"; export const result = ns.returnsBool(); ` - .addExtraFile("module.ts", ` + .addExtraFile( + "module.ts", + ` export ${moduleOrNamespace} ns { export function returnsBool() { return false; } } - `) + ` + ) .setOptions({ plugins: [{ transform: path.join(__dirname, "transformer-plugin.js") }] }) .expectNoExecutionError(); }); diff --git a/test/transpile/plugins/transformer-plugin.js b/test/transpile/plugins/transformer-plugin.js index 6b98be544..58dc6e98c 100644 --- a/test/transpile/plugins/transformer-plugin.js +++ b/test/transpile/plugins/transformer-plugin.js @@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts = tslib_1.__importStar(require("typescript")); -const replaceNode = (node) => { +const replaceNode = node => { if (ts.isReturnStatement(node)) { return ts.factory.createReturnStatement(ts.factory.createTrue()); } }; -const createTransformer = () => (context) => { - const visit = (node) => replaceNode(node) || ts.visitEachChild(node, visit, context); - return (file) => ts.visitNode(file, visit); +const createTransformer = () => context => { + const visit = node => replaceNode(node) || ts.visitEachChild(node, visit, context); + return file => ts.visitNode(file, visit); }; -exports.default = createTransformer; \ No newline at end of file +exports.default = createTransformer; From 907b97c93f733c0e713ea1a38d041535c2e384e9 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 3 May 2021 19:17:24 +0200 Subject: [PATCH 4/4] Switched transformer plugin to TS instead of JS --- test/transpile/plugins/plugins.spec.ts | 2 +- test/transpile/plugins/transformer-plugin.js | 18 ------------------ test/transpile/plugins/transformer-plugin.ts | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 test/transpile/plugins/transformer-plugin.js create mode 100644 test/transpile/plugins/transformer-plugin.ts diff --git a/test/transpile/plugins/plugins.spec.ts b/test/transpile/plugins/plugins.spec.ts index 045ad1360..eaaee3dca 100644 --- a/test/transpile/plugins/plugins.spec.ts +++ b/test/transpile/plugins/plugins.spec.ts @@ -57,6 +57,6 @@ test.each(["namespace", "module"])("%s with TS transformer plugin", moduleOrName } ` ) - .setOptions({ plugins: [{ transform: path.join(__dirname, "transformer-plugin.js") }] }) + .setOptions({ plugins: [{ transform: path.join(__dirname, "transformer-plugin.ts") }] }) .expectNoExecutionError(); }); diff --git a/test/transpile/plugins/transformer-plugin.js b/test/transpile/plugins/transformer-plugin.js deleted file mode 100644 index 58dc6e98c..000000000 --- a/test/transpile/plugins/transformer-plugin.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * This is a TS tranformer plugin that replaces any return statement to 'return true'. - */ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = require("tslib"); -const ts = tslib_1.__importStar(require("typescript")); - -const replaceNode = node => { - if (ts.isReturnStatement(node)) { - return ts.factory.createReturnStatement(ts.factory.createTrue()); - } -}; -const createTransformer = () => context => { - const visit = node => replaceNode(node) || ts.visitEachChild(node, visit, context); - return file => ts.visitNode(file, visit); -}; -exports.default = createTransformer; diff --git a/test/transpile/plugins/transformer-plugin.ts b/test/transpile/plugins/transformer-plugin.ts new file mode 100644 index 000000000..8b338723c --- /dev/null +++ b/test/transpile/plugins/transformer-plugin.ts @@ -0,0 +1,15 @@ +/** + * This is a TS tranformer plugin that replaces any return statement to 'return true'. + */ +import * as ts from "typescript"; + +const replaceNode = (node: ts.Node) => { + if (ts.isReturnStatement(node)) { + return ts.factory.createReturnStatement(ts.factory.createTrue()); + } +}; +const createTransformer = () => (context: ts.TransformationContext) => { + const visit = (node: ts.Node): ts.Node => replaceNode(node) ?? ts.visitEachChild(node, visit, context); + return (file: ts.SourceFile) => ts.visitNode(file, visit); +}; +exports.default = createTransformer;