11package com.github.xepozz.call.base.inlay
22
3+ import com.github.xepozz.call.base.SessionStorage
34import com.github.xepozz.call.base.api.FeatureGenerator
45import com.github.xepozz.call.base.api.FeatureMatch
56import com.github.xepozz.call.base.api.LanguageTextExtractor
@@ -30,15 +31,11 @@ import com.intellij.psi.PsiFile
3031import com.intellij.ui.dsl.builder.panel
3132import java.awt.BorderLayout
3233import java.awt.Cursor
33- import java.util.concurrent.ConcurrentHashMap
3434import javax.swing.Icon
3535import javax.swing.JPanel
3636
3737@Suppress(" UnstableApiUsage" )
3838class ExecutionInlayProvider : InlayHintsProvider <NoSettings > {
39- // key: editorId + featureId + line
40- private val sessions = ConcurrentHashMap <String , Session >()
41-
4239 override val key: SettingsKey <NoSettings > = SettingsKey (" call.implementation.inlay" )
4340 override val name: String = " Call (Unified)"
4441 override val previewText: String = " // shell: echo hello\n // https://api.example.com"
@@ -54,6 +51,7 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
5451 settings : NoSettings ,
5552 sink : InlayHintsSink
5653 ) = object : FactoryInlayHintsCollector (editor) {
54+ val sessionStorage = SessionStorage .getInstance(file.project)
5755
5856 // Pre-compute matches for the whole file once
5957 private val matchesByElement: Map <PsiElement , List <FeatureMatch >> = computeMatches(file)
@@ -62,7 +60,7 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
6260 val matches = matchesByElement[element] ? : return true
6361 if (matches.isEmpty()) return true
6462
65- val project = editor .project ? : return true
63+ val project = file .project
6664
6765 matches.forEach { m ->
6866 val offset = m.originalRange.startOffset
@@ -110,7 +108,7 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
110108 val line = editor.document.getLineNumber(start)
111109 val lineEndOffset = editor.document.getLineEndOffset(line)
112110 val key = makeKey(editor, match.featureId, line)
113- val session = sessions[ key]
111+ val session = sessionStorage.getSession( key)
114112
115113 val parts = mutableListOf<InlayPresentation >()
116114
@@ -194,7 +192,7 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
194192 lineEndOffset : Int ,
195193 ) {
196194 // Ensure wrapper exists and mounted
197- var current = sessions[ key]
195+ var current = sessionStorage.getSession( key)
198196 val wrapper = feature.createWrapper()
199197
200198 if (current?.container == null ) {
@@ -204,13 +202,10 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
204202 mountWrapperIntoContainer(container, wrapper)
205203
206204 current = Session (container, wrapper)
207- sessions[key] = current
208205 } catch (_: Throwable ) {
209- // If embedding fails, still execute without container
210206 current = Session (null , wrapper)
211- sessions[key] = current
212207 }
213- current.state = ExecutionState . RUNNING
208+ sessionStorage.putSession(key, current)
214209 } else {
215210 // Replace previous wrapper in the existing container
216211 val container = current.container
@@ -220,20 +215,20 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
220215 }
221216 mountWrapperIntoContainer(container, wrapper)
222217 current.wrapper = wrapper
223- current.state = ExecutionState .RUNNING
224218 }
219+ current.state = ExecutionState .RUNNING
225220
226221 refreshInlays(editor)
227222
228223 // Execute and capture process lifecycle
229- val sess = sessions[key] ? : return
224+ val session = current
230225 feature.execute(match, wrapper, project) { processHandler ->
231- sess .processHandler = processHandler
226+ session .processHandler = processHandler
232227
233228 processHandler?.addProcessListener(object : ProcessListener {
234229 override fun processTerminated (event : ProcessEvent ) {
235- sess .state = ExecutionState .FINISHED
236- sess .processHandler = null
230+ session .state = ExecutionState .FINISHED
231+ session .processHandler = null
237232 refreshInlays(editor)
238233 }
239234 })
@@ -249,14 +244,14 @@ class ExecutionInlayProvider : InlayHintsProvider<NoSettings> {
249244 }
250245
251246 private fun stop (key : String ) {
252- val session = sessions[ key] ? : return
247+ val session = sessionStorage.getSession( key) ? : return
253248 session.processHandler?.destroyProcess()
254249 session.processHandler = null
255250 session.state = ExecutionState .FINISHED
256251 }
257252
258253 private fun delete (key : String ) {
259- val session = sessions .remove(key) ? : return
254+ val session = sessionStorage .remove(key) ? : return
260255 try { session.processHandler?.destroyProcess() } catch (_: Throwable ) { }
261256 session.processHandler = null
262257 invokeLater {
0 commit comments