From f95d6f207da59083933675f45f99d629129c2170 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sat, 25 May 2019 21:12:07 +0200 Subject: [PATCH 1/6] Added support for importequals declaration --- src/LuaTransformer.ts | 35 +++++++++++++++++++++++++++++ test/unit/declarations.spec.ts | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index d46b5d107..0a35db05b 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -166,6 +166,8 @@ export class LuaTransformer { return this.transformExportDeclaration(node as ts.ExportDeclaration); case ts.SyntaxKind.ImportDeclaration: return this.transformImportDeclaration(node as ts.ImportDeclaration); + case ts.SyntaxKind.ImportEqualsDeclaration: + return this.transformImportEqualsDeclaration(node as ts.ImportEqualsDeclaration); case ts.SyntaxKind.ClassDeclaration: return this.transformClassDeclaration(node as ts.ClassDeclaration); case ts.SyntaxKind.ModuleDeclaration: @@ -471,6 +473,39 @@ export class LuaTransformer { } } + public transformImportEqualsDeclaration(declaration: ts.ImportEqualsDeclaration): StatementVisitResult { + const name = this.transformIdentifier(declaration.name); + const expression = this.transformModuleReference(declaration.moduleReference); + + return tstl.createVariableDeclarationStatement(name, expression, declaration); + } + + public transformModuleReference(moduleReference: ts.ModuleReference): ExpressionVisitResult { + return ts.isExternalModuleReference(moduleReference) + ? this.transformExternalModuleReference(moduleReference) + : this.transformEntityName(moduleReference); + } + + public transformExternalModuleReference( + externalModuleReference: ts.ExternalModuleReference + ): ExpressionVisitResult { + return this.transformExpression(externalModuleReference.expression); + } + + public transformEntityName(entityName: ts.EntityName): ExpressionVisitResult { + return ts.isQualifiedName(entityName) + ? this.transformQualifiedName(entityName) + : this.transformIdentifier(entityName); + } + + public transformQualifiedName(qualifiedName: ts.QualifiedName): ExpressionVisitResult { + const right = this.transformIdentifier(qualifiedName.right); + const rightLiteral = tstl.createStringLiteral(right.text, qualifiedName.right); + const left = this.transformEntityName(qualifiedName.left); + + return tstl.createTableIndexExpression(left, rightLiteral, qualifiedName); + } + public transformClassDeclaration( statement: ts.ClassLikeDeclaration, nameOverride?: tstl.Identifier diff --git a/test/unit/declarations.spec.ts b/test/unit/declarations.spec.ts index a4181b009..3a6636ab7 100644 --- a/test/unit/declarations.spec.ts +++ b/test/unit/declarations.spec.ts @@ -92,3 +92,44 @@ test("Declaration instance function callback", () => { const result = util.transpileAndExecute(source, undefined, libLua, tsHeader); expect(result).toBe(20); }); + +test("ImportEquals declaration", () => { + const header = ` + namespace outerNamespace { + export namespace innerNamespace { + export function func() { return "foo" } + } + }; + + import importedFunc = outerNamespace.innerNamespace.func; + `; + + const execution = `return importedFunc();`; + + const result = util.transpileAndExecute(execution, undefined, undefined, header); + expect(result).toBe("foo"); +}); + +test("ImportEquals declaration ambient", () => { + const header = ` + declare namespace outerNamespace { + namespace innerNamespace { + function func(): string; + } + }; + + import importedFunc = outerNamespace.innerNamespace.func; + `; + + const luaHeader = `outerNamespace = { + innerNamespace = { + func = function() return "foo" end + } + } + `; + + const execution = `return importedFunc();`; + + const result = util.transpileAndExecute(execution, undefined, luaHeader, header); + expect(result).toBe("foo"); +}); From cb1b1f38cce2577fadc171544f430ca622fb1b24 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sun, 26 May 2019 12:12:04 +0200 Subject: [PATCH 2/6] made importequalsdeclaration hoistable --- src/LuaTransformer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index 0a35db05b..c4f89a0a9 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -477,7 +477,11 @@ export class LuaTransformer { const name = this.transformIdentifier(declaration.name); const expression = this.transformModuleReference(declaration.moduleReference); - return tstl.createVariableDeclarationStatement(name, expression, declaration); + return this.createHoistableVariableDeclarationStatement( + name, + expression, + declaration + ); } public transformModuleReference(moduleReference: ts.ModuleReference): ExpressionVisitResult { From 378edfb296e7cf51e00c5c9563d05ed00bd23a63 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sun, 26 May 2019 12:50:10 +0200 Subject: [PATCH 3/6] Got rid of a visitor method and used getIdentifierText --- src/LuaTransformer.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index c4f89a0a9..4243286e7 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -475,7 +475,9 @@ export class LuaTransformer { public transformImportEqualsDeclaration(declaration: ts.ImportEqualsDeclaration): StatementVisitResult { const name = this.transformIdentifier(declaration.name); - const expression = this.transformModuleReference(declaration.moduleReference); + const expression = ts.isExternalModuleReference(declaration.moduleReference) + ? this.transformExternalModuleReference(declaration.moduleReference) + : this.transformEntityName(declaration.moduleReference); return this.createHoistableVariableDeclarationStatement( name, @@ -484,30 +486,23 @@ export class LuaTransformer { ); } - public transformModuleReference(moduleReference: ts.ModuleReference): ExpressionVisitResult { - return ts.isExternalModuleReference(moduleReference) - ? this.transformExternalModuleReference(moduleReference) - : this.transformEntityName(moduleReference); - } - public transformExternalModuleReference( externalModuleReference: ts.ExternalModuleReference ): ExpressionVisitResult { return this.transformExpression(externalModuleReference.expression); } - public transformEntityName(entityName: ts.EntityName): ExpressionVisitResult { + private transformEntityName(entityName: ts.EntityName): ExpressionVisitResult { return ts.isQualifiedName(entityName) ? this.transformQualifiedName(entityName) : this.transformIdentifier(entityName); } public transformQualifiedName(qualifiedName: ts.QualifiedName): ExpressionVisitResult { - const right = this.transformIdentifier(qualifiedName.right); - const rightLiteral = tstl.createStringLiteral(right.text, qualifiedName.right); + const right = tstl.createStringLiteral(this.getIdentifierText(qualifiedName.right), qualifiedName.right); const left = this.transformEntityName(qualifiedName.left); - return tstl.createTableIndexExpression(left, rightLiteral, qualifiedName); + return tstl.createTableIndexExpression(left, right, qualifiedName); } public transformClassDeclaration( @@ -3953,7 +3948,7 @@ export class LuaTransformer { } public transformPropertyAccessExpression(expression: ts.PropertyAccessExpression): ExpressionVisitResult { - const property = expression.name.text; + const property = this.getIdentifierText(expression.name); // Check for primitive types to override const type = this.checker.getTypeAtLocation(expression.expression); From 30279bd887247a91e8cdcbf8c5b4ad58b0e17374 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sun, 26 May 2019 12:57:56 +0200 Subject: [PATCH 4/6] Changed transformIdentifier to transformIdentifierExpression --- src/LuaTransformer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index 4243286e7..350b51bce 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -495,7 +495,7 @@ export class LuaTransformer { private transformEntityName(entityName: ts.EntityName): ExpressionVisitResult { return ts.isQualifiedName(entityName) ? this.transformQualifiedName(entityName) - : this.transformIdentifier(entityName); + : this.transformIdentifierExpression(entityName); } public transformQualifiedName(qualifiedName: ts.QualifiedName): ExpressionVisitResult { From 047cfe73098d6a6e08a2119708cfdc7e2e0c6f65 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 27 May 2019 21:28:17 +0200 Subject: [PATCH 5/6] Added test with import equals and require --- src/LuaTransformer.ts | 6 +++++- test/unit/declarations.spec.ts | 11 +++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index 350b51bce..6c900a950 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -489,7 +489,11 @@ export class LuaTransformer { public transformExternalModuleReference( externalModuleReference: ts.ExternalModuleReference ): ExpressionVisitResult { - return this.transformExpression(externalModuleReference.expression); + return tstl.createCallExpression( + tstl.createIdentifier("require"), + [this.transformExpression(externalModuleReference.expression)], + externalModuleReference + ); } private transformEntityName(entityName: ts.EntityName): ExpressionVisitResult { diff --git a/test/unit/declarations.spec.ts b/test/unit/declarations.spec.ts index 3a6636ab7..d0245dae0 100644 --- a/test/unit/declarations.spec.ts +++ b/test/unit/declarations.spec.ts @@ -107,7 +107,7 @@ test("ImportEquals declaration", () => { const execution = `return importedFunc();`; const result = util.transpileAndExecute(execution, undefined, undefined, header); - expect(result).toBe("foo"); + expect(result).toEqual("foo"); }); test("ImportEquals declaration ambient", () => { @@ -131,5 +131,12 @@ test("ImportEquals declaration ambient", () => { const execution = `return importedFunc();`; const result = util.transpileAndExecute(execution, undefined, luaHeader, header); - expect(result).toBe("foo"); + expect(result).toEqual("foo"); +}); + +test("ImportEquals declaration require", () => { + const source = `import foo = require("bar");`; + + const result = util.transpileString(source); + expect(result.includes(`local foo = require("bar")`)).toBeTruthy(); }); From e8e2bbb5a1f2b3badad586e4df5f4501906bed6f Mon Sep 17 00:00:00 2001 From: Perryvw Date: Mon, 27 May 2019 21:31:57 +0200 Subject: [PATCH 6/6] Prettier format --- src/LuaTransformer.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/LuaTransformer.ts b/src/LuaTransformer.ts index ee281867f..cd88c9553 100644 --- a/src/LuaTransformer.ts +++ b/src/LuaTransformer.ts @@ -466,11 +466,7 @@ export class LuaTransformer { ? this.transformExternalModuleReference(declaration.moduleReference) : this.transformEntityName(declaration.moduleReference); - return this.createHoistableVariableDeclarationStatement( - name, - expression, - declaration - ); + return this.createHoistableVariableDeclarationStatement(name, expression, declaration); } public transformExternalModuleReference(