Skip to content

Commit

Permalink
Merge pull request #1758 from guwirth/nosonar
Browse files Browse the repository at this point in the history
NOSONAR support
  • Loading branch information
guwirth committed Sep 2, 2019
2 parents c66c820 + b6fa893 commit 2142826
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 15 deletions.
Expand Up @@ -35,6 +35,7 @@
import org.sonar.api.batch.sensor.SensorDescriptor;
import org.sonar.api.batch.sensor.issue.NewIssue;
import org.sonar.api.batch.sensor.issue.NewIssueLocation;
import org.sonar.api.issue.NoSonarFilter;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.FileLinesContextFactory;
import org.sonar.api.measures.Metric;
Expand Down Expand Up @@ -89,6 +90,7 @@ public class CxxSquidSensor implements Sensor {

private final FileLinesContextFactory fileLinesContextFactory;
private final CxxChecks checks;
private final NoSonarFilter noSonarFilter;

private final CxxLanguage language;

Expand All @@ -97,8 +99,9 @@ public class CxxSquidSensor implements Sensor {
*/
public CxxSquidSensor(CxxLanguage language,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory) {
this(language, fileLinesContextFactory, checkFactory, null);
CheckFactory checkFactory,
NoSonarFilter noSonarFilter) {
this(language, fileLinesContextFactory, checkFactory, noSonarFilter, null);
}

/**
Expand All @@ -107,11 +110,13 @@ public CxxSquidSensor(CxxLanguage language,
public CxxSquidSensor(CxxLanguage language,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory,
NoSonarFilter noSonarFilter,
@Nullable CustomCxxRulesDefinition[] customRulesDefinition) {
this.checks = CxxChecks.createCxxCheck(checkFactory)
.addChecks(language.getRepositoryKey(), language.getChecks())
.addCustomChecks(customRulesDefinition);
this.fileLinesContextFactory = fileLinesContextFactory;
this.noSonarFilter = noSonarFilter;
this.language = language;
}

Expand Down Expand Up @@ -234,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
Expand Up @@ -37,6 +37,7 @@
import org.sonar.api.batch.rule.ActiveRules;
import org.sonar.api.batch.rule.CheckFactory;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
import org.sonar.api.issue.NoSonarFilter;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.FileLinesContext;
import org.sonar.api.measures.FileLinesContextFactory;
Expand Down Expand Up @@ -69,6 +70,7 @@ public void setUp() {
language,
fileLinesContextFactory,
checkFactory,
new NoSonarFilter(),
null);
}

Expand Down
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
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
@@ -0,0 +1,13 @@
/* Header */

/* NOSONAR */
int a;

// NOSONAR
int b;

int c; /* NOSONAR */

int d; // NOSONAR

/* EOF '/
9 changes: 6 additions & 3 deletions sonar-c-plugin/src/main/java/org/sonar/plugins/c/CPlugin.java
Expand Up @@ -30,6 +30,7 @@
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.issue.NoSonarFilter;
import org.sonar.api.measures.FileLinesContextFactory;
import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;
Expand Down Expand Up @@ -688,15 +689,17 @@ public static class CxxSquidSensorImpl extends CxxSquidSensor {

public CxxSquidSensorImpl(Configuration settings,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory) {
super(new CLanguage(settings), fileLinesContextFactory, checkFactory);
CheckFactory checkFactory,
NoSonarFilter noSonarFilter) {
super(new CLanguage(settings), fileLinesContextFactory, checkFactory, noSonarFilter);
}

public CxxSquidSensorImpl(Configuration settings,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory,
NoSonarFilter noSonarFilter,
@Nullable CustomCxxRulesDefinition[] customRulesDefinition) {
super(new CLanguage(settings), fileLinesContextFactory, checkFactory, customRulesDefinition);
super(new CLanguage(settings), fileLinesContextFactory, checkFactory, noSonarFilter, customRulesDefinition);
}
}

Expand Down
Expand Up @@ -30,6 +30,7 @@
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.issue.NoSonarFilter;
import org.sonar.api.measures.FileLinesContextFactory;
import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;
Expand Down Expand Up @@ -741,15 +742,17 @@ public static class CxxSquidSensorImpl extends CxxSquidSensor {

public CxxSquidSensorImpl(Configuration settings,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory) {
super(new CppLanguage(settings), fileLinesContextFactory, checkFactory);
CheckFactory checkFactory,
NoSonarFilter noSonarFilter) {
super(new CppLanguage(settings), fileLinesContextFactory, checkFactory, noSonarFilter);
}

public CxxSquidSensorImpl(Configuration settings,
FileLinesContextFactory fileLinesContextFactory,
CheckFactory checkFactory,
NoSonarFilter noSonarFilter,
@Nullable CustomCxxRulesDefinition[] customRulesDefinition) {
super(new CppLanguage(settings), fileLinesContextFactory, checkFactory, customRulesDefinition);
super(new CppLanguage(settings), fileLinesContextFactory, checkFactory, noSonarFilter, customRulesDefinition);
}
}

Expand Down

0 comments on commit 2142826

Please sign in to comment.