@@ -19,14 +19,22 @@ import com.intellij.openapi.util.Key
1919import com.intellij.util.io.await
2020import kotlinx.coroutines.CoroutineScope
2121import kotlinx.coroutines.launch
22+ import org.eclipse.lsp4j.ClientCapabilities
23+ import org.eclipse.lsp4j.ClientInfo
24+ import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities
2225import org.eclipse.lsp4j.InitializeParams
2326import org.eclipse.lsp4j.InitializedParams
27+ import org.eclipse.lsp4j.SynchronizationCapabilities
28+ import org.eclipse.lsp4j.TextDocumentClientCapabilities
29+ import org.eclipse.lsp4j.WorkspaceClientCapabilities
30+ import org.eclipse.lsp4j.WorkspaceFolder
2431import org.eclipse.lsp4j.jsonrpc.Launcher
2532import org.eclipse.lsp4j.launch.LSPLauncher
2633import org.slf4j.event.Level
2734import software.aws.toolkits.core.utils.getLogger
2835import software.aws.toolkits.core.utils.warn
2936import software.aws.toolkits.jetbrains.isDeveloperMode
37+ import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
3038import java.io.IOException
3139import java.io.OutputStreamWriter
3240import java.io.PipedInputStream
@@ -80,6 +88,69 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp
8088 private val launcherFuture: Future <Void >
8189 private val launcherHandler: KillableProcessHandler
8290
91+ private fun createInitializeParams (): InitializeParams {
92+ return InitializeParams ().apply {
93+ processId = ProcessHandle .current().pid().toInt()
94+ capabilities = createClientCapabilities()
95+ clientInfo = createClientInfo()
96+ workspaceFolders = createWorkspaceFolders()
97+ initializationOptions = getExtendedClientMetadata()
98+ }
99+ }
100+
101+ private fun createClientCapabilities (): ClientCapabilities {
102+ return ClientCapabilities ().apply {
103+ textDocument = TextDocumentClientCapabilities ().apply {
104+ // For didSaveTextDocument, other textDocument/ messages always mandatory
105+ synchronization = SynchronizationCapabilities ().apply {
106+ didSave = true
107+ }
108+ }
109+
110+ workspace = WorkspaceClientCapabilities ().apply {
111+ applyEdit = false
112+
113+ // For workspace folder changes
114+ workspaceFolders = true
115+
116+ // For file operations (create, delete)
117+ fileOperations = FileOperationsWorkspaceCapabilities ().apply {
118+ didCreate = true
119+ didDelete = true
120+ }
121+ }
122+ }
123+ }
124+
125+ private fun createWorkspaceFolders (): List <WorkspaceFolder > {
126+ return emptyList()
127+ }
128+
129+ private fun createClientInfo (): ClientInfo {
130+ val metadata = ClientMetadata .getDefault()
131+ return ClientInfo ().apply {
132+ name = metadata.awsProduct.toString()
133+ version = metadata.awsVersion
134+ }
135+ }
136+
137+ private fun getExtendedClientMetadata (): Map <String , Any > {
138+ val metadata = ClientMetadata .getDefault()
139+ return mapOf (
140+ " aws" to mapOf (
141+ " clientInfo" to mapOf (
142+ " extension" to mapOf (
143+ " name" to metadata.awsProduct.toString(),
144+ " version" to metadata.awsVersion
145+ ),
146+ " clientId" to metadata.clientId,
147+ " version" to metadata.parentProductVersion,
148+ " name" to metadata.parentProduct
149+ )
150+ )
151+ )
152+ }
153+
83154 init {
84155 val cmd = GeneralCommandLine (" amazon-q-lsp" )
85156
@@ -116,18 +187,7 @@ class AmazonQLspService(project: Project, private val cs: CoroutineScope) : Disp
116187 launcherFuture = launcher.startListening()
117188
118189 cs.launch {
119- val initializeResult = languageServer.initialize(
120- InitializeParams ().apply {
121- // does this work on windows
122- processId = ProcessHandle .current().pid().toInt()
123- // capabilities
124- // client info
125- // trace?
126- // workspace folders?
127- // anything else we need?
128- }
129- // probably need a timeout
130- ).await()
190+ val initializeResult = languageServer.initialize(createInitializeParams()).await()
131191
132192 // then if this succeeds then we can allow the client to send requests
133193 languageServer.initialized(InitializedParams ())
0 commit comments