@@ -15,6 +15,7 @@ import com.intellij.openapi.Disposable
1515import com.intellij.openapi.components.Service
1616import com.intellij.openapi.components.service
1717import com.intellij.openapi.project.Project
18+ import com.intellij.openapi.util.Disposer
1819import com.intellij.openapi.util.Key
1920import com.intellij.util.io.await
2021import kotlinx.coroutines.CoroutineScope
@@ -48,6 +49,7 @@ import java.net.URI
4849import java.nio.charset.StandardCharsets
4950import java.time.Duration
5051import java.util.concurrent.Future
52+
5153// https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/LSPProcessListener.java
5254// JB impl and redhat both use a wrapper to handle input buffering issue
5355internal class LSPProcessListener : ProcessListener {
@@ -83,6 +85,32 @@ internal class LSPProcessListener : ProcessListener {
8385
8486@Service(Service .Level .PROJECT )
8587class AmazonQLspService (private val project : Project , private val cs : CoroutineScope ) : Disposable {
88+ private var instance: AmazonQServerInstance ? = null
89+
90+ init {
91+ cs.launch {
92+ // manage lifecycle RAII-like so we can restart at arbitrary time
93+ // and suppress IDE error if server fails to start
94+ try {
95+ instance = AmazonQServerInstance (project, cs).also {
96+ Disposer .register(this @AmazonQLspService, it)
97+ }
98+ } catch (e: Exception ) {
99+ LOG .warn(e) { " Failed to start LSP server" }
100+ }
101+ }
102+ }
103+
104+ override fun dispose () {
105+ }
106+
107+ companion object {
108+ private val LOG = getLogger<AmazonQLspService >()
109+ fun getInstance (project : Project ) = project.service<AmazonQLspService >()
110+ }
111+ }
112+
113+ private class AmazonQServerInstance (private val project : Project , private val cs : CoroutineScope ) : Disposable {
86114 private val launcher: Launcher <AmazonQLanguageServer >
87115
88116 private val languageServer: AmazonQLanguageServer
@@ -180,10 +208,10 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS
180208
181209 cs.launch {
182210 val initializeResult = try {
183- withTimeout(Duration .ofSeconds(30 )) {
211+ withTimeout(Duration .ofSeconds(10 )) {
184212 languageServer.initialize(createInitializeParams()).await()
185213 }
186- } catch (e : TimeoutCancellationException ) {
214+ } catch (_ : TimeoutCancellationException ) {
187215 LOG .warn { " LSP initialization timed out" }
188216 null
189217 }
@@ -213,7 +241,6 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS
213241 }
214242
215243 companion object {
216- private val LOG = getLogger<AmazonQLspService >()
217- fun getInstance (project : Project ) = project.service<AmazonQLspService >()
244+ private val LOG = getLogger<AmazonQServerInstance >()
218245 }
219246}
0 commit comments