Skip to content

Commit 54d7ac3

Browse files
authored
Fix root level using statement not disposing object (#1633)
1 parent c836a36 commit 54d7ac3

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

src/transformation/pre-transformers/using-transformer.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import { LuaLibFeature, importLuaLibFeature } from "../utils/lualib";
55
export function usingTransformer(context: TransformationContext): ts.TransformerFactory<ts.SourceFile> {
66
return ctx => sourceFile => {
77
function visit(node: ts.Node): ts.Node {
8-
if (ts.isBlock(node)) {
8+
if (ts.isBlock(node) || ts.isSourceFile(node)) {
99
const [hasUsings, newStatements] = transformBlockWithUsing(context, node.statements, node);
1010
if (hasUsings) {
1111
// Recurse visitor into updated block to find further usings
12-
const updatedBlock = ts.factory.updateBlock(node, newStatements);
12+
const updatedBlock = ts.isBlock(node)
13+
? ts.factory.updateBlock(node, newStatements)
14+
: ts.factory.updateSourceFile(node, newStatements);
1315
const result = ts.visitEachChild(updatedBlock, visit, ctx);
1416

1517
// Set all the synthetic node parents to something that makes sense
@@ -29,7 +31,8 @@ export function usingTransformer(context: TransformationContext): ts.Transformer
2931
}
3032
return ts.visitEachChild(node, visit, ctx);
3133
}
32-
return ts.visitEachChild(sourceFile, visit, ctx);
34+
const transformedSourceFile = ts.visitEachChild(sourceFile, visit, ctx);
35+
return visit(transformedSourceFile) as ts.SourceFile;
3336
};
3437
}
3538

@@ -40,7 +43,7 @@ function isUsingDeclarationList(node: ts.Node): node is ts.VariableStatement {
4043
function transformBlockWithUsing(
4144
context: TransformationContext,
4245
statements: ts.NodeArray<ts.Statement> | ts.Statement[],
43-
block: ts.Block
46+
block: ts.Block | ts.SourceFile
4447
): [true, ts.Statement[]] | [false] {
4548
const newStatements: ts.Statement[] = [];
4649

@@ -102,7 +105,14 @@ function transformBlockWithUsing(
102105
call = ts.factory.createAwaitExpression(call);
103106
}
104107

105-
if (ts.isBlock(block.parent) && block.parent.statements[block.parent.statements.length - 1] !== block) {
108+
if (ts.isSourceFile(block)) {
109+
// If block is a sourcefile, don't insert a return statement into root code
110+
newStatements.push(ts.factory.createExpressionStatement(call));
111+
} else if (
112+
block.parent &&
113+
ts.isBlock(block.parent) &&
114+
block.parent.statements[block.parent.statements.length - 1] !== block
115+
) {
106116
// If this is a free-standing block in a function (not the last statement), dont return the value
107117
newStatements.push(ts.factory.createExpressionStatement(call));
108118
} else {

test/unit/using.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,19 @@ test("works with disposable classes (#1584)", () => {
217217
return log;
218218
`.expectToEqual(["action", "cleanup"]);
219219
});
220+
221+
// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1632
222+
test("works on root level (#1632)", () => {
223+
util.testModule`
224+
export let disposed = false;
225+
226+
class A {
227+
[Symbol.dispose] = function (this: A) {
228+
disposed = true;
229+
}
230+
}
231+
using a = new A();
232+
`.expectToEqual({
233+
disposed: true,
234+
});
235+
});

0 commit comments

Comments
 (0)