IDEA-352675 [Gradle|Sync] new: transfer source sets and their dependencies by phases

GitOrigin-RevId: d3b59726a5fac93bee2d747d3d7257b036041385
This commit is contained in:
Sergei Vorobyov
2024-06-11 21:29:50 +02:00
committed by intellij-monorepo-bot
parent d30ced6726
commit f9ae000c95
10 changed files with 39 additions and 203 deletions

View File

@@ -3,6 +3,8 @@ package org.jetbrains.plugins.gradle.service.project;
import com.intellij.build.events.MessageEvent;
import com.intellij.execution.configurations.ParametersList;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetDependencyModel.DefaultGradleSourceSetDependencyModel;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetModel.DefaultGradleSourceSetModel;
import com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction;
import com.intellij.gradle.toolingExtension.impl.telemetry.GradleTracingContext;
import com.intellij.gradle.toolingExtension.util.GradleVersionUtil;
@@ -708,6 +710,8 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad
private static void extractExternalProjectModels(@NotNull GradleIdeaModelHolder models) {
associateProjectModelsWithExternalProjects(models);
replicateBuildModelHierarchyInExternalProjectHierarchy(models);
associateSourceSetModelsWithExternalProjects(models);
associateSourceSetDependencyModelsWithSourceSetModels(models);
}
private static void associateProjectModelsWithExternalProjects(@NotNull GradleIdeaModelHolder models) {
@@ -737,6 +741,38 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad
}
}
private static void associateSourceSetModelsWithExternalProjects(@NotNull GradleIdeaModelHolder models) {
for (var buildModel : models.getAllBuilds()) {
for (var projectModel : buildModel.getProjects()) {
var externalProject = (DefaultExternalProject)models.getProjectModel(projectModel, ExternalProject.class);
var sourceSetModel = (DefaultGradleSourceSetModel)models.getProjectModel(projectModel, GradleSourceSetModel.class);
if (externalProject == null || sourceSetModel == null) continue;
externalProject.setSourceSetModel(sourceSetModel);
}
}
}
private static void associateSourceSetDependencyModelsWithSourceSetModels(@NotNull GradleIdeaModelHolder models) {
for (var buildModel : models.getAllBuilds()) {
for (var projectModel : buildModel.getProjects()) {
var sourceSetModel = (DefaultGradleSourceSetModel)models.getProjectModel(projectModel, GradleSourceSetModel.class);
var sourceSetDependencyModel = (DefaultGradleSourceSetDependencyModel)models.getProjectModel(projectModel, GradleSourceSetDependencyModel.class);
if (sourceSetModel == null || sourceSetDependencyModel == null) continue;
var sourceSets = sourceSetModel.getSourceSets();
var dependencies = sourceSetDependencyModel.getDependencies();
var sourceSetNames = new LinkedHashSet<>(sourceSets.keySet());
sourceSetNames.retainAll(dependencies.keySet());
for (String sourceSetName : sourceSetNames) {
var sourceSet = sourceSets.get(sourceSetName);
var sourceSetDependencies = dependencies.get(sourceSetName);
sourceSet.setDependencies(sourceSetDependencies);
}
}
}
}
private static @NotNull Map<String, DefaultExternalProject> createExternalProjectIndex(
@NotNull DefaultExternalProject rootExternalProject
) {

View File

@@ -12,7 +12,7 @@ object GradleModelBuilderMessageCollector : CounterUsagesCollector() {
override fun getGroup() = GROUP
private val GROUP: EventLogGroup = EventLogGroup("build.gradle.errors", 14)
private val GROUP: EventLogGroup = EventLogGroup("build.gradle.errors", 15)
private val ACTIVITY_ID = EventFields.Long("ide_activity_id")
private val MESSAGE_KIND = EventFields.Enum<Message.Kind>("message_kind")
@@ -29,8 +29,6 @@ object GradleModelBuilderMessageCollector : CounterUsagesCollector() {
Messages.TASK_CACHE_SET_GROUP,
Messages.SOURCE_SET_MODEL_GROUP,
Messages.SOURCE_SET_MODEL_CACHE_GET_GROUP,
Messages.SOURCE_SET_MODEL_CACHE_SET_GROUP,
Messages.SOURCE_SET_MODEL_PROJECT_TASK_ARTIFACT_GROUP,
Messages.SOURCE_SET_MODEL_SKIPPED_PROJECT_TASK_ARTIFACT_GROUP,
Messages.SOURCE_SET_MODEL_NON_SOURCE_SET_ARTIFACT_GROUP,
@@ -50,8 +48,6 @@ object GradleModelBuilderMessageCollector : CounterUsagesCollector() {
Messages.SOURCE_SET_ARTIFACT_INDEX_CACHE_SET_GROUP,
Messages.SOURCE_SET_DEPENDENCY_MODEL_GROUP,
Messages.SOURCE_SET_DEPENDENCY_MODEL_CACHE_GET_GROUP,
Messages.SOURCE_SET_DEPENDENCY_MODEL_CACHE_SET_GROUP,
Messages.EAR_CONFIGURATION_MODEL_GROUP,
Messages.WAR_CONFIGURATION_MODEL_GROUP,

View File

@@ -1,10 +1,6 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.toolingExtension.impl.model.projectModel;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetDependencyModel.DefaultGradleSourceSetDependencyModel;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetDependencyModel.GradleSourceSetDependencyCache;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetModel.DefaultGradleSourceSetModel;
import com.intellij.gradle.toolingExtension.impl.model.sourceSetModel.GradleSourceSetCache;
import com.intellij.gradle.toolingExtension.impl.model.taskModel.GradleTaskCache;
import com.intellij.gradle.toolingExtension.impl.modelBuilder.Messages;
import com.intellij.gradle.toolingExtension.impl.util.GradleObjectUtil;
@@ -65,7 +61,6 @@ public class GradleExternalProjectModelBuilder extends AbstractModelBuilderServi
externalProject.setGroup(wrap(project.getGroup()));
externalProject.setProjectDir(project.getProjectDir());
externalProject.setTasks(getTasks(project, context));
externalProject.setSourceSetModel(getSourceSetModel(project, context));
externalProject.setChildProjects(getChildProjects(project, context));
GradleExternalProjectCache.getInstance(context)
@@ -108,26 +103,6 @@ public class GradleExternalProjectModelBuilder extends AbstractModelBuilderServi
return result;
}
private static @NotNull DefaultGradleSourceSetModel getSourceSetModel(
@NotNull Project project,
@NotNull ModelBuilderContext context
) {
GradleSourceSetCache sourceSetCache = GradleSourceSetCache.getInstance(context);
GradleSourceSetDependencyCache sourceSetDependencyCache = GradleSourceSetDependencyCache.getInstance(context);
DefaultGradleSourceSetModel sourceSetModel = sourceSetCache.getSourceSetModel(project);
DefaultGradleSourceSetDependencyModel sourceSetDependencyModel = sourceSetDependencyCache.getSourceSetDependencyModel(project);
Map<String, DefaultExternalSourceSet> sourceSets = sourceSetModel.getSourceSets();
Map<String, Collection<ExternalDependency>> dependencies = sourceSetDependencyModel.getDependencies();
Set<String> sourceSetNames = new LinkedHashSet<>(sourceSets.keySet());
sourceSetNames.retainAll(dependencies.keySet());
for (String sourceSetName : sourceSetNames) {
DefaultExternalSourceSet sourceSet = sourceSets.get(sourceSetName);
Collection<ExternalDependency> sourceSetDependencies = dependencies.get(sourceSetName);
sourceSet.setDependencies(sourceSetDependencies);
}
return sourceSetModel;
}
private static @NotNull Map<String, DefaultExternalProject> getChildProjects(
@NotNull Project project,
@NotNull ModelBuilderContext context

View File

@@ -1,80 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.toolingExtension.impl.model.sourceSetDependencyModel;
import com.intellij.gradle.toolingExtension.impl.modelBuilder.Messages;
import com.intellij.gradle.toolingExtension.impl.util.GradleProjectUtil;
import com.intellij.gradle.toolingExtension.modelAction.GradleModelFetchPhase;
import org.gradle.api.Project;
import org.gradle.tooling.model.ProjectIdentifier;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.tooling.Message;
import org.jetbrains.plugins.gradle.tooling.ModelBuilderContext;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@ApiStatus.Internal
public class GradleSourceSetDependencyCache {
private final ModelBuilderContext context;
private final ConcurrentMap<ProjectIdentifier, DefaultGradleSourceSetDependencyModel> allSourceSetDependencyModels;
private GradleSourceSetDependencyCache(@NotNull ModelBuilderContext context) {
this.context = context;
this.allSourceSetDependencyModels = new ConcurrentHashMap<>();
}
public @NotNull DefaultGradleSourceSetDependencyModel getSourceSetDependencyModel(@NotNull Project project) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
DefaultGradleSourceSetDependencyModel sourceSetDependencyModel = allSourceSetDependencyModels.get(projectIdentifier);
if (sourceSetDependencyModel == null) {
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_DEPENDENCY_MODEL_CACHE_GET_GROUP)
.withTitle("Source set model isn't found")
.withText(
"Source set dependencies for " + project.getDisplayName() + " wasn't collected. " +
"All source set dependencies should be collected during " + GradleModelFetchPhase.PROJECT_SOURCE_SET_DEPENDENCY_PHASE + "."
)
.withInternal().withStackTrace()
.withKind(Message.Kind.ERROR)
.reportMessage(project);
return new DefaultGradleSourceSetDependencyModel();
}
return sourceSetDependencyModel;
}
public void setSourceSetDependencyModel(
@NotNull Project project,
@NotNull DefaultGradleSourceSetDependencyModel sourceSetDependencyModel
) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
DefaultGradleSourceSetDependencyModel previousSourceSetDependencyModel =
allSourceSetDependencyModels.put(projectIdentifier, sourceSetDependencyModel);
if (previousSourceSetDependencyModel != null) {
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_DEPENDENCY_MODEL_CACHE_SET_GROUP)
.withTitle("Source set dependency model redefinition")
.withText("Source set dependencies for " + project.getDisplayName() + " was already collected.")
.withInternal().withStackTrace()
.withKind(Message.Kind.ERROR)
.reportMessage(project);
}
}
/**
* Marks that a project source set model is loaded with errors.
* This mark means that error for {@code project} is already processed and reported.
*/
public void markSourceSetDependencyModelAsError(@NotNull Project project) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
allSourceSetDependencyModels.put(projectIdentifier, new DefaultGradleSourceSetDependencyModel());
}
private static final @NotNull ModelBuilderContext.DataProvider<GradleSourceSetDependencyCache> INSTANCE_PROVIDER =
GradleSourceSetDependencyCache::new;
public static @NotNull GradleSourceSetDependencyCache getInstance(@NotNull ModelBuilderContext context) {
return context.getData(INSTANCE_PROVIDER);
}
}

View File

@@ -27,13 +27,8 @@ public class GradleSourceSetDependencyModelBuilder extends AbstractModelBuilderS
@Override
public Object buildAll(@NotNull String modelName, @NotNull Project project, @NotNull ModelBuilderContext context) {
DefaultGradleSourceSetDependencyModel sourceSetDependencyModel = new DefaultGradleSourceSetDependencyModel();
sourceSetDependencyModel.setDependencies(collectDependencies(context, project));
GradleSourceSetDependencyCache.getInstance(context)
.setSourceSetDependencyModel(project, sourceSetDependencyModel);
return sourceSetDependencyModel;
}
@@ -64,9 +59,6 @@ public class GradleSourceSetDependencyModelBuilder extends AbstractModelBuilderS
@NotNull ModelBuilderContext context,
@NotNull Exception exception
) {
GradleSourceSetDependencyCache.getInstance(context)
.markSourceSetDependencyModelAsError(project);
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_DEPENDENCY_MODEL_GROUP)
.withKind(Message.Kind.ERROR)

View File

@@ -30,6 +30,6 @@ public class GradleSourceSetDependencyModelProvider implements ProjectImportMode
) {
GradleModelProviderUtil.buildModelsRecursively(controller, buildModels, GradleDependencyDownloadPolicy.class, GradleModelConsumer.NOOP);
GradleModelProviderUtil.buildModels(controller, buildModels, GradleSourceSetArtifactBuildRequest.class, GradleModelConsumer.NOOP);
GradleModelProviderUtil.buildModelsInParallel(controller, buildModels, GradleSourceSetDependencyModel.class, GradleModelConsumer.NOOP);
GradleModelProviderUtil.buildModelsInParallel(controller, buildModels, GradleSourceSetDependencyModel.class, modelConsumer);
}
}

View File

@@ -1,75 +0,0 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.gradle.toolingExtension.impl.model.sourceSetModel;
import com.intellij.gradle.toolingExtension.impl.modelBuilder.Messages;
import com.intellij.gradle.toolingExtension.impl.util.GradleProjectUtil;
import com.intellij.gradle.toolingExtension.modelAction.GradleModelFetchPhase;
import org.gradle.api.Project;
import org.gradle.tooling.model.ProjectIdentifier;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.tooling.Message;
import org.jetbrains.plugins.gradle.tooling.ModelBuilderContext;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@ApiStatus.Internal
public class GradleSourceSetCache {
private final ModelBuilderContext context;
private final ConcurrentMap<ProjectIdentifier, DefaultGradleSourceSetModel> allSourceSetModels;
private GradleSourceSetCache(@NotNull ModelBuilderContext context) {
this.context = context;
this.allSourceSetModels = new ConcurrentHashMap<>();
}
public @NotNull DefaultGradleSourceSetModel getSourceSetModel(@NotNull Project project) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
DefaultGradleSourceSetModel sourceSetModel = allSourceSetModels.get(projectIdentifier);
if (sourceSetModel == null) {
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_MODEL_CACHE_GET_GROUP)
.withTitle("Source set model isn't found")
.withText(
"Source sets for " + project.getDisplayName() + " wasn't collected. " +
"All source sets should be collected during " + GradleModelFetchPhase.PROJECT_SOURCE_SET_PHASE + "."
)
.withInternal().withStackTrace()
.withKind(Message.Kind.ERROR)
.reportMessage(project);
return new DefaultGradleSourceSetModel();
}
return sourceSetModel;
}
public void setSourceSetModel(@NotNull Project project, @NotNull DefaultGradleSourceSetModel sourceSetModel) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
DefaultGradleSourceSetModel previousSourceSetModel = allSourceSetModels.put(projectIdentifier, sourceSetModel);
if (previousSourceSetModel != null) {
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_MODEL_CACHE_SET_GROUP)
.withTitle("Source set model redefinition")
.withText("Source sets for " + project.getDisplayName() + " was already collected.")
.withInternal().withStackTrace()
.withKind(Message.Kind.ERROR)
.reportMessage(project);
}
}
/**
* Marks that a project source set model is loaded with errors.
* This mark means that error for {@code project} is already processed and reported.
*/
public void markSourceSetModelAsError(@NotNull Project project) {
ProjectIdentifier projectIdentifier = GradleProjectUtil.getProjectIdentifier(project);
allSourceSetModels.put(projectIdentifier, new DefaultGradleSourceSetModel());
}
private static final @NotNull ModelBuilderContext.DataProvider<GradleSourceSetCache> INSTANCE_PROVIDER = GradleSourceSetCache::new;
public static @NotNull GradleSourceSetCache getInstance(@NotNull ModelBuilderContext context) {
return context.getData(INSTANCE_PROVIDER);
}
}

View File

@@ -64,8 +64,6 @@ public class GradleSourceSetModelBuilder extends AbstractModelBuilderService {
sourceSetModel.setAdditionalArtifacts(collectNonSourceSetArtifacts(project, context));
sourceSetModel.setSourceSets(collectSourceSets(project, context));
GradleSourceSetCache.getInstance(context).setSourceSetModel(project, sourceSetModel);
return sourceSetModel;
}
@@ -74,8 +72,6 @@ public class GradleSourceSetModelBuilder extends AbstractModelBuilderService {
@NotNull Project project,
@NotNull ModelBuilderContext context,
@NotNull Exception exception) {
GradleSourceSetCache.getInstance(context).markSourceSetModelAsError(project);
context.getMessageReporter().createMessage()
.withGroup(Messages.SOURCE_SET_MODEL_GROUP)
.withKind(Message.Kind.ERROR)

View File

@@ -24,6 +24,6 @@ public class GradleSourceSetModelProvider implements ProjectImportModelProvider
@NotNull GradleBuild buildModel,
@NotNull GradleModelConsumer modelConsumer
) {
GradleModelProviderUtil.buildModels(controller, buildModel, GradleSourceSetModel.class, GradleModelConsumer.NOOP);
GradleModelProviderUtil.buildModels(controller, buildModel, GradleSourceSetModel.class, modelConsumer);
}
}

View File

@@ -20,8 +20,6 @@ public final class Messages {
public final static @NotNull String TASK_CACHE_SET_GROUP = "gradle.taskModel.cacheSet.group";
public final static @NotNull String SOURCE_SET_MODEL_GROUP = "gradle.sourceSetModel.group";
public final static @NotNull String SOURCE_SET_MODEL_CACHE_GET_GROUP = "gradle.sourceSetModel.cacheGet.group";
public final static @NotNull String SOURCE_SET_MODEL_CACHE_SET_GROUP = "gradle.sourceSetModel.cacheSet.group";
public final static @NotNull String SOURCE_SET_MODEL_PROJECT_TASK_ARTIFACT_GROUP = "gradle.sourceSetModel.projectArtifact.group";
public final static @NotNull String SOURCE_SET_MODEL_SKIPPED_PROJECT_TASK_ARTIFACT_GROUP = "gradle.sourceSetModel.projectArtifact.skipped.group";
public final static @NotNull String SOURCE_SET_MODEL_NON_SOURCE_SET_ARTIFACT_GROUP = "gradle.sourceSetModel.nonSourceSetArtifact.group";
@@ -36,8 +34,6 @@ public final class Messages {
public final static @NotNull String SOURCE_SET_ARTIFACT_INDEX_GROUP = "gradle.sourceSetArtifactIndex.group";
public final static @NotNull String SOURCE_SET_ARTIFACT_INDEX_CACHE_SET_GROUP = "gradle.sourceSetArtifactIndex.cacheSet.group";
public final static @NotNull String SOURCE_SET_DEPENDENCY_MODEL_GROUP = "gradle.sourceSetDependencyModel.group";
public final static @NotNull String SOURCE_SET_DEPENDENCY_MODEL_CACHE_GET_GROUP = "gradle.sourceSetDependencyModel.cacheGet.group";
public final static @NotNull String SOURCE_SET_DEPENDENCY_MODEL_CACHE_SET_GROUP = "gradle.sourceSetDependencyModel.cacheSet.group";
public final static @NotNull String EAR_CONFIGURATION_MODEL_GROUP = "gradle.earConfigurationModel.group";
public final static @NotNull String WAR_CONFIGURATION_MODEL_GROUP = "gradle.warConfigurationModel.group";