From 562adffb317d44f74b42922a7ec6b7cd4d53f858 Mon Sep 17 00:00:00 2001 From: He1pa <56333845+He1pa@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:54:56 +0800 Subject: [PATCH] fix kcl fmt action (#33) * override `getActionUpdateThread` Signed-off-by: he1pa <18012015693@163.com> * 1. update kcl fmt command. 2. use EnvironmentUtil.getValue to replace System.getenv(), ref: https://stackoverflow.com/questions/26320583/system-getenv-only-works-properly-when-debugging-intellij-plugin Signed-off-by: he1pa <18012015693@163.com> --------- Signed-off-by: he1pa <18012015693@163.com> --- gradle.properties | 2 +- .../kcl/action/FormatDirectoryAction.java | 10 ++++++-- .../kcl/action/FormatSingleFileAction.java | 15 ++++++++---- .../kcl/action/KCLToolsPopUpActionGroup.java | 7 ++++++ .../kcl/action/OpenKCLHelpAction.java | 8 +++++++ .../kcl/action/OpenLinkAction.java | 6 +++++ .../kusionstack/kcl/util/KCLBinaryUtil.java | 23 +++++++++---------- .../kusionstack/kcl/util/KCLFmtCommand.java | 15 ++++++++---- 8 files changed, 63 insertions(+), 23 deletions(-) diff --git a/gradle.properties b/gradle.properties index 92bd68c..b4693d4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = io.kusionstack.kcl pluginName = intellij-kcl pluginRepositoryUrl = https://github.com/KusionStack/intellij-kcl # SemVer format -> https://semver.org -pluginVersion = 0.1.18 +pluginVersion = 0.1.19 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 221 diff --git a/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java b/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java index 83b067c..c8d4cce 100644 --- a/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java +++ b/src/main/java/io/kusionstack/kcl/action/FormatDirectoryAction.java @@ -3,6 +3,7 @@ */ package io.kusionstack.kcl.action; +import com.intellij.openapi.actionSystem.ActionUpdateThread; import io.kusionstack.kcl.util.KCLBinaryUtil; import io.kusionstack.kcl.util.KCLFmtCommand; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -26,7 +27,7 @@ public void update(@NotNull AnActionEvent e) { VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE); e.getPresentation().setVisible((vf != null && vf.isDirectory())); // the action button is enabled only when kcl is installed - e.getPresentation().setEnabled(KCLBinaryUtil.KCLFmtCmdInstalled()); + e.getPresentation().setEnabled(KCLBinaryUtil.KCLInstalled()); } @Override @@ -37,7 +38,12 @@ public void actionPerformed(@NotNull AnActionEvent e) { FileDocumentManager.getInstance().saveAllDocuments(); // do kcl fmt VirtualFile file = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE); - KCLFmtCommand.execute(file); + KCLFmtCommand.execute(file, true); VfsUtil.markDirtyAndRefresh(true, true, true, file); } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread(){ + return ActionUpdateThread.BGT; + } } \ No newline at end of file diff --git a/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java b/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java index 0288f04..8b5971a 100644 --- a/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java +++ b/src/main/java/io/kusionstack/kcl/action/FormatSingleFileAction.java @@ -3,6 +3,7 @@ */ package io.kusionstack.kcl.action; +import com.intellij.openapi.actionSystem.ActionUpdateThread; import io.kusionstack.kcl.KCLFileType; import io.kusionstack.kcl.util.KCLBinaryUtil; import io.kusionstack.kcl.util.KCLFmtCommand; @@ -16,6 +17,8 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import com.intellij.openapi.diagnostic.Logger; + /** * @author amyxia * @version FormatSingleFileAction: FormatSingleFileAction.java, v 0.1 2020年11月04日 10:00 下午 amyxia Exp $ @@ -26,9 +29,9 @@ public void update(@NotNull AnActionEvent e) { // Using the event, evaluate the context, and enable or disable the action. // the action button is visible only when the current file is a kcl file VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE); - e.getPresentation().setVisible((vf != null && isKCLFile(vf))); + e.getPresentation().setVisible(true); // the action button is enabled only when kcl is installed - e.getPresentation().setEnabled(KCLBinaryUtil.KCLFmtCmdInstalled()); + e.getPresentation().setEnabled(KCLBinaryUtil.KCLInstalled()); } @Override @@ -42,9 +45,8 @@ public void actionPerformed(@NotNull AnActionEvent event) { } else { FileDocumentManager.getInstance().saveAllDocuments(); } - // execute kcl --fmt command to get formatted content - KCLFmtCommand.execute(file); + KCLFmtCommand.execute(file, false); VfsUtil.markDirtyAndRefresh(true, true, true, file); } @@ -54,4 +56,9 @@ public boolean isKCLFile(VirtualFile virtualFile) { } return false; } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread(){ + return ActionUpdateThread.BGT; + } } \ No newline at end of file diff --git a/src/main/java/io/kusionstack/kcl/action/KCLToolsPopUpActionGroup.java b/src/main/java/io/kusionstack/kcl/action/KCLToolsPopUpActionGroup.java index 93bcbd0..912730d 100644 --- a/src/main/java/io/kusionstack/kcl/action/KCLToolsPopUpActionGroup.java +++ b/src/main/java/io/kusionstack/kcl/action/KCLToolsPopUpActionGroup.java @@ -3,6 +3,8 @@ */ package io.kusionstack.kcl.action; +import com.intellij.openapi.actionSystem.ActionUpdateThread; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import org.jetbrains.annotations.NotNull; @@ -16,4 +18,9 @@ public class KCLToolsPopUpActionGroup extends DefaultActionGroup { public void update(@NotNull AnActionEvent e) { // enable/disable depending on whether user is editing... } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } } \ No newline at end of file diff --git a/src/main/java/io/kusionstack/kcl/action/OpenKCLHelpAction.java b/src/main/java/io/kusionstack/kcl/action/OpenKCLHelpAction.java index 2199015..1848115 100644 --- a/src/main/java/io/kusionstack/kcl/action/OpenKCLHelpAction.java +++ b/src/main/java/io/kusionstack/kcl/action/OpenKCLHelpAction.java @@ -3,6 +3,9 @@ */ package io.kusionstack.kcl.action; +import com.intellij.openapi.actionSystem.ActionUpdateThread; +import org.jetbrains.annotations.NotNull; + /** * @author amyxia * @version OpenKCLHelpAction: OpenKCLHelpAction.java, v 0.1 2020年12月03日 3:22 下午 amyxia Exp $ @@ -12,4 +15,9 @@ public class OpenKCLHelpAction extends OpenLinkAction { public String getLink() { return "https://kusionstack.io/docs/reference/lang/lang/tour"; } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } } \ No newline at end of file diff --git a/src/main/java/io/kusionstack/kcl/action/OpenLinkAction.java b/src/main/java/io/kusionstack/kcl/action/OpenLinkAction.java index c63eee4..60f720c 100644 --- a/src/main/java/io/kusionstack/kcl/action/OpenLinkAction.java +++ b/src/main/java/io/kusionstack/kcl/action/OpenLinkAction.java @@ -4,6 +4,7 @@ package io.kusionstack.kcl.action; import com.intellij.ide.BrowserUtil; +import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.DumbAwareAction; import org.jetbrains.annotations.NotNull; @@ -19,4 +20,9 @@ public abstract class OpenLinkAction extends DumbAwareAction { public void actionPerformed(@NotNull AnActionEvent e) { BrowserUtil.browse(getLink()); } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } } \ No newline at end of file diff --git a/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java b/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java index c6bac05..cdde0f6 100644 --- a/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java +++ b/src/main/java/io/kusionstack/kcl/util/KCLBinaryUtil.java @@ -5,11 +5,13 @@ import com.google.common.base.Joiner; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.EnvironmentUtil; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Arrays; import java.util.stream.Collectors; /** @@ -20,8 +22,6 @@ public class KCLBinaryUtil { private static final Logger LOGGER = Logger.getInstance(KCLBinaryUtil.class); public static String KCLLocation; public static final String kclCmdName = "kcl"; - public static final String kclFmtCmdName = "kcl-fmt"; - static { KCLInstalled(); } @@ -30,12 +30,8 @@ public static boolean KCLInstalled() { return KCLCmdInstalled(kclCmdName); } - public static boolean KCLFmtCmdInstalled() { - return KCLCmdInstalled(kclFmtCmdName); - } - public static boolean KCLCmdInstalled(String command) { - String[] kclParentPaths = System.getenv("PATH").split(File.pathSeparator); + String[] kclParentPaths = EnvironmentUtil.getValue("PATH").split(File.pathSeparator); for (String location :kclParentPaths) { File file = new File(Joiner.on(File.separator).join(location, command)); if (file.exists()) { @@ -46,16 +42,19 @@ public static boolean KCLCmdInstalled(String command) { } return false; } - public static ExecuteResult execKCLCmd(String command, String... options) { - if (!KCLCmdInstalled(command)) { - LOGGER.error(String.format("KCL command %s is not installed. Cannot execute.", command)); + public static ExecuteResult execKCLSubCmd(String subCommand, String... options) { + if (!KCLInstalled()) { + LOGGER.error(String.format("KCL command %s is not installed. Cannot execute.", subCommand)); return ExecuteResult.KCLNotInstalled(); } // assemble the KCL command from filePath & options - String[] cmd = new String[1 + options.length]; + String[] cmd = new String[2 + options.length]; + cmd[0] = KCLLocation; - System.arraycopy(options, 0, cmd, 1, options.length); + cmd[1] = subCommand; + System.arraycopy(options, 0, cmd, 2, options.length); try { + LOGGER.info(String.format("run cmd %s ", Arrays.toString(cmd))); Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); if (process.exitValue() == 0) { diff --git a/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java b/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java index 4655117..1f23f89 100644 --- a/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java +++ b/src/main/java/io/kusionstack/kcl/util/KCLFmtCommand.java @@ -7,6 +7,8 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; + /** * @author amyxia * @version KCLFmtCommand: KCLFmtCommand.java, v 0.1 2020年12月03日 2:53 下午 amyxia Exp $ @@ -14,11 +16,16 @@ public class KCLFmtCommand { private static final Logger LOGGER = Logger.getInstance(KCLFmtCommand.class); - public static boolean execute(@NotNull VirtualFile virtualFile) { - String[] options = {virtualFile.getCanonicalPath(), "-R"}; - ExecuteResult result = KCLBinaryUtil.execKCLCmd("kcl-fmt", options); + public static boolean execute(@NotNull VirtualFile virtualFile, boolean isDirectory) { + String path = virtualFile.getCanonicalPath(); + LOGGER.info(String.format("path: %s", isDirectory)); + if (isDirectory){ + path = path.concat("..."); + } + + ExecuteResult result = KCLBinaryUtil.execKCLSubCmd("fmt", path); if (!result.isSuccess()) { - LOGGER.error(String.format("kcl-fmt %s -R exec failed, err msg: %s", virtualFile.getPath(), result.getStderr())); + LOGGER.error(String.format("kcl fmt %s exec failed, err msg: %s", virtualFile.getPath(), result.getStderr())); } return result.isSuccess(); }