Skip to content

Commit 0bbfbeb

Browse files
authored
fix: Update complexity calculations in CSharpMetricsAnalyzer (#115)
Signed-off-by: André Silva <[email protected]>
1 parent b532d14 commit 0bbfbeb

File tree

5 files changed

+22
-25
lines changed

5 files changed

+22
-25
lines changed

package-lock.json

Lines changed: 0 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/metricsAnalyzer/languages/csharpAnalyzer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,10 @@ export class CSharpMetricsAnalyzer {
338338
* @param node - The current syntax node being visited
339339
*/
340340
private visit(node: Parser.SyntaxNode): void {
341-
const increment = this.getComplexityIncrement(node);
342-
if (increment > 0) {
341+
const baseIncrement = this.getComplexityIncrement(node);
342+
if (baseIncrement > 0) {
343+
// Add nesting level to the increment for cognitive complexity
344+
const increment = baseIncrement + this.nesting;
343345
const reason = this.getComplexityReason(node);
344346
this.complexity += increment;
345347

src/test/metricsAnalyzer/languages/csharpAnalyzer.test.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ suite("CSharp Metrics Analyzer Tests", () => {
6868

6969
assert.strictEqual(results.length, 1);
7070
assert.strictEqual(results[0].name, "Process");
71-
// Expected complexity: if(1) + for(1) + nested if(1) + nested continue(1) = 4
72-
assert.strictEqual(results[0].complexity, 4);
71+
// Expected complexity: if(1) + for(2) + nested if(3) + nested continue(4) = 10
72+
assert.strictEqual(results[0].complexity, 10);
7373
assert.strictEqual(results[0].details.length, 4);
7474
});
7575
});
@@ -88,7 +88,7 @@ suite("CSharp Metrics Analyzer Tests", () => {
8888

8989
const results = analyzer.analyzeFunctions(sourceCode);
9090

91-
assert.strictEqual(results[0].complexity, 2);
91+
assert.strictEqual(results[0].complexity, 3);
9292
assert.strictEqual(results[0].details[0].reason, "while loop");
9393
assert.strictEqual(
9494
results[0].details[1].reason,
@@ -186,7 +186,7 @@ suite("CSharp Metrics Analyzer Tests", () => {
186186

187187
const results = analyzer.analyzeFunctions(sourceCode);
188188

189-
assert.strictEqual(results[0].complexity, 2);
189+
assert.strictEqual(results[0].complexity, 3);
190190
assert.strictEqual(results[0].details.length, 2);
191191

192192
const tryDetail = results[0].details.find(
@@ -219,7 +219,7 @@ suite("CSharp Metrics Analyzer Tests", () => {
219219

220220
const results = analyzer.analyzeFunctions(sourceCode);
221221

222-
assert.strictEqual(results[0].complexity, 3); // try + 2 catches
222+
assert.strictEqual(results[0].complexity, 5); // try(1) + catch1(2) + catch2(2)
223223
assert.strictEqual(results[0].details.length, 3);
224224
});
225225
});
@@ -316,8 +316,8 @@ suite("CSharp Metrics Analyzer Tests", () => {
316316

317317
const results = analyzer.analyzeFunctions(sourceCode);
318318

319-
// Expected: if statement (1) + lambda in nested context (1) = 2
320-
assert.strictEqual(results[0].complexity, 2);
319+
// Expected: if statement (1) + lambda in nested context (2) = 3
320+
assert.strictEqual(results[0].complexity, 3);
321321
});
322322

323323
test("should not count lambda at top level", () => {
@@ -369,8 +369,8 @@ suite("CSharp Metrics Analyzer Tests", () => {
369369

370370
const results = analyzer.analyzeFunctions(sourceCode);
371371

372-
// for (1) + nested if (1) + nested continue (1) = 3
373-
assert.strictEqual(results[0].complexity, 3);
372+
// for (1) + nested if (2) + nested continue (3) = 6
373+
assert.strictEqual(results[0].complexity, 6);
374374
});
375375

376376
test("should handle break in nested context", () => {
@@ -388,8 +388,8 @@ suite("CSharp Metrics Analyzer Tests", () => {
388388

389389
const results = analyzer.analyzeFunctions(sourceCode);
390390

391-
// while (1) + nested if (1) + nested break (1) = 3
392-
assert.strictEqual(results[0].complexity, 3);
391+
// while (1) + nested if (2) + nested break (3) = 6
392+
assert.strictEqual(results[0].complexity, 6);
393393
});
394394
});
395395

@@ -473,7 +473,7 @@ suite("CSharp Metrics Analyzer Tests", () => {
473473
const results = analyzer.analyzeFunctions(sourceCode);
474474

475475
assert.strictEqual(results.length, 1);
476-
assert.strictEqual(results[0].complexity, 2); // if (+1) with logical OR (+1)
476+
assert.strictEqual(results[0].complexity, 3); // if (1) + || nested in if condition (2)
477477
});
478478

479479
test("should analyze local functions", () => {
@@ -590,7 +590,7 @@ suite("CSharp Metrics Analyzer Tests", () => {
590590
assert.ok(outerMethod);
591591
assert.ok(innerMethod);
592592
assert.strictEqual(outerMethod.complexity, 1);
593-
assert.strictEqual(innerMethod.complexity, 2); // while loop + nested break
593+
assert.strictEqual(innerMethod.complexity, 3); // while loop (1) + nested break (2)
594594
});
595595
});
596596

src/test/metricsAnalyzer/metricsAnalyzerFactory.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ suite("Metrics Analyzer Factory Tests", () => {
107107

108108
assert.strictEqual(addFunction.complexity, 0);
109109
assert.strictEqual(divideFunction.complexity, 1); // if statement
110-
assert.strictEqual(processFunction.complexity, 5); // if + || operator + foreach + nested if + nested continue
110+
assert.strictEqual(processFunction.complexity, 9); // if(1) + ||(2) + foreach(1) + nested if(2) + nested continue(3)
111111
});
112112

113113
test("should handle C# code with logical operators", () => {
@@ -152,7 +152,7 @@ suite("Metrics Analyzer Factory Tests", () => {
152152
const results = MetricsAnalyzerFactory.analyzeFile(sourceCode, "csharp");
153153

154154
assert.strictEqual(results.length, 1);
155-
assert.strictEqual(results[0].complexity, 3); // try + 2 catch blocks
155+
assert.strictEqual(results[0].complexity, 5); // try(1) + catch(2) + catch(2)
156156

157157
const tryDetail = results[0].details.find(
158158
(d) => d.reason === "try statement"
@@ -500,7 +500,7 @@ suite("Metrics Analyzer Factory Tests", () => {
500500

501501
// ProcessData should have moderate complexity
502502
assert.ok(processDataFunction.complexity > 0);
503-
assert.ok(processDataFunction.complexity < 10);
503+
assert.ok(processDataFunction.complexity < 20);
504504

505505
// IsComplexCondition should have high complexity due to nested conditions
506506
assert.ok(isComplexConditionFunction.complexity > 5);

src/unit/unit.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ describe("Core Logic Unit Tests (Node.js)", () => {
6868
const results = analyzer.analyzeFunctions(sourceCode);
6969

7070
assert.strictEqual(results.length, 1);
71-
assert.strictEqual(results[0].complexity, 4); // 2 ifs + 1 && + 1 ||
71+
// 2 ifs (+1 each) + '&&' (+2 at nest 1) + '||' (+2 at nest 1) = 6
72+
assert.strictEqual(results[0].complexity, 6);
7273
});
7374

7475
it("should handle loops correctly", () => {

0 commit comments

Comments
 (0)