Skip to content

Merge main into feature/remote-chat-lsp #5736

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
May 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import com.intellij.openapi.project.DumbAwareAction
import com.intellij.util.messages.Topic
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
import software.aws.toolkits.resources.AmazonQBundle
import software.aws.toolkits.resources.message
import java.util.EventListener

class QRefreshPanelAction : DumbAwareAction(AmazonQBundle.message("amazonq.refresh.panel"), null, AllIcons.Actions.Refresh) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ class AmazonQToolWindow private constructor(

val component
get() = chatPanel.component

fun disposeAndRecreate() {
Disposer.dispose(chatPanel)
chatPanel = AmazonQPanel(project, scope)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let { qConn ->
openMeetQPage(project)
}
prepareChatContent(project, qPanel)
preparePanelContent(project, qPanel)

Check warning on line 69 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L69

Added line #L69 was not covered by tests
}
}
)
Expand All @@ -75,7 +75,7 @@
RefreshQChatPanelButtonPressedListener.TOPIC,
object : RefreshQChatPanelButtonPressedListener {
override fun onRefresh() {
prepareChatContent(project, qPanel)
preparePanelContent(project, qPanel)

Check warning on line 78 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L78

Added line #L78 was not covered by tests
}
}
)
Expand All @@ -85,8 +85,7 @@
object : BearerTokenProviderListener {
override fun onChange(providerId: String, newScopes: List<String>?) {
if (ToolkitConnectionManager.getInstance(project).connectionStateForFeature(QConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED) {
AmazonQToolWindow.getInstance(project).disposeAndRecreate()
prepareChatContent(project, qPanel)
preparePanelContent(project, qPanel)

Check warning on line 88 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L88

Added line #L88 was not covered by tests
}
}
}
Expand All @@ -98,13 +97,12 @@
// note we name myProject intentionally ow it will shadow the "project" provided by the IDE
override fun onProfileSelected(myProject: Project, profile: QRegionProfile?) {
if (project.isDisposed) return
AmazonQToolWindow.getInstance(project).disposeAndRecreate()
prepareChatContent(project, qPanel)
preparePanelContent(project, qPanel)

Check warning on line 100 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L100

Added line #L100 was not covered by tests
}
}
)

prepareChatContent(project, qPanel)
preparePanelContent(project, qPanel)

Check warning on line 105 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L105

Added line #L105 was not covered by tests

val content = contentManager.factory.createContent(mainPanel, null, false).also {
it.isCloseable = true
Expand All @@ -114,7 +112,7 @@
contentManager.addContent(content)
}

private fun prepareChatContent(
private fun preparePanelContent(
project: Project,
qPanel: Wrapper,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
import kotlinx.coroutines.runBlocking
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GENERIC_COMMAND
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
Expand All @@ -36,23 +38,19 @@
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
var uiMessage: FlareUiMessage? = null
if (command.verb != "sendToPrompt") {
if (command.verb != SEND_TO_PROMPT) {
val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name)
uiMessage = FlareUiMessage(command = "genericCommand", params = params)
uiMessage = FlareUiMessage(command = GENERIC_COMMAND, params = params)

Check warning on line 43 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt#L43

Added line #L43 was not covered by tests
} else {
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
uiMessage = FlareUiMessage(command = "sendToPrompt", params = params)
uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params)

Check warning on line 46 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt#L46

Added line #L46 was not covered by tests
}
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
}
}
}
}

fun reportMessageClick(command: EditorContextCommand, issue: MutableMap<String, String>, project: Project) {
_messages.tryEmit(CodeScanIssueActionMessage(command, issue, project))
}

// provide singleton access
companion object {
val instance = ActionRegistrar()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,55 @@

package software.aws.toolkits.jetbrains.services.cwc.commands.codescan.actions

import software.aws.toolkits.jetbrains.services.cwc.commands.EditorContextCommand
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.DumbAware
import kotlinx.coroutines.runBlocking
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType

class ExplainCodeIssueAction : CodeScanQActions(EditorContextCommand.ExplainCodeScanIssue)
class ExplainCodeIssueAction : AnAction(), DumbAware {

Check warning on line 20 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L20

Added line #L20 was not covered by tests
override fun actionPerformed(e: AnActionEvent) {
val issueDataKey = DataKey.create<MutableMap<String, String>>("amazonq.codescan.explainissue")

Check warning on line 22 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L22

Added line #L22 was not covered by tests
val issueContext = e.getData(issueDataKey) ?: return

ActionManager.getInstance().getAction("q.openchat").actionPerformed(e)

Check warning on line 25 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L25

Added line #L25 was not covered by tests

ApplicationManager.getApplication().executeOnPooledThread {

Check warning on line 27 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L27

Added line #L27 was not covered by tests
runBlocking {
// https://github.com/aws/aws-toolkit-vscode/blob/master/packages/amazonq/src/lsp/chat/commands.ts#L30
val codeSelection = "\n```\n${issueContext["code"]?.trimIndent()?.trim()}\n```\n"

val prompt = "Explain the issue \n\n " +
"Issue: \"${issueContext["title"]}\" \n" +
"Code: $codeSelection"

Check warning on line 34 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L32-L34

Added lines #L32 - L34 were not covered by tests

val modelPrompt = "Explain the issue ${issueContext["title"]} \n\n " +
"Issue: \"${issueContext["title"]}\" \n" +
"Description: ${issueContext["description"]} \n" +
"Code: $codeSelection and generate the code demonstrating the fix"

Check warning on line 39 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L36-L39

Added lines #L36 - L39 were not covered by tests

val params = SendToPromptParams(
selection = codeSelection,
triggerType = TriggerType.CONTEXT_MENU,
prompt = ChatPrompt(
prompt = prompt,
escapedPrompt = modelPrompt,
command = null

Check warning on line 47 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L41-L47

Added lines #L41 - L47 were not covered by tests
),
autoSubmit = true

Check warning on line 49 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L49

Added line #L49 was not covered by tests
)

val uiMessage = FlareUiMessage(SEND_TO_PROMPT, params)
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
}
}
}

Check warning on line 56 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt#L52-L56

Added lines #L52 - L56 were not covered by tests
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
val fileName = getFileName(psiFile)
val programmingLanguage = psiFile.programmingLanguage()
val fileRelativePath = getRelativePathToContentRoot(editor)
return FileContextInfo(caretContext, fileName, programmingLanguage, fileRelativePath)
val fileUri = getFileUri(psiFile)
return FileContextInfo(caretContext, fileName, programmingLanguage, fileRelativePath, fileUri)

Check warning on line 36 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorUtil.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorUtil.kt#L35-L36

Added lines #L35 - L36 were not covered by tests
}

fun extractCaretContext(editor: Editor): CaretContext {
Expand Down Expand Up @@ -73,6 +74,11 @@
private fun getFileName(psiFile: PsiFile): String =
psiFile.name.substring(0, psiFile.name.length.coerceAtMost(CodeWhispererConstants.FILENAME_CHARS_LIMIT))

private fun getFileUri(psiFile: PsiFile): String? =
psiFile.virtualFile?.takeIf { it.isValid }?.let { vFile ->
vFile.url.substring(0, vFile.url.length.coerceAtMost(CodeWhispererConstants.FILENAME_CHARS_LIMIT))
}

Check warning on line 80 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorUtil.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorUtil.kt#L79-L80

Added lines #L79 - L80 were not covered by tests

fun getRelativePathToContentRoot(editor: Editor): String? =
editor.project?.let { project ->
FileDocumentManager.getInstance().getFile(editor.document)?.let { vFile ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
val filename: String,
val programmingLanguage: CodeWhispererProgrammingLanguage,
val fileRelativePath: String?,
val fileUri: String?,

Check warning on line 50 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/model/CodeWhispererModel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/model/CodeWhispererModel.kt#L50

Added line #L50 was not covered by tests
)

data class RecommendationContext(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ class CodeWhispererServiceTest : CodeWhispererTestBase() {
CaretContext(leftFileContext = "", rightFileContext = "public class Main {}", leftContextOnCurrentLine = ""),
"main.java",
CodeWhispererJava.INSTANCE,
"main.java"
"main.java",
file.virtualFile.url
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ fun aFileContextInfo(language: CodeWhispererProgrammingLanguage? = null): FileCo
CodeWhispererJava.INSTANCE
).random()

return FileContextInfo(caretContextInfo, fileName, programmingLanguage, fileRelativePath)
return FileContextInfo(caretContextInfo, fileName, programmingLanguage, fileRelativePath, null)
}

fun aTriggerType(): CodewhispererTriggerType =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { ChatItem, MynahIcons } from '@aws/mynah-ui-chat'
export const disclaimerAcknowledgeButtonId = 'amazonq-disclaimer-acknowledge-button-id'
export const disclaimerCard: Partial<ChatItem> = {
messageId: 'amazonq-disclaimer-card',
body: 'Amazon Q Developer uses generative AI. You may need to verify responses. See the [AWS Responsible AI Policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/). Amazon Q Developer processes data across all US Regions. See [here](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/cross-region-inference.html) for more info. Amazon Q may retain chats to provide and maintain the service.',
body: 'Amazon Q Developer uses generative AI. You may need to verify responses. See the [AWS Responsible AI Policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/). Amazon Q may retain chats to provide and maintain the service. For information on the AWS Regions where Amazon Q may perform inference, see [the documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/cross-region-processing.html#cross-region-inference).',
buttons: [
{
text: 'Acknowledge',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,16 @@
import com.intellij.util.net.JdkProxyProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.future.asCompletableFuture
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
Expand All @@ -52,6 +56,7 @@
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
import org.eclipse.lsp4j.launch.LSPLauncher
import org.slf4j.event.Level
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.core.utils.info
import software.aws.toolkits.core.utils.warn
Expand Down Expand Up @@ -128,6 +133,9 @@

val encryptionManager
get() = instance.getCompleted().encryptionManager
private val heartbeatJob: Job
private val restartTimestamps = ArrayDeque<Long>()
private val restartMutex = Mutex() // Separate mutex for restart tracking

Check warning on line 138 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L137 - L138 were not covered by tests

val rawEndpoint
get() = instance.getCompleted().rawEndpoint
Expand Down Expand Up @@ -166,9 +174,50 @@

init {
instance = start()

// Initialize heartbeat job
heartbeatJob = cs.launch {

Check warning on line 179 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L179 was not covered by tests
while (isActive) {
delay(5.seconds) // Check every 5 seconds
val shouldLoop = checkConnectionStatus()

Check warning on line 182 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L181 - L182 were not covered by tests
if (!shouldLoop) {
break

Check warning on line 184 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L184 was not covered by tests
}
}
}
}

Check warning on line 188 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L187 - L188 were not covered by tests

private suspend fun checkConnectionStatus(): Boolean {
try {
val currentInstance = mutex.withLock { instance }.await()

Check warning on line 192 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L190 - L192 were not covered by tests

// Check if the launcher's Future (startListening) is done
// If it's done, that means the connection has been terminated
if (currentInstance.launcherFuture.isDone) {
LOG.debug { "LSP server connection terminated, checking restart limits" }
val canRestart = checkForRemainingRestartAttempts()

Check warning on line 198 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L197 - L198 were not covered by tests
if (!canRestart) {
return false

Check warning on line 200 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L200 was not covered by tests
}
LOG.debug { "Restarting LSP server" }
restart()

Check warning on line 203 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L202 - L203 were not covered by tests
} else {
LOG.debug { "LSP server is currently running" }

Check warning on line 205 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L205 was not covered by tests
}
} catch (e: Exception) {
LOG.debug(e) { "Connection status check failed, checking restart limits" }
val canRestart = checkForRemainingRestartAttempts()

Check warning on line 209 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L207 - L209 were not covered by tests
if (!canRestart) {
return false

Check warning on line 211 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L211 was not covered by tests
}
LOG.debug { "Restarting LSP server" }
restart()

Check warning on line 214 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L213 - L214 were not covered by tests
}
return true

Check warning on line 216 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L216 was not covered by tests
}

override fun dispose() {
heartbeatJob.cancel()

Check warning on line 220 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L220 was not covered by tests
}

suspend fun restart() = mutex.withLock {
Expand All @@ -195,6 +244,25 @@
instance = start()
}

private suspend fun checkForRemainingRestartAttempts(): Boolean = restartMutex.withLock {
val currentTime = System.currentTimeMillis()

Check warning on line 248 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L247 - L248 were not covered by tests

while (restartTimestamps.isNotEmpty() &&
currentTime - restartTimestamps.first() > RESTART_WINDOW_MS
) {
restartTimestamps.removeFirst()

Check warning on line 253 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L253 was not covered by tests
}

if (restartTimestamps.size < MAX_RESTARTS) {
restartTimestamps.addLast(currentTime)
return true

Check warning on line 258 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L257 - L258 were not covered by tests
}

LOG.info { "Rate limit reached for LSP server restarts. Stop attempting to restart." }

Check warning on line 261 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L261 was not covered by tests

return false

Check warning on line 263 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L263 was not covered by tests
}

suspend fun<T> execute(runnable: suspend AmazonQLspService.(AmazonQLanguageServer) -> T): T {
val lsp = withTimeout(10.seconds) {
val holder = mutex.withLock { instance }.await()
Expand All @@ -212,6 +280,8 @@

companion object {
private val LOG = getLogger<AmazonQLspService>()
private const val MAX_RESTARTS = 5
private const val RESTART_WINDOW_MS = 3 * 60 * 1000
fun getInstance(project: Project) = project.service<AmazonQLspService>()

@Deprecated("Easy to accidentally freeze EDT")
Expand Down Expand Up @@ -241,7 +311,7 @@
get() = launcher.remoteEndpoint

@Suppress("ForbiddenVoid")
private val launcherFuture: Future<Void>
val launcherFuture: Future<Void>

Check warning on line 314 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

View check run for this annotation

Codecov / codecov/patch

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

Added line #L314 was not covered by tests
private val launcherHandler: KillableProcessHandler
val initializeResult: Deferred<InitializeResult>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.intellij.openapi.util.text.StringUtil
import com.intellij.util.io.DigestUtil
import com.intellij.util.system.CpuArch
import org.apache.commons.io.FileUtils
import software.aws.toolkits.core.utils.ZIP_PROPERTY_POSIX
import software.aws.toolkits.core.utils.createParentDirectories
import software.aws.toolkits.core.utils.exists
Expand Down Expand Up @@ -68,7 +69,8 @@
fun moveFilesFromSourceToDestination(sourceDir: Path, targetDir: Path) {
try {
Files.createDirectories(targetDir.parent)
Files.move(sourceDir, targetDir, StandardCopyOption.REPLACE_EXISTING)
// NIO move does not work when copying across mount points (i.e. /tmp is on tmpfs)
FileUtils.moveDirectory(sourceDir.toFile(), targetDir.toFile())

Check warning on line 73 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/LspUtils.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/LspUtils.kt#L73

Added line #L73 was not covered by tests
} catch (e: Exception) {
throw IllegalStateException("Failed to move files from $sourceDir to $targetDir", e)
}
Expand Down
Loading
Loading