Skip to content

Commit 4ff6819

Browse files
ark120202Perryvw
authored andcommitted
Simplify const enum transform (#623)
* Simplify const enum transform * Rename getConstEnumValue to tryGetConstEnumValue
1 parent acd036b commit 4ff6819

File tree

2 files changed

+17
-52
lines changed

2 files changed

+17
-52
lines changed

src/LuaTransformer.ts

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3889,6 +3889,11 @@ export class LuaTransformer {
38893889
public transformPropertyAccessExpression(expression: ts.PropertyAccessExpression): ExpressionVisitResult {
38903890
const property = this.getIdentifierText(expression.name);
38913891

3892+
const constEnumValue = this.tryGetConstEnumValue(expression);
3893+
if (constEnumValue) {
3894+
return constEnumValue;
3895+
}
3896+
38923897
// Check for primitive types to override
38933898
const type = this.checker.getTypeAtLocation(expression.expression);
38943899
if (tsHelper.isStringType(type)) {
@@ -3898,8 +3903,6 @@ export class LuaTransformer {
38983903
if (arrayPropertyAccess) {
38993904
return arrayPropertyAccess;
39003905
}
3901-
} else if (type.symbol && type.symbol.flags & ts.SymbolFlags.ConstEnum) {
3902-
return this.transformConstEnumValue(type, property, expression);
39033906
}
39043907

39053908
this.checkForLuaLibType(type);
@@ -4062,16 +4065,12 @@ export class LuaTransformer {
40624065
const table = this.transformExpression(expression.expression);
40634066
const index = this.transformExpression(expression.argumentExpression);
40644067

4065-
const type = this.checker.getTypeAtLocation(expression.expression);
4066-
4067-
if (
4068-
type.symbol &&
4069-
type.symbol.flags & ts.SymbolFlags.ConstEnum &&
4070-
ts.isStringLiteral(expression.argumentExpression)
4071-
) {
4072-
return this.transformConstEnumValue(type, expression.argumentExpression.text, expression);
4068+
const constEnumValue = this.tryGetConstEnumValue(expression);
4069+
if (constEnumValue) {
4070+
return constEnumValue;
40734071
}
40744072

4073+
const type = this.checker.getTypeAtLocation(expression.expression);
40754074
if (tsHelper.isArrayType(type, this.checker, this.program)) {
40764075
return tstl.createTableIndexExpression(table, this.expressionPlusOne(index), expression);
40774076
} else if (tsHelper.isStringType(type)) {
@@ -4085,46 +4084,15 @@ export class LuaTransformer {
40854084
}
40864085
}
40874086

4088-
protected transformConstEnumValue(
4089-
enumType: ts.EnumType,
4090-
memberName: string,
4091-
tsOriginal: ts.Node
4092-
): ExpressionVisitResult {
4093-
// Assumption: the enum only has one declaration
4094-
const enumDeclaration = enumType.symbol.declarations.find(d => ts.isEnumDeclaration(d)) as ts.EnumDeclaration;
4095-
const enumMember = enumDeclaration.members.find(m => ts.isIdentifier(m.name) && m.name.text === memberName);
4096-
4097-
if (enumMember) {
4098-
if (enumMember.initializer) {
4099-
if (ts.isIdentifier(enumMember.initializer)) {
4100-
const [isEnumMember, valueName] = tsHelper.isEnumMember(enumDeclaration, enumMember.initializer);
4101-
if (isEnumMember && valueName) {
4102-
if (ts.isIdentifier(valueName)) {
4103-
return this.transformConstEnumValue(enumType, valueName.text, tsOriginal);
4104-
}
4105-
} else {
4106-
return tstl.setNodeOriginal(this.transformExpression(enumMember.initializer), tsOriginal);
4107-
}
4108-
} else {
4109-
return tstl.setNodeOriginal(this.transformExpression(enumMember.initializer), tsOriginal);
4110-
}
4111-
} else {
4112-
let enumValue = 0;
4113-
for (const member of enumDeclaration.members) {
4114-
if (member === enumMember) {
4115-
return tstl.createNumericLiteral(enumValue, tsOriginal);
4116-
}
4117-
if (member.initializer === undefined) {
4118-
enumValue++;
4119-
} else if (ts.isNumericLiteral(member.initializer)) {
4120-
enumValue = Number(member.initializer.text) + 1;
4121-
}
4122-
}
4123-
4124-
throw TSTLErrors.CouldNotFindEnumMember(enumDeclaration, memberName, tsOriginal);
4125-
}
4087+
private tryGetConstEnumValue(
4088+
node: ts.PropertyAccessExpression | ts.ElementAccessExpression
4089+
): tstl.Expression | undefined {
4090+
const value = this.checker.getConstantValue(node);
4091+
if (typeof value === "string") {
4092+
return tstl.createStringLiteral(value, node);
4093+
} else if (typeof value === "number") {
4094+
return tstl.createNumericLiteral(value, node);
41264095
}
4127-
throw TSTLErrors.CouldNotFindEnumMember(enumDeclaration, memberName, tsOriginal);
41284096
}
41294097

41304098
protected transformStringCallExpression(node: ts.CallExpression): tstl.Expression {

src/TSTLErrors.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ export class TSTLErrors {
88
public static CouldNotCast = (castName: string) =>
99
new Error(`Failed to cast all elements to expected type using ${castName}.`);
1010

11-
public static CouldNotFindEnumMember = (enumDeclaration: ts.EnumDeclaration, enumMember: string, node: ts.Node) =>
12-
new TranspileError(`Could not find ${enumMember} in ${enumDeclaration.name.text}`, node);
13-
1411
public static DefaultImportsNotSupported = (node: ts.Node) =>
1512
new TranspileError(`Default Imports are not supported, please use named imports instead!`, node);
1613

0 commit comments

Comments
 (0)