From d1f6d9c7b219ef454a46c676392eadba7955b864 Mon Sep 17 00:00:00 2001 From: oraum Date: Thu, 12 May 2022 22:47:16 +0200 Subject: [PATCH 1/3] implement basic ActionOnSave --- gradle.properties | 4 +- .../actions/SpotlessActionOnSave.java | 34 +++++++++++ .../config/SpotlessConfiguration.java | 46 ++++++++++++++ .../config/SpotlessOnSaveInfoProvider.java | 60 +++++++++++++++++++ src/main/resources/META-INF/plugin.xml | 10 ++++ 5 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java create mode 100644 src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java create mode 100644 src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java diff --git a/gradle.properties b/gradle.properties index 1f8ff52..c25819f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,11 +13,11 @@ pluginUntilBuild = 221.* # IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties platformType = IC -platformVersion = 2021.1.2 +platformVersion = 2021.2.1 # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 -platformPlugins = com.intellij.gradle:211.7442.57 +platformPlugins = com.intellij.gradle # Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3 javaVersion = 11 diff --git a/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java b/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java new file mode 100644 index 0000000..b1c9efa --- /dev/null +++ b/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java @@ -0,0 +1,34 @@ +package com.github.ragurney.spotless.actions; + +import com.github.ragurney.spotless.config.SpotlessConfiguration; +import com.intellij.ide.actionsOnSave.impl.ActionsOnSaveFileDocumentManagerListener; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; +import org.jetbrains.annotations.NotNull; + +/** + * Action to be called whenever a document is saved + */ +public class SpotlessActionOnSave extends ActionsOnSaveFileDocumentManagerListener.ActionOnSave { + @Override + public boolean isEnabledForProject(@NotNull Project project) { + return SpotlessConfiguration.getInstance(project).isRunOnSave(); + } + + @Override + public void processDocuments(@NotNull Project project, @NotNull Document @NotNull [] documents) { + SpotlessConfiguration spotlessConfiguration = SpotlessConfiguration.getInstance(project); + if (!spotlessConfiguration.isRunOnSave()) return; + + for (Document document : documents) { + var file = PsiDocumentManager.getInstance(project).getPsiFile(document); + + if (file == null) { + continue; + } + + new ReformatCodeProcessor(file).run(); + } + } +} diff --git a/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java new file mode 100644 index 0000000..6f2ddf2 --- /dev/null +++ b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java @@ -0,0 +1,46 @@ +package com.github.ragurney.spotless.config; + +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * Configuration to store whether spotless should be executed on save + */ +@State(name = "SpotlessConfiguration", storages = @Storage("spotless.xml")) +public class SpotlessConfiguration implements PersistentStateComponent { + + + private static final boolean SPOTLESS_ON_SAVE_DEFAULT = false; + private @NotNull State myState = new State(); + + @NotNull + public static SpotlessConfiguration getInstance(@NotNull Project project) { + return project.getService(SpotlessConfiguration.class); + } + + @Override + public @NotNull State getState() { + return myState; + } + + @Override + public void loadState(@NotNull State state) { + myState = state; + } + + public boolean isRunOnSave() { + return myState.myRunOnSave; + } + + public void setRunOnSave(boolean runOnSave) { + myState.myRunOnSave = runOnSave; + } + + static class State { + public boolean myRunOnSave = SPOTLESS_ON_SAVE_DEFAULT; + } + +} diff --git a/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java b/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java new file mode 100644 index 0000000..6b26b0a --- /dev/null +++ b/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java @@ -0,0 +1,60 @@ +package com.github.ragurney.spotless.config; + +import com.intellij.ide.actionsOnSave.ActionOnSaveComment; +import com.intellij.ide.actionsOnSave.ActionOnSaveContext; +import com.intellij.ide.actionsOnSave.ActionOnSaveInfo; +import com.intellij.ide.actionsOnSave.ActionOnSaveInfoProvider; +import com.intellij.openapi.util.NlsContexts; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; + +@SuppressWarnings("UnstableApiUsage") +public class SpotlessOnSaveInfoProvider extends ActionOnSaveInfoProvider { + @Override + protected @NotNull Collection getActionOnSaveInfos(@NotNull ActionOnSaveContext context) { + return Collections.singleton(new SpotlessActionOnSaveInfo(context)); + } + + static class SpotlessActionOnSaveInfo extends ActionOnSaveInfo { + + private boolean isActionOnSaveEnabled; + + protected SpotlessActionOnSaveInfo(@NotNull ActionOnSaveContext context) { + super(context); + isActionOnSaveEnabled = SpotlessConfiguration.getInstance(getProject()).isRunOnSave(); + } + + @Override + protected void apply() { + SpotlessConfiguration.getInstance(getProject()).setRunOnSave(isActionOnSaveEnabled); + } + + @Override + protected boolean isModified() { + return isActionOnSaveEnabled != SpotlessConfiguration.getInstance(getProject()).isRunOnSave(); + } + + @Override + public @NotNull @NlsContexts.Checkbox String getActionOnSaveName() { + return "Run spotless"; + } + + @Override + public boolean isActionOnSaveEnabled() { + return isActionOnSaveEnabled; + } + + @Override + public void setActionOnSaveEnabled(boolean enabled) { + isActionOnSaveEnabled = enabled; + } + + @Override + public @Nullable ActionOnSaveComment getComment() { + return ActionOnSaveComment.info("Runs spotless apply on changed files"); + } + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index c3554f7..c93b087 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -15,4 +15,14 @@ + + + + + + From b6aacd0a2acdf419cd054b4f7680fb2f95764b5c Mon Sep 17 00:00:00 2001 From: oraum Date: Sat, 14 May 2022 00:47:14 +0200 Subject: [PATCH 2/3] fix remarks --- .../actions/SpotlessActionOnSave.java | 34 ++++----- .../config/SpotlessConfiguration.java | 69 ++++++++--------- .../config/SpotlessOnSaveInfoProvider.java | 75 ++++++++++--------- 3 files changed, 85 insertions(+), 93 deletions(-) diff --git a/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java b/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java index b1c9efa..6d4ce7c 100644 --- a/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java +++ b/src/main/java/com/github/ragurney/spotless/actions/SpotlessActionOnSave.java @@ -5,30 +5,24 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; +import java.util.Optional; import org.jetbrains.annotations.NotNull; -/** - * Action to be called whenever a document is saved - */ +/** Action to be called whenever a document is saved */ public class SpotlessActionOnSave extends ActionsOnSaveFileDocumentManagerListener.ActionOnSave { - @Override - public boolean isEnabledForProject(@NotNull Project project) { - return SpotlessConfiguration.getInstance(project).isRunOnSave(); - } - - @Override - public void processDocuments(@NotNull Project project, @NotNull Document @NotNull [] documents) { - SpotlessConfiguration spotlessConfiguration = SpotlessConfiguration.getInstance(project); - if (!spotlessConfiguration.isRunOnSave()) return; - - for (Document document : documents) { - var file = PsiDocumentManager.getInstance(project).getPsiFile(document); + @Override + public boolean isEnabledForProject(@NotNull Project project) { + return SpotlessConfiguration.getInstance(project).isRunOnSaveEnabled(); + } - if (file == null) { - continue; - } + @Override + public void processDocuments(@NotNull Project project, @NotNull Document @NotNull [] documents) { + SpotlessConfiguration spotlessConfiguration = SpotlessConfiguration.getInstance(project); + if (!spotlessConfiguration.isRunOnSaveEnabled()) return; - new ReformatCodeProcessor(file).run(); - } + for (Document document : documents) { + Optional.ofNullable(PsiDocumentManager.getInstance(project).getPsiFile(document)) + .ifPresent(file -> new ReformatCodeProcessor(file).run()); } + } } diff --git a/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java index 6f2ddf2..3a2bf06 100644 --- a/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java +++ b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java @@ -6,41 +6,38 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -/** - * Configuration to store whether spotless should be executed on save - */ +/** Configuration to store whether spotless should be executed on save */ @State(name = "SpotlessConfiguration", storages = @Storage("spotless.xml")) -public class SpotlessConfiguration implements PersistentStateComponent { - - - private static final boolean SPOTLESS_ON_SAVE_DEFAULT = false; - private @NotNull State myState = new State(); - - @NotNull - public static SpotlessConfiguration getInstance(@NotNull Project project) { - return project.getService(SpotlessConfiguration.class); - } - - @Override - public @NotNull State getState() { - return myState; - } - - @Override - public void loadState(@NotNull State state) { - myState = state; - } - - public boolean isRunOnSave() { - return myState.myRunOnSave; - } - - public void setRunOnSave(boolean runOnSave) { - myState.myRunOnSave = runOnSave; - } - - static class State { - public boolean myRunOnSave = SPOTLESS_ON_SAVE_DEFAULT; - } - +public class SpotlessConfiguration + implements PersistentStateComponent { + + private static final boolean SPOTLESS_ON_SAVE_DEFAULT = false; + private @NotNull State state = new State(); + + @NotNull + public static SpotlessConfiguration getInstance(@NotNull Project project) { + return project.getService(SpotlessConfiguration.class); + } + + @Override + public @NotNull State getState() { + return state; + } + + @Override + public void loadState(@NotNull State state) { + this.state = state; + } + + public boolean isRunOnSaveEnabled() { + return state.myRunOnSave; + } + + public void setRunOnSave(boolean runOnSave) { + state.myRunOnSave = runOnSave; + } + + static class State { + public boolean myRunOnSave = SPOTLESS_ON_SAVE_DEFAULT; + } } diff --git a/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java b/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java index 6b26b0a..d691423 100644 --- a/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java +++ b/src/main/java/com/github/ragurney/spotless/config/SpotlessOnSaveInfoProvider.java @@ -5,56 +5,57 @@ import com.intellij.ide.actionsOnSave.ActionOnSaveInfo; import com.intellij.ide.actionsOnSave.ActionOnSaveInfoProvider; import com.intellij.openapi.util.NlsContexts; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import java.util.Collection; import java.util.Collections; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @SuppressWarnings("UnstableApiUsage") public class SpotlessOnSaveInfoProvider extends ActionOnSaveInfoProvider { - @Override - protected @NotNull Collection getActionOnSaveInfos(@NotNull ActionOnSaveContext context) { - return Collections.singleton(new SpotlessActionOnSaveInfo(context)); - } + @Override + protected @NotNull Collection getActionOnSaveInfos( + @NotNull ActionOnSaveContext context) { + return Collections.singleton(new SpotlessActionOnSaveInfo(context)); + } - static class SpotlessActionOnSaveInfo extends ActionOnSaveInfo { + static class SpotlessActionOnSaveInfo extends ActionOnSaveInfo { - private boolean isActionOnSaveEnabled; + private boolean isActionOnSaveEnabled; - protected SpotlessActionOnSaveInfo(@NotNull ActionOnSaveContext context) { - super(context); - isActionOnSaveEnabled = SpotlessConfiguration.getInstance(getProject()).isRunOnSave(); - } + protected SpotlessActionOnSaveInfo(@NotNull ActionOnSaveContext context) { + super(context); + isActionOnSaveEnabled = SpotlessConfiguration.getInstance(getProject()).isRunOnSaveEnabled(); + } - @Override - protected void apply() { - SpotlessConfiguration.getInstance(getProject()).setRunOnSave(isActionOnSaveEnabled); - } + @Override + protected void apply() { + SpotlessConfiguration.getInstance(getProject()).setRunOnSave(isActionOnSaveEnabled); + } - @Override - protected boolean isModified() { - return isActionOnSaveEnabled != SpotlessConfiguration.getInstance(getProject()).isRunOnSave(); - } + @Override + protected boolean isModified() { + return isActionOnSaveEnabled + != SpotlessConfiguration.getInstance(getProject()).isRunOnSaveEnabled(); + } - @Override - public @NotNull @NlsContexts.Checkbox String getActionOnSaveName() { - return "Run spotless"; - } + @Override + public @NotNull @NlsContexts.Checkbox String getActionOnSaveName() { + return "Run spotless"; + } - @Override - public boolean isActionOnSaveEnabled() { - return isActionOnSaveEnabled; - } + @Override + public boolean isActionOnSaveEnabled() { + return isActionOnSaveEnabled; + } - @Override - public void setActionOnSaveEnabled(boolean enabled) { - isActionOnSaveEnabled = enabled; - } + @Override + public void setActionOnSaveEnabled(boolean enabled) { + isActionOnSaveEnabled = enabled; + } - @Override - public @Nullable ActionOnSaveComment getComment() { - return ActionOnSaveComment.info("Runs spotless apply on changed files"); - } + @Override + public @Nullable ActionOnSaveComment getComment() { + return ActionOnSaveComment.info("Runs spotless apply on changed files"); } + } } From 86612de8e879a856ff3e168bcb54c379c0d2ccd4 Mon Sep 17 00:00:00 2001 From: oraum Date: Sat, 14 May 2022 00:57:42 +0200 Subject: [PATCH 3/3] fix remarks --- .../ragurney/spotless/config/SpotlessConfiguration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java index 3a2bf06..1e75c00 100644 --- a/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java +++ b/src/main/java/com/github/ragurney/spotless/config/SpotlessConfiguration.java @@ -30,14 +30,14 @@ public void loadState(@NotNull State state) { } public boolean isRunOnSaveEnabled() { - return state.myRunOnSave; + return state.runOnSave; } public void setRunOnSave(boolean runOnSave) { - state.myRunOnSave = runOnSave; + state.runOnSave = runOnSave; } static class State { - public boolean myRunOnSave = SPOTLESS_ON_SAVE_DEFAULT; + public boolean runOnSave = SPOTLESS_ON_SAVE_DEFAULT; } }