From 1733ef831d4acafc351d4a829fdc53c823eaa13c Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Tue, 11 Feb 2025 17:34:18 -0800 Subject: [PATCH 01/10] add InitializeParams --- .../services/amazonq/lsp/AmazonQLspService.kt | 84 ++++++++++++++++--- 1 file changed, 72 insertions(+), 12 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 16b9d8810b6..3eb238417e4 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 @@ -19,14 +19,22 @@ import com.intellij.openapi.util.Key import com.intellij.util.io.await import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.eclipse.lsp4j.ClientCapabilities +import org.eclipse.lsp4j.ClientInfo +import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities import org.eclipse.lsp4j.InitializeParams import org.eclipse.lsp4j.InitializedParams +import org.eclipse.lsp4j.SynchronizationCapabilities +import org.eclipse.lsp4j.TextDocumentClientCapabilities +import org.eclipse.lsp4j.WorkspaceClientCapabilities +import org.eclipse.lsp4j.WorkspaceFolder import org.eclipse.lsp4j.jsonrpc.Launcher import org.eclipse.lsp4j.launch.LSPLauncher import org.slf4j.event.Level import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn import software.aws.toolkits.jetbrains.isDeveloperMode +import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata import java.io.IOException import java.io.OutputStreamWriter import java.io.PipedInputStream @@ -80,6 +88,69 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp private val launcherFuture: Future private val launcherHandler: KillableProcessHandler + private fun createInitializeParams(): InitializeParams { + return InitializeParams().apply { + processId = ProcessHandle.current().pid().toInt() + capabilities = createClientCapabilities() + clientInfo = createClientInfo() + workspaceFolders = createWorkspaceFolders() + initializationOptions = getExtendedClientMetadata() + } + } + + private fun createClientCapabilities(): ClientCapabilities { + return ClientCapabilities().apply { + textDocument = TextDocumentClientCapabilities().apply { + // For didSaveTextDocument, other textDocument/ messages always mandatory + synchronization = SynchronizationCapabilities().apply { + didSave = true + } + } + + workspace = WorkspaceClientCapabilities().apply { + applyEdit = false + + // For workspace folder changes + workspaceFolders = true + + // For file operations (create, delete) + fileOperations = FileOperationsWorkspaceCapabilities().apply { + didCreate = true + didDelete = true + } + } + } + } + + private fun createWorkspaceFolders(): List { + return emptyList() + } + + private fun createClientInfo(): ClientInfo { + val metadata = ClientMetadata.getDefault() + return ClientInfo().apply { + name = metadata.awsProduct.toString() + version = metadata.awsVersion + } + } + + private fun getExtendedClientMetadata(): Map { + val metadata = ClientMetadata.getDefault() + return mapOf( + "aws" to mapOf( + "clientInfo" to mapOf( + "extension" to mapOf( + "name" to metadata.awsProduct.toString(), + "version" to metadata.awsVersion + ), + "clientId" to metadata.clientId, + "version" to metadata.parentProductVersion, + "name" to metadata.parentProduct + ) + ) + ) + } + init { val cmd = GeneralCommandLine("amazon-q-lsp") @@ -116,18 +187,7 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp launcherFuture = launcher.startListening() cs.launch { - val initializeResult = languageServer.initialize( - InitializeParams().apply { - // does this work on windows - processId = ProcessHandle.current().pid().toInt() - // capabilities - // client info - // trace? - // workspace folders? - // anything else we need? - } - // probably need a timeout - ).await() + val initializeResult = languageServer.initialize(createInitializeParams()).await() // then if this succeeds then we can allow the client to send requests if (initializeResult == null) { From 139af9442bd8d37f841677969edd5cea991fddf3 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Tue, 11 Feb 2025 17:48:01 -0800 Subject: [PATCH 02/10] workspace folders --- .../services/amazonq/lsp/AmazonQLspService.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 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 3eb238417e4..d836b99cd89 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 @@ -41,6 +41,7 @@ import java.io.PipedInputStream import java.io.PipedOutputStream import java.io.PrintWriter import java.io.StringWriter +import java.net.URI import java.nio.charset.StandardCharsets import java.util.concurrent.Future @@ -78,7 +79,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 val launcher: Launcher private val languageServer: AmazonQLanguageServer @@ -123,7 +124,12 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp } private fun createWorkspaceFolders(): List { - return emptyList() + return project.basePath?.let { basePath -> + listOf(WorkspaceFolder( + URI("file://$basePath").toString(), + project.name + )) + } ?: emptyList() } private fun createClientInfo(): ClientInfo { From 16702124b7a44145d0773a026988ef65061729c0 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Tue, 11 Feb 2025 17:48:27 -0800 Subject: [PATCH 03/10] lint --- .../services/amazonq/lsp/AmazonQLspService.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 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 d836b99cd89..8696265fe7b 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 @@ -89,16 +89,6 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS private val launcherFuture: Future private val launcherHandler: KillableProcessHandler - private fun createInitializeParams(): InitializeParams { - return InitializeParams().apply { - processId = ProcessHandle.current().pid().toInt() - capabilities = createClientCapabilities() - clientInfo = createClientInfo() - workspaceFolders = createWorkspaceFolders() - initializationOptions = getExtendedClientMetadata() - } - } - private fun createClientCapabilities(): ClientCapabilities { return ClientCapabilities().apply { textDocument = TextDocumentClientCapabilities().apply { @@ -125,10 +115,12 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS private fun createWorkspaceFolders(): List { return project.basePath?.let { basePath -> - listOf(WorkspaceFolder( - URI("file://$basePath").toString(), - project.name - )) + listOf( + WorkspaceFolder( + URI("file://$basePath").toString(), + project.name + ) + ) } ?: emptyList() } @@ -157,6 +149,16 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS ) } + private fun createInitializeParams(): InitializeParams { + return InitializeParams().apply { + processId = ProcessHandle.current().pid().toInt() + capabilities = createClientCapabilities() + clientInfo = createClientInfo() + workspaceFolders = createWorkspaceFolders() + initializationOptions = getExtendedClientMetadata() + } + } + init { val cmd = GeneralCommandLine("amazon-q-lsp") From add8d412519ad9c6435b5076cb883c47066f6643 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 10:39:04 -0800 Subject: [PATCH 04/10] add timeout to initialize() --- .../services/amazonq/lsp/AmazonQLspService.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 8696265fe7b..ae4e1fb4a67 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 @@ -18,7 +18,9 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.Key import com.intellij.util.io.await import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.launch +import kotlinx.coroutines.time.withTimeout import org.eclipse.lsp4j.ClientCapabilities import org.eclipse.lsp4j.ClientInfo import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities @@ -43,6 +45,7 @@ import java.io.PrintWriter import java.io.StringWriter import java.net.URI import java.nio.charset.StandardCharsets +import java.time.Duration import java.util.concurrent.Future // https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/LSPProcessListener.java @@ -195,7 +198,14 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS launcherFuture = launcher.startListening() cs.launch { - val initializeResult = languageServer.initialize(createInitializeParams()).await() + val initializeResult = try { + withTimeout(Duration.ofSeconds(30)) { + languageServer.initialize(createInitializeParams()).await() + } + } catch (e: TimeoutCancellationException) { + LOG.warn { "LSP initialization timed out" } + null + } // then if this succeeds then we can allow the client to send requests if (initializeResult == null) { From ee0b589caeb0943579e2662991a5151f39ed0a22 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 11:06:39 -0800 Subject: [PATCH 05/10] data class for ExtendedClientMetadata instead of freeform map --- .../services/amazonq/lsp/AmazonQLspService.kt | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 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 ae4e1fb4a67..2cdc3e93b49 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 @@ -21,6 +21,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.launch import kotlinx.coroutines.time.withTimeout +import kotlinx.serialization.Serializable import org.eclipse.lsp4j.ClientCapabilities import org.eclipse.lsp4j.ClientInfo import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities @@ -48,6 +49,47 @@ import java.nio.charset.StandardCharsets import java.time.Duration import java.util.concurrent.Future +@Serializable +data class ExtendedClientMetadata( + val aws: AwsMetadata, +) + +@Serializable +data class AwsMetadata( + val clientInfo: ClientInfoMetadata, +) + +@Serializable +data class ClientInfoMetadata( + val extension: ExtensionMetadata, + val clientId: String, + val version: String, + val name: String, +) + +@Serializable +data class ExtensionMetadata( + val name: String, + val version: String, +) + +private fun createExtendedClientMetadata(): ExtendedClientMetadata { + val metadata = ClientMetadata.getDefault() + return ExtendedClientMetadata( + aws = AwsMetadata( + clientInfo = ClientInfoMetadata( + extension = ExtensionMetadata( + name = metadata.awsProduct.toString(), + version = metadata.awsVersion + ), + clientId = metadata.clientId, + version = metadata.parentProductVersion, + name = metadata.parentProduct + ) + ) + ) +} + // https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/LSPProcessListener.java // JB impl and redhat both use a wrapper to handle input buffering issue internal class LSPProcessListener : ProcessListener { @@ -135,30 +177,13 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS } } - private fun getExtendedClientMetadata(): Map { - val metadata = ClientMetadata.getDefault() - return mapOf( - "aws" to mapOf( - "clientInfo" to mapOf( - "extension" to mapOf( - "name" to metadata.awsProduct.toString(), - "version" to metadata.awsVersion - ), - "clientId" to metadata.clientId, - "version" to metadata.parentProductVersion, - "name" to metadata.parentProduct - ) - ) - ) - } - private fun createInitializeParams(): InitializeParams { return InitializeParams().apply { processId = ProcessHandle.current().pid().toInt() capabilities = createClientCapabilities() clientInfo = createClientInfo() workspaceFolders = createWorkspaceFolders() - initializationOptions = getExtendedClientMetadata() + initializationOptions = createExtendedClientMetadata() } } From 081953569ba2ecc68d8a871c1fc7e371906e958f Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 11:13:31 -0800 Subject: [PATCH 06/10] comment --- .../toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 1 + 1 file changed, 1 insertion(+) 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 2cdc3e93b49..67c5565f34a 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 @@ -158,6 +158,7 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS } } + // needs case handling when project's base path is null: default projects/unit tests private fun createWorkspaceFolders(): List { return project.basePath?.let { basePath -> listOf( From 0d0494e321abdfa8cfa9c2c379467d2914b00d63 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 11:17:17 -0800 Subject: [PATCH 07/10] comment --- .../jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 67c5565f34a..3c10b031867 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 @@ -167,7 +167,7 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS project.name ) ) - } ?: emptyList() + } ?: emptyList() // no folders to report or workspace not folder based } private fun createClientInfo(): ClientInfo { From 2e3ad80adeb87bc0f7c04ebefca54cf9b3778f25 Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 13:40:54 -0800 Subject: [PATCH 08/10] break out metadata into model --- .../services/amazonq/lsp/AmazonQLspService.kt | 44 +------------------ .../lsp/model/ExtendedClientMetadata.kt | 43 ++++++++++++++++++ 2 files changed, 44 insertions(+), 43 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt 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 3c10b031867..6c2aa44e318 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 @@ -21,7 +21,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.launch import kotlinx.coroutines.time.withTimeout -import kotlinx.serialization.Serializable import org.eclipse.lsp4j.ClientCapabilities import org.eclipse.lsp4j.ClientInfo import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities @@ -37,6 +36,7 @@ import org.slf4j.event.Level import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn import software.aws.toolkits.jetbrains.isDeveloperMode +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata import java.io.IOException import java.io.OutputStreamWriter @@ -48,48 +48,6 @@ import java.net.URI import java.nio.charset.StandardCharsets import java.time.Duration import java.util.concurrent.Future - -@Serializable -data class ExtendedClientMetadata( - val aws: AwsMetadata, -) - -@Serializable -data class AwsMetadata( - val clientInfo: ClientInfoMetadata, -) - -@Serializable -data class ClientInfoMetadata( - val extension: ExtensionMetadata, - val clientId: String, - val version: String, - val name: String, -) - -@Serializable -data class ExtensionMetadata( - val name: String, - val version: String, -) - -private fun createExtendedClientMetadata(): ExtendedClientMetadata { - val metadata = ClientMetadata.getDefault() - return ExtendedClientMetadata( - aws = AwsMetadata( - clientInfo = ClientInfoMetadata( - extension = ExtensionMetadata( - name = metadata.awsProduct.toString(), - version = metadata.awsVersion - ), - clientId = metadata.clientId, - version = metadata.parentProductVersion, - name = metadata.parentProduct - ) - ) - ) -} - // https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/LSPProcessListener.java // JB impl and redhat both use a wrapper to handle input buffering issue internal class LSPProcessListener : ProcessListener { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt new file mode 100644 index 00000000000..6672a70408f --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/ExtendedClientMetadata.kt @@ -0,0 +1,43 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.model + +import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata + +data class ExtendedClientMetadata( + val aws: AwsMetadata, +) + +data class AwsMetadata( + val clientInfo: ClientInfoMetadata, +) + +data class ClientInfoMetadata( + val extension: ExtensionMetadata, + val clientId: String, + val version: String, + val name: String, +) + +data class ExtensionMetadata( + val name: String, + val version: String, +) + +fun createExtendedClientMetadata(): ExtendedClientMetadata { + val metadata = ClientMetadata.getDefault() + return ExtendedClientMetadata( + aws = AwsMetadata( + clientInfo = ClientInfoMetadata( + extension = ExtensionMetadata( + name = metadata.awsProduct.toString(), + version = metadata.awsVersion + ), + clientId = metadata.clientId, + version = metadata.parentProductVersion, + name = metadata.parentProduct + ) + ) + ) +} From 30d7c9cd78d09b6822c2aafa0afacd3eade990fe Mon Sep 17 00:00:00 2001 From: samgst-amazon Date: Wed, 12 Feb 2025 15:51:34 -0800 Subject: [PATCH 09/10] detekt --- .../services/amazonq/lsp/AmazonQLspService.kt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 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 6c2aa44e318..59c17bfabd1 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 @@ -92,8 +92,8 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS private val launcherFuture: Future private val launcherHandler: KillableProcessHandler - private fun createClientCapabilities(): ClientCapabilities { - return ClientCapabilities().apply { + private fun createClientCapabilities(): ClientCapabilities = + ClientCapabilities().apply { textDocument = TextDocumentClientCapabilities().apply { // For didSaveTextDocument, other textDocument/ messages always mandatory synchronization = SynchronizationCapabilities().apply { @@ -114,11 +114,10 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS } } } - } // needs case handling when project's base path is null: default projects/unit tests - private fun createWorkspaceFolders(): List { - return project.basePath?.let { basePath -> + private fun createWorkspaceFolders(): List = + project.basePath?.let { basePath -> listOf( WorkspaceFolder( URI("file://$basePath").toString(), @@ -126,7 +125,6 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS ) ) } ?: emptyList() // no folders to report or workspace not folder based - } private fun createClientInfo(): ClientInfo { val metadata = ClientMetadata.getDefault() @@ -136,15 +134,14 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS } } - private fun createInitializeParams(): InitializeParams { - return InitializeParams().apply { + private fun createInitializeParams(): InitializeParams = + InitializeParams().apply { processId = ProcessHandle.current().pid().toInt() capabilities = createClientCapabilities() clientInfo = createClientInfo() workspaceFolders = createWorkspaceFolders() initializationOptions = createExtendedClientMetadata() } - } init { val cmd = GeneralCommandLine("amazon-q-lsp") From ec614b897e337988e6d7a0cc8ebc17d922293a1b Mon Sep 17 00:00:00 2001 From: Richard Li <742829+rli@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:16:45 -0800 Subject: [PATCH 10/10] detekt --- .../jetbrains/services/amazonq/lsp/AmazonQLspService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 59c17bfabd1..0181e70591b 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 @@ -124,7 +124,7 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS project.name ) ) - } ?: emptyList() // no folders to report or workspace not folder based + }.orEmpty() // no folders to report or workspace not folder based private fun createClientInfo(): ClientInfo { val metadata = ClientMetadata.getDefault()