1
1
package cc.unitmesh.devti.gui.snippet
2
2
3
3
import cc.unitmesh.devti.util.parser.CodeFence
4
+ import com.intellij.ide.scratch.ScratchRootType
4
5
import com.intellij.json.JsonLanguage
6
+ import com.intellij.json.psi.JsonFile
7
+ import com.intellij.json.psi.JsonLiteral
8
+ import com.intellij.json.psi.JsonObject
9
+ import com.intellij.json.psi.JsonProperty
10
+ import com.intellij.json.psi.JsonStringLiteral
11
+ import com.intellij.json.psi.JsonValue
12
+ import com.intellij.json.JsonUtil
5
13
import com.intellij.openapi.actionSystem.ActionUpdateThread
6
14
import com.intellij.openapi.actionSystem.AnActionEvent
7
15
import com.intellij.openapi.actionSystem.CommonDataKeys
8
16
import com.intellij.openapi.actionSystem.Presentation
9
17
import com.intellij.openapi.actionSystem.ex.CustomComponentAction
18
+ import com.intellij.openapi.application.runReadAction
10
19
import com.intellij.openapi.fileEditor.FileDocumentManager
11
20
import com.intellij.openapi.project.DumbAwareAction
12
21
import com.intellij.openapi.project.Project
13
22
import com.intellij.openapi.util.Key
23
+ import com.intellij.openapi.vfs.VirtualFile
24
+ import com.intellij.psi.PsiFile
25
+ import com.intellij.psi.PsiManager
14
26
import com.intellij.testFramework.LightVirtualFile
15
27
import com.intellij.ui.components.JBLabel
16
28
import com.intellij.util.ui.UIUtil
@@ -43,22 +55,38 @@ class AutoDevLanguageLabelAction : DumbAwareAction(), CustomComponentAction {
43
55
44
56
override fun update (e : AnActionEvent ) {
45
57
val editor = e.dataContext.getData(CommonDataKeys .EDITOR ) ? : return
46
- val lightVirtualFile = FileDocumentManager .getInstance().getFile(editor.document) as ? LightVirtualFile ? : return
58
+ var lightVirtualFile = FileDocumentManager .getInstance().getFile(editor.document) as ? LightVirtualFile ? : return
47
59
48
- // val project = e.project ?: return
49
- // if (lightVirtualFile.language == JsonLanguage.INSTANCE) {
50
- // checkDevContainer (project, lightVirtualFile)
51
- // }
60
+ val project = e.project ? : return
61
+ if (lightVirtualFile.language == JsonLanguage .INSTANCE ) {
62
+ lightVirtualFile = updateForDevContainer (project, lightVirtualFile) ? : lightVirtualFile
63
+ }
52
64
53
65
val displayName =
54
- lightVirtualFile.language.displayName ? : CodeFence .displayNameByExt(lightVirtualFile.extension ? : " txt" )
66
+ lightVirtualFile.language? .displayName ? : CodeFence .displayNameByExt(lightVirtualFile.extension ? : " txt" )
55
67
e.presentation.putClientProperty(LANGUAGE_PRESENTATION_KEY , displayName)
56
68
}
57
69
58
- private fun checkDevContainer (
70
+ private fun updateForDevContainer (
59
71
project : Project ,
60
72
lightVirtualFile : LightVirtualFile
61
- ) {
73
+ ): LightVirtualFile ? {
74
+ val psiFile = runReadAction { PsiManager .getInstance(project).findFile(lightVirtualFile) } ? : return null
75
+ val image = getEnvObject(" image" , psiFile) ? : return null
76
+
77
+ val literal = image as ? JsonStringLiteral ? : return null
78
+ val imageValue = literal.value
79
+
80
+ if (! imageValue.contains(" mcr.microsoft.com/devcontainers" )) return null
81
+
82
+ // / create new file with name devcontainer.json
83
+ val content = lightVirtualFile.inputStream.readBytes().toString(Charsets .UTF_8 )
84
+ val newFile = LightVirtualFile (
85
+ " devcontainer.json" ,
86
+ JsonLanguage .INSTANCE ,
87
+ content
88
+ )
89
+
62
90
try {
63
91
// follow: https://containers.dev/guide/dockerfile
64
92
// check image, exist, {
@@ -68,9 +96,32 @@ class AutoDevLanguageLabelAction : DumbAwareAction(), CustomComponentAction {
68
96
.filter { it.isAvailable(lightVirtualFile) }
69
97
70
98
// devcontainer.json
99
+ providers.map {
100
+ it.name
101
+ }
71
102
} catch (e: Exception ) {
72
103
e.printStackTrace()
73
104
}
105
+
106
+ return newFile
107
+ }
108
+
109
+ fun getEnvObject (propName : String , psiFile : PsiFile ): JsonValue ? {
110
+ val rootObject = (psiFile as ? JsonFile )?.topLevelValue as ? JsonObject ? : return null
111
+ return rootObject.propertyList.firstOrNull { it.name == propName }?.value
112
+ }
113
+
114
+ fun JsonProperty.valueAsString (obj : JsonObject ): String? {
115
+ val value = JsonUtil .getPropertyValueOfType(obj, name, JsonLiteral ::class .java)
116
+ return when (value) {
117
+ is JsonStringLiteral -> value.value
118
+ else -> value?.text
119
+ }
120
+ }
121
+
122
+ fun JsonObject.findString (name : String ): String? {
123
+ val property = findProperty(name) ? : return null
124
+ return property.valueAsString(this )
74
125
}
75
126
76
127
companion object {
0 commit comments