Skip to content

Commit

Permalink
feat(runner): add ShireFileRunService and enhance run configuration
Browse files Browse the repository at this point in the history
#165

- Implement ShireFileRunService for handling file execution.
- Update ShireRunConfigurationProfileState to support data context loading.
- Minor fixes and improvements in related classes.
  • Loading branch information
phodal committed Dec 19, 2024
1 parent 9887aa8 commit e08c831
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class ShireFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, Shir

override fun toString(): String = "ShireFile"

override fun getStub(): ShireFileStub? = super.getStub() as ShireFileStub ?
override fun getStub(): ShireFileStub? = super.getStub() as ShireFileStub?

companion object {
/**
Expand All @@ -27,7 +27,8 @@ class ShireFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, Shir
val filename =
ShireLanguage.INSTANCE.displayName + "-${UUID.randomUUID()}." + ShireFileType.INSTANCE.defaultExtension
val shireFile = runReadAction {
PsiFileFactory.getInstance(project).createFileFromText(filename, ShireLanguage.INSTANCE, text) as ShireFile
PsiFileFactory.getInstance(project)
.createFileFromText(filename, ShireLanguage.INSTANCE, text) as ShireFile
}

return shireFile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ import com.intellij.execution.impl.ConsoleViewImpl
import com.intellij.execution.process.*
import com.intellij.execution.runners.ProgramRunner
import com.intellij.execution.ui.ConsoleViewContentType
import com.intellij.ide.DataManager
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.externalSystem.model.ProjectSystemId
Expand All @@ -20,6 +24,7 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfigurationViewManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import com.intellij.psi.PsiManager
import com.intellij.ui.components.panels.NonOpaquePanel
import com.phodal.shirecore.ShireCoroutineScope
import com.phodal.shirecore.config.InteractionType
Expand Down Expand Up @@ -60,10 +65,14 @@ open class ShireRunConfigurationProfileState(

console!!.attachToProcess(processHandler)

val shireFile: ShireFile? = ShireFile.lookup(myProject, configuration.getScriptPath())
var shireFile: ShireFile? = ShireFile.lookup(myProject, configuration.getScriptPath())
if (shireFile == null) {
shireFile = tryLoadFromDataContext()
}

if (shireFile == null) {
console!!.print("File not found: ${configuration.getScriptPath()}", ConsoleViewContentType.ERROR_OUTPUT)
processHandler.destroyProcess()
processHandler.exitWithError()
return DefaultExecutionResult(console, processHandler)
}

Expand Down Expand Up @@ -109,10 +118,23 @@ open class ShireRunConfigurationProfileState(
return DefaultExecutionResult(console, processHandler)
}

private fun tryLoadFromDataContext(): ShireFile? {
val dataContext = DataManager.getInstance().dataContextFromFocusAsync.blockingGet(10000)
?: throw IllegalStateException("No data context found")

val data = SimpleDataContext.getProjectContext(myProject).getData(SHIRE_VIRTUAL_KEY)

return dataContext.getData(SHIRE_VIRTUAL_KEY) ?: data
}

override fun dispose() {
console?.dispose()
executionConsole?.dispose()
}

companion object {
val SHIRE_VIRTUAL_KEY: DataKey<ShireFile> = DataKey.create("shireVirtualKey")
}
}

class ShireConsoleView(private val executionConsole: ShireExecutionConsole) :
Expand All @@ -126,6 +148,7 @@ class ShireConsoleView(private val executionConsole: ShireExecutionConsole) :
private val id = ProjectSystemId("Shire")
private fun createTaskId() =
ExternalSystemTaskId.create(id, ExternalSystemTaskType.RESOLVE_PROJECT, executionConsole.project)

private val scriptPath = executionConsole.configuration.getScriptPath()

val task = createTaskId()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.phodal.shirelang.runner

import com.intellij.execution.RunManager
import com.intellij.execution.RunnerAndConfigurationSettings
import com.intellij.execution.configurations.RunConfiguration
import com.intellij.execution.configurations.RunProfile
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.testFramework.LightVirtualFile
import com.phodal.shirecore.provider.shire.FileRunService
import com.phodal.shirelang.psi.ShireFile
import com.phodal.shirelang.run.ShireConfiguration
import com.phodal.shirelang.run.ShireConfigurationType
import com.phodal.shirelang.run.ShireRunConfigurationProfileState

class ShireFileRunService : FileRunService {
override fun isApplicable(project: Project, file: VirtualFile): Boolean {
return PsiManager.getInstance(project).findFile(file) is ShireFile
}

override fun runConfigurationClass(project: Project): Class<out RunProfile> = ShireConfiguration::class.java

override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
val configurationSetting = runReadAction {
val psiFile =
PsiManager.getInstance(project).findFile(virtualFile) as? ShireFile ?: return@runReadAction null
RunManager.getInstance(project)
.createConfiguration(psiFile.name, ShireConfigurationType.getInstance())
} ?: return null

val shireConfiguration = configurationSetting.configuration as ShireConfiguration
shireConfiguration.name = virtualFile.nameWithoutExtension
shireConfiguration.setScriptPath(virtualFile.path)

return shireConfiguration
}

override fun createRunSettings(
project: Project,
virtualFile: VirtualFile,
testElement: PsiElement?,
): RunnerAndConfigurationSettings? {
val runManager = RunManager.getInstance(project)

val psiFile = runReadAction {
PsiManager.getInstance(project).findFile(virtualFile) as? ShireFile ?: return@runReadAction null
} ?: return null

val setting = runReadAction {
runManager.createConfiguration(psiFile.name, ShireConfigurationType.getInstance())
}

val shireConfiguration = setting.configuration as ShireConfiguration
shireConfiguration.name = virtualFile.nameWithoutExtension

if (virtualFile is LightVirtualFile) {
val dataContext = SimpleDataContext.builder()
.add<ShireFile>(ShireRunConfigurationProfileState.SHIRE_VIRTUAL_KEY, psiFile).build()

}

shireConfiguration.setScriptPath(virtualFile.path)

runManager.setTemporaryConfiguration(setting)

setting.isTemporary = true
runManager.selectedConfiguration = setting

return setting
}
}
2 changes: 2 additions & 0 deletions shirelang/src/main/resources/com.phodal.shirelang.xml
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@
<extensions defaultExtensionNs="com.phodal">
<shireFileRunService implementation="com.phodal.shirelang.runner.ShellFileRunService"/>

<shireFileRunService implementation="com.phodal.shirelang.runner.ShireFileRunService"/>

<shirePsiVariableProvider language="Shire"
implementationClass="com.phodal.shirelang.provider.ShirePsiVariableProvider"/>
<shireLanguageToolchainProvider language="Shire"
Expand Down

0 comments on commit e08c831

Please sign in to comment.