diff --git a/src/transformation/visitors/identifier.ts b/src/transformation/visitors/identifier.ts index 565c0625b..b9097b962 100644 --- a/src/transformation/visitors/identifier.ts +++ b/src/transformation/visitors/identifier.ts @@ -4,7 +4,7 @@ import { transformBuiltinIdentifierExpression } from "../builtins"; import { FunctionVisitor, TransformationContext } from "../context"; import { isForRangeType } from "../utils/annotations"; import { InvalidForRangeCall } from "../utils/errors"; -import { createExportedIdentifier, getIdentifierExportScope } from "../utils/export"; +import { createExportedIdentifier, getSymbolExportScope } from "../utils/export"; import { createSafeName, hasUnsafeIdentifierName } from "../utils/safe-names"; import { getIdentifierSymbolId } from "../utils/symbols"; import { findFirstNodeAbove } from "../utils/typescript"; @@ -27,12 +27,16 @@ export function transformIdentifier(context: TransformationContext, identifier: } export const transformIdentifierExpression: FunctionVisitor = (node, context) => { - // TODO: Move below to avoid extra transforms? - const identifier = transformIdentifier(context, node); - - const exportScope = getIdentifierExportScope(context, identifier); - if (exportScope) { - return createExportedIdentifier(context, identifier, exportScope); + const symbol = context.checker.getSymbolAtLocation(node); + if (symbol) { + const exportScope = getSymbolExportScope(context, symbol); + if (exportScope) { + const name = symbol.name; + const text = hasUnsafeIdentifierName(context, node) ? createSafeName(name) : name; + const symbolId = getIdentifierSymbolId(context, node); + const identifier = lua.createIdentifier(text, node, symbolId, name); + return createExportedIdentifier(context, identifier, exportScope); + } } if (node.originalKeywordKind === ts.SyntaxKind.UndefinedKeyword) { @@ -44,5 +48,5 @@ export const transformIdentifierExpression: FunctionVisitor = (no return builtinResult; } - return identifier; + return transformIdentifier(context, node); }; diff --git a/test/unit/modules/modules.spec.ts b/test/unit/modules/modules.spec.ts index 6b9f09c54..14cea1337 100644 --- a/test/unit/modules/modules.spec.ts +++ b/test/unit/modules/modules.spec.ts @@ -272,3 +272,24 @@ test("export dependency modified in for in loop", () => { .setReturnExport("bar") .expectToEqual("x"); }); + +test("export default class with future reference", () => { + util.testModule` + export default class Default {} + const d = new Default(); + export const result = d.constructor.name; + ` + .setReturnExport("result") + .expectToMatchJsResult(); +}); + +test("export default function with future reference", () => { + util.testModule` + export default function defaultFunction() { + return true; + } + export const result = defaultFunction(); + ` + .setReturnExport("result") + .expectToMatchJsResult(); +});