public FileMetrics(PythonVisitorContext context, boolean ignoreHeaderComments) { AstNode rootTree = context.rootTree(); numberOfStatements = rootTree.getDescendants(PythonGrammar.STATEMENT).size(); numberOfClasses = rootTree.getDescendants(PythonGrammar.CLASSDEF).size(); complexityVisitor.scanFile(context); cognitiveComplexityVisitor.scanFile(context); fileLinesVisitor = new FileLinesVisitor(ignoreHeaderComments); fileLinesVisitor.scanFile(context); for (AstNode functionDef : rootTree.getDescendants(PythonGrammar.FUNCDEF)) { functionComplexities.add(ComplexityVisitor.complexity(functionDef)); } }
@Override public void leaveFile(AstNode astNode) { InputFile inputFile = fileSystem.inputFile(fileSystem.predicates().is(getContext().getFile())); if (inputFile == null){ throw new IllegalStateException("InputFile is null, but it should not be."); } FileLinesContext fileLinesContext = fileLinesContextFactory.createFor(inputFile); int fileLength = getContext().peekSourceCode().getInt(PythonMetric.LINES); for (int line = 1; line <= fileLength; line++) { fileLinesContext.setIntValue(CoreMetrics.NCLOC_DATA_KEY, line, linesOfCode.contains(line) ? 1 : 0); fileLinesContext.setIntValue(CoreMetrics.COMMENT_LINES_DATA_KEY, line, linesOfComments.contains(line) ? 1 : 0); } fileLinesContext.save(); linesOfCode.clear(); linesOfComments.clear(); }
private void saveMeasures(InputFile inputFile, PythonVisitorContext visitorContext) { boolean ignoreHeaderComments = new PythonConfiguration(context.fileSystem().encoding()).getIgnoreHeaderComments(); FileMetrics fileMetrics = new FileMetrics(visitorContext, ignoreHeaderComments); FileLinesVisitor fileLinesVisitor = fileMetrics.fileLinesVisitor(); cpdAnalyzer.pushCpdTokens(inputFile, visitorContext); noSonarFilter.noSonarInFile(inputFile, fileLinesVisitor.getLinesWithNoSonar()); saveFilesComplexityDistribution(inputFile, fileMetrics); saveFunctionsComplexityDistribution(inputFile, fileMetrics); Set<Integer> linesOfCode = fileLinesVisitor.getLinesOfCode(); saveMetricOnFile(inputFile, CoreMetrics.NCLOC, linesOfCode.size()); saveMetricOnFile(inputFile, CoreMetrics.STATEMENTS, fileMetrics.numberOfStatements()); saveMetricOnFile(inputFile, CoreMetrics.FUNCTIONS, fileMetrics.numberOfFunctions()); saveMetricOnFile(inputFile, CoreMetrics.CLASSES, fileMetrics.numberOfClasses()); saveMetricOnFile(inputFile, CoreMetrics.COMPLEXITY, fileMetrics.complexity()); saveMetricOnFile(inputFile, CoreMetrics.COGNITIVE_COMPLEXITY, fileMetrics.cognitiveComplexity()); saveMetricOnFile(inputFile, CoreMetrics.COMMENT_LINES, fileLinesVisitor.getCommentLineCount()); FileLinesContext fileLinesContext = fileLinesContextFactory.createFor(inputFile); for (int line : linesOfCode) { fileLinesContext.setIntValue(CoreMetrics.NCLOC_DATA_KEY, line, 1); } for (int line : fileLinesVisitor.getExecutableLines()) { fileLinesContext.setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, line, 1); } fileLinesContext.save(); }
/** * Gets the lines of codes and lines of comments (with character #). * Does not get the lines of docstrings. */ @Override public void visitToken(Token token) { if (token.getType().equals(GenericTokenType.EOF)) { return; } if (!token.getType().equals(PythonTokenType.DEDENT) && !token.getType().equals(PythonTokenType.INDENT) && !token.getType().equals(PythonTokenType.NEWLINE)) { // Handle all the lines of the token String[] tokenLines = token.getValue().split("\n", -1); for (int line = token.getLine(); line < token.getLine() + tokenLines.length; line++) { linesOfCode.add(line); } } if (ignoreHeaderComments && !seenFirstToken) { seenFirstToken = true; return; } for (Trivia trivia : token.getTrivia()) { if (trivia.isComment()) { visitComment(trivia); } } }
private void saveMeasures(InputFile inputFile, PythonVisitorContext visitorContext) { boolean ignoreHeaderComments = new PythonConfiguration(context.fileSystem().encoding()).getIgnoreHeaderComments(); FileMetrics fileMetrics = new FileMetrics(visitorContext, ignoreHeaderComments); FileLinesVisitor fileLinesVisitor = fileMetrics.fileLinesVisitor(); cpdAnalyzer.pushCpdTokens(inputFile, visitorContext); noSonarFilter.noSonarInFile(inputFile, fileLinesVisitor.getLinesWithNoSonar()); saveFilesComplexityDistribution(inputFile, fileMetrics); saveFunctionsComplexityDistribution(inputFile, fileMetrics); Set<Integer> linesOfCode = fileLinesVisitor.getLinesOfCode(); saveMetricOnFile(inputFile, CoreMetrics.NCLOC, linesOfCode.size()); saveMetricOnFile(inputFile, CoreMetrics.STATEMENTS, fileMetrics.numberOfStatements()); saveMetricOnFile(inputFile, CoreMetrics.FUNCTIONS, fileMetrics.numberOfFunctions()); saveMetricOnFile(inputFile, CoreMetrics.CLASSES, fileMetrics.numberOfClasses()); saveMetricOnFile(inputFile, CoreMetrics.COMPLEXITY, fileMetrics.complexity()); saveMetricOnFile(inputFile, CoreMetrics.COGNITIVE_COMPLEXITY, fileMetrics.cognitiveComplexity()); saveMetricOnFile(inputFile, CoreMetrics.COMMENT_LINES, fileLinesVisitor.getCommentLineCount()); FileLinesContext fileLinesContext = fileLinesContextFactory.createFor(inputFile); for (int line : linesOfCode) { fileLinesContext.setIntValue(CoreMetrics.NCLOC_DATA_KEY, line, 1); } for (int line : fileLinesVisitor.getExecutableLines()) { fileLinesContext.setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, line, 1); } fileLinesContext.save(); }
/** * Gets the lines of codes and lines of comments (with character #). * Does not get the lines of docstrings. */ @Override public void visitToken(Token token) { if (token.getType().equals(GenericTokenType.EOF)) { return; } if (!token.getType().equals(PythonTokenType.DEDENT) && !token.getType().equals(PythonTokenType.INDENT) && !token.getType().equals(PythonTokenType.NEWLINE)) { // Handle all the lines of the token String[] tokenLines = token.getValue().split("\n", -1); for (int line = token.getLine(); line < token.getLine() + tokenLines.length; line++) { linesOfCode.add(line); } } if (ignoreHeaderComments && !seenFirstToken) { seenFirstToken = true; return; } for (Trivia trivia : token.getTrivia()) { if (trivia.isComment()) { visitComment(trivia); } } }
public FileMetrics(PythonVisitorContext context, boolean ignoreHeaderComments) { AstNode rootTree = context.rootTree(); numberOfStatements = rootTree.getDescendants(PythonGrammar.STATEMENT).size(); numberOfClasses = rootTree.getDescendants(PythonGrammar.CLASSDEF).size(); complexityVisitor.scanFile(context); cognitiveComplexityVisitor.scanFile(context); fileLinesVisitor = new FileLinesVisitor(ignoreHeaderComments); fileLinesVisitor.scanFile(context); for (AstNode functionDef : rootTree.getDescendants(PythonGrammar.FUNCDEF)) { functionComplexities.add(ComplexityVisitor.complexity(functionDef)); } }