From c33a740843dc535ad2b86d6a64e3a4fc358bf71d Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 12 Feb 2025 09:09:22 -0800 Subject: [PATCH 1/2] feat(amazonq): initialize flare lsp on project start --- .../amazonq/startup/AmazonQStartupActivity.kt | 2 ++ .../services/amazonq/lsp/AmazonQLspService.kt | 30 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt index f114ae98239..b6b9aa29c9d 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/startup/AmazonQStartupActivity.kt @@ -19,6 +19,7 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService +import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory @@ -52,6 +53,7 @@ class AmazonQStartupActivity : ProjectActivity { CodeWhispererExplorerActionManager.getInstance().setIsFirstRestartAfterQInstall(false) } } + AmazonQLspService.getInstance(project) startLsp(project) if (runOnce.get()) return emitUserState(project) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index 16b9d8810b6..6acde29b9ba 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -15,6 +15,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Key import com.intellij.util.io.await import kotlinx.coroutines.CoroutineScope @@ -71,6 +72,32 @@ internal class LSPProcessListener : ProcessListener { @Service(Service.Level.PROJECT) class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disposable { + private var instance: AmazonQServerInstance? = null + + init { + cs.launch { + // manage lifecycle RAII-like so we can restart at arbitrary time + // and suppress IDE error if server fails to start + try { + instance = AmazonQServerInstance(cs).also { + Disposer.register(this@AmazonQLspService, it) + } + } catch (e: Exception) { + LOG.warn(e) { "Failed to start LSP server" } + } + } + } + + override fun dispose() { + } + + companion object { + private val LOG = getLogger() + fun getInstance(project: Project) = project.service() + } +} + +private class AmazonQServerInstance(cs: CoroutineScope) : Disposable { private val launcher: Launcher private val languageServer: AmazonQLanguageServer @@ -154,7 +181,6 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp } companion object { - private val LOG = getLogger() - fun getInstance(project: Project) = project.service() + private val LOG = getLogger() } } From 9256837f7696bb8c291f9c2561865de9e55301f4 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 12 Feb 2025 12:25:48 -0800 Subject: [PATCH 2/2] passthroguh project --- .../jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt index 6acde29b9ba..d402148ed4e 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt @@ -71,7 +71,7 @@ internal class LSPProcessListener : ProcessListener { } @Service(Service.Level.PROJECT) -class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disposable { +class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable { private var instance: AmazonQServerInstance? = null init { @@ -79,7 +79,7 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp // manage lifecycle RAII-like so we can restart at arbitrary time // and suppress IDE error if server fails to start try { - instance = AmazonQServerInstance(cs).also { + instance = AmazonQServerInstance(project, cs).also { Disposer.register(this@AmazonQLspService, it) } } catch (e: Exception) { @@ -97,7 +97,7 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp } } -private class AmazonQServerInstance(cs: CoroutineScope) : Disposable { +private class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable { private val launcher: Launcher private val languageServer: AmazonQLanguageServer