Skip to content

Commit 2ff6f41

Browse files
authored
Merge pull request #1650 from ivangalkin/preprocessor_includes_alt
CxxPreprocessor: collect missing includes conditionally
2 parents 330a2c3 + 7d2847a commit 2ff6f41

File tree

4 files changed

+22
-21
lines changed

4 files changed

+22
-21
lines changed

cxx-sensors/src/main/java/org/sonar/cxx/sensors/squid/CxxSquidSensor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.sonar.cxx.CxxLanguage;
4747
import org.sonar.cxx.CxxMetricsFactory;
4848
import org.sonar.cxx.api.CxxMetric;
49+
import org.sonar.cxx.checks.error.MissingIncludeFileCheck;
4950
import org.sonar.cxx.sensors.utils.CxxReportSensor;
5051
import org.sonar.cxx.sensors.utils.JsonCompilationDatabase;
5152
import org.sonar.cxx.sensors.visitors.CxxCpdVisitor;
@@ -139,6 +140,7 @@ public void execute(SensorContext context) {
139140
this.language.getBooleanOption(CPD_IGNORE_IDENTIFIERS_KEY).orElse(Boolean.FALSE)));
140141

141142
CxxConfiguration cxxConf = createConfiguration(context.fileSystem(), context);
143+
cxxConf.setCollectMissingIncludes(visitors.stream().anyMatch(v -> v instanceof MissingIncludeFileCheck));
142144
AstScanner<Grammar> scanner = CxxAstScanner.create(this.language, cxxConf,
143145
visitors.toArray(new SquidAstVisitor[visitors.size()]));
144146

cxx-squid/src/main/java/org/sonar/cxx/CxxConfiguration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class CxxConfiguration extends SquidConfiguration {
5353
private String jsonCompilationDatabaseFile;
5454
private CxxCompilationUnitSettings globalCompilationUnitSettings;
5555
private final Map<String, CxxCompilationUnitSettings> compilationUnitSettings = new HashMap<>();
56+
private boolean collectMissingIncludes = false;
5657

5758
private final CxxVCppBuildLogParser cxxVCppParser;
5859

@@ -84,6 +85,14 @@ public boolean getIgnoreHeaderComments() {
8485
return ignoreHeaderComments;
8586
}
8687

88+
public boolean doCollectMissingIncludes() {
89+
return collectMissingIncludes;
90+
}
91+
92+
public void setCollectMissingIncludes(boolean collectMissingIncludes) {
93+
this.collectMissingIncludes = collectMissingIncludes;
94+
}
95+
8796
public void setDefines(@Nullable String[] defines) {
8897
if (defines == null) {
8998
return;

cxx-squid/src/main/java/org/sonar/cxx/parser/CxxParser.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.sonar.sslr.api.Grammar;
2323
import com.sonar.sslr.impl.Parser;
2424
import java.io.File;
25+
import java.lang.ref.WeakReference;
2526
import java.util.Collection;
2627
import org.sonar.cxx.CxxConfiguration;
2728
import org.sonar.cxx.CxxLanguage;
@@ -34,21 +35,17 @@
3435

3536
public final class CxxParser {
3637

37-
private static CxxPreprocessor cxxpp;
38+
private static WeakReference<CxxPreprocessor> currentPreprocessorInstance;
3839

3940
private CxxParser() {
4041
}
4142

4243
public static void finishedParsing(File path) {
43-
cxxpp.finishedPreprocessing(path);
44-
}
45-
46-
public static Collection<CxxPreprocessor.Include> getIncludedFiles(File path) {
47-
return cxxpp.getIncludedFiles(path);
44+
currentPreprocessorInstance.get().finishedPreprocessing(path);
4845
}
4946

5047
public static Collection<CxxPreprocessor.Include> getMissingIncludeFiles(File path) {
51-
return cxxpp.getMissingIncludeFiles(path);
48+
return currentPreprocessorInstance.get().getMissingIncludeFiles(path);
5249
}
5350

5451
public static Parser<Grammar> create(CxxLanguage language) {
@@ -62,7 +59,8 @@ public static Parser<Grammar> create(CxxLanguage language, SquidAstVisitorContex
6259

6360
public static Parser<Grammar> create(SquidAstVisitorContext<Grammar> context, CxxConfiguration conf,
6461
CxxLanguage language) {
65-
cxxpp = new CxxPreprocessor(context, conf, language);
62+
final CxxPreprocessor cxxpp = new CxxPreprocessor(context, conf, language);
63+
currentPreprocessorInstance = new WeakReference<CxxPreprocessor>(cxxpp);
6664
return Parser.builder(CxxGrammarImpl.create(conf))
6765
.withLexer(CxxLexer.create(conf, cxxpp, new JoinStringsPreprocessor()))
6866
.build();

cxx-squid/src/main/java/org/sonar/cxx/preprocessor/CxxPreprocessor.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public class CxxPreprocessor extends Preprocessor {
101101
private final List<String> cFilesPatterns;
102102
private final CxxConfiguration conf;
103103
private CxxCompilationUnitSettings compilationUnitSettings;
104-
private final Multimap<String, Include> includedFiles = HashMultimap.create();
105104
private final Multimap<String, Include> missingIncludeFiles = HashMultimap.create();
106105
private boolean ctorInProgress = true;
107106

@@ -441,10 +440,6 @@ private static String stripQuotes(String str) {
441440
return str.substring(1, str.length() - 1);
442441
}
443442

444-
public Collection<Include> getIncludedFiles(File file) {
445-
return includedFiles.get(file.getPath());
446-
}
447-
448443
public Collection<Include> getMissingIncludeFiles(File file) {
449444
return missingIncludeFiles.get(file.getPath());
450445
}
@@ -1075,19 +1070,16 @@ PreprocessorAction handleIncludeLine(AstNode ast, Token token, String filename,
10751070
// c) if not done yet, process it using a special lexer, which calls back only
10761071
// if it finds relevant preprocessor directives (currently: include's and define's)
10771072

1078-
File includedFile = findIncludedFile(ast, token, filename);
1079-
1080-
File currentFile = this.getFileUnderAnalysis();
1081-
if (includedFile != null) {
1082-
includedFiles.put(currentFile.getPath(), new Include(token.getLine(), includedFile.getAbsolutePath()));
1083-
}
1084-
1073+
final File includedFile = findIncludedFile(ast, token, filename);
10851074
if (includedFile == null) {
10861075
missingIncludeFilesCounter++;
10871076
if (LOG.isDebugEnabled()) {
10881077
LOG.debug("[" + filename + ":" + token.getLine() + "]: cannot find include file '" + token.getValue() + "'");
10891078
}
1090-
missingIncludeFiles.put(currentFile.getPath(), new Include(token.getLine(), token.getValue()));
1079+
if (conf.doCollectMissingIncludes()) {
1080+
final File currentFile = this.getFileUnderAnalysis();
1081+
missingIncludeFiles.put(currentFile.getPath(), new Include(token.getLine(), token.getValue()));
1082+
}
10911083
} else if (analysedFiles.add(includedFile.getAbsoluteFile())) {
10921084
if (LOG.isTraceEnabled()) {
10931085
LOG.trace("[{}:{}]: processing {}, resolved to file '{}'",

0 commit comments

Comments
 (0)