public Engine(Collection<Check> rules, Collection<Validator> validators) { engineContext = new EngineContext(rules); metricsVisitor = new MetricsVisitor(); // should this be parameterized in order to switch ON/OFF validation? // add validators first, to validate before playing any rule validators.forEach(rule -> rule.initialize(engineContext)); rules.forEach(rule -> rule.initialize(engineContext)); }
private void visitToken(UastNode node, UastNode.Token token) { if (node.is(UastNode.Kind.EOF)) { return; } Set<Integer> lineNumbers = node.is(UastNode.Kind.COMMENT) ? metrics.commentLines : metrics.linesOfCode; addLines(lineNumbers, token); }
public ScanResult scan(UastNode uast, InputFile inputFile) throws IOException { metricsVisitor.enterFile(uast); engineContext.enterFile(inputFile); visit(uast); return new ScanResult(engineContext.getIssues(), metricsVisitor.getMetrics()); }
public void visitNode(UastNode node) { if (node.is(UastNode.Kind.CLASS)) { metrics.numberOfClasses++; } if (node.is(UastNode.Kind.FUNCTION)) { metrics.numberOfFunctions++; } if (node.is(UastNode.Kind.STATEMENT)) { metrics.numberOfStatements++; } if (node.is(UastNode.Kind.STATEMENT, UastNode.Kind.EXPRESSION, UastNode.Kind.CASE, UastNode.Kind.LABEL)) { addLines(metrics.executableLines, node.firstToken()); } UastNode.Token token = node.token; if (token != null) { visitToken(node, token); } }
private void visit(UastNode uast) { metricsVisitor.visitNode(uast); Set<Visitor> visitors = uast.kinds.stream() .flatMap(kind -> engineContext.registeredVisitors(kind).stream()) .collect(Collectors.toSet()); for (Visitor visitor : visitors) { visitor.visitNode(uast); } for (UastNode child : uast.children) { visit(child); } for (Visitor visitor : visitors) { visitor.leaveNode(uast); } }