X Tutup
Skip to content

Commit 8733a3e

Browse files
Fix default exports reference bug (#830)
* Use escaped symbol names to reference default exports * Update src/transformation/visitors/identifier.ts Co-Authored-By: ark120202 <ark120202@gmail.com> * Move logic to transformIdentifierExpression * Use extra if in identifier expression Co-authored-by: ark120202 <ark120202@gmail.com>
1 parent 770d5ff commit 8733a3e

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

src/transformation/visitors/identifier.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { transformBuiltinIdentifierExpression } from "../builtins";
44
import { FunctionVisitor, TransformationContext } from "../context";
55
import { isForRangeType } from "../utils/annotations";
66
import { InvalidForRangeCall } from "../utils/errors";
7-
import { createExportedIdentifier, getIdentifierExportScope } from "../utils/export";
7+
import { createExportedIdentifier, getSymbolExportScope } from "../utils/export";
88
import { createSafeName, hasUnsafeIdentifierName } from "../utils/safe-names";
99
import { getIdentifierSymbolId } from "../utils/symbols";
1010
import { findFirstNodeAbove } from "../utils/typescript";
@@ -27,12 +27,16 @@ export function transformIdentifier(context: TransformationContext, identifier:
2727
}
2828

2929
export const transformIdentifierExpression: FunctionVisitor<ts.Identifier> = (node, context) => {
30-
// TODO: Move below to avoid extra transforms?
31-
const identifier = transformIdentifier(context, node);
32-
33-
const exportScope = getIdentifierExportScope(context, identifier);
34-
if (exportScope) {
35-
return createExportedIdentifier(context, identifier, exportScope);
30+
const symbol = context.checker.getSymbolAtLocation(node);
31+
if (symbol) {
32+
const exportScope = getSymbolExportScope(context, symbol);
33+
if (exportScope) {
34+
const name = symbol.name;
35+
const text = hasUnsafeIdentifierName(context, node) ? createSafeName(name) : name;
36+
const symbolId = getIdentifierSymbolId(context, node);
37+
const identifier = lua.createIdentifier(text, node, symbolId, name);
38+
return createExportedIdentifier(context, identifier, exportScope);
39+
}
3640
}
3741

3842
if (node.originalKeywordKind === ts.SyntaxKind.UndefinedKeyword) {
@@ -44,5 +48,5 @@ export const transformIdentifierExpression: FunctionVisitor<ts.Identifier> = (no
4448
return builtinResult;
4549
}
4650

47-
return identifier;
51+
return transformIdentifier(context, node);
4852
};

test/unit/modules/modules.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,24 @@ test("export dependency modified in for in loop", () => {
272272
.setReturnExport("bar")
273273
.expectToEqual("x");
274274
});
275+
276+
test("export default class with future reference", () => {
277+
util.testModule`
278+
export default class Default {}
279+
const d = new Default();
280+
export const result = d.constructor.name;
281+
`
282+
.setReturnExport("result")
283+
.expectToMatchJsResult();
284+
});
285+
286+
test("export default function with future reference", () => {
287+
util.testModule`
288+
export default function defaultFunction() {
289+
return true;
290+
}
291+
export const result = defaultFunction();
292+
`
293+
.setReturnExport("result")
294+
.expectToMatchJsResult();
295+
});

0 commit comments

Comments
 (0)
X Tutup