diff --git a/exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/WriteInsCommand.kt b/exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/WriteInsCommand.kt index 5af54e498d..e85e6b1be5 100644 --- a/exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/WriteInsCommand.kt +++ b/exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/WriteInsCommand.kt @@ -5,22 +5,50 @@ import cc.unitmesh.devti.language.compiler.model.LineInfo import cc.unitmesh.devti.language.utils.lookupFile import cc.unitmesh.devti.util.parser.Code import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.command.WriteCommandAction +import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.project.Project +import com.intellij.openapi.project.guessProjectDir +import com.intellij.openapi.vfs.findOrCreateDirectory import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager +import java.io.File class WriteInsCommand(val myProject: Project, val argument: String, val content: String) : InsCommand { override suspend fun execute(): String? { val content = Code.parse(content).text val range: LineInfo? = LineInfo.fromString(argument) - val filename = argument.split("#")[0] + val filepath = argument.split("#")[0] + val projectDir = myProject.guessProjectDir() ?: return "$DEVINS_ERROR: Project directory not found" + + val virtualFile = myProject.lookupFile(filepath) + if (virtualFile == null) { + return runWriteAction { + val parentPath = filepath.substringBeforeLast(File.separator) + val parentDir = projectDir.findOrCreateDirectory(parentPath) + val newFile = parentDir.createChildData(this, filepath.substringAfterLast(File.separator)) + val document = FileDocumentManager.getInstance().getDocument(newFile) + ?: return@runWriteAction "$DEVINS_ERROR: Create File failed: $argument" + + document.setText(content) + + return@runWriteAction "Create file: $argument" + } + } - val virtualFile = myProject.lookupFile(filename) ?: return "$DEVINS_ERROR: File not found: $argument" val psiFile = PsiManager.getInstance(myProject).findFile(virtualFile) ?: return "$DEVINS_ERROR: File not found: $argument" + return executeInsert(psiFile, range, content) + } + private fun executeInsert( + psiFile: PsiFile, + range: LineInfo?, + content: String + ): String { val document = runReadAction { PsiDocumentManager.getInstance(myProject).getDocument(psiFile) } ?: return "$DEVINS_ERROR: File not found: $argument" @@ -40,4 +68,4 @@ class WriteInsCommand(val myProject: Project, val argument: String, val content: return "$DEVINS_ERROR: ${e.message}" } } -} \ No newline at end of file +}