diff --git a/ets2panda/linter/src/lib/TypeScriptLinter.ts b/ets2panda/linter/src/lib/TypeScriptLinter.ts index 1ba26f68a66fd4705c83ef78e502ecdc7a6cb8b8..28711f74414fe6a1188a877e47c463f1fae79a6b 100644 --- a/ets2panda/linter/src/lib/TypeScriptLinter.ts +++ b/ets2panda/linter/src/lib/TypeScriptLinter.ts @@ -9676,6 +9676,11 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { return; } + const arrayDecl = TypeScriptLinter.findArrayDeclaration(arraySym); + if (arrayDecl && TypeScriptLinter.isArrayCreatedWithOtherArrayLength(arrayDecl)) { + return; + } + const indexExpr = accessExpr.argumentExpression; const loopVarName = ts.isIdentifier(indexExpr) ? indexExpr.text : undefined; @@ -10041,4 +10046,31 @@ export class TypeScriptLinter extends BaseTypeScriptLinter { return false; } + + static isArrayCreatedWithOtherArrayLength(decl: ts.VariableDeclaration): boolean { + if (!decl.initializer || !ts.isNewExpression(decl.initializer)) { + return false; + } + + const newExpr = decl.initializer; + return ( + newExpr.arguments?.some((arg) => { + return ts.isPropertyAccessExpression(arg) && arg.name.text === 'length'; + }) ?? false + ); + } + + static findArrayDeclaration(sym: ts.Symbol): ts.VariableDeclaration | undefined { + const decls = sym.getDeclarations(); + if (!decls) { + return undefined; + } + + for (const decl of decls) { + if (ts.isVariableDeclaration(decl)) { + return decl; + } + } + return undefined; + } } diff --git a/ets2panda/linter/test/main/runtime_array_bound.ets b/ets2panda/linter/test/main/runtime_array_bound.ets index 55402651662922da880b103f075b670737a3ff60..093c957d7b2e6e3d251d21cf96cb48a87743e8dd 100644 --- a/ets2panda/linter/test/main/runtime_array_bound.ets +++ b/ets2panda/linter/test/main/runtime_array_bound.ets @@ -165,3 +165,8 @@ enum TE{ } arr1[TE.AA] = 12; +let a: string[] = []; +let b: Array = new Array(a.length); +for (let i = 0; i < a.length; i++) { + b[i]; +} \ No newline at end of file diff --git a/ets2panda/linter/test/main/runtime_array_bound.ets.arkts2.json b/ets2panda/linter/test/main/runtime_array_bound.ets.arkts2.json index fb3f014d249f2a135971c67e17dd2b25f09385df..a42550c13874adc2e100180926979ceca3c40c08 100644 --- a/ets2panda/linter/test/main/runtime_array_bound.ets.arkts2.json +++ b/ets2panda/linter/test/main/runtime_array_bound.ets.arkts2.json @@ -1853,6 +1853,36 @@ "suggest": "", "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", "severity": "ERROR" + }, + { + "line": 169, + "column": 24, + "endLine": 169, + "endColumn": 43, + "problem": "GenericCallNoTypeArgs", + "suggest": "", + "rule": "Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params)", + "severity": "ERROR" + }, + { + "line": 170, + "column": 10, + "endLine": 170, + "endColumn": 15, + "problem": "NumericSemantics", + "suggest": "", + "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", + "severity": "ERROR" + }, + { + "line": 170, + "column": 14, + "endLine": 170, + "endColumn": 15, + "problem": "NumericSemantics", + "suggest": "", + "rule": "Numeric semantics is different for integer values (arkts-numeric-semantic)", + "severity": "ERROR" } ] } \ No newline at end of file diff --git a/ets2panda/linter/test/main/runtime_array_bound.ets.migrate.ets b/ets2panda/linter/test/main/runtime_array_bound.ets.migrate.ets index 2d4beff4184f04808d32a5db68bcfc08a248e82c..b3691dd0dd28072e0181ac4ea1f9b4d5f23b68cd 100644 --- a/ets2panda/linter/test/main/runtime_array_bound.ets.migrate.ets +++ b/ets2panda/linter/test/main/runtime_array_bound.ets.migrate.ets @@ -165,3 +165,8 @@ enum TE{ } arr1[TE.AA] = 12.0; +let a: string[] = []; +let b: Array = new Array(a.length); +for (let i: number = 0.0; i < a.length; i++) { + b[i as int]; +} \ No newline at end of file