From 88627e56f14c6cad4d29c7adec03bae4634789c0 Mon Sep 17 00:00:00 2001 From: funbiscuit Date: Tue, 4 Jul 2023 21:34:48 +0300 Subject: [PATCH] Improve read only check Don't fail if got exception while formatting one of files --- .../idea/plugin/formatter/FileFormatter.java | 10 +++++++++- .../idea/plugin/formatter/FormatCommand.java | 13 ++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/funbiscuit/idea/plugin/formatter/FileFormatter.java b/src/main/java/com/funbiscuit/idea/plugin/formatter/FileFormatter.java index a9fc529..309d20e 100644 --- a/src/main/java/com/funbiscuit/idea/plugin/formatter/FileFormatter.java +++ b/src/main/java/com/funbiscuit/idea/plugin/formatter/FileFormatter.java @@ -3,8 +3,13 @@ import com.intellij.codeInsight.actions.AbstractLayoutCodeProcessor; import com.intellij.codeInsight.actions.RearrangeCodeProcessor; import com.intellij.codeInsight.actions.ReformatCodeProcessor; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.impl.NonProjectFileWritingAccessProvider; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiUtilCore; + +import java.util.Objects; public class FileFormatter implements FileProcessor { private static final String PROCESS_RESULT_OK = "OK"; @@ -18,7 +23,10 @@ public FileFormatter(FormatStatistics statistics) { @Override public String processFile(PsiFile originalFile) { - if (!originalFile.isWritable()) { + FileDocumentManager documentManager = FileDocumentManager.getInstance(); + VirtualFile virtualFile = PsiUtilCore.getVirtualFile(originalFile); + var document = documentManager.getDocument(Objects.requireNonNull(virtualFile)); + if (!documentManager.requestWriting(Objects.requireNonNull(document), null)) { return PROCESS_RESULT_READ_ONLY; } diff --git a/src/main/java/com/funbiscuit/idea/plugin/formatter/FormatCommand.java b/src/main/java/com/funbiscuit/idea/plugin/formatter/FormatCommand.java index 98d2978..eabf1ec 100644 --- a/src/main/java/com/funbiscuit/idea/plugin/formatter/FormatCommand.java +++ b/src/main/java/com/funbiscuit/idea/plugin/formatter/FormatCommand.java @@ -37,6 +37,7 @@ public class FormatCommand implements Callable { private static final String PROJECT_DIR_SUFFIX = ".tmp"; private static final String PROCESS_RESULT_BINARY_FILE = "Skipped, binary file."; private static final String PROCESS_RESULT_FAILED_OPEN = "Failed to open."; + private static final String PROCESS_RESULT_FAILED_TO_PROCESS = "Failed to process."; @Option(names = {"-s", "--style"}, required = true, description = "A path to Intellij IDEA code style settings .xml file") private Path style; @@ -103,8 +104,18 @@ public Integer call() throws Exception { private void processPath(Path filePath) { messageOutput.info("%s %s... ".formatted(fileProcessor.actionMessage(), filePath)); - String result = processPathInternal(filePath); + String result; + Exception ex = null; + try { + result = processPathInternal(filePath); + } catch (Exception e) { + result = PROCESS_RESULT_FAILED_TO_PROCESS; + ex = e; + } messageOutput.info("%s%n".formatted(result)); + if (ex != null) { + ex.printStackTrace(); + } } private String processPathInternal(Path filePath) {