Skip to content

Commit c734d39

Browse files
committed
Implement global setting for run on save
closes #1739
1 parent ff79092 commit c734d39

File tree

9 files changed

+121
-27
lines changed

9 files changed

+121
-27
lines changed

Src/CSharpier.Rider/CHANGELOG.md

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

33
# csharpier-rider Changelog
44

5+
## [2.3.0]
6+
- Add a global format on save option
7+
58
## [2.2.4]
69
- Fix Stream closed exception in Rider plugin
710

Src/CSharpier.Rider/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
pluginVersion = 2.2.4
1+
pluginVersion = 2.3.0
22

33
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
44
pluginSinceBuild = 222
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.components.PersistentStateComponent;
5+
import com.intellij.openapi.components.State;
6+
import com.intellij.openapi.components.Storage;
7+
import com.intellij.util.xmlb.XmlSerializerUtil;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
@State(
11+
name = "com.intellij.csharpier.global",
12+
storages = @Storage("$APP_CONFIG$/CSharpierPlugin.xml")
13+
)
14+
public class CSharpierGlobalSettings implements PersistentStateComponent<CSharpierGlobalSettings> {
15+
16+
@NotNull
17+
public static CSharpierGlobalSettings getInstance() {
18+
return ApplicationManager.getApplication().getService(CSharpierGlobalSettings.class);
19+
}
20+
21+
private boolean runOnSave;
22+
23+
public boolean getRunOnSave() {
24+
return this.runOnSave;
25+
}
26+
27+
public void setRunOnSave(boolean value) {
28+
this.runOnSave = value;
29+
}
30+
31+
@Override
32+
public CSharpierGlobalSettings getState() {
33+
return this;
34+
}
35+
36+
@Override
37+
public void loadState(@NotNull CSharpierGlobalSettings state) {
38+
XmlSerializerUtil.copyBean(state, this);
39+
}
40+
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,15 @@ private String findVersionInCsProjOfParentsDirectories(String directoryThatConta
207207

208208
private String findVersionInCsProj(Path currentDirectory) {
209209
this.logger.debug("Looking for " + currentDirectory + "/*.csproj");
210-
File[] csProjFiles = currentDirectory.toFile()
210+
File[] csProjFiles = currentDirectory
211+
.toFile()
211212
.listFiles((dir, name) -> name.toLowerCase().endsWith(".csproj"));
212213
if (csProjFiles == null) {
213-
this.logger.debug("Unable to list files in directory: " + currentDirectory +
214-
" (directory may not exist, not be a directory, or be temporarily inaccessible)");
214+
this.logger.debug(
215+
"Unable to list files in directory: " +
216+
currentDirectory +
217+
" (directory may not exist, not be a directory, or be temporarily inaccessible)"
218+
);
215219
return null;
216220
}
217221
for (var pathToCsProj : csProjFiles) {

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,23 @@ private void startProcess() {
5151
var csharpierProcess = processBuilder.start();
5252

5353
var errorOutput = new StringBuilder();
54-
var stderrThread = new Thread(() -> {
55-
try (
56-
var errorReader = new BufferedReader(
57-
new InputStreamReader(csharpierProcess.getErrorStream())
58-
)
59-
) {
60-
String line;
61-
while ((line = errorReader.readLine()) != null) {
62-
errorOutput.append(line).append("\n");
54+
var stderrThread = new Thread(
55+
() -> {
56+
try (
57+
var errorReader = new BufferedReader(
58+
new InputStreamReader(csharpierProcess.getErrorStream())
59+
)
60+
) {
61+
String line;
62+
while ((line = errorReader.readLine()) != null) {
63+
errorOutput.append(line).append("\n");
64+
}
65+
} catch (IOException e) {
66+
// Stream closed or process terminated - expected behavior
6367
}
64-
} catch (IOException e) {
65-
// Stream closed or process terminated - expected behavior
66-
}
67-
}, "CSharpier stderr reader");
68+
},
69+
"CSharpier stderr reader"
70+
);
6871
stderrThread.start();
6972

7073
var stdoutThread = new Thread(() -> {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ static CSharpierSettings getInstance(@NotNull Project project) {
1515
return project.getService(CSharpierSettings.class);
1616
}
1717

18-
private boolean runOnSave;
18+
private Boolean runOnSave;
1919

20-
public boolean getRunOnSave() {
20+
public Boolean getRunOnSave() {
2121
return this.runOnSave;
2222
}
2323

24-
public void setRunOnSave(boolean value) {
24+
public void setRunOnSave(Boolean value) {
2525
this.runOnSave = value;
2626
}
2727

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

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@
22

33
import com.intellij.openapi.options.SearchableConfigurable;
44
import com.intellij.openapi.project.Project;
5+
import com.intellij.openapi.ui.ComboBox;
56
import com.intellij.ui.components.JBCheckBox;
67
import com.intellij.ui.components.JBLabel;
78
import com.intellij.ui.components.JBTextField;
89
import com.intellij.util.ui.FormBuilder;
910
import java.awt.*;
11+
import java.util.Arrays;
1012
import javax.swing.*;
1113
import org.jetbrains.annotations.Nls;
1214
import org.jetbrains.annotations.NotNull;
1315
import org.jetbrains.annotations.Nullable;
1416

1517
public class CSharpierSettingsComponent implements SearchableConfigurable {
1618

19+
private final ComboItem[] runOnSaveItems = {
20+
new ComboItem(null, "Use Global Setting"),
21+
new ComboItem(true, "True"),
22+
new ComboItem(false, "False"),
23+
};
1724
private final Project project;
18-
private JBCheckBox runOnSaveCheckBox = new JBCheckBox("Run on Save");
25+
private ComboBox<ComboItem> solutionRunOnSaveComboBox = new ComboBox<>(runOnSaveItems);
26+
private JBCheckBox globalRunOnSaveCheckBox = new JBCheckBox("Run on Save (Global)");
1927
private JBCheckBox disableCSharpierServerCheckBox = new JBCheckBox("Disable CSharpier Server");
2028
private JBCheckBox useCustomPath = new JBCheckBox("Override CSharpier Executable");
2129
private JBTextField customPathTextField = new JBTextField();
@@ -66,7 +74,13 @@ private JComponent createSectionHeader(String label) {
6674
return FormBuilder.createFormBuilder()
6775
.addComponent(createSectionHeader("General Settings"))
6876
.setFormLeftIndent(leftIndent)
69-
.addComponent(this.runOnSaveCheckBox, topInset)
77+
.addLabeledComponent(
78+
new JBLabel("Run on save (Solution):"),
79+
this.solutionRunOnSaveComboBox,
80+
topInset,
81+
false
82+
)
83+
.addComponent(this.globalRunOnSaveCheckBox, topInset)
7084
.setFormLeftIndent(0)
7185
.addComponent(createSectionHeader("Developer Settings"), 20)
7286
.setFormLeftIndent(leftIndent)
@@ -82,11 +96,14 @@ private JComponent createSectionHeader(String label) {
8296
.getPanel();
8397
}
8498

99+
private Boolean getSelected() {
100+
return ((ComboItem) this.solutionRunOnSaveComboBox.getSelectedItem()).value;
101+
}
102+
85103
@Override
86104
public boolean isModified() {
87105
return (
88-
CSharpierSettings.getInstance(this.project).getRunOnSave() !=
89-
this.runOnSaveCheckBox.isSelected() ||
106+
CSharpierSettings.getInstance(this.project).getRunOnSave() != this.getSelected() ||
90107
CSharpierSettings.getInstance(this.project).getCustomPath() !=
91108
this.customPathTextField.getText() ||
92109
CSharpierSettings.getInstance(this.project).getUseCustomPath() !=
@@ -100,18 +117,40 @@ public boolean isModified() {
100117
public void apply() {
101118
var settings = CSharpierSettings.getInstance(this.project);
102119

103-
settings.setRunOnSave(this.runOnSaveCheckBox.isSelected());
120+
settings.setRunOnSave(this.getSelected());
104121
settings.setCustomPath(this.customPathTextField.getText());
105122
settings.setDisableCSharpierServer(this.disableCSharpierServerCheckBox.isSelected());
106123
settings.setUseCustomPath(this.useCustomPath.isSelected());
124+
125+
CSharpierGlobalSettings.getInstance()
126+
.setRunOnSave(this.globalRunOnSaveCheckBox.isSelected());
107127
}
108128

109129
@Override
110130
public void reset() {
111131
var settings = CSharpierSettings.getInstance(this.project);
112-
this.runOnSaveCheckBox.setSelected(settings.getRunOnSave());
132+
133+
var index = -1;
134+
for (var i = 0; i < runOnSaveItems.length; i++) {
135+
if (runOnSaveItems[i].value == settings.getRunOnSave()) {
136+
index = i;
137+
break;
138+
}
139+
}
140+
141+
this.solutionRunOnSaveComboBox.setSelectedIndex(index);
142+
this.globalRunOnSaveCheckBox.setSelected(
143+
CSharpierGlobalSettings.getInstance().getRunOnSave()
144+
);
113145
this.useCustomPath.setSelected(settings.getUseCustomPath());
114146
this.customPathTextField.setText(settings.getCustomPath());
115147
this.disableCSharpierServerCheckBox.setSelected(settings.getDisableCSharpierServer());
116148
}
149+
150+
public record ComboItem(Boolean value, String label) {
151+
@Override
152+
public String toString() {
153+
return label;
154+
}
155+
}
117156
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ public void beforeDocumentSaving(@NotNull Document document) {
2020
}
2121

2222
var cSharpierSettings = CSharpierSettings.getInstance(project);
23-
if (!cSharpierSettings.getRunOnSave()) {
23+
var shouldRunOnSave =
24+
Boolean.TRUE.equals(cSharpierSettings.getRunOnSave()) ||
25+
(cSharpierSettings.getRunOnSave() == null &&
26+
CSharpierGlobalSettings.getInstance().getRunOnSave());
27+
if (!shouldRunOnSave) {
2428
return;
2529
}
2630

Src/CSharpier.Rider/src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<vendor>belav</vendor>
66
<depends>com.intellij.modules.rider</depends>
77
<extensions defaultExtensionNs="com.intellij">
8+
<applicationService serviceImplementation="com.intellij.csharpier.CSharpierGlobalSettings" />
89
<projectService serviceImplementation="com.intellij.csharpier.CSharpierProcessProvider" />
910
<projectService serviceImplementation="com.intellij.csharpier.DotNetProvider" />
1011
<projectService serviceImplementation="com.intellij.csharpier.FormattingService" />

0 commit comments

Comments
 (0)