Skip to content

Commit bdba345

Browse files
authored
Delay lookup of dotnet cli exe path and fall back to finding dotnet o… (#1190)
* Delay lookup of dotnet cli exe path and fall back to finding dotnet on PATH closes #1189 * self code review * update version number * Delay calling getDotNetCoreRuntime even longer. Take into account sh and zsh for trying to find dotnet on PAH * only use dotnetCoreRuntime, wait until rider is ready to ensure it is loaded. * some cleanup
1 parent 8949282 commit bdba345

11 files changed

+91
-52
lines changed

Src/CSharpier.Rider/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
# csharpier-rider Changelog
44

5+
## [1.6.2]
6+
- Fix issues with lookup of '.NET CLI executable path', csharpier will now wait until rider is ready with the information.
7+
- No more falling back to `PATH`
8+
9+
## [1.6.1]
10+
- Delay lookup of '.NET CLI executable path' until it is needed
11+
- Fall back to looking for dotnet on PATH if '.NET CLI executable path' is not available
12+
513
## [1.6.0]
614
- Better support for dotnet commands.
715
- Uses the Rider setting for '.NET CLI executable path' for running dotnet commands

Src/CSharpier.Rider/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
pluginGroup = com.intellij.csharpier
55
pluginName = csharpier
6-
pluginVersion = 1.6.0
6+
pluginVersion = 1.6.2
77

88
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
99
# for insight into build numbers and IntelliJ Platform versions.

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessPipeMultipleFiles.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private void startProcess() {
3434
try {
3535
var processBuilder = new ProcessBuilder(this.csharpierPath, "--pipe-multiple-files");
3636
processBuilder.environment().put("DOTNET_NOLOGO", "1");
37-
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetROot());
37+
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot());
3838
this.process = processBuilder.start();
3939

4040
var charset = this.useUtf8 ? "utf-8" : Charset.defaultCharset().toString();

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessProvider.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,6 @@ public CSharpierProcessProvider(@NotNull Project project) {
4141
this.project = project;
4242
this.customPathInstaller = new CustomPathInstaller(project);
4343

44-
for (var fileEditor : FileEditorManager.getInstance(project).getAllEditors()) {
45-
var path = fileEditor.getFile().getPath();
46-
if (path.toLowerCase().endsWith(".cs")) {
47-
this.findAndWarmProcess(path);
48-
}
49-
}
50-
5144
EditorFactory.getInstance().getEventMulticaster().addDocumentListener(this, this);
5245
}
5346

@@ -72,6 +65,10 @@ public void documentChanged(@NotNull DocumentEvent event) {
7265
}
7366

7467
private void findAndWarmProcess(String filePath) {
68+
// if we didn't find dotnet bail out so we don't get extra errors about being unable to format
69+
if (!DotNetProvider.getInstance(this.project).foundDotNet()) {
70+
return;
71+
}
7572
var directory = Path.of(filePath).getParent().toString();
7673
var now = Instant.now().toEpochMilli();
7774
var lastWarmed = this.lastWarmedByDirectory.getOrDefault(directory, Long.valueOf(0));
@@ -98,6 +95,11 @@ private void findAndWarmProcess(String filePath) {
9895
}
9996

10097
public ICSharpierProcess getProcessFor(String filePath) {
98+
// if we didn't find dotnet bail out so we don't get extra errors about being unable to format
99+
if (!DotNetProvider.getInstance(this.project).foundDotNet()) {
100+
return NullCSharpierProcess.Instance;
101+
}
102+
101103
var directory = Path.of(filePath).getParent().toString();
102104
var version = this.csharpierVersionByDirectory.getOrDefault(directory, null);
103105
if (version == null) {

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ private void startProcess() {
3838
var processBuilder = new ProcessBuilder(this.csharpierPath, "--server");
3939
processBuilder.redirectErrorStream(true);
4040
processBuilder.environment().put("DOTNET_NOLOGO", "1");
41-
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetROot());
41+
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot());
4242
this.process = processBuilder.start();
4343

4444
var reader = new BufferedReader(new InputStreamReader(this.process.getInputStream()));

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessSingleFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public String formatFile(String content, String fileName) {
2323
this.logger.debug("Running " + this.csharpierPath + " --write-stdout");
2424
var processBuilder = new ProcessBuilder(this.csharpierPath, "--write-stdout");
2525
processBuilder.environment().put("DOTNET_NOLOGO", "1");
26-
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetROot());
26+
processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot());
2727
processBuilder.redirectErrorStream(true);
2828
var process = processBuilder.start();
2929

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierStartup.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.intellij.csharpier
2+
3+
import com.intellij.openapi.application.ApplicationManager
4+
import com.intellij.openapi.diagnostic.Logger
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.openapi.startup.StartupActivity
7+
import com.intellij.openapi.startup.StartupActivity.DumbAware
8+
import com.jetbrains.rd.platform.util.lifetime
9+
import com.jetbrains.rd.util.reactive.adviseUntil
10+
import com.jetbrains.rider.model.riderSolutionLifecycle
11+
import com.jetbrains.rider.projectView.solution
12+
import com.jetbrains.rider.runtime.RiderDotNetActiveRuntimeHost
13+
14+
// kotlin because I have no idea how to get project.solution.riderSolutionLifecycle.isProjectModelReady.adviseUntil happy in java
15+
class CSharpierStartup : StartupActivity, DumbAware {
16+
var logger: Logger = CSharpierLogger.getInstance()
17+
18+
override fun runActivity(project: Project) {
19+
project.solution.riderSolutionLifecycle.isProjectModelReady.adviseUntil(project.lifetime) { isReady ->
20+
21+
val dotNetCoreRuntime =
22+
RiderDotNetActiveRuntimeHost.Companion.getInstance(project).dotNetCoreRuntime.value
23+
24+
if (!isReady || dotNetCoreRuntime == null) {
25+
if (isReady) {
26+
logger.warn("isProjectModelReady is true, but dotNetCoreRuntime is still null");
27+
}
28+
29+
return@adviseUntil false
30+
}
31+
32+
CSharpierProcessProvider.getInstance(project)
33+
ApplicationManager.getApplication().getService(ReformatWithCSharpierOnSave::class.java)
34+
DotNetProvider.getInstance(project).initialize();
35+
36+
return@adviseUntil true
37+
}
38+
}
39+
40+
}

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CustomPathInstaller.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import java.io.File;
88
import java.nio.file.Path;
9-
import java.util.HashMap;
109
import java.util.List;
1110
import java.util.Map;
1211
import java.util.regex.Pattern;
@@ -51,7 +50,7 @@ public boolean ensureVersionInstalled(String version) throws Exception {
5150

5251
private boolean validateInstall(String pathToDirectoryForVersion, String version) {
5352
try {
54-
var env = Map.of("DOTNET_ROOT", this.dotNetProvider.getDotNetROot());
53+
var env = Map.of("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot());
5554

5655
var command = List.of(this.getPathForVersion(version), "--version" );
5756
var output = ProcessHelper.executeCommand(command, env, new File(pathToDirectoryForVersion)).trim();

Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/DotNetProvider.java

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,49 @@
55
import com.intellij.openapi.diagnostic.Logger;
66
import com.intellij.openapi.project.Project;
77
import com.jetbrains.rider.runtime.RiderDotNetActiveRuntimeHost;
8-
import com.jetbrains.rider.runtime.dotNetCore.DotNetCoreRuntime;
98
import org.jetbrains.annotations.NotNull;
109

1110
import java.io.File;
1211
import java.nio.file.Paths;
13-
import java.util.ArrayList;
14-
import java.util.Map;
15-
import java.util.List;
12+
import java.util.*;
1613

1714
public class DotNetProvider {
1815
private final Logger logger = CSharpierLogger.getInstance();
1916
private final Project project;
2017
private String dotNetRoot;
21-
private DotNetCoreRuntime dotNetCoreRuntime;
18+
private String cliExePath;
2219

2320
public DotNetProvider(@NotNull Project project) {
2421
this.project = project;
22+
}
2523

24+
static DotNetProvider getInstance(@NotNull Project project) {
25+
return project.getService(DotNetProvider.class);
26+
}
27+
28+
void initialize() {
2629
var foundDotNet = this.findDotNet();
2730
if (!foundDotNet) {
2831

2932
var title = "CSharpier unable to run dotnet commands";
30-
var message = "CSharpier was unable to determine how to run dotnet commands. Ensure that '.NET CLI executable path' is set properly in your settings and restart.";
31-
var notification = NotificationGroupManager.getInstance().getNotificationGroup("CSharpier")
32-
.createNotification(title, message, NotificationType.WARNING);
33+
var message = "CSharpier was unable to determine how to run dotnet commands. Ensure that '.NET CLI executable path' is set properly in your settings or dotnet is available on PATH and restart.";
34+
var notification = NotificationGroupManager.getInstance().getNotificationGroup("CSharpier").createNotification(title, message, NotificationType.WARNING);
3335
notification.notify(this.project);
3436
}
3537
}
3638

37-
static DotNetProvider getInstance(@NotNull Project project) {
38-
return project.getService(DotNetProvider.class);
39-
}
40-
4139
private boolean findDotNet() {
4240
try {
43-
this.dotNetCoreRuntime = RiderDotNetActiveRuntimeHost.Companion.getInstance(project).getDotNetCoreRuntime().getValue();
41+
var dotNetCoreRuntime = RiderDotNetActiveRuntimeHost.Companion.getInstance(project).getDotNetCoreRuntime().getValue();
4442

45-
if (dotNetCoreRuntime.getCliExePath() != null) {
46-
logger.debug("Using dotnet found from RiderDotNetActiveRuntimeHost at " + dotNetCoreRuntime.getCliExePath());
43+
if (dotNetCoreRuntime != null && dotNetCoreRuntime.getCliExePath() != null) {
44+
this.logger.debug("Using dotnet found from RiderDotNetActiveRuntimeHost at " + dotNetCoreRuntime.getCliExePath());
45+
this.cliExePath = dotNetCoreRuntime.getCliExePath();
4746
} else {
4847
return false;
4948
}
5049

51-
dotNetRoot = Paths.get(dotNetCoreRuntime.getCliExePath()).getParent().toString();
50+
this.dotNetRoot = Paths.get(this.cliExePath).getParent().toString();
5251

5352
return true;
5453
} catch (Exception ex) {
@@ -60,17 +59,20 @@ private boolean findDotNet() {
6059

6160
public String execDotNet(List<String> command, File workingDirectory) {
6261
var commands = new ArrayList<>(command);
63-
commands.add(0, this.dotNetCoreRuntime.getCliExePath());
62+
commands.add(0, this.cliExePath);
6463

65-
var env = Map.of(
66-
"DOTNET_NOLOGO", "1",
67-
"DOTNET_CLI_TELEMETRY_OPTOUT", "1",
68-
"DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "1");
64+
var env = Map.of("DOTNET_NOLOGO", "1", "DOTNET_CLI_TELEMETRY_OPTOUT", "1", "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "1");
6965

7066
return ProcessHelper.executeCommand(commands, env, workingDirectory);
7167
}
7268

73-
public String getDotNetROot() {
69+
public String getDotNetRoot() {
7470
return this.dotNetRoot;
7571
}
72+
73+
public boolean foundDotNet() {
74+
return this.cliExePath != null;
75+
}
76+
77+
7678
}

0 commit comments

Comments
 (0)