From d0c7e112ad846cb33c516589dc14213974ecb943 Mon Sep 17 00:00:00 2001 From: lizhonghan Date: Thu, 15 May 2025 10:42:07 +0800 Subject: [PATCH] Fix enum member check float Change-Id: I66452d9cbdd1e71ea87c466cb131ee0606dc2c5f Signed-off-by: lizhonghan --- ets2panda/linter/src/lib/TypeScriptLinter.ts | 24 ++++--- .../test/main/enum_not_support_float.ets | 38 ++++++++++ .../enum_not_support_float.ets.arkts2.json | 70 +++++++++++++++++++ 3 files changed, 124 insertions(+), 8 deletions(-) diff --git a/ets2panda/linter/src/lib/TypeScriptLinter.ts b/ets2panda/linter/src/lib/TypeScriptLinter.ts index eb59a81165..efe485e8f8 100644 --- a/ets2panda/linter/src/lib/TypeScriptLinter.ts +++ b/ets2panda/linter/src/lib/TypeScriptLinter.ts @@ -3656,17 +3656,25 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { if (!initializer) { return; } - let value; - if (ts.isNumericLiteral(initializer)) { - value = parseFloat(initializer.text); - } else if (ts.isPrefixUnaryExpression(initializer)) { - const operand = initializer.operand; - value = ts.isNumericLiteral(operand) ? parseFloat(operand.text) : value; - } else { + + const extractNumericValue = (initializerExpr: ts.Expression): { value: number; originText: string } | undefined => { + if (ts.isNumericLiteral(initializerExpr)) { + return { value: parseFloat(initializerExpr.text), originText: initializerExpr.getText() }; + } + + if (ts.isPrefixUnaryExpression(initializerExpr) && ts.isNumericLiteral(initializerExpr.operand)) { + return { value: parseFloat(initializerExpr.operand.text), originText: initializerExpr.operand.getText() }; + } + return undefined; + }; + + const result = extractNumericValue(enumMember.initializer); + if (!result) { return; } - if (!Number.isInteger(value)) { + const { value, originText } = result; + if (!Number.isInteger(value) || originText.includes('.') || originText.includes('e')) { this.incrementCounters(enumMember, FaultID.EnumMemberNonConstInit); } } diff --git a/ets2panda/linter/test/main/enum_not_support_float.ets b/ets2panda/linter/test/main/enum_not_support_float.ets index 593f6c64b9..e6e9a53c4f 100644 --- a/ets2panda/linter/test/main/enum_not_support_float.ets +++ b/ets2panda/linter/test/main/enum_not_support_float.ets @@ -53,3 +53,41 @@ enum ExprInits { H = '123'.length, I = 1 && 2, } + +enum SpecialFloat1 { + S = 1.0 // Error +} +enum SpecialFloat2 { + S = 2.0 // Error +} +enum SpecialFloat3 { + S = 3e0 // Error +} +enum SpecialFloat4 { + S = 1e5 // Error +} +enum SpecialFloat5 { + S = 1_000_000.0 // Error +} +enum SpecialFloat6 { + S = .0 // Error +} +enum SpecialFloat7 { + S = 5. // Error +} + +enum SpecialNotFloat { + S1 = 1, + S2 = 2, + S3 = 3, + S4 = 100000, + S5 = 1_000_000, + S6 = 0, + S7 = 5 +} + +enum SpecialNotFloat2{ + S1 = 0b1010, + S2 = 0o11, + S3 = 0xFF +} \ No newline at end of file diff --git a/ets2panda/linter/test/main/enum_not_support_float.ets.arkts2.json b/ets2panda/linter/test/main/enum_not_support_float.ets.arkts2.json index d4ffa9eb19..8b241d8a38 100644 --- a/ets2panda/linter/test/main/enum_not_support_float.ets.arkts2.json +++ b/ets2panda/linter/test/main/enum_not_support_float.ets.arkts2.json @@ -73,6 +73,76 @@ "suggest": "", "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", "severity": "ERROR" + }, + { + "line": 58, + "column": 3, + "endLine": 58, + "endColumn": 10, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 61, + "column": 3, + "endLine": 61, + "endColumn": 10, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 64, + "column": 3, + "endLine": 64, + "endColumn": 10, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 67, + "column": 3, + "endLine": 67, + "endColumn": 10, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 70, + "column": 3, + "endLine": 70, + "endColumn": 18, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 73, + "column": 3, + "endLine": 73, + "endColumn": 9, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" + }, + { + "line": 76, + "column": 3, + "endLine": 76, + "endColumn": 9, + "problem": "EnumMemberNonConstInit", + "suggest": "", + "rule": "Enumeration members can be initialized only with compile time expressions of the same type (arkts-no-enum-mixed-types)", + "severity": "ERROR" } ] } \ No newline at end of file -- Gitee