diff --git a/src/metricsAnalyzer/languages/csharpAnalyzer.ts b/src/metricsAnalyzer/languages/csharpAnalyzer.ts index d8aeac1..c458f25 100644 --- a/src/metricsAnalyzer/languages/csharpAnalyzer.ts +++ b/src/metricsAnalyzer/languages/csharpAnalyzer.ts @@ -171,7 +171,8 @@ export class CSharpMetricsAnalyzer { } // Continue traversing child nodes - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child); } }; @@ -444,7 +445,8 @@ export class CSharpMetricsAnalyzer { const isPreproc = node.type.startsWith("preproc_"); if (nests) { this.nesting++; } if (isPreproc) { this.preprocessorDepth++; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; if (!this.isFunctionDeclaration(child)) { this.visit(child); } diff --git a/src/metricsAnalyzer/languages/goAnalyzer.ts b/src/metricsAnalyzer/languages/goAnalyzer.ts index 7e84103..5f15d33 100644 --- a/src/metricsAnalyzer/languages/goAnalyzer.ts +++ b/src/metricsAnalyzer/languages/goAnalyzer.ts @@ -147,7 +147,8 @@ export class GoMetricsAnalyzer { return; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child); } }; @@ -350,7 +351,8 @@ export class GoMetricsAnalyzer { ? node.childForFieldName("alternative") : null; - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; if (this.isFunctionDeclaration(child)) { continue; } if (alternative && child === alternative) { this.visitAlternative(child); @@ -395,7 +397,8 @@ export class GoMetricsAnalyzer { // (do NOT bump nesting again — the outer if already did). // We must also intercept any nested alternative (further else-if/else chains). const innerAlt = node.childForFieldName("alternative"); - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; if (this.isFunctionDeclaration(child)) { continue; } if (child.type === "else") { continue; } // skip the 'else' keyword token if (innerAlt && child === innerAlt) { diff --git a/src/metricsAnalyzer/languages/javaAnalyzer.ts b/src/metricsAnalyzer/languages/javaAnalyzer.ts index 8ed3c17..b697c06 100644 --- a/src/metricsAnalyzer/languages/javaAnalyzer.ts +++ b/src/metricsAnalyzer/languages/javaAnalyzer.ts @@ -130,7 +130,8 @@ export class JavaMetricsAnalyzer { // Do not recurse into the method body again — analyzeMethod handles it return; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child); } }; @@ -222,7 +223,8 @@ export class JavaMetricsAnalyzer { * @param node - The block or body node to visit */ private visitBody(node: Parser.SyntaxNode): void { - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; this.visit(child); } } @@ -271,7 +273,8 @@ export class JavaMetricsAnalyzer { // to avoid double-counting (the else_clause +1 already accounts for it). const nests = this.increasesNesting(node); if (nests) { this.nesting++; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; if (!this.isMethodDeclaration(child)) { this.visit(child, elseBranchNode !== null && child === elseBranchNode); } diff --git a/src/metricsAnalyzer/languages/jsLikeAnalyzer.ts b/src/metricsAnalyzer/languages/jsLikeAnalyzer.ts index 1b565d5..33f82d7 100644 --- a/src/metricsAnalyzer/languages/jsLikeAnalyzer.ts +++ b/src/metricsAnalyzer/languages/jsLikeAnalyzer.ts @@ -174,7 +174,8 @@ export class JsLikeMetricsAnalyzer { this.details = savedDetails; this.nesting = savedNesting; } else { - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; this.collectFunctions(child, functions); } } @@ -341,7 +342,8 @@ export class JsLikeMetricsAnalyzer { this.nesting++; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; // Nested functions: add a nesting penalty and continue analyzing their body // as part of the outer function at an increased nesting level, so that any // complexity inside the nested body (ternaries, loops, etc.) counts toward diff --git a/src/metricsAnalyzer/languages/pythonAnalyzer.ts b/src/metricsAnalyzer/languages/pythonAnalyzer.ts index 2f97838..d7d9fcf 100644 --- a/src/metricsAnalyzer/languages/pythonAnalyzer.ts +++ b/src/metricsAnalyzer/languages/pythonAnalyzer.ts @@ -122,7 +122,8 @@ export class PythonMetricsAnalyzer { const name = nameNode ? this.sourceText.substring(nameNode.startIndex, nameNode.endIndex) : ""; - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child, name); } return; @@ -144,7 +145,8 @@ export class PythonMetricsAnalyzer { return; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child, className); } }; @@ -231,7 +233,8 @@ export class PythonMetricsAnalyzer { }); } this.nesting++; - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; this.visit(child); } this.nesting--; @@ -253,7 +256,8 @@ export class PythonMetricsAnalyzer { // Conditionally bump nesting, iterate children once, then restore. const nests = this.increasesNesting(node); if (nests) { this.nesting++; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; this.visit(child); } if (nests) { this.nesting--; } diff --git a/src/metricsAnalyzer/languages/rustAnalyzer.ts b/src/metricsAnalyzer/languages/rustAnalyzer.ts index bc44e86..1ed4105 100644 --- a/src/metricsAnalyzer/languages/rustAnalyzer.ts +++ b/src/metricsAnalyzer/languages/rustAnalyzer.ts @@ -149,7 +149,8 @@ export class RustMetricsAnalyzer { } } } else { - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; visit(child); } } @@ -269,7 +270,8 @@ export class RustMetricsAnalyzer { // shouldSkipChildStructuralIncrement handles else-if chains to avoid double-counting. const nests = this.increasesNesting(node); if (nests) { this.nesting++; } - for (const child of node.children) { + for (let i = 0; i < node.childCount; i++) { + const child = node.child(i)!; if (!this.isFunctionDeclaration(child)) { this.visit(child, this.shouldSkipChildStructuralIncrement(node, child)); }