Skip to content

Commit 1d59130

Browse files
committed
feat(agent): enhance variable template handling and introduce new file creation services #379
1 parent 5f3c0dc commit 1d59130

File tree

8 files changed

+108
-70
lines changed

8 files changed

+108
-70
lines changed

core/src/main/kotlin/cc/unitmesh/devti/custom/compile/VariableTemplateCompiler.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.intellij.psi.PsiFile
1616
import com.intellij.psi.PsiNameIdentifierOwner
1717
import cc.unitmesh.devti.intentions.action.getElementToAction
1818
import com.intellij.openapi.application.ReadAction
19+
import com.intellij.openapi.application.runReadAction
1920
import com.intellij.psi.PsiManager
2021
import kotlinx.coroutines.runBlocking
2122
import org.apache.velocity.VelocityContext
@@ -33,7 +34,7 @@ class VariableTemplateCompiler(
3334
private val velocityContext = VelocityContext()
3435

3536
init {
36-
this.set(CustomVariable.SELECTION.variable, editor.selectionModel.selectedText ?: selectedText)
37+
this.set(CustomVariable.SELECTION.variable, runReadAction { editor.selectionModel.selectedText ?: selectedText })
3738
this.set(CustomVariable.BEFORE_CURSOR.variable, file.text.substring(0, editor.caretModel.offset))
3839
this.set(CustomVariable.AFTER_CURSOR.variable, file.text.substring(editor.caretModel.offset))
3940
this.set(CustomVariable.ALL.variable, file.text)

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/ast/variable/ShireVariableTemplateCompiler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class ShireVariableTemplateCompiler(
4545
PsiManager.getInstance(myProject).findFile(editor.virtualFile ?: return@runReadAction null)
4646
}!!
4747

48-
val templateCompiler = VariableTemplateCompiler(file.language, file, null, editor)
48+
val templateCompiler = runReadAction { VariableTemplateCompiler(file.language, file, null, editor) }
4949

5050
templateCompiler.putAll(additionalMap)
5151
templateCompiler.putAll(customVariables)

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/middleware/builtin/AppendProcessor.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import com.intellij.openapi.project.Project
55
import cc.unitmesh.devti.language.middleware.post.PostProcessorType
66
import cc.unitmesh.devti.language.middleware.post.PostProcessorContext
77
import cc.unitmesh.devti.language.middleware.post.PostProcessor
8-
import kotlin.text.get
98

109
class AppendProcessor : PostProcessor {
1110
override val processorName: String = PostProcessorType.Append.handleName

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/middleware/builtin/SaveFileProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class SaveFileProcessor : PostProcessor, Disposable {
5757
val outputDir = ShireConstants.outputDir(project)
5858

5959
val outputFile = outputDir?.createChildData(this, fileName)
60-
?: throw IllegalStateException("Failed to save file")
60+
?: throw IllegalStateException("Failed to save file, fileName: $fileName, outputDir: $outputDir")
6161

6262
val content = getContent(context)
6363
outputFile.setBinaryContent(content?.toByteArray() ?: ByteArray(0))
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cc.unitmesh.devti.language.provider
2+
3+
import com.intellij.openapi.extensions.ExtensionPointName
4+
import com.intellij.openapi.project.Project
5+
6+
class AgentToolContext(
7+
val project: Project,
8+
val argument: String
9+
) {
10+
11+
}
12+
13+
data class AgentToolResult(
14+
val isSuccess: Boolean,
15+
val output: String? = null
16+
)
17+
18+
interface AgentTool {
19+
val name: String
20+
val description: String
21+
fun execute(context: AgentToolContext): AgentToolResult
22+
23+
// extension point
24+
companion object {
25+
private val EP_NAME = ExtensionPointName<AgentTool>("cc.unitmesh.shireAgentTool")
26+
27+
fun allTools(): List<AgentTool> {
28+
return EP_NAME.extensionList
29+
}
30+
}
31+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package cc.unitmesh.devti.language.provider
2+
3+
import com.intellij.lang.Language
4+
import com.intellij.lang.LanguageExtension
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.openapi.vfs.VirtualFile
7+
8+
9+
interface FileCreateService {
10+
fun createFile(prompt: String, project: Project): VirtualFile?
11+
12+
companion object {
13+
private val languageExtension: LanguageExtension<FileCreateService> =
14+
LanguageExtension("cc.unitmesh.shireFileCreateService")
15+
16+
fun provide(language: Language): FileCreateService? {
17+
return languageExtension.forLanguage(language)
18+
}
19+
}
20+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cc.unitmesh.devti.language.provider
2+
3+
import com.intellij.openapi.extensions.ExtensionPointName
4+
import com.intellij.openapi.project.Project
5+
6+
interface ToolchainFunctionProvider {
7+
fun isApplicable(project: Project, funcName: String): Boolean
8+
9+
fun execute(project: Project, funcName: String, args: List<Any>, allVariables: Map<String, Any?>): Any
10+
11+
companion object {
12+
private val EP_NAME: ExtensionPointName<ToolchainFunctionProvider> =
13+
ExtensionPointName("cc.unitmesh.shireToolchainFunctionProvider")
14+
15+
fun all(): List<ToolchainFunctionProvider> {
16+
return EP_NAME.extensionList
17+
}
18+
19+
fun lookup(providerName: String): ToolchainFunctionProvider? {
20+
return EP_NAME.extensionList.firstOrNull {
21+
it.javaClass.simpleName == providerName
22+
}
23+
}
24+
25+
fun provide(project: Project, funcName: String): ToolchainFunctionProvider? {
26+
return EP_NAME.extensionList.firstOrNull {
27+
it.isApplicable(project, funcName)
28+
}
29+
}
30+
}
31+
}

exts/devins-lang/src/main/resources/cc.unitmesh.devti.language.xml

Lines changed: 22 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
<backgroundPostStartupActivity implementation="cc.unitmesh.devti.language.startup.ShireActionStartupActivity"/>
99
<vfs.asyncListener implementation="cc.unitmesh.devti.language.startup.AsyncShireFileListener"/>
1010
<fileDocumentManagerListener implementation="cc.unitmesh.devti.language.startup.ShireFileModificationListener"/>
11-
<editorFactoryDocumentListener implementation="cc.unitmesh.devti.language.startup.ShireFileModificationListener"/>
11+
<editorFactoryDocumentListener
12+
implementation="cc.unitmesh.devti.language.startup.ShireFileModificationListener"/>
1213
<copyPastePreProcessor implementation="cc.unitmesh.devti.language.startup.ShireCopyPastePreProcessor"/>
1314

1415
<!-- refs: https://github.com/JetBrains/intellij-sdk-code-samples/blob/main/simple_language_plugin/src/main/resources/META-INF/plugin.xml-->
@@ -43,7 +44,8 @@
4344

4445
<configurationType implementation="cc.unitmesh.devti.language.run.DevInsConfigurationType"/>
4546
<programRunner implementation="cc.unitmesh.devti.language.run.DevInsProgramRunner"/>
46-
<runConfigurationBeforeRunProviderDelegate implementation="cc.unitmesh.devti.language.run.DevInsBeforeRunProviderDelegate"/>
47+
<runConfigurationBeforeRunProviderDelegate
48+
implementation="cc.unitmesh.devti.language.run.DevInsBeforeRunProviderDelegate"/>
4749
<runConfigurationProducer implementation="cc.unitmesh.devti.language.run.DevInsRunConfigurationProducer"/>
4850
<runLineMarkerContributor language="DevIn"
4951
implementationClass="cc.unitmesh.devti.language.run.DevInsRunLineMarkersProvider"/>
@@ -59,24 +61,8 @@
5961
enabledByDefault="true"
6062
level="ERROR"
6163
implementationClass="cc.unitmesh.devti.language.lints.DevInsDuplicateAgentInspection"/>
62-
63-
64-
<extensionPoint qualifiedName="cc.unitmesh.shireSymbolProvider"
65-
interface="cc.unitmesh.devti.language.provider.shire.ShireSymbolProvider"
66-
dynamic="true"/>
67-
68-
<extensionPoint qualifiedName="cc.unitmesh.shireQLDataProvider"
69-
interface="cc.unitmesh.devti.language.provider.shire.ShireQLDataProvider"
70-
dynamic="true"/>
71-
72-
<extensionPoint qualifiedName="cc.unitmesh.shireAgentTool"
73-
interface="cc.unitmesh.devti.language.provider.agent.AgentTool"
74-
dynamic="true"/>
75-
76-
<extensionPoint qualifiedName="cc.unitmesh.shireRevisionProvider"
77-
interface="cc.unitmesh.devti.language.provider.shire.RevisionProvider"
78-
dynamic="true"/>
79-
64+
</extensions>
65+
<extensionPoints>
8066
<extensionPoint qualifiedName="cc.unitmesh.shireBuildSystemProvider"
8167
interface="cc.unitmesh.devti.language.provider.context.BuildSystemProvider"
8268
dynamic="true"/>
@@ -87,17 +73,8 @@
8773

8874
<extensionPoint qualifiedName="cc.unitmesh.shireRefactoringTool"
8975
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
90-
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.shire.RefactoringTool"/>
91-
</extensionPoint>
92-
93-
<extensionPoint qualifiedName="cc.unitmesh.shirePsiCapture"
94-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
95-
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.psi.PsiCapture"/>
96-
</extensionPoint>
97-
98-
<extensionPoint qualifiedName="cc.unitmesh.shireRelatedClass"
99-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
100-
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.psi.RelatedClassesProvider"/>
76+
<with attribute="implementationClass"
77+
implements="cc.unitmesh.devti.language.provider.shire.RefactoringTool"/>
10178
</extensionPoint>
10279

10380
<extensionPoint qualifiedName="cc.unitmesh.shireAutoTesting"
@@ -108,46 +85,32 @@
10885
<extensionPoint qualifiedName="cc.unitmesh.shireFileCreateService"
10986
beanClass="com.intellij.lang.LanguageExtensionPoint"
11087
dynamic="true">
111-
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.shire.FileCreateService"/>
88+
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.FileCreateService"/>
11289
</extensionPoint>
11390

11491
<!-- Toolchain Provider -->
11592
<extensionPoint qualifiedName="cc.unitmesh.shireLanguageToolchainProvider"
11693
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
11794
<with attribute="implementationClass"
118-
implements="cc.unitmesh.devti.language.provider.context.LanguageToolchainProvider"/>
95+
implements="cc.unitmesh.devti.language.provider.LanguageToolchainProvider"/>
11996
</extensionPoint>
12097

12198
<extensionPoint qualifiedName="cc.unitmesh.shirePsiVariableProvider"
12299
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
123100
<with attribute="implementationClass"
124-
implements="cc.unitmesh.devti.language.provider.variable.PsiContextVariableProvider"/>
101+
implements="cc.unitmesh.devti.language.provider.ast.variable.PsiContextVariableProvider"/>
125102
</extensionPoint>
126103

127104
<!-- PSI Query Expression -->
128105
<extensionPoint qualifiedName="cc.unitmesh.shirePsiQLInterpreter"
129106
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
130107
<with attribute="implementationClass"
131-
implements="cc.unitmesh.devti.language.provider.variable.ShireQLInterpreter"/>
132-
</extensionPoint>
133-
134-
<!-- Code Editor -->
135-
<extensionPoint qualifiedName="cc.unitmesh.shireCodeModifier"
136-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
137-
<with attribute="implementationClass"
138-
implements="cc.unitmesh.devti.language.provider.codeedit.CodeModifier"/>
139-
</extensionPoint>
140-
141-
<!-- PSI DATA Builder -->
142-
<extensionPoint qualifiedName="cc.unitmesh.shirePsiElementDataBuilder"
143-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
144-
<with attribute="implementationClass"
145-
implements="cc.unitmesh.devti.language.provider.psi.PsiElementDataBuilder"/>
108+
implements="cc.unitmesh.devti.language.ast.shireql.ShireQLInterpreter"/>
146109
</extensionPoint>
147110

148111
<!-- Toolchain Variable Provider -->
149112
<extensionPoint qualifiedName="cc.unitmesh.shireToolchainVariableProvider"
150-
interface="cc.unitmesh.devti.language.provider.variable.ToolchainVariableProvider"
113+
interface="cc.unitmesh.devti.language.provider.ToolchainVariableProvider"
151114
dynamic="true">
152115
</extensionPoint>
153116

@@ -162,15 +125,20 @@
162125
interface="cc.unitmesh.devti.language.middleware.post.PostProcessor"
163126
dynamic="true"/>
164127

128+
<!-- Location Interaction -->
129+
<extensionPoint qualifiedName="cc.unitmesh.shireLocationInteraction"
130+
interface="cc.unitmesh.devti.language.provider.LocationInteractionProvider"
131+
dynamic="true"/>
132+
165133
<extensionPoint qualifiedName="cc.unitmesh.shireActionLocationEditor"
166134
interface="cc.unitmesh.devti.language.provider.ActionLocationEditor"
167135
dynamic="true"/>
168136

169137
<extensionPoint qualifiedName="cc.unitmesh.shirePsiCapture"
170138
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
171-
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.psi.PsiCapture"/>
139+
<with attribute="implementationClass" implements="cc.unitmesh.devti.language.provider.PsiCapture"/>
172140
</extensionPoint>
173-
141+
174142
<extensionPoint qualifiedName="cc.unitmesh.shireSymbolProvider"
175143
interface="cc.unitmesh.devti.language.provider.ShireSymbolProvider"
176144
dynamic="true"/>
@@ -201,18 +169,7 @@
201169
<with attribute="implementationClass"
202170
implements="cc.unitmesh.devti.language.provider.ComplexityProvider"/>
203171
</extensionPoint>
204-
205-
<!-- EditorInteractionProvider-->
206-
<shireLocationInteraction implementation="cc.unitmesh.devti.language.config.EditorInteractionProvider"/>
207-
208-
<!-- Toolchain Provider -->
209-
<extensionPoint qualifiedName="cc.unitmesh.shireLanguageToolchainProvider"
210-
beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
211-
<with attribute="implementationClass"
212-
implements="cc.unitmesh.devti.language.provider.context.LanguageToolchainProvider"/>
213-
</extensionPoint>
214-
</extensions>
215-
172+
</extensionPoints>
216173

217174
<actions>
218175
<action id="runDevInsFileAction"
@@ -228,7 +185,6 @@
228185

229186
<sketchToolchainProvider implementation="cc.unitmesh.devti.language.compiler.DevInsSketchToolchainProvider"/>
230187

231-
232188
<!-- Shire -->
233189
<shireTerminalExecutor implementation="cc.unitmesh.devti.language.provider.ShireTerminalExecutor"/>
234190
<!-- code processors -->
@@ -254,6 +210,6 @@
254210
<shirePostProcessor implementation="cc.unitmesh.devti.language.middleware.builtin.ShowWebviewProcessor"/>
255211

256212
<!-- EditorInteractionProvider-->
257-
<shireLocationInteraction implementation="cc.unitmesh.devti.language.config.interaction.EditorInteractionProvider"/>
213+
<shireLocationInteraction implementation="cc.unitmesh.devti.language.config.EditorInteractionProvider"/>
258214
</extensions>
259215
</idea-plugin>

0 commit comments

Comments
 (0)