diff --git a/ets2panda/linter/src/lib/TypeScriptLinter.ts b/ets2panda/linter/src/lib/TypeScriptLinter.ts index ca04dbcfcd70cd084c01b8f28c23f983dd279534..2c2de1eba8fc5f2e0fd713fba9722a08db6ce60a 100644 --- a/ets2panda/linter/src/lib/TypeScriptLinter.ts +++ b/ets2panda/linter/src/lib/TypeScriptLinter.ts @@ -9466,9 +9466,32 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { if (ts.isStringLiteral(indexExpr) || ts.isNumericLiteral(indexExpr)) { return true; } - const type = this.tsTypeChecker.getTypeAtLocation(indexExpr); - const typeString = this.tsTypeChecker.typeToString(type); - return typeString === 'number' || typeString === 'string'; + const indexType = this.tsTypeChecker.getTypeAtLocation(indexExpr); + const typeString = this.tsTypeChecker.typeToString(indexType); + if (typeString === 'number' || typeString === 'string') { + return true; + } + const baseExprSym = this.tsUtils.trueSymbolAtLocation(node.expression); + if (indexType.isUnion()) { + return indexType.types.some((t) => { + return this.isInvalidEnumMemberType(t, baseExprSym); + }); + } + return this.isInvalidEnumMemberType(indexType, baseExprSym); + } + + private isInvalidEnumMemberType(indexType: ts.Type, baseExprSym: ts.Symbol | undefined): boolean { + const indexSym = indexType.getSymbol(); + if (!indexSym) { + return false; + } + return !indexSym.declarations?.some((decl) => { + if (decl && ts.isEnumDeclaration(decl.parent) && ts.isEnumMember(decl)) { + const enumDeclSym = this.tsUtils.trueSymbolAtLocation(decl.parent.name); + return enumDeclSym === baseExprSym; + } + return false; + }); } private handleMakeObserved(node: ts.PropertyAccessExpression): void { diff --git a/ets2panda/linter/test/main/literals_as_prop_names.ets b/ets2panda/linter/test/main/literals_as_prop_names.ets index 114339394cb2a8634ac97a7594c104b8c7bd5920..0f2781e90b8c704334aef16842824a9d1ebd75ac 100755 --- a/ets2panda/linter/test/main/literals_as_prop_names.ets +++ b/ets2panda/linter/test/main/literals_as_prop_names.ets @@ -147,4 +147,19 @@ let compPropObj = { ['CompProp']: 1, // Error in arkts 2.0 [2]: 'CompProp2', // Error in arkts 2.0 [LiteralAsPropertyNameEnum.One]: 3 // Error in arkts 2.0 -}; \ No newline at end of file +}; + +enum TEST { + A, + B, + C, +} +enum TEST2 { + A, + B, + C, +} + +let de3 = TEST2[TEST.A] //error +let de4 = TEST2[TEST.A| TEST.B] //error +let de5 = TEST[TEST.C] //ok \ No newline at end of file diff --git a/ets2panda/linter/test/main/literals_as_prop_names.ets.arkts2.json b/ets2panda/linter/test/main/literals_as_prop_names.ets.arkts2.json index 5062fc598a9ff3a3afff09acf1a3400e9ded0fba..a1c3a4b9724091615941ad405ba2ef2ceaeaaf5c 100644 --- a/ets2panda/linter/test/main/literals_as_prop_names.ets.arkts2.json +++ b/ets2panda/linter/test/main/literals_as_prop_names.ets.arkts2.json @@ -724,6 +724,26 @@ "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", "severity": "ERROR" }, + { + "line": 163, + "column": 11, + "endLine": 163, + "endColumn": 24, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, + { + "line": 164, + "column": 11, + "endLine": 164, + "endColumn": 32, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, { "line": 115, "column": 2, diff --git a/ets2panda/linter/test/main/literals_as_prop_names.ets.autofix.json b/ets2panda/linter/test/main/literals_as_prop_names.ets.autofix.json index f3414d739de19184996435dcab30d7a8d61c643f..afa0fd01c5fe4f037c9c92b2c673924e7b34e82f 100644 --- a/ets2panda/linter/test/main/literals_as_prop_names.ets.autofix.json +++ b/ets2panda/linter/test/main/literals_as_prop_names.ets.autofix.json @@ -1463,6 +1463,26 @@ "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", "severity": "ERROR" }, + { + "line": 163, + "column": 11, + "endLine": 163, + "endColumn": 24, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, + { + "line": 164, + "column": 11, + "endLine": 164, + "endColumn": 32, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, { "line": 115, "column": 2, diff --git a/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.ets b/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.ets index 6fb5cb3e0f5cb74294ebcbd803bacdd0840a12a4..4abad71ee18ca55c15d20b0c14040bff11c3db35 100644 --- a/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.ets +++ b/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.ets @@ -156,4 +156,19 @@ let compPropObj = { ['CompProp']: 1.0, // Error in arkts 2.0 [2.0]: 'CompProp2', // Error in arkts 2.0 [LiteralAsPropertyNameEnum.One]: 3.0 // Error in arkts 2.0 -}; \ No newline at end of file +}; + +enum TEST { + A, + B, + C, +} +enum TEST2 { + A, + B, + C, +} + +let de3 = TEST2[TEST.A] //error +let de4 = TEST2[TEST.A| TEST.B] //error +let de5 = TEST[TEST.C] //ok \ No newline at end of file diff --git a/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.json b/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.json index a180c185731eed0d9719daee26a9ec1c64f65992..1674775166a54b855d472ba46e08aee5cffe7da1 100644 --- a/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.json +++ b/ets2panda/linter/test/main/literals_as_prop_names.ets.migrate.json @@ -184,6 +184,26 @@ "rule": "Objects with property names that are not identifiers are not supported (arkts-identifiers-as-prop-names)", "severity": "ERROR" }, + { + "line": 172, + "column": 11, + "endLine": 172, + "endColumn": 24, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, + { + "line": 173, + "column": 11, + "endLine": 173, + "endColumn": 32, + "problem": "UnsupportPropNameFromValue", + "suggest": "", + "rule": "Enum cannot get member name by member value (arkts-enum-no-props-by-index)", + "severity": "ERROR" + }, { "line": 31, "column": 11,