Search in sources :

Example 1 with LinesOfCodeVisitor

use of org.sonar.java.ast.visitors.LinesOfCodeVisitor in project sonar-java by SonarSource.

the class MethodTooBigCheck method visitNode.

@Override
public void visitNode(Tree tree) {
    MethodTree methodTree = (MethodTree) tree;
    BlockTree block = methodTree.block();
    if (block != null) {
        int lines = new LinesOfCodeVisitor().linesOfCode(block);
        if (lines > max) {
            reportIssue(methodTree.simpleName(), "This method has " + lines + " lines, which is greater than the " + max + " lines authorized. Split it into smaller methods.");
        }
    }
}
Also used : MethodTree(org.sonar.plugins.java.api.tree.MethodTree) BlockTree(org.sonar.plugins.java.api.tree.BlockTree) LinesOfCodeVisitor(org.sonar.java.ast.visitors.LinesOfCodeVisitor)

Example 2 with LinesOfCodeVisitor

use of org.sonar.java.ast.visitors.LinesOfCodeVisitor in project sonar-java by SonarSource.

the class SwitchCaseTooBigCheck method visitNode.

@Override
public void visitNode(Tree tree) {
    SwitchStatementTree switchStatementTree = (SwitchStatementTree) tree;
    LinesOfCodeVisitor locVisitor = new LinesOfCodeVisitor();
    switchStatementTree.cases().forEach(cgt -> {
        int lines = cgt.body().stream().mapToInt(locVisitor::linesOfCode).sum();
        if (lines > max) {
            reportIssue(cgt.labels().get(cgt.labels().size() - 1), "Reduce this switch case number of lines from " + lines + " to at most " + max + ", for example by extracting code into methods.");
        }
    });
}
Also used : LinesOfCodeVisitor(org.sonar.java.ast.visitors.LinesOfCodeVisitor) SwitchStatementTree(org.sonar.plugins.java.api.tree.SwitchStatementTree)

Example 3 with LinesOfCodeVisitor

use of org.sonar.java.ast.visitors.LinesOfCodeVisitor in project sonar-java by SonarSource.

the class InnerClassTooManyLinesCheck method visitNode.

@Override
public void visitNode(Tree tree) {
    ClassTree node = (ClassTree) tree;
    Symbol.TypeSymbol symbol = node.symbol();
    Symbol owner = symbol.owner();
    Type ownerType = owner.type();
    if (ownerType != null && ownerType.isClass() && owner.owner().isPackageSymbol()) {
        // raise only one issue for the first level of nesting when multiple nesting
        int lines = new LinesOfCodeVisitor().linesOfCode(node);
        if (lines > max) {
            reportIssue(ExpressionsHelper.reportOnClassTree(node), "Reduce this class from " + lines + " to the maximum allowed " + max + " or externalize it in a public class.");
        }
    }
}
Also used : Type(org.sonar.plugins.java.api.semantic.Type) Symbol(org.sonar.plugins.java.api.semantic.Symbol) ClassTree(org.sonar.plugins.java.api.tree.ClassTree) LinesOfCodeVisitor(org.sonar.java.ast.visitors.LinesOfCodeVisitor)

Example 4 with LinesOfCodeVisitor

use of org.sonar.java.ast.visitors.LinesOfCodeVisitor in project sonar-java by SonarSource.

the class Measurer method scanFile.

@Override
public void scanFile(JavaFileScannerContext context) {
    sonarFile = fs.inputFile(fs.predicates().is(context.getFile()));
    CommentLinesVisitor commentLinesVisitor = createCommentLineVisitorAndFindNoSonar(context);
    if (isSonarLintContext()) {
        // No need to compute metrics on SonarLint side, but the no sonar filter is still required
        return;
    }
    classTrees.clear();
    methods = 0;
    complexityInMethods = 0;
    classes = 0;
    methodComplexityDistribution = new RangeDistributionBuilder(LIMITS_COMPLEXITY_METHODS);
    super.scanFile(context);
    // leave file.
    int fileComplexity = context.getComplexityNodes(context.getTree()).size();
    saveMetricOnFile(CoreMetrics.CLASSES, classes);
    saveMetricOnFile(CoreMetrics.FUNCTIONS, methods);
    saveMetricOnFile(CoreMetrics.COMPLEXITY_IN_FUNCTIONS, complexityInMethods);
    saveMetricOnFile(CoreMetrics.COMPLEXITY_IN_CLASSES, fileComplexity);
    saveMetricOnFile(CoreMetrics.COMPLEXITY, fileComplexity);
    saveMetricOnFile(CoreMetrics.COMMENT_LINES, commentLinesVisitor.commentLinesMetric());
    saveMetricOnFile(CoreMetrics.STATEMENTS, new StatementVisitor().numberOfStatements(context.getTree()));
    saveMetricOnFile(CoreMetrics.NCLOC, new LinesOfCodeVisitor().linesOfCode(context.getTree()));
    saveMetricOnFile(CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION, methodComplexityDistribution.build());
    RangeDistributionBuilder fileComplexityDistribution = new RangeDistributionBuilder(LIMITS_COMPLEXITY_FILES);
    saveMetricOnFile(CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION, fileComplexityDistribution.add(fileComplexity).build());
    saveMetricOnFile(CoreMetrics.COGNITIVE_COMPLEXITY, CognitiveComplexityVisitor.compilationUnitComplexity(context.getTree()));
}
Also used : CommentLinesVisitor(org.sonar.java.ast.visitors.CommentLinesVisitor) StatementVisitor(org.sonar.java.ast.visitors.StatementVisitor) LinesOfCodeVisitor(org.sonar.java.ast.visitors.LinesOfCodeVisitor) RangeDistributionBuilder(org.sonar.api.ce.measure.RangeDistributionBuilder)

Aggregations

LinesOfCodeVisitor (org.sonar.java.ast.visitors.LinesOfCodeVisitor)4 RangeDistributionBuilder (org.sonar.api.ce.measure.RangeDistributionBuilder)1 CommentLinesVisitor (org.sonar.java.ast.visitors.CommentLinesVisitor)1 StatementVisitor (org.sonar.java.ast.visitors.StatementVisitor)1 Symbol (org.sonar.plugins.java.api.semantic.Symbol)1 Type (org.sonar.plugins.java.api.semantic.Type)1 BlockTree (org.sonar.plugins.java.api.tree.BlockTree)1 ClassTree (org.sonar.plugins.java.api.tree.ClassTree)1 MethodTree (org.sonar.plugins.java.api.tree.MethodTree)1 SwitchStatementTree (org.sonar.plugins.java.api.tree.SwitchStatementTree)1