Ver código fonte

add: create directory, add dart、flutter depends

hwh97 4 anos atrás
pai
commit
7582825dd4

+ 2 - 1
build.gradle.kts

@@ -4,7 +4,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 plugins {
     id("org.jetbrains.intellij") version "0.7.2"
     java
-    kotlin("jvm") version "1.4.10"
+    kotlin("jvm") version "1.3.72"
 }
 
 group = "com.i2edu"
@@ -27,6 +27,7 @@ dependencies {
 // See https://github.com/JetBrains/gradle-intellij-plugin/
 intellij {
     version = "2020.3.1"
+    setPlugins("Dart:203.6912", "io.flutter:52.1.5")
 }
 
 tasks {

+ 1 - 1
settings.gradle.kts

@@ -1,2 +1,2 @@
-rootProject.name = "i2_code_genrate"
+rootProject.name = "i2_code_generate"
 

+ 42 - 9
src/main/kotlin/RouterGenerateAction.kt

@@ -1,21 +1,54 @@
+import com.intellij.execution.configurations.GeneralCommandLine
+import com.intellij.ide.util.gotoByName.ModelDiff
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.actionSystem.PlatformDataKeys
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.command.WriteCommandAction
 import com.intellij.openapi.diagnostic.LoggerRt
+import com.intellij.openapi.vfs.VfsUtil
+import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.psi.PsiFileFactory
+import com.intellij.psi.impl.file.PsiDirectoryFactory
+import com.jetbrains.lang.dart.DartLanguage
+import org.omg.SendingContext.RunTime
+import template.CodeTemplate
+import util.CodeUtil
+import util.FlutterUtil
+
 
 class RouterGenerateAction : AnAction() {
     private val log = LoggerRt.getInstance(RouterGenerateAction::class.java)
 
     override fun actionPerformed(e: AnActionEvent) {
         val project = e.getData(PlatformDataKeys.PROJECT)!!
-//        log.info(project.name)
-//        print(project.)
-
-//        val psiFile = e.getData(CommonDataKeys.PSI_FILE)
-//
-//        val classPath = psiFile!!.virtualFile.path
-//
-//        val title = "Stupid Flutter";
-        NotifierUtil.showNotifier(project, project.name)
+        val isTargetProject = FlutterUtil.isTargetProject(project)
+        if (isTargetProject) {
+            NotifierUtil.showNotifier(project, "you found our project cheer!", type = NotifierType.INFO)
+
+            val fileFactory = PsiFileFactory.getInstance(project)
+            // create generated directory
+            var saveFile: VirtualFile? = null
+            WriteCommandAction.runWriteCommandAction(project) {
+                saveFile = VfsUtil.createDirectoryIfMissing("${project.basePath}/lib/router_gen")!!
+            }
+            val saveDirectory = PsiDirectoryFactory.getInstance(project).createDirectory(saveFile!!)
+
+
+            // create file
+            val saveTextFile = fileFactory.createFileFromText("router_meta.dart", DartLanguage.INSTANCE, CodeTemplate.RouterMeta)
+            WriteCommandAction.runWriteCommandAction(project) {
+                CodeUtil.reformatDartCode(saveTextFile)
+            }
+
+            // add to file
+            WriteCommandAction.runWriteCommandAction(project) {
+               saveDirectory.add(saveTextFile!!)
+            }
+
+//            val directory = PsiDirectoryFactory.getInstance(project).createDirectory(project.projectFile!!)
+        } else {
+            NotifierUtil.showNotifier(project, "oh... you lose our project, check again?", type = NotifierType.ERROR)
+        }
     }
 }

+ 8 - 0
src/main/kotlin/constant/Constants.kt

@@ -0,0 +1,8 @@
+package constant
+
+object Constants {
+    const val title: String = "i2 code generate"
+    const val projectName: String = "i2-school-app"
+    const val flutterTarget: String = "pubspec.yaml"
+
+}

+ 11 - 0
src/main/kotlin/template/CodeTemplate.kt

@@ -0,0 +1,11 @@
+package template
+
+object CodeTemplate {
+    const val RouterMeta: String = """
+class RouterMeta {
+   final String paramName;
+   const RouterMeta({this.paramName});
+}"""
+
+
+}

+ 17 - 0
src/main/kotlin/util/CodeUtil.kt

@@ -0,0 +1,17 @@
+package util
+
+import com.intellij.openapi.diagnostic.logger
+import com.intellij.psi.PsiElement
+import com.intellij.psi.codeStyle.CodeStyleManager
+import com.jetbrains.rd.util.string.print
+
+object CodeUtil {
+    fun reformatDartCode(element: PsiElement) {
+        val codeStyleManager = CodeStyleManager.getInstance(element.project)
+        try {
+            codeStyleManager.reformat(element)
+        } catch (e: Exception) {
+            logger<CodeUtil>().error("reformat code failed", e)
+        }
+    }
+}

+ 23 - 0
src/main/kotlin/util/FlutterUtil.kt

@@ -0,0 +1,23 @@
+package util
+
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.FilenameIndex
+import com.intellij.psi.search.GlobalSearchScope
+import constant.Constants
+
+object FlutterUtil {
+    fun isTargetProject(project: Project, ): Boolean {
+        var exist = false
+        for (pubspec in FilenameIndex.getFilesByName(
+            project,
+            Constants.flutterTarget,
+            GlobalSearchScope.projectScope(project)
+        )) {
+            if (pubspec.isValid) {
+                exist = true
+            }
+        }
+
+        return exist && project.name == Constants.projectName
+    }
+}

+ 8 - 11
src/main/kotlin/util/NotifierUtil.kt

@@ -1,11 +1,9 @@
-import com.intellij.notification.NotificationGroupManager
 import com.intellij.notification.NotificationType
 import com.intellij.openapi.project.Project
-import com.intellij.openapi.ui.Messages
-import javax.swing.Icon
 import com.intellij.notification.NotificationDisplayType
 
 import com.intellij.notification.NotificationGroup
+import constant.Constants
 
 
 enum class NotifierType {
@@ -13,18 +11,17 @@ enum class NotifierType {
 }
 
 object NotifierUtil {
-    const val title: String = "提示"
     private val NOTIFICATION_GROUP =
-        NotificationGroup("Custom Notification Group", NotificationDisplayType.BALLOON, true)
+            NotificationGroup("Custom Notification Group", NotificationDisplayType.BALLOON, true)
 
     fun showNotifier(
-        project: Project,
-        content: String,
-        title: String = this.title,
-        type: NotifierType = NotifierType.INFO
+            project: Project,
+            content: String,
+            title: String = Constants.title,
+            type: NotifierType = NotifierType.INFO
     ) = NOTIFICATION_GROUP
-        .createNotification(title, content, getNotifierByType(type))
-        .notify(project);
+            .createNotification(title, content, getNotifierByType(type))
+            .notify(project);
 
     private fun getNotifierByType(type: NotifierType): NotificationType {
         return when (type) {

+ 3 - 0
src/main/resources/META-INF/plugin.xml

@@ -11,6 +11,9 @@
     <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
          on how to target different products -->
     <depends>com.intellij.modules.platform</depends>
+    <depends>com.intellij.modules.lang</depends>
+    <depends>Dart</depends>
+    <depends>io.flutter</depends>
 
     <extensions defaultExtensionNs="com.intellij">
         <!-- Add your extensions here -->