Skip to content

Commit

Permalink
add NOSONAR support
Browse files Browse the repository at this point in the history
  • Loading branch information
guwirth committed Aug 30, 2019
1 parent 38fffdd commit b6fa893
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@ private void save(Collection<SourceCode> squidSourceFiles, SensorContext context
}

private void saveMeasures(InputFile inputFile, SourceFile squidFile, SensorContext context) {

// NOSONAR
noSonarFilter.noSonarInFile(inputFile, squidFile.getNoSonarTagLines());

// CORE METRICS
context.<Integer>newMeasure().forMetric(CoreMetrics.NCLOC).on(inputFile)
.withValue(squidFile.getInt(CxxMetric.LINES_OF_CODE)).save();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@
import static com.sonar.sslr.api.GenericTokenType.EOF;
import com.sonar.sslr.api.Grammar;
import com.sonar.sslr.api.Token;
import com.sonar.sslr.api.Trivia;
import java.util.regex.Pattern;
import org.sonar.squidbridge.SquidAstVisitor;
import org.sonar.squidbridge.api.SourceCode;
import org.sonar.squidbridge.api.SourceFile;
import org.sonar.squidbridge.measures.MetricDef;

/**
Expand All @@ -34,7 +37,7 @@
* @param <GRAMMAR>
*/
public class CxxLinesOfCodeVisitor<GRAMMAR extends Grammar>
extends SquidAstVisitor<GRAMMAR> implements AstAndTokenVisitor {
extends SquidAstVisitor<GRAMMAR> implements AstAndTokenVisitor {

public static final Pattern EOL_PATTERN = Pattern.compile("\\R");

Expand All @@ -58,14 +61,42 @@ public void visitFile(AstNode node) {
*/
@Override
public void visitToken(Token token) {
if (!token.getType().equals(EOF)) {
/* Handle all the lines of the token */
String[] tokenLines = EOL_PATTERN.split(token.getValue(), -1);
if (token.getType().equals(EOF)) {
return;
}

// handle all the lines of the token
String[] tokenLines = EOL_PATTERN.split(token.getValue(), -1);

int firstLineAlreadyCounted = lastTokenLine == token.getLine() ? 1 : 0;
getContext().peekSourceCode().add(metric, (double) tokenLines.length - firstLineAlreadyCounted);

int firstLineAlreadyCounted = lastTokenLine == token.getLine() ? 1 : 0;
getContext().peekSourceCode().add(metric, (double) tokenLines.length - firstLineAlreadyCounted);
lastTokenLine = token.getLine() + tokenLines.length - 1;

// handle comments
for (Trivia trivia : token.getTrivia()) {
if (trivia.isComment()) {
visitComment(trivia);
}
}
}

/**
* Search in comments for NOSONAR
*/
public void visitComment(Trivia trivia) {
String[] commentLines = EOL_PATTERN
.split(getContext().getCommentAnalyser().getContents(trivia.getToken().getOriginalValue()), -1);
int line = trivia.getToken().getLine();

lastTokenLine = token.getLine() + tokenLines.length - 1;
for (String commentLine : commentLines) {
if (commentLine.contains("NOSONAR")) {
SourceCode sourceCode = getContext().peekSourceCode();
if (sourceCode instanceof SourceFile) {
((SourceFile) sourceCode).hasNoSonarTagAtLine(line);
}
}
line++;
}
}

Expand Down
9 changes: 9 additions & 0 deletions cxx-squid/src/test/java/org/sonar/cxx/CxxAstScannerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import org.assertj.core.api.SoftAssertions;
import org.junit.Test;
Expand Down Expand Up @@ -125,4 +127,11 @@ public void error_recovery_declaration() throws UnsupportedEncodingException, IO
assertThat(file.getInt(CxxMetric.FUNCTIONS)).isEqualTo(2);
}

@Test
public void nosonar_comments() throws UnsupportedEncodingException, IOException {
CxxFileTester tester = CxxFileTesterHelper.CreateCxxFileTester("src/test/resources/metrics/nosonar.cc", ".", "");
SourceFile file = CxxAstScanner.scanSingleFile(tester.cxxFile, tester.sensorContext, CxxFileTesterHelper.mockCxxLanguage());
assertThat(file.getNoSonarTagLines()).containsOnlyElementsOf(Arrays.asList(3, 6, 9, 11));
}

}
13 changes: 13 additions & 0 deletions cxx-squid/src/test/resources/metrics/nosonar.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* Header */

/* NOSONAR */
int a;

// NOSONAR
int b;

int c; /* NOSONAR */

int d; // NOSONAR

/* EOF '/

0 comments on commit b6fa893

Please sign in to comment.