@@ -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 {
0 commit comments