Skip to content

Commit df38c29

Browse files
committed
feat(devti-lang): add support for creating files with content in specific directories #143
1 parent aeda0e5 commit df38c29

File tree

1 file changed

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

1 file changed

+28
-10
lines changed

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

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import cc.unitmesh.devti.util.parser.Code
77
import com.intellij.openapi.application.runReadAction
88
import com.intellij.openapi.application.runWriteAction
99
import com.intellij.openapi.command.WriteCommandAction
10+
import com.intellij.openapi.editor.Document
1011
import com.intellij.openapi.fileEditor.FileDocumentManager
1112
import com.intellij.openapi.project.Project
1213
import com.intellij.openapi.project.guessProjectDir
14+
import com.intellij.openapi.vfs.VirtualFile
1315
import com.intellij.psi.PsiDocumentManager
1416
import com.intellij.psi.PsiFile
1517
import com.intellij.psi.PsiManager
@@ -26,26 +28,42 @@ class WriteInsCommand(val myProject: Project, val argument: String, val content:
2628
val virtualFile = myProject.lookupFile(filepath)
2729
if (virtualFile == null) {
2830
return runWriteAction {
29-
val parentPath = filepath.substringBeforeLast(File.separator)
30-
var parentDir = projectDir.findChild(parentPath)
31-
if (parentDir == null) {
32-
parentDir = projectDir.createChildDirectory(this, parentPath)
33-
}
34-
val newFile = parentDir.createChildData(this, filepath.substringAfterLast(File.separator))
35-
val document = FileDocumentManager.getInstance().getDocument(newFile)
36-
?: return@runWriteAction "$DEVINS_ERROR: Create File failed: $argument"
31+
// filepath maybe just a file name, so we need to create parent directory
32+
val hasChildPath = filepath.contains(File.separator)
33+
if (hasChildPath) {
34+
val parentPath = filepath.substringBeforeLast(File.separator)
35+
var parentDir = projectDir.findChild(parentPath)
36+
if (parentDir == null) {
37+
parentDir = projectDir.createChildDirectory(this, parentPath)
38+
}
39+
40+
createNewContent(parentDir, filepath, content)
41+
?: return@runWriteAction "$DEVINS_ERROR: Create File failed: $argument"
3742

38-
document.setText(content)
43+
return@runWriteAction "Create file: $argument"
44+
} else {
45+
createNewContent(projectDir, filepath, content)
46+
?: return@runWriteAction "$DEVINS_ERROR: Create File failed: $argument"
3947

40-
return@runWriteAction "Create file: $argument"
48+
return@runWriteAction "Create file: $argument"
49+
}
4150
}
4251
}
4352

4453
val psiFile = PsiManager.getInstance(myProject).findFile(virtualFile)
4554
?: return "$DEVINS_ERROR: File not found: $argument"
55+
4656
return executeInsert(psiFile, range, content)
4757
}
4858

59+
private fun createNewContent(parentDir: VirtualFile, filepath: String, content: String): Document? {
60+
val newFile = parentDir.createChildData(this, filepath.substringAfterLast(File.separator))
61+
val document = FileDocumentManager.getInstance().getDocument(newFile) ?: return null
62+
63+
document.setText(content)
64+
return document
65+
}
66+
4967
private fun executeInsert(
5068
psiFile: PsiFile,
5169
range: LineInfo?,

0 commit comments

Comments
 (0)