Skip to content

Commit 838b331

Browse files
authored
Implement global setting for run on save (#1798)
closes #1739
1 parent ff79092 commit 838b331

File tree

12 files changed

+137
-33
lines changed

12 files changed

+137
-33
lines changed

.github/workflows/ValidatePullRequest.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ jobs:
3636
rm -r -f ./Tests/CSharpier.MsBuild.Test
3737
dotnet tool restore
3838
dotnet csharpier check .
39+
cd ./Src/CSharpier.Rider
40+
npm install
41+
npm run prettier:check
42+
cd ..
43+
cd ./CSharpier.Playground/ClientApp
44+
npm install
45+
npm run prettier:check
46+
3947
check_todos:
4048
runs-on: ubuntu-latest
4149
name: Check TODOs

Src/CSharpier.Playground/ClientApp/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"scripts": {
2828
"build": "tsc && vite build",
2929
"prettier": "prettier --parser typescript ./src/**/*.{ts,tsx} --write",
30+
"prettier:check": "prettier --parser typescript ./src/**/*.{ts,tsx} --check",
3031
"start": "echo Starting the development server && vite"
3132
},
3233
"browserslist": {

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

Src/CSharpier.Rider/package.json

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
2-
"scripts": {
3-
"prettier": "prettier ./**/*.java --write"
4-
},
5-
"devDependencies": {
6-
"prettier": "^3.4.2",
7-
"prettier-plugin-java": "^2.6.4"
8-
}
2+
"scripts": {
3+
"prettier": "prettier ./**/*.java --write",
4+
"prettier:check": "prettier ./**/*.java --check"
5+
},
6+
"devDependencies": {
7+
"prettier": "^3.4.2",
8+
"prettier-plugin-java": "^2.6.4"
9+
}
910
}
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: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
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;
@@ -14,8 +15,14 @@
1415

1516
public class CSharpierSettingsComponent implements SearchableConfigurable {
1617

18+
private final ComboItem[] runOnSaveItems = {
19+
new ComboItem(null, "Use Global Setting"),
20+
new ComboItem(true, "True"),
21+
new ComboItem(false, "False"),
22+
};
1723
private final Project project;
18-
private JBCheckBox runOnSaveCheckBox = new JBCheckBox("Run on Save");
24+
private ComboBox<ComboItem> solutionRunOnSaveComboBox = new ComboBox<>(runOnSaveItems);
25+
private JBCheckBox globalRunOnSaveCheckBox = new JBCheckBox("Run on Save (Global)");
1926
private JBCheckBox disableCSharpierServerCheckBox = new JBCheckBox("Disable CSharpier Server");
2027
private JBCheckBox useCustomPath = new JBCheckBox("Override CSharpier Executable");
2128
private JBTextField customPathTextField = new JBTextField();
@@ -66,7 +73,13 @@ private JComponent createSectionHeader(String label) {
6673
return FormBuilder.createFormBuilder()
6774
.addComponent(createSectionHeader("General Settings"))
6875
.setFormLeftIndent(leftIndent)
69-
.addComponent(this.runOnSaveCheckBox, topInset)
76+
.addLabeledComponent(
77+
new JBLabel("Run on save (Solution):"),
78+
this.solutionRunOnSaveComboBox,
79+
topInset,
80+
false
81+
)
82+
.addComponent(this.globalRunOnSaveCheckBox, topInset)
7083
.setFormLeftIndent(0)
7184
.addComponent(createSectionHeader("Developer Settings"), 20)
7285
.setFormLeftIndent(leftIndent)
@@ -82,11 +95,15 @@ private JComponent createSectionHeader(String label) {
8295
.getPanel();
8396
}
8497

98+
private Boolean getSelectedSolutionRunOnSave() {
99+
return ((ComboItem) this.solutionRunOnSaveComboBox.getSelectedItem()).value;
100+
}
101+
85102
@Override
86103
public boolean isModified() {
87104
return (
88105
CSharpierSettings.getInstance(this.project).getRunOnSave() !=
89-
this.runOnSaveCheckBox.isSelected() ||
106+
this.getSelectedSolutionRunOnSave() ||
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.getSelectedSolutionRunOnSave());
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
}

0 commit comments

Comments
 (0)