Skip to content

Commit d9f7bb3

Browse files
authored
feat(amazonq): initialize flare lsp on project start (#5366)
1 parent ba5d289 commit d9f7bb3

File tree

2 files changed

+33
-4
lines changed
  • plugins/amazonq

2 files changed

+33
-4
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1919
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
2020
import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
2121
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
22+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2223
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
2324
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
2425
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
@@ -52,6 +53,7 @@ class AmazonQStartupActivity : ProjectActivity {
5253
CodeWhispererExplorerActionManager.getInstance().setIsFirstRestartAfterQInstall(false)
5354
}
5455
}
56+
AmazonQLspService.getInstance(project)
5557
startLsp(project)
5658
if (runOnce.get()) return
5759
emitUserState(project)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.intellij.openapi.Disposable
1515
import com.intellij.openapi.components.Service
1616
import com.intellij.openapi.components.service
1717
import com.intellij.openapi.project.Project
18+
import com.intellij.openapi.util.Disposer
1819
import com.intellij.openapi.util.Key
1920
import com.intellij.util.io.await
2021
import kotlinx.coroutines.CoroutineScope
@@ -48,6 +49,7 @@ import java.net.URI
4849
import java.nio.charset.StandardCharsets
4950
import java.time.Duration
5051
import 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
5355
internal class LSPProcessListener : ProcessListener {
@@ -83,6 +85,32 @@ internal class LSPProcessListener : ProcessListener {
8385

8486
@Service(Service.Level.PROJECT)
8587
class 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

Comments
 (0)