Skip to content

Commit 7ca0441

Browse files
committed
wip
1 parent b4992ff commit 7ca0441

File tree

3 files changed

+52
-12
lines changed
  • plugins/amazonq
    • chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview
    • codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer
    • shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp

3 files changed

+52
-12
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class BrowserConnector(
112112
private val themeBrowserAdapter: ThemeBrowserAdapter = ThemeBrowserAdapter(),
113113
private val project: Project,
114114
) {
115-
var uiReady = CompletableDeferred<Boolean>()
115+
val uiReady = CompletableDeferred<Boolean>()
116116
private val chatCommunicationManager = ChatCommunicationManager.getInstance(project)
117117
private val chatAsyncResultManager = ChatAsyncResultManager.getInstance(project)
118118

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,19 @@ import com.intellij.testFramework.replaceService
1313
import com.intellij.testFramework.runInEdtAndWait
1414
import io.mockk.every
1515
import io.mockk.mockk
16+
import kotlinx.coroutines.CompletableDeferred
17+
import kotlinx.coroutines.Deferred
1618
import kotlinx.coroutines.Job
1719
import kotlinx.coroutines.delay
20+
import kotlinx.coroutines.flow.first
1821
import kotlinx.coroutines.test.runTest
1922
import kotlinx.coroutines.yield
2023
import org.assertj.core.api.Assertions.assertThat
24+
import org.eclipse.lsp4j.jsonrpc.Launcher
25+
import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint
2126
import org.junit.After
2227
import org.junit.Before
28+
import org.junit.BeforeClass
2329
import org.junit.Rule
2430
import org.mockito.kotlin.any
2531
import org.mockito.kotlin.argumentCaptor
@@ -38,6 +44,9 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
3844
import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
3945
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
4046
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
47+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQServerInstanceFacade
48+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
49+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
4150
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
4251
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.WorkspaceInfo
4352
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionListWithReferences
@@ -69,6 +78,7 @@ import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
6978
import software.aws.toolkits.jetbrains.utils.rules.PythonCodeInsightTestFixtureRule
7079
import software.aws.toolkits.resources.message
7180
import java.util.concurrent.CompletableFuture
81+
import java.util.concurrent.Future
7282
import java.util.concurrent.atomic.AtomicReference
7383

7484
// TODO: restructure testbase, too bulky and hard to debug
@@ -100,8 +110,30 @@ open class CodeWhispererTestBase {
100110

101111
@Before
102112
open fun setUp() {
103-
mockLspService = spy(AmazonQLspService.getInstance(projectRule.project))
104113
mockLanguageServer = mockk()
114+
mockLspService = spy(object : AmazonQLspService(projectRule.project, mockk()) {
115+
override fun start() = CompletableDeferred(object : AmazonQServerInstanceFacade {
116+
override val launcher: Launcher<AmazonQLanguageServer>
117+
get() = TODO("Not yet implemented")
118+
119+
override val launcherFuture: Future<Void>
120+
get() = TODO("Not yet implemented")
121+
122+
override val initializeResult: Deferred<AwsExtendedInitializeResult>
123+
get() = TODO("Not yet implemented")
124+
125+
override val encryptionManager: JwtEncryptionManager
126+
get() = TODO("Not yet implemented")
127+
128+
override val languageServer: AmazonQLanguageServer
129+
get() = mockLanguageServer
130+
131+
override val rawEndpoint: RemoteEndpoint
132+
get() = TODO("Not yet implemented")
133+
134+
override fun dispose() {}
135+
})
136+
})
105137

106138
// Mock the service methods on Project
107139
projectRule.project.replaceService(AmazonQLspService::class.java, mockLspService, disposableRule.disposable)

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint
6161
import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod
6262
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
6363
import org.eclipse.lsp4j.launch.LSPLauncher
64+
import org.jetbrains.annotations.VisibleForTesting
6465
import org.slf4j.event.Level
6566
import software.aws.toolkits.core.utils.debug
6667
import software.aws.toolkits.core.utils.getLogger
@@ -134,11 +135,11 @@ internal class LSPProcessListener : ProcessListener {
134135
}
135136

136137
@Service(Service.Level.PROJECT)
137-
class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable {
138+
open class AmazonQLspService(private val project: Project, private val cs: CoroutineScope) : Disposable {
138139
private val _flowInstance = MutableSharedFlow<AmazonQServerInstance>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
139140
val instanceFlow = _flowInstance.asSharedFlow().map { it.languageServer }
140141

141-
private var instance: Deferred<AmazonQServerInstance>
142+
private var instance: Deferred<AmazonQServerInstanceFacade>
142143
val capabilities
143144
get() = instance.getCompleted().initializeResult.getCompleted().capabilities
144145

@@ -154,7 +155,8 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS
154155
// dont allow lsp commands if server is restarting
155156
private val mutex = Mutex(false)
156157

157-
private fun start() = cs.async {
158+
@VisibleForTesting
159+
protected open fun start(): Deferred<AmazonQServerInstanceFacade> = cs.async {
158160
// manage lifecycle RAII-like so we can restart at arbitrary time
159161
// and suppress IDE error if server fails to start
160162
var attempts = 0
@@ -331,21 +333,27 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS
331333
}
332334
}
333335

334-
private class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable {
335-
val encryptionManager = JwtEncryptionManager()
336-
337-
private val launcher: Launcher<AmazonQLanguageServer>
336+
interface AmazonQServerInstanceFacade : Disposable {
337+
val launcher: Launcher<AmazonQLanguageServer>
338+
val launcherFuture: Future<Void>
339+
val initializeResult: Deferred<AwsExtendedInitializeResult>
340+
val encryptionManager: JwtEncryptionManager
338341

339342
val languageServer: AmazonQLanguageServer
340343
get() = launcher.remoteProxy
341344

342345
val rawEndpoint: RemoteEndpoint
343346
get() = launcher.remoteEndpoint
347+
}
348+
349+
private class AmazonQServerInstance(private val project: Project, private val cs: CoroutineScope) : Disposable, AmazonQServerInstanceFacade {
350+
override val encryptionManager = JwtEncryptionManager()
351+
override val launcher: Launcher<AmazonQLanguageServer>
344352

345353
@Suppress("ForbiddenVoid")
346-
val launcherFuture: Future<Void>
354+
override val launcherFuture: Future<Void>
347355
private val launcherHandler: KillableProcessHandler
348-
val initializeResult: Deferred<InitializeResult>
356+
override val initializeResult: Deferred<AwsExtendedInitializeResult>
349357

350358
private fun createClientCapabilities(): ClientCapabilities =
351359
ClientCapabilities().apply {
@@ -546,7 +554,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs
546554
}
547555
languageServer.initialized(InitializedParams())
548556

549-
initializeResult
557+
initializeResult as AwsExtendedInitializeResult
550558
}
551559

552560
// invokeOnCompletion results in weird lock/timeout error

0 commit comments

Comments
 (0)