Skip to content

Commit

Permalink
preparatory refactoring of AbstractAnalysis
Browse files Browse the repository at this point in the history
  • Loading branch information
saberduck committed May 24, 2024
1 parent 968bed2 commit 33d9cd6
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 107 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,21 @@
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.plugins.javascript.CancellationException;
import org.sonar.plugins.javascript.JavaScriptLanguage;
import org.sonar.plugins.javascript.TypeScriptLanguage;
import org.sonar.plugins.javascript.analysis.cache.CacheAnalysis;
import org.sonar.plugins.javascript.analysis.cache.CacheStrategies;
import org.sonar.plugins.javascript.bridge.AnalysisMode;
import org.sonar.plugins.javascript.bridge.AnalysisWarningsWrapper;
import org.sonar.plugins.javascript.bridge.BridgeServer;
import org.sonar.plugins.javascript.JavaScriptFilePredicate;
import org.sonar.plugins.javascript.bridge.BridgeServer.TsProgram;
import org.sonar.plugins.javascript.utils.ProgressReport;

abstract class AbstractAnalysis {
Expand Down Expand Up @@ -78,4 +83,56 @@ protected boolean isJavaScript(InputFile file) {
}

abstract void analyzeFiles(List<InputFile> inputFiles, List<String> tsConfigs) throws IOException;

protected void analyzeFile(InputFile file, @Nullable List<String> tsConfigs, @Nullable TsProgram tsProgram) throws IOException {
if (context.isCancelled()) {
throw new CancellationException(
"Analysis interrupted because the SensorContext is in cancelled state"
);
}
var cacheStrategy = CacheStrategies.getStrategyFor(context, file);
if (cacheStrategy.isAnalysisRequired()) {
try {
LOG.debug("Analyzing file: {}", file.uri());
progressReport.nextFile(file.toString());
var fileContent = contextUtils.shouldSendFileContent(file) ? file.contents() : null;
var request = getJsAnalysisRequest(file, fileContent, tsProgram, tsConfigs);

var response = isJavaScript(file)
? bridgeServer.analyzeJavaScript(request)
: bridgeServer.analyzeTypeScript(request);

analysisProcessor.processResponse(context, checks, file, response);
cacheStrategy.writeAnalysisToCache(
CacheAnalysis.fromResponse(response.ucfgPaths(), response.cpdTokens()),
file
);
} catch (IOException e) {
LOG.error("Failed to get response while analyzing " + file.uri(), e);
throw e;
}
} else {
LOG.debug("Processing cache analysis of file: {}", file.uri());
var cacheAnalysis = cacheStrategy.readAnalysisFromCache();
analysisProcessor.processCacheAnalysis(context, file, cacheAnalysis);
}
}

private BridgeServer.JsAnalysisRequest getJsAnalysisRequest(
InputFile file,
@Nullable String fileContent,
@Nullable TsProgram tsProgram,
@Nullable List<String> tsConfigs
) {
return new BridgeServer.JsAnalysisRequest(
file.absolutePath(),
file.type().toString(),
inputFileLanguage(file),
fileContent,
contextUtils.ignoreHeaderComments(),
tsConfigs,
tsProgram != null ? tsProgram.programId() : null,
analysisMode.getLinterIdFor(file)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,13 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.scanner.ScannerSide;
import org.sonar.plugins.javascript.CancellationException;
import org.sonar.plugins.javascript.JavaScriptPlugin;
import org.sonar.plugins.javascript.analysis.cache.CacheAnalysis;
import org.sonar.plugins.javascript.analysis.cache.CacheStrategies;
import org.sonar.plugins.javascript.bridge.AnalysisWarningsWrapper;
import org.sonar.plugins.javascript.bridge.BridgeServer;
import org.sonar.plugins.javascript.bridge.BridgeServer.JsAnalysisRequest;
import org.sonar.plugins.javascript.bridge.BridgeServer.TsProgram;
import org.sonar.plugins.javascript.bridge.BridgeServer.TsProgramRequest;
import org.sonar.plugins.javascript.utils.ProgressReport;
Expand Down Expand Up @@ -107,7 +102,7 @@ void analyzeFiles(List<InputFile> inputFiles, List<String> tsConfigs) throws IOE
);
for (var f : skippedFiles) {
LOG.debug("File not part of any tsconfig.json: {}", f);
analyze(f, null);
analyzeFile(f, null, null);
}
}
success = true;
Expand Down Expand Up @@ -139,7 +134,7 @@ private void analyzeProgram(TsProgram program, Set<InputFile> analyzedFiles) thr
continue;
}
if (analyzedFiles.add(inputFile)) {
analyze(inputFile, program);
analyzeFile(inputFile, null, program);
counter++;
} else {
LOG.debug(
Expand All @@ -152,54 +147,4 @@ private void analyzeProgram(TsProgram program, Set<InputFile> analyzedFiles) thr
LOG.info("Analyzed {} file(s) with current program", counter);
}

private void analyze(InputFile file, @Nullable TsProgram tsProgram) throws IOException {
if (context.isCancelled()) {
throw new CancellationException(
"Analysis interrupted because the SensorContext is in cancelled state"
);
}
var cacheStrategy = CacheStrategies.getStrategyFor(context, file);
if (cacheStrategy.isAnalysisRequired()) {
try {
LOG.debug("Analyzing file: {}", file.uri());
progressReport.nextFile(file.toString());
var fileContent = contextUtils.shouldSendFileContent(file) ? file.contents() : null;
var request = getJsAnalysisRequest(file, tsProgram, fileContent);

var response = isJavaScript(file)
? bridgeServer.analyzeJavaScript(request)
: bridgeServer.analyzeTypeScript(request);

analysisProcessor.processResponse(context, checks, file, response);
cacheStrategy.writeAnalysisToCache(
CacheAnalysis.fromResponse(response.ucfgPaths(), response.cpdTokens()),
file
);
} catch (IOException e) {
LOG.error("Failed to get response while analyzing " + file.uri(), e);
throw e;
}
} else {
LOG.debug("Processing cache analysis of file: {}", file.uri());
var cacheAnalysis = cacheStrategy.readAnalysisFromCache();
analysisProcessor.processCacheAnalysis(context, file, cacheAnalysis);
}
}

private JsAnalysisRequest getJsAnalysisRequest(
InputFile file,
@Nullable TsProgram tsProgram,
@Nullable String fileContent
) {
return new JsAnalysisRequest(
file.absolutePath(),
file.type().toString(),
inputFileLanguage(file),
fileContent,
contextUtils.ignoreHeaderComments(),
null,
tsProgram != null ? tsProgram.programId() : null,
analysisMode.getLinterIdFor(file)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.HashSet;
import java.util.List;
Expand All @@ -33,12 +32,8 @@
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.scanner.ScannerSide;
import org.sonar.plugins.javascript.CancellationException;
import org.sonar.plugins.javascript.analysis.cache.CacheAnalysis;
import org.sonar.plugins.javascript.analysis.cache.CacheStrategies;
import org.sonar.plugins.javascript.bridge.AnalysisWarningsWrapper;
import org.sonar.plugins.javascript.bridge.BridgeServer;
import org.sonar.plugins.javascript.bridge.BridgeServer.JsAnalysisRequest;
import org.sonar.plugins.javascript.bridge.TsConfigFile;
import org.sonar.plugins.javascript.utils.ProgressReport;
import org.sonarsource.api.sonarlint.SonarLintSide;
Expand Down Expand Up @@ -121,52 +116,9 @@ private List<TsConfigFile> loadTsConfigs(List<String> tsConfigPaths) {

private void analyzeTsConfig(@Nullable TsConfigFile tsConfigFile, List<InputFile> files)
throws IOException {
List<String> tsConfigs = tsConfigFile == null ? List.of() : List.of(tsConfigFile.getFilename());
for (InputFile inputFile : files) {
if (context.isCancelled()) {
throw new CancellationException(
"Analysis interrupted because the SensorContext is in cancelled state"
);
}
analyze(inputFile, tsConfigFile);
progressReport.nextFile(inputFile.toString());
}
}

private void analyze(InputFile file, @Nullable TsConfigFile tsConfigFile) throws IOException {
var cacheStrategy = CacheStrategies.getStrategyFor(context, file);
if (cacheStrategy.isAnalysisRequired()) {
try {
LOG.debug("Analyzing file: {}", file);
var fileContent = contextUtils.shouldSendFileContent(file) ? file.contents() : null;
var tsConfigs = tsConfigFile == null
? Collections.<String>emptyList()
: List.of(tsConfigFile.getFilename());
var request = new JsAnalysisRequest(
file.absolutePath(),
file.type().toString(),
inputFileLanguage(file),
fileContent,
contextUtils.ignoreHeaderComments(),
tsConfigs,
null,
analysisMode.getLinterIdFor(file)
);
var response = isJavaScript(file)
? bridgeServer.analyzeJavaScript(request)
: bridgeServer.analyzeTypeScript(request);
analysisProcessor.processResponse(context, checks, file, response);
cacheStrategy.writeAnalysisToCache(
CacheAnalysis.fromResponse(response.ucfgPaths(), response.cpdTokens()),
file
);
} catch (IOException e) {
LOG.error("Failed to get response while analyzing " + file.uri(), e);
throw e;
}
} else {
LOG.debug("Processing cache analysis of file: {}", file.uri());
var cacheAnalysis = cacheStrategy.readAnalysisFromCache();
analysisProcessor.processCacheAnalysis(context, file, cacheAnalysis);
analyzeFile(inputFile, tsConfigs, null);
}
}
}

0 comments on commit 33d9cd6

Please sign in to comment.