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 300x 300x 300x 58x 58x 242x 300x 249x 47x 47x 322x 322x 322x 322x 322x 322x 322x 322x 322x 322x 322x 322x 101x 101x 322x 47x 47x 47x 47x 47x 47x 47x 47x 47x 47x 47x 249x 242x 242x 242x 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; } } |