diff --git a/src/transformation/pre-transformers/using-transformer.ts b/src/transformation/pre-transformers/using-transformer.ts index 51908a40a..d78f6206a 100644 --- a/src/transformation/pre-transformers/using-transformer.ts +++ b/src/transformation/pre-transformers/using-transformer.ts @@ -18,7 +18,7 @@ export function usingTransformer(context: TransformationContext): ts.Transformer ts.setParent(node2, parent[parent.length - 1]); parent.push(node2); ts.visitEachChild(node2, setParent, ctx); - parent.push(); + parent.pop(); return node2; } ts.visitEachChild(updatedBlock, setParent, ctx); @@ -74,12 +74,13 @@ function transformBlockWithUsing( ); const callback = ts.factory.createFunctionExpression( - undefined, + // Put async keyword in front of callback when we are in an async using + isAwaitUsing ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] : undefined, undefined, undefined, undefined, variableNames, - undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), // Required for TS to not freak out trying to infer the type of synthetic nodes callbackBody ); diff --git a/test/unit/using.spec.ts b/test/unit/using.spec.ts index c43120bd6..5182b8928 100644 --- a/test/unit/using.spec.ts +++ b/test/unit/using.spec.ts @@ -175,3 +175,21 @@ test("await using can handle non-async disposables", () => { .setTsHeader(usingTestLib) .expectToEqual({ logs: ["Creating a", "function content", "Disposing a"] }); }); + +// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1571 +test("await using no extra diagnostics (#1571)", () => { + util.testModule` + async function getResource(): Promise { + return { + [Symbol.asyncDispose]: async () => {} + }; + } + + async function someOtherAsync() {} + + async function main() { + await using resource = await getResource(); + await someOtherAsync(); + } + `.expectToHaveNoDiagnostics(); +});