Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 336x 336x 336x 63x 63x 273x 336x 280x 52x 52x 339x 339x 339x 339x 339x 339x 339x 339x 339x 339x 339x 339x 101x 101x 339x 52x 52x 52x 52x 52x 52x 52x 52x 52x 52x 52x 280x 273x 273x 273x 1x 1x | import * as Expressions from "../abap/2_statements/expressions"; import * as Statements from "../abap/2_statements/statements"; import * as Structures from "../abap/3_structures/structures"; import {IFile} from "../files/_ifile"; import {Position} from "../position"; import {IObject} from "../objects/_iobject"; import {ABAPObject} from "../objects/_abap_object"; // only methods are reported export interface ICyclomaticComplexityResult { file: IFile; pos: Position; name: string; count: number; } export class CyclomaticComplexityStats { public static run(obj: IObject): ICyclomaticComplexityResult[] { const res: ICyclomaticComplexityResult[] = []; if (!(obj instanceof ABAPObject)) { return []; } for (const file of obj.getABAPFiles()) { for (const m of file.getStructure()?.findAllStructures(Structures.Method) || []) { let count = 0; for (const s of m.findAllStatementNodes()) { const type = s.get(); if (type instanceof Statements.Assert || type instanceof Statements.Check || type instanceof Statements.ElseIf || type instanceof Statements.If || type instanceof Statements.While || type instanceof Statements.Case || type instanceof Statements.SelectLoop || type instanceof Statements.Catch || type instanceof Statements.Cleanup || type instanceof Statements.EndAt || type instanceof Statements.Loop) { count += 1; } } const name = m.findDirectStatement(Statements.MethodImplementation)?.findDirectExpression( Expressions.MethodName)?.getFirstToken().getStr(); res.push({ file, pos: m.getFirstToken().getStart(), name: name ? name : "Error!", count, }); } } return res; } } |