From 6dab5f7bf536ca082d4bf51a053c59dc85b2196c Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Tue, 25 Feb 2020 17:05:44 +1000 Subject: [PATCH 1/4] Use escaped symbol names to reference default exports --- src/transformation/visitors/identifier.ts | 6 ++++-- test/unit/modules/modules.spec.ts | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/transformation/visitors/identifier.ts b/src/transformation/visitors/identifier.ts index 565c0625b..923d407ee 100644 --- a/src/transformation/visitors/identifier.ts +++ b/src/transformation/visitors/identifier.ts @@ -20,10 +20,12 @@ export function transformIdentifier(context: TransformationContext, identifier: } } - const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(identifier.text) : identifier.text; + const symbol = context.checker.getSymbolAtLocation(identifier); + const name = symbol ? ts.unescapeLeadingUnderscores(symbol.escapedName) : identifier.text; + const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(name) : name; const symbolId = getIdentifierSymbolId(context, identifier); - return lua.createIdentifier(text, identifier, symbolId, identifier.text); + return lua.createIdentifier(text, identifier, symbolId, name); } export const transformIdentifierExpression: FunctionVisitor = (node, context) => { 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(); +}); From d34e387904725348126ed28b236f0ad95cc93cbf Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Wed, 26 Feb 2020 09:57:59 +1000 Subject: [PATCH 2/4] Update src/transformation/visitors/identifier.ts Co-Authored-By: ark120202 --- src/transformation/visitors/identifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transformation/visitors/identifier.ts b/src/transformation/visitors/identifier.ts index 923d407ee..34f3a0f4d 100644 --- a/src/transformation/visitors/identifier.ts +++ b/src/transformation/visitors/identifier.ts @@ -21,7 +21,7 @@ export function transformIdentifier(context: TransformationContext, identifier: } const symbol = context.checker.getSymbolAtLocation(identifier); - const name = symbol ? ts.unescapeLeadingUnderscores(symbol.escapedName) : identifier.text; + const name = symbol?.name ?? identifier.text; const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(name) : name; const symbolId = getIdentifierSymbolId(context, identifier); From f3d5018a5e5eaf4c5314963fa4269c8fcca6e06b Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Wed, 26 Feb 2020 14:43:48 +1000 Subject: [PATCH 3/4] Move logic to transformIdentifierExpression --- src/transformation/visitors/identifier.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/transformation/visitors/identifier.ts b/src/transformation/visitors/identifier.ts index 34f3a0f4d..c6146eb5f 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"; @@ -20,21 +20,21 @@ export function transformIdentifier(context: TransformationContext, identifier: } } - const symbol = context.checker.getSymbolAtLocation(identifier); - const name = symbol?.name ?? identifier.text; - const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(name) : name; + const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(identifier.text) : identifier.text; const symbolId = getIdentifierSymbolId(context, identifier); - return lua.createIdentifier(text, identifier, symbolId, name); + return lua.createIdentifier(text, identifier, symbolId, identifier.text); } export const transformIdentifierExpression: FunctionVisitor = (node, context) => { - // TODO: Move below to avoid extra transforms? - const identifier = transformIdentifier(context, node); - - const exportScope = getIdentifierExportScope(context, identifier); + const symbol = context.checker.getSymbolAtLocation(node); + const exportScope = symbol ? getSymbolExportScope(context, symbol) : undefined; if (exportScope) { - return createExportedIdentifier(context, identifier, exportScope); + const name = symbol?.name ?? node.text; + const text = hasUnsafeIdentifierName(context, node) ? createSafeName(name) : name; + + const symbolId = getIdentifierSymbolId(context, node); + return createExportedIdentifier(context, lua.createIdentifier(text, node, symbolId, name), exportScope); } if (node.originalKeywordKind === ts.SyntaxKind.UndefinedKeyword) { @@ -46,5 +46,5 @@ export const transformIdentifierExpression: FunctionVisitor = (no return builtinResult; } - return identifier; + return transformIdentifier(context, node); }; From 0e56c3b856cb77495ea09b38b49e878599ee3cf6 Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Wed, 26 Feb 2020 14:50:29 +1000 Subject: [PATCH 4/4] Use extra if in identifier expression --- src/transformation/visitors/identifier.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/transformation/visitors/identifier.ts b/src/transformation/visitors/identifier.ts index c6146eb5f..b9097b962 100644 --- a/src/transformation/visitors/identifier.ts +++ b/src/transformation/visitors/identifier.ts @@ -28,13 +28,15 @@ export function transformIdentifier(context: TransformationContext, identifier: export const transformIdentifierExpression: FunctionVisitor = (node, context) => { const symbol = context.checker.getSymbolAtLocation(node); - const exportScope = symbol ? getSymbolExportScope(context, symbol) : undefined; - if (exportScope) { - const name = symbol?.name ?? node.text; - const text = hasUnsafeIdentifierName(context, node) ? createSafeName(name) : name; - - const symbolId = getIdentifierSymbolId(context, node); - return createExportedIdentifier(context, lua.createIdentifier(text, node, symbolId, name), exportScope); + 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) {