in plugin/jps/src/main/kotlin/com/jetbrains/packagesearch/plugin/maven/PackageSearchJpsModule.kt [50:119]
override suspend fun editModule(action: context(EditModuleContext) () -> Unit) {
val libsDir = ModuleRootManager.getInstance(nativeModule)
.contentRoots
.firstOrNull()
?.runCatching { toNioPath() }
?.getOrNull()
?.resolve("libs")
?.createDirectories()
?: return
val editContext = EditJpsModuleContext()
action(editContext)
val toModify = editContext.data.getToModify()
val toRemove = editContext.data.getToRemove()
if (toModify.isNotEmpty() || toRemove.isNotEmpty()) {
ModuleRootModificationUtil.updateModel(nativeModule) { model ->
val mavenLibraries = buildMap {
for (lib in model.moduleLibraryTable.libraries) {
val ex = lib as? LibraryEx ?: continue
val mavenCoordinates = (ex.properties as? LibraryWithMavenCoordinatesProperties)
?.mavenCoordinates
?: continue
val id = "${mavenCoordinates.groupId}:${mavenCoordinates.artifactId}" +
":${mavenCoordinates.version}"
put(id, ex)
}
}
for (modification in toModify) {
val libraryEx = mavenLibraries[modification.id] ?: continue
val library = model.findLibraryOrderEntry(libraryEx) ?: continue
library.scope = modification.newScope
}
for (removal in toRemove) {
val libraryEx = mavenLibraries[removal] ?: continue
model.moduleLibraryTable.modifiableModel.removeLibrary(libraryEx)
}
model.commit()
}
}
val downloader = JpsDownloader(libsDir)
val downloaded = editContext.data.getToAdd()
.associateWith { downloader.downloadLibrary(it.groupId, it.artifactId, it.version, it.repositories) }
val virtualFileManager = VirtualFileManager.getInstance()
ModuleRootModificationUtil.updateModel(nativeModule) { model ->
for ((add, libraries) in downloaded) {
for (library in libraries) {
val libraryEx =
(model.moduleLibraryTable.modifiableModel
.createLibrary(add.id, RepositoryLibraryType.REPOSITORY_LIBRARY_KIND) as? LibraryEx)
?.modifiableModel
?: continue
val properties = RepositoryLibraryProperties(
/* groupId = */ add.groupId,
/* artifactId = */ add.artifactId,
/* version = */ add.version,
/* includeTransitiveDependencies = */ true,
/* excludedDependencies = */ emptyList()
)
libraryEx.properties = properties
virtualFileManager.findFileByNioPath(library.classesPath)
?.let { libraryEx.addRoot(it, OrderRootType.CLASSES) }
virtualFileManager.findFileByNioPath(library.sourcesPath)
?.let { libraryEx.addRoot(it, OrderRootType.SOURCES) }
libraryEx.commit()
}
}
model.commit()
}
}