Skip to content

Commit 10ddb2d

Browse files
committed
implement syncModuleDependencies logic
1 parent f5f4c87 commit 10ddb2d

File tree

2 files changed

+117
-9
lines changed

2 files changed

+117
-9
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import software.aws.toolkits.core.utils.info
4444
import software.aws.toolkits.core.utils.warn
4545
import software.aws.toolkits.jetbrains.isDeveloperMode
4646
import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCredentialsService
47+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.DefaultModuleDependenciesService
4748
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
4849
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
4950
import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDocumentServiceHandler
@@ -143,7 +144,7 @@ class AmazonQLspService(private val project: Project, private val cs: CoroutineS
143144

144145
try {
145146
val i = it.await()
146-
if (i.initializeResult.isActive) {
147+
if (i.initializer.isActive) {
147148
// not initialized
148149
return
149150
}
@@ -192,7 +193,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs
192193
@Suppress("ForbiddenVoid")
193194
private val launcherFuture: Future<Void>
194195
private val launcherHandler: KillableProcessHandler
195-
val initializeResult: Deferred<InitializeResult>
196+
val initializer: Job
196197

197198
private fun createClientCapabilities(): ClientCapabilities =
198199
ClientCapabilities().apply {
@@ -301,6 +302,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs
301302
}
302303

303304
DefaultAuthCredentialsService(project, encryptionManager, this)
305+
DefaultModuleDependenciesService(project, this)
304306
TextDocumentServiceHandler(project, this)
305307
WorkspaceServiceHandler(project, this)
306308
}

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

Lines changed: 113 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,129 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies
55

6+
import com.intellij.openapi.Disposable
67
import com.intellij.openapi.project.Project
8+
import com.intellij.openapi.module.Module
9+
import com.intellij.openapi.roots.ModuleRootEvent
10+
import com.intellij.openapi.roots.ModuleRootListener
11+
import com.intellij.openapi.module.ModuleManager
12+
import com.intellij.openapi.projectRoots.JavaSdkType
13+
import com.intellij.openapi.roots.ModuleRootManager
14+
import com.intellij.openapi.roots.OrderRootType
15+
import com.intellij.openapi.vfs.VfsUtil
16+
import com.jetbrains.python.packaging.management.PythonPackageManager
17+
import com.jetbrains.python.sdk.PythonSdkUtil
718
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
819
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.SyncModuleDependenciesParams
920

10-
class DefaultModuleDependenciesService(private val project: Project) : ModuleDependenciesService {
21+
class DefaultModuleDependenciesService(
22+
private val project: Project,
23+
serverInstance: Disposable
24+
) : ModuleDependenciesService,
25+
ModuleRootListener
26+
{
27+
28+
init {
29+
project.messageBus.connect(serverInstance).subscribe(
30+
ModuleRootListener.TOPIC,
31+
this
32+
)
33+
// project initiation with initial list of dependencies
34+
syncAllModules()
35+
}
36+
37+
38+
override fun rootsChanged(event: ModuleRootEvent) {
39+
if (event.isCausedByFileTypesChange) return
40+
// call on change with updated dependencies
41+
syncAllModules()
42+
}
43+
1144

12-
// init {
13-
// TODO: add moduleRootListener to make function call that eventually sends message w/ params
14-
// }
1545

1646
override fun syncModuleDependencies(params: SyncModuleDependenciesParams) {
1747
AmazonQLspService.executeIfRunning(project) { languageServer ->
1848
languageServer.syncModuleDependencies(params)
1949
}
2050
}
2151

22-
// fun createSyncModuleDependenciesParams() : SyncModuleDependenciesParams {
23-
// return SyncModuleDependenciesParams()
24-
// }
52+
private fun syncAllModules() {
53+
ModuleManager.getInstance(project).modules.forEach { module ->
54+
val language = getModuleLanguage(module)
55+
val params = when (language) {
56+
"Java" -> createJavaParams(module)
57+
"Python" -> createPythonParams(module)
58+
else -> return
59+
}
60+
syncModuleDependencies(params)
61+
}
62+
63+
}
64+
65+
private fun getModuleLanguage(module: Module): String {
66+
return when {
67+
ModuleRootManager.getInstance(module).sdk?.sdkType is JavaSdkType -> "Java"
68+
PythonSdkUtil.findPythonSdk(module) != null -> "Python"
69+
else -> "Unknown"
70+
}
71+
}
72+
73+
private fun getSourceRoots(module: Module): List<String> {
74+
val sourceRoots = mutableListOf<String>()
75+
76+
// Get all source roots from content entries
77+
ModuleRootManager.getInstance(module).contentEntries
78+
.flatMap { contentEntry ->
79+
contentEntry.sourceFolders
80+
.filter { !it.isTestSource }
81+
.mapNotNull { it.file?.path }
82+
}
83+
.forEach { path -> sourceRoots.add(path) }
84+
85+
return sourceRoots
86+
}
87+
88+
private fun createJavaParams(module: Module): SyncModuleDependenciesParams {
89+
val sourceRoots = getSourceRoots(module)
90+
val dependencies = mutableListOf<String>()
91+
92+
// Get library dependencies
93+
ModuleRootManager.getInstance(module).orderEntries().forEachLibrary { library ->
94+
library.getUrls(OrderRootType.CLASSES).forEach { url ->
95+
dependencies.add(VfsUtil.urlToPath(url))
96+
}
97+
true
98+
}
99+
100+
return SyncModuleDependenciesParams(
101+
moduleName = module.name,
102+
programmingLanguage = "Java",
103+
files = sourceRoots,
104+
dirs = dependencies,
105+
includePatterns = emptyList(),
106+
excludePatterns = emptyList()
107+
)
108+
}
109+
110+
private fun createPythonParams(module: Module): SyncModuleDependenciesParams {
111+
val sourceRoots = getSourceRoots(module)
112+
val dependencies = mutableListOf<String>()
113+
114+
// Get Python packages
115+
PythonSdkUtil.findPythonSdk(module)?.let { sdk ->
116+
val packageManager = PythonPackageManager.forSdk(module.project, sdk)
117+
packageManager.installedPackages.forEach { pkg ->
118+
dependencies.add(pkg.name)
119+
}
120+
}
121+
122+
return SyncModuleDependenciesParams(
123+
moduleName = module.name,
124+
programmingLanguage = "Python",
125+
files = sourceRoots,
126+
dirs = dependencies,
127+
includePatterns = emptyList(),
128+
excludePatterns = emptyList()
129+
)
130+
}
25131
}

0 commit comments

Comments
 (0)