diff --git a/CHANGELOG.md b/CHANGELOG.md index e0339bb..2b231a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ### +## [4.1.6] - 2024-08-17 + +- `Base`: 修复 `modify PSI for non-committed Document` + ## [4.1.5] - 2024-08-10 - `Flutter Resource`: 优化资源列表预览尺寸 @@ -54,80 +58,4 @@ ## [3.0.6] - 2024-01-13 -- `Base`: 代码优化 - -## [3.0.5] - 2023-12-24 - -- `Base`: 资源管理优化 - -## [3.0.4] - 2023-11-18 - -- `Dart Code`: 添加更多`LiveTemplate`片段 - -## [3.0.3] - 2023-10-09 - -- `Flutter Resource`: 上下文菜单新增删除功能 -- `Flutter Resource`: 支持图片缺省展示 -- `HttpMock`: 修复启动失败问题 -- `Base`: 其他微小改动 - -## [3.0.2] - 2023-09-20 - -- `Dart Code`: 调整代码生成机制 -- `Base`: - 修改插件错误处理策略[(LogUtils)](https://github.com/YangLang116/iFlutter/blob/main/src/main/java/com/xtu/plugin/flutter/utils/LogUtils.java) - ,将错误打印改为上报,所有上报的数据[(AdviceManager)](https://github.com/YangLang116/iFlutter/blob/main/src/main/java/com/xtu/plugin/flutter/advice/AdviceManager.java) - 不涉及任何项目隐私,请放心使用 - -## [3.0.1] - 2023-09-08 - -- `Base`: 支持快速清除`Dart`、`YAML`文件中所有注释 -- `Base`: Bug修复 - -## [3.0.0] - 2023-08-17 - -- `Base`: 优化插件性能 & Bug修复 - -## [2.2.7] - 2023-08-09 - -- `Flutter Resource`: 修复Bug -- `Suggestion & Feedback`: 调整错误上报方式 - -## [2.2.6] - 2023-08-07 - -- `Flutter Resource`: 更新窗口图标 - -## [2.2.5] - 2023-07-25 - -- `Flutter Resource`: Bug修复 - -## [2.2.4] - 2023-06-20 - -- `Suggestion & Feedback`: 新增错误与反馈渠道 - -## [2.2.3] - 2023-04-24 - -- `Flutter Resource`: 上下文菜单新增图片压缩功能 - -## [2.2.2] - 2023-04-23 - -- `Flutter Resource`: 上下文菜单新增图片路径拷贝功能 -- `Base`: 一些其他小改动 - -## [2.2.1] - 2023-04-15 - -- `Flutter Resource`: 上下文菜单新增搜索功能 - -## [2.2.0] - 2023-04-13 - -- `Flutter Resource`: 新增图片资源管理窗口 - -## [2.1.4] - 2023-02-21 - -- `Upgrade`: 优化插件引导升级逻辑 -- `Code`: 支持生成类构造器代码 - -## [2.1.3] - 2023-02-18 - -- `Code`: 优化 `fromJson`、`toJson` 代码生成逻辑 -- `Covert Dependency To Local`: 兼容 Flutter 3.0 \ No newline at end of file +- `Base`: 代码优化 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 8f09e9e..c546061 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ # -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html pluginGroup=com.xtu.plugin pluginName=iFlutter -pluginVersion=4.1.5 +pluginVersion=4.1.6 # Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl # See https://jb.gg/intellij-platform-builds-list for available build versions. pluginVerifierIdeVersions=2022.3.1 diff --git a/src/main/java/com/xtu/plugin/flutter/base/utils/DartUtils.java b/src/main/java/com/xtu/plugin/flutter/base/utils/DartUtils.java index 6021f4b..15e7269 100644 --- a/src/main/java/com/xtu/plugin/flutter/base/utils/DartUtils.java +++ b/src/main/java/com/xtu/plugin/flutter/base/utils/DartUtils.java @@ -55,8 +55,14 @@ public static boolean isBuiltInType(@NotNull DartReferenceExpression referenceEx return FileUtils.isChildPath(flutterPath, dartFile.getPath()); } - //生成Dart类 - //必须运行在EDT线程中 + public static void createDartFile(@NotNull Project project, + @NotNull VirtualFile parentDir, + @NotNull String fileName, + @NotNull String fileContent) { + createDartFile(project, parentDir, fileName, fileContent, null); + } + + public static void createDartFile(@NotNull Project project, @NotNull VirtualFile parentDir, @NotNull String fileName, @@ -65,33 +71,46 @@ public static void createDartFile(@NotNull Project project, Application application = ApplicationManager.getApplication(); application.assertIsDispatchThread(); WriteCommandAction.runWriteCommandAction(project, () -> { - FileTypeRegistry typeRegistry = FileTypeRegistry.getInstance(); - FileType fileType = typeRegistry.getFileTypeByFileName(fileName); - PsiFileFactory fileFactory = PsiFileFactory.getInstance(project); - PsiFile newFile = fileFactory.createFileFromText(fileName, fileType, fileContent); - CodeStyleManager styleManager = CodeStyleManager.getInstance(project); - PsiFile formatFile = (PsiFile) styleManager.reformat(newFile); - - PsiManager psiManager = PsiManager.getInstance(project); - PsiDirectory psiDir = psiManager.findDirectory(parentDir); - assert psiDir != null; - PsiFile resultFile; - PsiFile originFile = psiDir.findFile(fileName); - if (originFile == null) { - resultFile = psiDir.add(formatFile).getContainingFile(); - } else { - resultFile = PsiUtils.replacePsiFile(originFile, formatFile); - } + PsiFile formatFile = createPsiFile(project, fileName, fileContent); + PsiFile resultFile = modifyPsiTree(project, parentDir, fileName, formatFile); + PsiUtils.saveDocument(project, resultFile); if (listener != null) { VirtualFile virtualFile = resultFile.getVirtualFile(); - application.invokeLater(() -> listener.onCreated(virtualFile)); + application.invokeLater(() -> listener.onFinish(virtualFile)); } }); } + + @NotNull + private static PsiFile createPsiFile(@NotNull Project project, @NotNull String fileName, @NotNull String fileContent) { + FileTypeRegistry typeRegistry = FileTypeRegistry.getInstance(); + FileType fileType = typeRegistry.getFileTypeByFileName(fileName); + PsiFileFactory fileFactory = PsiFileFactory.getInstance(project); + PsiFile newFile = fileFactory.createFileFromText(fileName, fileType, fileContent); + CodeStyleManager styleManager = CodeStyleManager.getInstance(project); + return (PsiFile) styleManager.reformat(newFile); + } + + @NotNull + private static PsiFile modifyPsiTree(@NotNull Project project, + @NotNull VirtualFile parentDir, + @NotNull String fileName, + @NotNull PsiFile formatFile) { + PsiManager psiManager = PsiManager.getInstance(project); + PsiDirectory psiDir = psiManager.findDirectory(parentDir); + assert psiDir != null; + PsiFile originFile = psiDir.findFile(fileName); + if (originFile == null) { + return psiDir.add(formatFile).getContainingFile(); + } else { + return PsiUtils.replacePsiFile(originFile, formatFile); + } + } + public interface OnFileCreatedListener { - void onCreated(@NotNull VirtualFile virtualFile); + void onFinish(@NotNull VirtualFile virtualFile); } } diff --git a/src/main/java/com/xtu/plugin/flutter/base/utils/PsiUtils.java b/src/main/java/com/xtu/plugin/flutter/base/utils/PsiUtils.java index 0906389..c880396 100644 --- a/src/main/java/com/xtu/plugin/flutter/base/utils/PsiUtils.java +++ b/src/main/java/com/xtu/plugin/flutter/base/utils/PsiUtils.java @@ -1,5 +1,9 @@ package com.xtu.plugin.flutter.base.utils; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -47,7 +51,7 @@ public static List findChildren(@NotNull PsiElement parentPsi, return resultList; } - //替换psiFile.replace()处理,避免出现 `because "treeParent" is null` + @NotNull public static PsiFile replacePsiFile(@NotNull PsiFile originFile, @NotNull PsiFile newFile) { for (PsiElement oldEl : originFile.getChildren()) { oldEl.delete(); @@ -57,4 +61,15 @@ public static PsiFile replacePsiFile(@NotNull PsiFile originFile, @NotNull PsiFi } return originFile; } + + public static void saveDocument(@NotNull Project project, @NotNull PsiFile file) { + PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); + Document document = psiDocumentManager.getDocument(file); + if (document != null) { + //sync psi - document + psiDocumentManager.doPostponedOperationsAndUnblockDocument(document); + //sync psi - vfs + FileDocumentManager.getInstance().saveDocument(document); + } + } } diff --git a/src/main/java/com/xtu/plugin/flutter/base/utils/PubSpecUtils.java b/src/main/java/com/xtu/plugin/flutter/base/utils/PubSpecUtils.java index f9eb249..b82203a 100644 --- a/src/main/java/com/xtu/plugin/flutter/base/utils/PubSpecUtils.java +++ b/src/main/java/com/xtu/plugin/flutter/base/utils/PubSpecUtils.java @@ -1,14 +1,11 @@ package com.xtu.plugin.flutter.base.utils; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.WindowManager; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.util.PsiTreeUtil; @@ -24,6 +21,7 @@ import java.util.Map; +@SuppressWarnings("SpellCheckingInspection") public class PubSpecUtils { private static final String NODE_FLUTTER = "flutter"; @@ -206,20 +204,14 @@ public static void writeAssetList(@NotNull Project project, YAMLSequence oldAssetSequence = getFlutterSequence(project, NODE_ASSET); YAMLSequence oldFontSequence = getFlutterSequence(project, NODE_FONT); YAMLElementGenerator elementGenerator = YAMLElementGenerator.getInstance(project); - //modify asset - if (modifyAsset(project, assetList, oldAssetSequence, elementGenerator)) return; - //modify font - if (modifyFont(project, fontList, oldFontSequence, elementGenerator)) return; + //modify asset and font + boolean assetModifyFail = modifyAsset(project, assetList, oldAssetSequence, elementGenerator); + boolean fontModifyFail = modifyFont(project, fontList, oldFontSequence, elementGenerator); + if (assetModifyFail && fontModifyFail) return; + //save document YAMLFile rootPubspecFile = getRootPubSpecPsiFile(project); assert rootPubspecFile != null; - PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); - Document document = psiDocumentManager.getDocument(rootPubspecFile); - if (document != null) { - //sync psi - document - psiDocumentManager.doPostponedOperationsAndUnblockDocument(document); - //sync psi - vfs - FileDocumentManager.getInstance().saveDocument(document); - } + PsiUtils.saveDocument(project, rootPubspecFile); //refresh UI notifyPubSpecUpdate(project); } diff --git a/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartFontFileGenerator.java b/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartFontFileGenerator.java index 8d99972..a0125be 100644 --- a/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartFontFileGenerator.java +++ b/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartFontFileGenerator.java @@ -91,7 +91,7 @@ private void generateFile(Project project, VirtualFile rDirectory, .append("';\n"); } fileStringBuilder.append("}\n"); - DartUtils.createDartFile(project, rDirectory, FONT_FILE_NAME, fileStringBuilder.toString(), null); + DartUtils.createDartFile(project, rDirectory, FONT_FILE_NAME, fileStringBuilder.toString()); } @NotNull diff --git a/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartRFileGenerator.java b/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartRFileGenerator.java index 6462d64..519d742 100644 --- a/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartRFileGenerator.java +++ b/src/main/java/com/xtu/plugin/flutter/component/assets/code/DartRFileGenerator.java @@ -109,7 +109,7 @@ private String generateFile(@NotNull Project project, @NotNull VirtualFile rDire } fileStringBuilder.append("}\n"); String fileName = assetDirName.toLowerCase() + "_res.dart"; - DartUtils.createDartFile(project, rDirectory, fileName, fileStringBuilder.toString(), null); + DartUtils.createDartFile(project, rDirectory, fileName, fileStringBuilder.toString()); return fileName; } diff --git a/src/main/resources/icons/code.svg b/src/main/resources/icons/code.svg index f383d3a..d86a78e 100644 --- a/src/main/resources/icons/code.svg +++ b/src/main/resources/icons/code.svg @@ -1,7 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/code_dark.svg b/src/main/resources/icons/code_dark.svg index 2bf87bb..a9a9a9f 100644 --- a/src/main/resources/icons/code_dark.svg +++ b/src/main/resources/icons/code_dark.svg @@ -1,7 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/comment.svg b/src/main/resources/icons/comment.svg index 09b6506..9105a33 100644 --- a/src/main/resources/icons/comment.svg +++ b/src/main/resources/icons/comment.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/comment_dark.svg b/src/main/resources/icons/comment_dark.svg index caf42fb..ea3445e 100644 --- a/src/main/resources/icons/comment_dark.svg +++ b/src/main/resources/icons/comment_dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/compress.svg b/src/main/resources/icons/compress.svg index dd50567..4483d09 100644 --- a/src/main/resources/icons/compress.svg +++ b/src/main/resources/icons/compress.svg @@ -1,7 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/compress_dark.svg b/src/main/resources/icons/compress_dark.svg index c4449bd..a756a38 100644 --- a/src/main/resources/icons/compress_dark.svg +++ b/src/main/resources/icons/compress_dark.svg @@ -1,7 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/copy.svg b/src/main/resources/icons/copy.svg index 100f530..540f61e 100644 --- a/src/main/resources/icons/copy.svg +++ b/src/main/resources/icons/copy.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/copy_dark.svg b/src/main/resources/icons/copy_dark.svg index 878b742..6765947 100644 --- a/src/main/resources/icons/copy_dark.svg +++ b/src/main/resources/icons/copy_dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/delete.svg b/src/main/resources/icons/delete.svg index 8444cb0..6200beb 100644 --- a/src/main/resources/icons/delete.svg +++ b/src/main/resources/icons/delete.svg @@ -1,4 +1,3 @@ - - + fill="#1296db"/> \ No newline at end of file diff --git a/src/main/resources/icons/fetch.svg b/src/main/resources/icons/fetch.svg index ea33ea6..a43cb2b 100644 --- a/src/main/resources/icons/fetch.svg +++ b/src/main/resources/icons/fetch.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/fetch_dark.svg b/src/main/resources/icons/fetch_dark.svg index ad2d05e..7a7458c 100644 --- a/src/main/resources/icons/fetch_dark.svg +++ b/src/main/resources/icons/fetch_dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/github.svg b/src/main/resources/icons/github.svg index f27bb64..63b590d 100644 --- a/src/main/resources/icons/github.svg +++ b/src/main/resources/icons/github.svg @@ -1,8 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/github_dark.svg b/src/main/resources/icons/github_dark.svg index 91943a6..0a1f03d 100644 --- a/src/main/resources/icons/github_dark.svg +++ b/src/main/resources/icons/github_dark.svg @@ -1,8 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/link.svg b/src/main/resources/icons/link.svg index 8c4bbd6..7df9b9d 100644 --- a/src/main/resources/icons/link.svg +++ b/src/main/resources/icons/link.svg @@ -1,7 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/link_dark.svg b/src/main/resources/icons/link_dark.svg index a7704c2..72e4a9b 100644 --- a/src/main/resources/icons/link_dark.svg +++ b/src/main/resources/icons/link_dark.svg @@ -1,7 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/locate.svg b/src/main/resources/icons/locate.svg index a46dcad..4df2e13 100644 --- a/src/main/resources/icons/locate.svg +++ b/src/main/resources/icons/locate.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/maven.svg b/src/main/resources/icons/maven.svg index b2403e1..a1faefa 100644 --- a/src/main/resources/icons/maven.svg +++ b/src/main/resources/icons/maven.svg @@ -1,8 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/maven_dark.svg b/src/main/resources/icons/maven_dark.svg index e0760f8..5b5cc64 100644 --- a/src/main/resources/icons/maven_dark.svg +++ b/src/main/resources/icons/maven_dark.svg @@ -1,8 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/net.svg b/src/main/resources/icons/net.svg index 62ba5a2..bd78c89 100644 --- a/src/main/resources/icons/net.svg +++ b/src/main/resources/icons/net.svg @@ -1,8 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/net_dark.svg b/src/main/resources/icons/net_dark.svg index 40f0c06..cb20ba7 100644 --- a/src/main/resources/icons/net_dark.svg +++ b/src/main/resources/icons/net_dark.svg @@ -1,8 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/note.svg b/src/main/resources/icons/note.svg index 3221b7e..dadad18 100644 --- a/src/main/resources/icons/note.svg +++ b/src/main/resources/icons/note.svg @@ -1,7 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/note_dark.svg b/src/main/resources/icons/note_dark.svg index 9e45dca..530557f 100644 --- a/src/main/resources/icons/note_dark.svg +++ b/src/main/resources/icons/note_dark.svg @@ -1,7 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/open.svg b/src/main/resources/icons/open.svg index 5855d24..3340dfa 100644 --- a/src/main/resources/icons/open.svg +++ b/src/main/resources/icons/open.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/open_dark.svg b/src/main/resources/icons/open_dark.svg index 6a3aa39..73156fe 100644 --- a/src/main/resources/icons/open_dark.svg +++ b/src/main/resources/icons/open_dark.svg @@ -1,4 +1,3 @@ - diff --git a/src/main/resources/icons/search.svg b/src/main/resources/icons/search.svg index 7277dab..e82a9b9 100644 --- a/src/main/resources/icons/search.svg +++ b/src/main/resources/icons/search.svg @@ -1,8 +1,5 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/search_dark.svg b/src/main/resources/icons/search_dark.svg index 7a78865..d224f17 100644 --- a/src/main/resources/icons/search_dark.svg +++ b/src/main/resources/icons/search_dark.svg @@ -1,8 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/sortAz.svg b/src/main/resources/icons/sortAz.svg index 2a21d6c..20fc1d5 100644 --- a/src/main/resources/icons/sortAz.svg +++ b/src/main/resources/icons/sortAz.svg @@ -1,4 +1,3 @@ - - + fill="#6C707E"/> \ No newline at end of file diff --git a/src/main/resources/icons/star_dark.svg b/src/main/resources/icons/star_dark.svg index d4395e5..85320d3 100644 --- a/src/main/resources/icons/star_dark.svg +++ b/src/main/resources/icons/star_dark.svg @@ -1,8 +1,5 @@ - - + fill="#CED0D6"/> \ No newline at end of file diff --git a/src/main/resources/icons/window_icon.svg b/src/main/resources/icons/window_icon.svg index 1e481e0..13ba1ce 100644 --- a/src/main/resources/icons/window_icon.svg +++ b/src/main/resources/icons/window_icon.svg @@ -1,4 +1,3 @@ -