diff --git a/platform/external-system-api/api-dump.txt b/platform/external-system-api/api-dump.txt index be3d8260aeb1..7f8c2d30226b 100644 --- a/platform/external-system-api/api-dump.txt +++ b/platform/external-system-api/api-dump.txt @@ -1014,6 +1014,7 @@ com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallba - onSuccess(com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId,com.intellij.openapi.externalSystem.model.DataNode):V com.intellij.openapi.externalSystem.service.project.ExternalSystemCoordinateContributor - sf:Companion:com.intellij.openapi.externalSystem.service.project.ExternalSystemCoordinateContributor$Companion +- findLibraryCoordinate(com.intellij.openapi.roots.libraries.Library):com.intellij.openapi.externalSystem.model.project.ProjectCoordinate - findModuleCoordinate(com.intellij.openapi.module.Module):com.intellij.openapi.externalSystem.model.project.ProjectCoordinate f:com.intellij.openapi.externalSystem.service.project.ExternalSystemCoordinateContributor$Companion com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ExternalSystemCoordinateContributor.kt b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ExternalSystemCoordinateContributor.kt index ac54311273f9..d34e15ec2f70 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ExternalSystemCoordinateContributor.kt +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ExternalSystemCoordinateContributor.kt @@ -3,6 +3,7 @@ package com.intellij.openapi.externalSystem.service.project import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.externalSystem.model.project.ProjectCoordinate import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.libraries.Library import org.jetbrains.annotations.ApiStatus /** @@ -22,6 +23,16 @@ interface ExternalSystemCoordinateContributor { return null } + /** + * Finds maven-like artifact coordinates for external library that corresponding to the given library. + * + * @param library is a library to find artifact coordinates of a corresponding external library. + * @return found external artifact coordinates. + */ + fun findLibraryCoordinate(library: Library): ProjectCoordinate? { + return null + } + companion object { @ApiStatus.Internal diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ExternalProjectsWorkspace.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ExternalProjectsWorkspace.kt index 434d6417fc6b..8588c902ff3b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ExternalProjectsWorkspace.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ExternalProjectsWorkspace.kt @@ -13,9 +13,7 @@ import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal @Service(Service.Level.PROJECT) @State(name = "ExternalProjectsWorkspace", storages = [Storage(CACHE_FILE)]) -class ExternalProjectsWorkspace( - private val project: Project, -) : SimplePersistentStateComponent(State()) { +class ExternalProjectsWorkspace : SimplePersistentStateComponent(State()) { class State : BaseState() { @@ -31,7 +29,7 @@ class ExternalProjectsWorkspace( if (!Registry.`is`("external.system.substitute.library.dependencies")) { return ModifiableWorkspaceModel.NOP } - return ModifiableWorkspaceModelImpl(project, state, modelProvider) + return ModifiableWorkspaceModelImpl(state, modelProvider) } companion object { diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ModifiableWorkspaceModelImpl.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ModifiableWorkspaceModelImpl.kt index 7171e906c497..cb2aa70ace58 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ModifiableWorkspaceModelImpl.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ModifiableWorkspaceModelImpl.kt @@ -1,11 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.externalSystem.service.project -import com.intellij.openapi.externalSystem.ExternalSystemManager -import com.intellij.openapi.externalSystem.model.ProjectKeys import com.intellij.openapi.externalSystem.model.project.ProjectCoordinate -import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil -import com.intellij.openapi.project.Project import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.ModuleOrderEntry @@ -19,7 +15,6 @@ import java.util.* @ApiStatus.Internal class ModifiableWorkspaceModelImpl internal constructor( - private val project: Project, private val state: ExternalProjectsWorkspace.State, private val modelsProvider: IdeModifiableModelsProvider, ) : ModifiableWorkspaceModel { @@ -61,16 +56,11 @@ class ModifiableWorkspaceModelImpl internal constructor( private fun buildLibraryToCoordinateMap(): Map { val result = HashMap() - val projectDataManager = ProjectDataManager.getInstance() - ExternalSystemManager.EP_NAME.forEachExtensionSafe { manager -> - val projectsData = projectDataManager.getExternalProjectsData(project, manager.systemId) - for (projectInfo in projectsData) { - val projectStructure = projectInfo.externalProjectStructure ?: continue - val libraryNodes = ExternalSystemApiUtil.findAll(projectStructure, ProjectKeys.LIBRARY) - for (libraryNode in libraryNodes) { - val libraryData = libraryNode.getData() - result.put(libraryData.internalName, libraryData) - } + ExternalSystemCoordinateContributor.EP_NAME.forEachExtensionSafe { contributor -> + for (library in modelsProvider.allLibraries) { + val libraryName = library.name ?: continue + val libraryCoordinate = contributor.findLibraryCoordinate(library) ?: continue + result.put(libraryName, libraryCoordinate) } } return result diff --git a/plugins/gradle/java/src/service/project/JavaGradleCoordinateContributor.kt b/plugins/gradle/java/src/service/project/JavaGradleCoordinateContributor.kt new file mode 100644 index 000000000000..49e7ab0cb3e7 --- /dev/null +++ b/plugins/gradle/java/src/service/project/JavaGradleCoordinateContributor.kt @@ -0,0 +1,25 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.plugins.gradle.service.project + +import com.intellij.java.library.MavenCoordinates +import com.intellij.java.library.getMavenCoordinates +import com.intellij.openapi.externalSystem.model.project.ProjectCoordinate +import com.intellij.openapi.externalSystem.model.project.ProjectId +import com.intellij.openapi.externalSystem.service.project.ExternalSystemCoordinateContributor +import com.intellij.openapi.roots.libraries.Library +import org.jetbrains.plugins.gradle.util.GradleConstants + +class JavaGradleCoordinateContributor: ExternalSystemCoordinateContributor { + + override fun findLibraryCoordinate(library: Library): ProjectCoordinate? { + val librarySource = library.externalSource ?: return null + if (librarySource.id != GradleConstants.SYSTEM_ID.id) { + return null + } + return library.getMavenCoordinates()?.toProjectCoordinate() + } + + private fun MavenCoordinates.toProjectCoordinate(): ProjectCoordinate { + return ProjectId(groupId, artifactId, version) + } +} \ No newline at end of file