override suspend fun editModule()

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()
        }

    }