Skip to content

Commit ad029f1

Browse files
committed
feat(devins): enable write new content to file #143
1 parent 8525a0b commit ad029f1

File tree

1 file changed

+31
-3
lines changed
  • exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec

1 file changed

+31
-3
lines changed

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/WriteInsCommand.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,50 @@ import cc.unitmesh.devti.language.compiler.model.LineInfo
55
import cc.unitmesh.devti.language.utils.lookupFile
66
import cc.unitmesh.devti.util.parser.Code
77
import com.intellij.openapi.application.runReadAction
8+
import com.intellij.openapi.application.runWriteAction
89
import com.intellij.openapi.command.WriteCommandAction
10+
import com.intellij.openapi.fileEditor.FileDocumentManager
911
import com.intellij.openapi.project.Project
12+
import com.intellij.openapi.project.guessProjectDir
13+
import com.intellij.openapi.vfs.findOrCreateDirectory
1014
import com.intellij.psi.PsiDocumentManager
15+
import com.intellij.psi.PsiFile
1116
import com.intellij.psi.PsiManager
17+
import java.io.File
1218

1319
class WriteInsCommand(val myProject: Project, val argument: String, val content: String) : InsCommand {
1420
override suspend fun execute(): String? {
1521
val content = Code.parse(content).text
1622

1723
val range: LineInfo? = LineInfo.fromString(argument)
18-
val filename = argument.split("#")[0]
24+
val filepath = argument.split("#")[0]
25+
val projectDir = myProject.guessProjectDir() ?: return "$DEVINS_ERROR: Project directory not found"
26+
27+
val virtualFile = myProject.lookupFile(filepath)
28+
if (virtualFile == null) {
29+
return runWriteAction {
30+
val parentPath = filepath.substringBeforeLast(File.separator)
31+
val parentDir = projectDir.findOrCreateDirectory(parentPath)
32+
val newFile = parentDir.createChildData(this, filepath.substringAfterLast(File.separator))
33+
val document = FileDocumentManager.getInstance().getDocument(newFile)
34+
?: return@runWriteAction "$DEVINS_ERROR: Create File failed: $argument"
35+
36+
document.setText(content)
37+
38+
return@runWriteAction "Create file: $argument"
39+
}
40+
}
1941

20-
val virtualFile = myProject.lookupFile(filename) ?: return "$DEVINS_ERROR: File not found: $argument"
2142
val psiFile = PsiManager.getInstance(myProject).findFile(virtualFile)
2243
?: return "$DEVINS_ERROR: File not found: $argument"
44+
return executeInsert(psiFile, range, content)
45+
}
2346

47+
private fun executeInsert(
48+
psiFile: PsiFile,
49+
range: LineInfo?,
50+
content: String
51+
): String {
2452
val document = runReadAction {
2553
PsiDocumentManager.getInstance(myProject).getDocument(psiFile)
2654
} ?: return "$DEVINS_ERROR: File not found: $argument"
@@ -40,4 +68,4 @@ class WriteInsCommand(val myProject: Project, val argument: String, val content:
4068
return "$DEVINS_ERROR: ${e.message}"
4169
}
4270
}
43-
}
71+
}

0 commit comments

Comments
 (0)