Skip to content

Commit

Permalink
feat(devins): enable write new content to file #143
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Apr 10, 2024
1 parent 8525a0b commit ad029f1
Showing 1 changed file with 31 additions and 3 deletions.
Expand Up @@ -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"
Expand All @@ -40,4 +68,4 @@ class WriteInsCommand(val myProject: Project, val argument: String, val content:
return "$DEVINS_ERROR: ${e.message}"
}
}
}
}

0 comments on commit ad029f1

Please sign in to comment.