diff --git a/integration-tests/features/importing_coverage.feature b/integration-tests/features/importing_coverage.feature index 7a1eca963e..ee40fbd41a 100644 --- a/integration-tests/features/importing_coverage.feature +++ b/integration-tests/features/importing_coverage.feature @@ -83,14 +83,14 @@ Feature: Importing coverage data """ AND the following metrics have following values: | metric | value | - | coverage | 5.9 | - | line_coverage | 3.1 | + | coverage | 8.0 | + | line_coverage | 4.3 | | branch_coverage | 50 | - | it_coverage | 14.1 | - | it_line_coverage | 8.2 | + | it_coverage | 18.2 | + | it_line_coverage | 11.1 | | it_branch_coverage | 50 | - | overall_coverage | 20.0 | - | overall_line_coverage | 12.5 | + | overall_coverage | 25.0 | + | overall_line_coverage | 16.7 | | overall_branch_coverage | 50 | @@ -115,8 +115,8 @@ Feature: Importing coverage data """ AND the following metrics have following values: | metric | value | - | coverage | 16.9 | - | line_coverage | 10.1 | + | coverage | 22.2 | + | line_coverage | 14.3 | | branch_coverage | 50 | diff --git a/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/metrics/FileLinesVisitor.java b/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/metrics/FileLinesVisitor.java index 1b547480ec..50b8a1b935 100644 --- a/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/metrics/FileLinesVisitor.java +++ b/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/metrics/FileLinesVisitor.java @@ -35,6 +35,7 @@ import org.sonar.api.measures.FileLinesContext; import org.sonar.api.measures.FileLinesContextFactory; import org.sonar.cxx.api.CxxMetric; +import org.sonar.cxx.parser.CxxGrammarImpl; import org.sonar.squidbridge.SquidAstVisitor; /** @@ -49,6 +50,10 @@ public class FileLinesVisitor extends SquidAstVisitor implements AstAnd private Set linesOfComments = Sets.newHashSet(); private final FileSystem fileSystem; private final Map> allLinesOfCode; + private int isWithinFunctionDefinition = 0; + private final Set ignoreToken = Sets.newHashSet( + "{", "}", "(", ")", "[", "]" + ); public FileLinesVisitor(FileLinesContextFactory fileLinesContextFactory, FileSystem fileSystem, Map> linesOfCode) { this.fileLinesContextFactory = fileLinesContextFactory; @@ -56,13 +61,22 @@ public FileLinesVisitor(FileLinesContextFactory fileLinesContextFactory, FileSys this.allLinesOfCode = linesOfCode; } + @Override + public void init() { + subscribeTo(CxxGrammarImpl.functionDefinition); + } + @Override public void visitToken(Token token) { if (token.getType().equals(GenericTokenType.EOF)) { return; } - linesOfCode.add(token.getLine()); + if (isWithinFunctionDefinition != 0) { + if (!ignoreToken.contains(token.getType().getValue())) { + linesOfCode.add(token.getLine()); + } + } List trivias = token.getTrivia(); for (Trivia trivia : trivias) { @@ -72,6 +86,16 @@ public void visitToken(Token token) { } } + @Override + public void visitNode(AstNode node) { + isWithinFunctionDefinition++; + } + + @Override + public void leaveNode(AstNode node) { + isWithinFunctionDefinition--; + } + @Override public void leaveFile(AstNode astNode) { InputFile inputFile = fileSystem.inputFile(fileSystem.predicates().is(getContext().getFile())); diff --git a/sonar-cxx-plugin/src/test/java/org/sonar/plugins/cxx/metrics/FileLinesVisitorTest.java b/sonar-cxx-plugin/src/test/java/org/sonar/plugins/cxx/metrics/FileLinesVisitorTest.java index 1d99b6ee82..1697593e8c 100644 --- a/sonar-cxx-plugin/src/test/java/org/sonar/plugins/cxx/metrics/FileLinesVisitorTest.java +++ b/sonar-cxx-plugin/src/test/java/org/sonar/plugins/cxx/metrics/FileLinesVisitorTest.java @@ -59,11 +59,12 @@ public void test() throws UnsupportedEncodingException, IOException { assertThat(linesOfCode).hasSize(1); assertThat(linesOfCode.get(inputFile)).containsOnly( - 8, 9, 10, 11, - 14, 15, 16, 17, 18, 19, - 21, 22, 23, 24, 25, 26, 27, - 31, 32, 34, 35, 36, 37, - 42, 43, 44, 45, 46 + 8, 10, + 14, 16, 17, 18, + 21, 22, 23, 26, + 31, 34, 35, + 42, 44, 45, + 57, 60, 61 ); } diff --git a/sonar-cxx-plugin/src/test/resources/org/sonar/plugins/cxx/ncloc.cc b/sonar-cxx-plugin/src/test/resources/org/sonar/plugins/cxx/ncloc.cc index 1c43988b3a..172bbd8e19 100644 --- a/sonar-cxx-plugin/src/test/resources/org/sonar/plugins/cxx/ncloc.cc +++ b/sonar-cxx-plugin/src/test/resources/org/sonar/plugins/cxx/ncloc.cc @@ -45,4 +45,22 @@ void func5() int sum = ADD(a, b); } +// declaration +void func6(); + +// inline +class MyClass { +public: + MyClass(); + int method1(); + + int method2() + { + // comment + for(int iii=0; iii