From fe57b44bdd505e574956648a7e2910700bfbf9a6 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Mon, 20 Jan 2025 14:31:30 -0600 Subject: [PATCH] Working on updates to rider plugin to support csharpier 1.0.0 (#1433) #1385 #1274 --- .../Server/CSharpierServiceImplementation.cs | 8 ++ Src/CSharpier.Rider/CHANGELOG.md | 6 ++ Src/CSharpier.Rider/README.md | 11 +- Src/CSharpier.Rider/gradle.properties | 2 +- .../CSharpierProcessPipeMultipleFiles.java | 7 +- .../csharpier/CSharpierProcessProvider.java | 34 +++--- .../csharpier/CSharpierProcessServer.java | 100 +++++++++++------- .../intellij/csharpier/CSharpierSettings.java | 10 ++ .../csharpier/CSharpierSettingsComponent.java | 10 +- .../intellij/csharpier/CSharpierStartup.kt | 1 - .../csharpier/CustomPathInstaller.java | 19 +++- .../intellij/csharpier/FormattingService.java | 68 +++++++----- .../intellij/csharpier/ICSharpierProcess.java | 1 + .../ReformatWithCSharpierAction.java | 15 ++- .../java/com/intellij/csharpier/Semver.java | 15 +++ Src/CSharpier.VSCode/CHANGELOG.md | 3 + Src/CSharpier.VSCode/package.json | 2 +- .../src/CSharpierProcessPipeMultipleFiles.ts | 2 +- .../src/CSharpierProcessServer.ts | 2 +- .../src/CustomPathInstaller.ts | 2 +- 20 files changed, 215 insertions(+), 103 deletions(-) create mode 100644 Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/Semver.java diff --git a/Src/CSharpier.Cli/Server/CSharpierServiceImplementation.cs b/Src/CSharpier.Cli/Server/CSharpierServiceImplementation.cs index 35b17640e..91481bb18 100644 --- a/Src/CSharpier.Cli/Server/CSharpierServiceImplementation.cs +++ b/Src/CSharpier.Cli/Server/CSharpierServiceImplementation.cs @@ -16,6 +16,14 @@ CancellationToken cancellationToken try { logger.LogInformation("Received request to format " + formatFileParameter.fileName); + if (formatFileParameter.fileContents.StartsWith("// csh-slow")) + { + Thread.Sleep(TimeSpan.FromSeconds(5)); + } + if (formatFileParameter.fileContents.StartsWith("// csh-throw")) + { + throw new Exception("Throwing because of // csh-throw comment"); + } var directoryName = this.fileSystem.Path.GetDirectoryName(formatFileParameter.fileName); DebugLogger.Log(directoryName ?? string.Empty); if (directoryName == null) diff --git a/Src/CSharpier.Rider/CHANGELOG.md b/Src/CSharpier.Rider/CHANGELOG.md index 1eba8ab9a..5faa86c2b 100644 --- a/Src/CSharpier.Rider/CHANGELOG.md +++ b/Src/CSharpier.Rider/CHANGELOG.md @@ -2,6 +2,12 @@ # csharpier-rider Changelog +## [2.0.0] +- Adding support for CSharpier 1.0.0 which includes the ability to format xml files. +- Improving logic around starting up CSharpier to minimize UI lag. +- Wait at most two seconds to format a file on save. +- Wait longer than two seconds to start CSharpier Server, on some systems it is talking 8+ seconds. + ## [1.8.4] - Use working directory to install csharpier so it respects a projects NuGet.config diff --git a/Src/CSharpier.Rider/README.md b/Src/CSharpier.Rider/README.md index 2255d5bc3..aaec6e1ed 100644 --- a/Src/CSharpier.Rider/README.md +++ b/Src/CSharpier.Rider/README.md @@ -2,14 +2,19 @@ -This plugin makes use of the dotnet tool [CSharpier](https://github.com/belav/csharpier) to format your code. CSharpier an opinionated code formatter for c#. -It uses Roslyn to parse your code and re-prints it using its own rules. -The printing process was ported from [prettier](https://prettier.io/) but has evolved over time. +This plugin makes use of the dotnet tool [CSharpier](https://github.com/belav/csharpier) to format your code and is versioned independently. + +CSharpier is an opinionated code formatter for c# and xml. \ +It provides very few options and provides a deterministic way to enforce formatting of your code. \ +The printing process was ported from [prettier](https://prettier.io) but has evolved over time. \ ## CSharpier Version The plugin determines which version of csharpier is needed to format a give file by looking for a dotnet manifest file. If one is not found it looks for a globally installed version of CSharpier. +## XML Formatting +Formatting XML is only available using CSharpier >= 1.0.0 + ### To format files: - Install csharpier diff --git a/Src/CSharpier.Rider/gradle.properties b/Src/CSharpier.Rider/gradle.properties index d4a76c7b4..83e7eb69c 100644 --- a/Src/CSharpier.Rider/gradle.properties +++ b/Src/CSharpier.Rider/gradle.properties @@ -1,4 +1,4 @@ -pluginVersion = 1.8.4 +pluginVersion = 2.0.0 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 222 diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessPipeMultipleFiles.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessPipeMultipleFiles.java index 1299ec261..e606552e7 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessPipeMultipleFiles.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessPipeMultipleFiles.java @@ -4,6 +4,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import java.io.*; +import java.lang.Runtime.Version; import java.nio.charset.Charset; public class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess, Disposable { @@ -38,8 +39,12 @@ public CSharpierProcessPipeMultipleFiles( } private void startProcess() { + var newCommandsVersion = "1.0.0-alpha1"; + var argument = Semver.gte(this.version, newCommandsVersion) + ? "pipe-files" + : "--pipe-multiple-files"; try { - var processBuilder = new ProcessBuilder(this.csharpierPath, "--pipe-multiple-files"); + var processBuilder = new ProcessBuilder(this.csharpierPath, argument); processBuilder.environment().put("DOTNET_NOLOGO", "1"); processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot()); this.process = processBuilder.start(); diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessProvider.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessProvider.java index d632b7cd1..6a79b8ad1 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessProvider.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessProvider.java @@ -1,7 +1,5 @@ package com.intellij.csharpier; -import com.google.gson.Gson; -import com.google.gson.JsonObject; import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.Disposable; @@ -10,16 +8,13 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import java.io.File; -import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.xml.parsers.DocumentBuilderFactory; @@ -64,6 +59,7 @@ public void documentChanged(@NotNull DocumentEvent event) { return; } var filePath = file.getPath(); + this.findAndWarmProcess(filePath); } @@ -93,10 +89,16 @@ private void findAndWarmProcess(String filePath) { } if (!this.csharpierProcessesByVersion.containsKey(version)) { - this.csharpierProcessesByVersion.put( - version, - this.setupCSharpierProcess(directory, version) - ); + var finalVersion = version; + Runnable task = () -> { + this.csharpierProcessesByVersion.put( + finalVersion, + this.setupCSharpierProcess(directory, finalVersion) + ); + }; + + var thread = new Thread(task); + thread.start(); } } @@ -256,23 +258,19 @@ private ICSharpierProcess setupCSharpierProcess(String directory, String version this.logger.debug("Adding new version " + version + " process for " + directory); - // ComparableVersion was unhappy in rider 2023, this code should probably just go away - // but there are still 0.12 and 0.14 downloads happening - var installedVersion = version.split("\\."); - var versionWeCareAbout = Integer.parseInt(installedVersion[1]); - var serverVersion = 29; + var serverVersion = "0.29.0"; ICSharpierProcess csharpierProcess; if ( - versionWeCareAbout >= serverVersion && + Semver.gte(version, serverVersion) && !CSharpierSettings.getInstance(this.project).getDisableCSharpierServer() ) { csharpierProcess = new CSharpierProcessServer(customPath, version, this.project); - } else if (versionWeCareAbout >= 12) { - var useUtf8 = versionWeCareAbout >= 14; + } else if (Semver.gte(version, "0.12.0")) { + var useUtf8 = Semver.gte(version, "0.14.0"); if ( - versionWeCareAbout >= serverVersion && + Semver.gte(version, serverVersion) && CSharpierSettings.getInstance(this.project).getDisableCSharpierServer() ) { this.logger.debug( diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessServer.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessServer.java index 874b627de..f63f6f366 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessServer.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierProcessServer.java @@ -28,10 +28,7 @@ public CSharpierProcessServer(String csharpierPath, String version, Project proj this.dotNetProvider = DotNetProvider.getInstance(project); this.version = version; - if (!this.startProcess()) { - this.processFailedToStart = true; - return; - } + this.startProcess(); this.logger.debug("Warm CSharpier with initial format"); // warm by formatting a file twice, the 3rd time is when it gets really fast @@ -39,45 +36,58 @@ public CSharpierProcessServer(String csharpierPath, String version, Project proj this.formatFile("public class ClassName { }", "/Temp/Test.cs"); } - private boolean startProcess() { + private void startProcess() { + var newCommandsVersion = "1.0.0-alpha1"; + var argument = Semver.gte(this.version, newCommandsVersion) ? "server" : "--server"; try { - var processBuilder = new ProcessBuilder(this.csharpierPath, "--server"); - processBuilder.redirectErrorStream(true); + var processBuilder = new ProcessBuilder(this.csharpierPath, argument); processBuilder.environment().put("DOTNET_NOLOGO", "1"); processBuilder.environment().put("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot()); - this.process = processBuilder.start(); - - var reader = new BufferedReader(new InputStreamReader(this.process.getInputStream())); - - var executor = Executors.newSingleThreadExecutor(); - var future = executor.submit(() -> reader.readLine()); - - String output; - try { - output = future.get(2, TimeUnit.SECONDS); - } catch (TimeoutException e) { - this.logger.warn( - "Spawning the csharpier server timed out. Formatting cannot occur." - ); - this.process.destroy(); - return false; - } - - if (!this.process.isAlive()) { - this.logger.warn( - "Spawning the csharpier server failed because it exited. " + output - ); - return false; - } - - var portString = output.replace("Started on ", ""); - this.port = Integer.parseInt(portString); - - this.logger.debug("Connecting via port " + portString); - return true; + var csharpierProcess = processBuilder.start(); + + var stdoutThread = new Thread(() -> { + try ( + var reader = new BufferedReader( + new InputStreamReader(csharpierProcess.getInputStream()) + ) + ) { + var line = reader.readLine(); + if (line == null) { + return; + } + + var portString = line.replace("Started on ", ""); + this.port = Integer.parseInt(portString); + + this.logger.debug("Connecting via port " + portString); + this.process = csharpierProcess; + } catch (Exception e) { + e.printStackTrace(); + } + }); + stdoutThread.start(); + stdoutThread.join(); + + csharpierProcess + .onExit() + .thenAccept(p -> { + try ( + var errorReader = new BufferedReader( + new InputStreamReader(csharpierProcess.getErrorStream()) + ) + ) { + var error = new StringBuilder(); + errorReader.lines().forEach(o -> error.append(o + "\n")); + this.logger.error("Process failed to start with " + error); + } catch (Exception e) { + this.logger.error("Process failed to start with " + e); + } + + this.processFailedToStart = true; + }); } catch (Exception e) { this.logger.warn("Failed to spawn the needed csharpier server.", e); - return false; + this.processFailedToStart = true; } } @@ -88,6 +98,20 @@ public FormatFileResult formatFile(FormatFileParameter parameter) { return null; } + var timeWaited = 0; + while (this.process == null && timeWaited < 15000) { + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + + timeWaited += 100; + } + + if (this.processFailedToStart || this.process == null) { + this.logger.warn("CSharpier process failed to start. Formatting cannot occur."); + return null; + } + var url = "http://127.0.0.1:" + this.port + "/format"; try { diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java index a6537c412..2e49228c1 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java @@ -25,6 +25,16 @@ public void setRunOnSave(boolean value) { this.runOnSave = value; } + private boolean useCustomPath; + + public boolean getUseCustomPath() { + return this.useCustomPath; + } + + public void setUseCustomPath(boolean value) { + this.useCustomPath = value; + } + private String customPath; public String getCustomPath() { diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java index 68ea36424..8725fb3ef 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java @@ -1,6 +1,5 @@ package com.intellij.csharpier; -import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.ui.components.JBCheckBox; @@ -9,7 +8,6 @@ import com.intellij.util.ui.FormBuilder; import java.awt.*; import javax.swing.*; -import javax.swing.border.EmptyBorder; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,6 +17,7 @@ public class CSharpierSettingsComponent implements SearchableConfigurable { private final Project project; private JBCheckBox runOnSaveCheckBox = new JBCheckBox("Run on Save"); private JBCheckBox disableCSharpierServerCheckBox = new JBCheckBox("Disable CSharpier Server"); + private JBCheckBox useCustomPath = new JBCheckBox("Override CSharpier Executable"); private JBTextField customPathTextField = new JBTextField(); public CSharpierSettingsComponent(@NotNull Project project) { @@ -71,8 +70,9 @@ private JComponent createSectionHeader(String label) { .setFormLeftIndent(0) .addComponent(createSectionHeader("Developer Settings"), 20) .setFormLeftIndent(leftIndent) + .addComponent(this.useCustomPath, topInset) .addLabeledComponent( - new JBLabel("Directory of custom dotnet-csharpier:"), + new JBLabel("Directory of custom CSharpier executable:"), this.customPathTextField, topInset, false @@ -89,6 +89,8 @@ public boolean isModified() { this.runOnSaveCheckBox.isSelected() || CSharpierSettings.getInstance(this.project).getCustomPath() != this.customPathTextField.getText() || + CSharpierSettings.getInstance(this.project).getUseCustomPath() != + this.useCustomPath.isSelected() || CSharpierSettings.getInstance(this.project).getDisableCSharpierServer() != this.disableCSharpierServerCheckBox.isSelected() ); @@ -101,12 +103,14 @@ public void apply() { settings.setRunOnSave(this.runOnSaveCheckBox.isSelected()); settings.setCustomPath(this.customPathTextField.getText()); settings.setDisableCSharpierServer(this.disableCSharpierServerCheckBox.isSelected()); + settings.setUseCustomPath(this.useCustomPath.isSelected()); } @Override public void reset() { var settings = CSharpierSettings.getInstance(this.project); this.runOnSaveCheckBox.setSelected(settings.getRunOnSave()); + this.useCustomPath.setSelected(settings.getUseCustomPath()); this.customPathTextField.setText(settings.getCustomPath()); this.disableCSharpierServerCheckBox.setSelected(settings.getDisableCSharpierServer()); } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierStartup.kt b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierStartup.kt index 8f966774f..4bb0bcf9f 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierStartup.kt +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierStartup.kt @@ -19,7 +19,6 @@ class CSharpierStartup : StartupActivity, DumbAware { private val lifetimeDefinition = LifetimeDefinition() private val lifetime: Lifetime = lifetimeDefinition - override fun runActivity(project: Project) { // this ensures we meet the conditions of isProjectModelReady "Must be executed on UI thread or background threads with special permissions" application.invokeLater { diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CustomPathInstaller.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CustomPathInstaller.java index 3b19d2789..36c72369f 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CustomPathInstaller.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CustomPathInstaller.java @@ -17,7 +17,10 @@ public class CustomPathInstaller { String customPath; public CustomPathInstaller(Project project) { - this.customPath = CSharpierSettings.getInstance(project).getCustomPath(); + if (CSharpierSettings.getInstance(project).getUseCustomPath()) { + this.customPath = CSharpierSettings.getInstance(project).getCustomPath(); + } + this.dotNetProvider = DotNetProvider.getInstance(project); } @@ -60,10 +63,12 @@ public boolean ensureVersionInstalled(String version, String directory) throws E } private boolean validateInstall(String pathToDirectoryForVersion, String version) { + var pathForVersion = ""; try { var env = Map.of("DOTNET_ROOT", this.dotNetProvider.getDotNetRoot()); - var command = List.of(this.getPathForVersion(version), "--version"); + pathForVersion = this.getPathForVersion(version); + var command = List.of(pathForVersion, "--version"); var output = ProcessHelper.executeCommand( command, env, @@ -74,7 +79,7 @@ private boolean validateInstall(String pathToDirectoryForVersion, String version return false; } - this.logger.debug(this.getPathForVersion(version) + "--version output: " + version); + this.logger.debug(pathForVersion + "--version output: " + version); var versionWithoutHash = output.trim().split(Pattern.quote("+"))[0]; this.logger.debug("Using " + versionWithoutHash + " as the version number."); @@ -84,7 +89,9 @@ private boolean validateInstall(String pathToDirectoryForVersion, String version } } catch (Exception ex) { this.logger.warn( - "Exception while running 'dotnet csharpier --version' in " + + "Exception while running '" + + pathForVersion + + " --version' in " + pathToDirectoryForVersion, ex ); @@ -121,7 +128,9 @@ private String getDirectoryForVersion(String version) throws Exception { } public String getPathForVersion(String version) throws Exception { - var path = Path.of(getDirectoryForVersion(version), "dotnet-csharpier"); + var newCommandsVersion = "1.0.0-alpha1"; + var filename = Semver.gte(version, newCommandsVersion) ? "csharpier" : "dotnet-csharpier"; + var path = Path.of(getDirectoryForVersion(version), filename); return path.toString(); } } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/FormattingService.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/FormattingService.java index 9c02a7a2e..7cb6174f9 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/FormattingService.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/FormattingService.java @@ -9,6 +9,10 @@ import java.time.Duration; import java.time.Instant; import java.util.Collections; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.jetbrains.annotations.NotNull; public class FormattingService { @@ -20,21 +24,20 @@ static FormattingService getInstance(@NotNull Project project) { return project.getService(FormattingService.class); } + static boolean isSupportedLanguageId(String languageId) { + return languageId.equals("C#") || languageId.equals("MSBuild") || languageId.equals("XML"); + } + public void format(@NotNull Document document, @NotNull Project project) { var psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document); if (psiFile == null) { return; } - if ( - !(psiFile.getLanguage().getID().equals("C#") || - // while testing in intellij it doesn't know about c# - (psiFile.getLanguage().getID().equals("TEXT") && psiFile.getName().endsWith(".cs"))) - ) { - this.logger.debug( - "Skipping formatting because language was " + - psiFile.getLanguage().getDisplayName() - ); + // TODO #1433 update the readme + var languageId = psiFile.getLanguage().getID(); + if (!isSupportedLanguageId(languageId)) { + this.logger.debug("Skipping formatting because language was " + languageId); return; } @@ -70,25 +73,42 @@ public void format(@NotNull Document document, @NotNull Project project) { var parameter = new FormatFileParameter(); parameter.fileContents = currentDocumentText; parameter.fileName = filePath; - var result = csharpierProcess2.formatFile(parameter); - var end = Instant.now(); - this.logger.info("Formatted in " + (Duration.between(start, end).toMillis()) + "ms"); + var executor = Executors.newSingleThreadExecutor(); + FormatFileResult result = null; - if (result != null) { - switch (result.status) { - case Formatted -> updateText( - document, - project, - result.formattedFile, - currentDocumentText - ); - case Ignored -> this.logger.info("File is ignored by csharpier cli."); - case Failed -> this.logger.warn( - "CSharpier cli failed to format the file and returned the following error: " + - result.errorMessage + Callable task = () -> csharpierProcess2.formatFile(parameter); + + var future = executor.submit(task); + + try { + result = future.get(2000, TimeUnit.MILLISECONDS); + } catch (Exception e) { + this.logger.warn("Took more than two seconds or something went wrong " + e); + future.cancel(true); + } + + if (result == null) { + return; + } + + switch (result.status) { + case Formatted -> { + var end = Instant.now(); + this.logger.info( + "Formatted in " + (Duration.between(start, end).toMillis()) + "ms" ); + updateText(document, project, result.formattedFile, currentDocumentText); } + case Ignored -> this.logger.info("File is ignored by csharpier cli."); + case Failed -> this.logger.warn( + "CSharpier cli failed to format the file and returned the following error: " + + result.errorMessage + ); + case UnsupportedFile -> this.logger.warn( + "CSharpier does not support formatting the file " + filePath + ); + default -> this.logger.error("Unable to handle for status of " + result.status); } } else { var result = csharpierProcess.formatFile(currentDocumentText, filePath); diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ICSharpierProcess.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ICSharpierProcess.java index ad53bf7f0..d61797ec6 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ICSharpierProcess.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ICSharpierProcess.java @@ -29,4 +29,5 @@ enum Status { Formatted, Ignored, Failed, + UnsupportedFile, } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierAction.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierAction.java index 3bf7de3bc..cea3c7bbf 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierAction.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierAction.java @@ -4,6 +4,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; import org.jetbrains.annotations.NotNull; public class ReformatWithCSharpierAction extends AnAction { @@ -49,12 +50,16 @@ public void update(@NotNull AnActionEvent e) { return; } - var file = virtualFileString.substring(filePrefix.length()); - var isCSharpFile = file.toLowerCase().endsWith(".cs"); - e.getPresentation().setVisible(isCSharpFile); + var editor = e.getData(PlatformDataKeys.EDITOR); + var document = editor.getDocument(); + var psiFile = PsiDocumentManager.getInstance(e.getProject()).getPsiFile(document); + var languageId = psiFile.getLanguage().getID(); + var filePath = virtualFileString.substring(filePrefix.length()); + this.logger.debug(languageId); + var canFormat = - isCSharpFile && - FormattingService.getInstance(e.getProject()).getCanFormat(file, e.getProject()); + FormattingService.isSupportedLanguageId(languageId) && + FormattingService.getInstance(e.getProject()).getCanFormat(filePath, e.getProject()); e.getPresentation().setEnabled(canFormat); } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/Semver.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/Semver.java new file mode 100644 index 000000000..7813a425a --- /dev/null +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/Semver.java @@ -0,0 +1,15 @@ +package com.intellij.csharpier; + +import java.lang.module.ModuleDescriptor; + +public class Semver { + + public static boolean gte(String version, String otherVersion) { + return ( + ModuleDescriptor.Version.parse(version).compareTo( + ModuleDescriptor.Version.parse(otherVersion) + ) >= + 0 + ); + } +} diff --git a/Src/CSharpier.VSCode/CHANGELOG.md b/Src/CSharpier.VSCode/CHANGELOG.md index 031f6c284..fa6523cf6 100644 --- a/Src/CSharpier.VSCode/CHANGELOG.md +++ b/Src/CSharpier.VSCode/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.0.3 +- Get things working with the alpha version of 1.0.0 + ## 2.0.2 - Use working directory to install csharpier so it respects a projects NuGet.config diff --git a/Src/CSharpier.VSCode/package.json b/Src/CSharpier.VSCode/package.json index 6c46c2465..2bf22d569 100644 --- a/Src/CSharpier.VSCode/package.json +++ b/Src/CSharpier.VSCode/package.json @@ -2,7 +2,7 @@ "name": "csharpier-vscode", "displayName": "CSharpier - Code formatter", "description": "Code formatter using csharpier", - "version": "2.0.2", + "version": "2.0.3", "publisher": "csharpier", "author": "CSharpier", "homepage": "https://marketplace.visualstudio.com/items?itemName=csharpier.csharpier-vscode", diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts index 596c09efb..c317249ed 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts @@ -30,7 +30,7 @@ export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { } private spawnProcess = (csharpierPath: string, workingDirectory: string) => { - let newCommandsVersion = "1.0.0"; + let newCommandsVersion = "1.0.0-alpha1"; let argument = semver.gte(this.version, newCommandsVersion) ? "pipe-files" : "--pipe-multiple-files"; diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts index a7aa762f1..142fdfbad 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts @@ -30,7 +30,7 @@ export class CSharpierProcessServer implements ICSharpierProcess2 { } private spawnProcess(csharpierPath: string, workingDirectory: string) { - let newCommandsVersion = "1.0.0"; + let newCommandsVersion = "1.0.0-alpha1"; let argument = semver.gte(this.version, newCommandsVersion) ? "server" : "--server"; const csharpierProcess = spawn(csharpierPath, [argument], { diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index dd3ed5154..89b5fb156 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -90,7 +90,7 @@ export class CustomPathInstaller { } public getPathForVersion(version: string) { - let newCommandsVersion = "1.0.0"; + let newCommandsVersion = "1.0.0-alpha1"; let filename = semver.gte(version, newCommandsVersion) ? "csharpier" : "dotnet-csharpier"; return path.resolve(this.getDirectoryForVersion(version), filename); }