Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SLI-1629 Improve how Node.js is loaded #1185

Merged
merged 2 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
sonarlint-core = "10.6.0.79033"
sonarlint-core = "10.7.0.79122"

sonar-java = "8.4.0.37032"
sonar-javascript = "10.16.0.27621"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ object SonarLintIntelliJClient : SonarLintRpcClientDelegate {

override fun raiseHotspots(
configurationScopeId: String,
issuesByFileUri: Map<URI, List<RaisedHotspotDto>>,
hotspotsByFileUri: Map<URI, List<RaisedHotspotDto>>,
isIntermediatePublication: Boolean,
analysisId: UUID?,
) {
Expand All @@ -861,13 +861,13 @@ object SonarLintIntelliJClient : SonarLintRpcClientDelegate {
val runningAnalysis = analysisId?.let { getService(project, RunningAnalysesTracker::class.java).getById(it) }

if (runningAnalysis != null) {
runningAnalysis.addRawHotspots(analysisId, issuesByFileUri, isIntermediatePublication)
runningAnalysis.addRawHotspots(analysisId, hotspotsByFileUri, isIntermediatePublication)
if (runningAnalysis.isAnalysisFinished()) {
getService(project, RunningAnalysesTracker::class.java).finish(runningAnalysis)
}
} else if (analysisId == null && module != null) {
val onTheFlyFindingsHolder = getService(project, AnalysisSubmitter::class.java).onTheFlyFindingsHolder
onTheFlyFindingsHolder.updateViewsWithNewSecurityHotspots(module, issuesByFileUri)
onTheFlyFindingsHolder.updateViewsWithNewSecurityHotspots(module, hotspotsByFileUri)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.nio.file.Paths;
import java.util.Objects;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
Expand All @@ -51,7 +52,8 @@

public class SonarLintGlobalOptionsPanel implements ConfigurationPanel<SonarLintGlobalSettings> {
private static final String NODE_JS_TOOLTIP = "SonarLint requires Node.js to analyze some languages. You can provide an explicit path for the node executable here or leave " +
"this field blank to let SonarLint look for it using your PATH environment variable.";
"this field blank to let SonarLint look for it using your PATH environment variable." +
" Restarting your IDE is recommended.";
private JPanel rootPane;
private JBCheckBox autoTrigger;
private JBTextField nodeJsPath;
Expand Down Expand Up @@ -136,19 +138,31 @@ public void load(SonarLintGlobalSettings model) {
autoTrigger.setSelected(model.isAutoTrigger());
nodeJsPath.setText(model.getNodejsPath());
focusOnNewCode.setSelected(model.isFocusOnNewCode());
loadNodeJsSettings();
loadNodeJsSettings(model);
}

private void loadNodeJsSettings() {
getService(BackendService.class).getAutoDetectedNodeJs().thenAccept(settings -> {
if (settings == null) {
this.nodeJsPath.getEmptyText().setText("Node.js not found");
this.nodeJsVersion.setText("N/A");
} else {
this.nodeJsPath.getEmptyText().setText(settings.getPath().toString());
this.nodeJsVersion.setText(settings.getVersion());
}
});
private void loadNodeJsSettings(SonarLintGlobalSettings model) {
if (model.getNodejsPath() == null || model.getNodejsPath().isBlank()) {
getService(BackendService.class).getAutoDetectedNodeJs().thenAccept(settings -> {
if (settings == null) {
this.nodeJsPath.getEmptyText().setText("Node.js not found");
this.nodeJsVersion.setText("N/A");
} else {
this.nodeJsPath.getEmptyText().setText(settings.getPath().toString());
this.nodeJsVersion.setText(settings.getVersion());
}
});
} else {
var forcedNodeJsPath = Paths.get(model.getNodejsPath());
getService(BackendService.class).changeClientNodeJsPath(forcedNodeJsPath).thenAccept(settings -> {
if (settings == null) {
this.nodeJsVersion.setText("N/A");
} else {
this.nodeJsPath.setText(settings.getPath().toString());
this.nodeJsVersion.setText(settings.getVersion());
}
});
}
}

@Override
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/sonarlint/intellij/core/BackendService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ import org.sonarsource.sonarlint.core.rpc.protocol.SonarLintRpcServer
import org.sonarsource.sonarlint.core.rpc.protocol.backend.analysis.AnalyzeFilesAndTrackParams
import org.sonarsource.sonarlint.core.rpc.protocol.backend.analysis.AnalyzeFilesResponse
import org.sonarsource.sonarlint.core.rpc.protocol.backend.analysis.DidChangeAutomaticAnalysisSettingParams
import org.sonarsource.sonarlint.core.rpc.protocol.backend.analysis.DidChangeClientNodeJsPathParams
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileParams
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileResponse
import org.sonarsource.sonarlint.core.rpc.protocol.backend.branch.DidVcsRepositoryChangeParams
Expand Down Expand Up @@ -894,6 +895,13 @@ class BackendService : Disposable {
}
}

fun changeClientNodeJsPath(nodeJsPath: Path?): CompletableFuture<NodeJsSettings?> {
return requestFromBackend { it.analysisService.didChangeClientNodeJsPath(DidChangeClientNodeJsPathParams(nodeJsPath)) }
.thenApplyAsync { response ->
response.details?.let { NodeJsSettings(it.path, it.version) }
}
}

fun updateFileSystem(filesByModule: Map<Module, List<VirtualFileEvent>>) {
val deletedFileUris = filesByModule.values
.flatMap { it.filter { event -> event.type == ModuleFileEvent.Type.DELETED } }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import org.sonarlint.intellij.finding.LiveFindings;
import org.sonarlint.intellij.finding.hotspot.LiveSecurityHotspot;
import org.sonarlint.intellij.finding.issue.LiveIssue;
import org.sonarsource.sonarlint.core.client.utils.ImpactSeverity;
import org.sonarsource.sonarlint.core.commons.IssueSeverity;
import org.sonarsource.sonarlint.core.commons.api.SonarLanguage;

Expand Down Expand Up @@ -161,7 +162,8 @@ private ReturnResult processResults(List<AnalysisResult> results) {
.flatMap(e -> e.getValue().stream())
.filter(Predicate.not(LiveIssue::isResolved))
.filter(issue -> !shouldFocusOnNewCode || issue.isOnNewCode())
.filter(i -> i.getUserSeverity() != null && i.getUserSeverity().name().equals(IssueSeverity.BLOCKER.name()))
.filter(i -> (i.getHighestImpact() != null && i.getHighestImpact().name().equals(ImpactSeverity.BLOCKER.name()))
|| (i.getUserSeverity() != null && i.getUserSeverity().name().equals(IssueSeverity.BLOCKER.name())))
.count();

if (numIssues == 0) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@

<change-notes><![CDATA[
<ul>
<li>10.11 - 1 new PHP rule. 7 new Python rules related to PyTorch. Bug fixes, fewer FPs and improvements for many languages.</li>
<li>10.11 - Optimize the triggering of analysis and automatically cancel redundant ones. Avoid an error related to the .gitignore file. Fix an issue where a custom Node.js path would not be considered. Optimize SonarLint initialization performance and reduce the file system cache usage. Improve error feedback with Connected Mode. 1 new PHP rule. 7 new Python rules related to PyTorch. Bug fixes, fewer FPs and improvements for many languages.</li>
<li>10.10 - Improve SonarLint performance and optimize memory usage. Refactor thread management to avoid UI freezes. Avoid errors of type 'No file to analyze'. Support detection of Micronaut configuration issues. 6 new JS/TS rules. Introduce new INFO and BLOCKER severities. Improve UI feedback when lacking permission with SonarQube or SonarCloud. Bug fixes, fewer FPs and improvements for many languages.</li>
<li>10.9 - Support analysis of Helm files. Improve analysis consistency on Rider. 7 new C++23 rules and C++23 support. Bug fixes, fewer FPs and improvements for many languages.</li>
<li>10.8.1 - Correctly display the current file analysis results on dev containers. Fix an issue where triggering a report analysis would disappear. Fix a problem where issues from another project would appear in the report.</li>
Expand Down