[gradle] extract local indexes, prepare reusable methods IDEA-313748

GitOrigin-RevId: bacaded45bab3ff4f002c35275ea64d6e15dea69
This commit is contained in:
Nikita.Skvortsov
2023-02-24 10:52:15 +00:00
committed by intellij-monorepo-bot
parent 711a8ab610
commit bc682fe448
@@ -78,6 +78,73 @@ public final class GradleBuildSrcProjectsResolver {
public void discoverAndAppendTo(@NotNull DataNode<ProjectData> mainBuildProjectDataNode) {
String gradleHome = myGradleUserHome == null ? null : myGradleUserHome.getPath();
Index index = prepareIndexes(mainBuildProjectDataNode);
List<String> jvmOptions = new SmartList<>();
// the BuildEnvironment jvm arguments of the main build should be used for the 'buildSrc' import
// to avoid spawning of the second gradle daemon
BuildEnvironment mainBuildEnvironment = myResolverContext.getModels().getBuildEnvironment();
if (mainBuildEnvironment != null) {
jvmOptions.addAll(mainBuildEnvironment.getJava().getJvmArguments());
}
if (myMainBuildExecutionSettings != null) {
jvmOptions.addAll(myMainBuildExecutionSettings.getJvmArguments());
}
Stream<Build> builds = new ToolingModelsProviderImpl(myResolverContext.getModels()).builds();
builds.forEach(build -> {
String buildPath = FileUtil.toSystemIndependentName(build.getBuildIdentifier().getRootDir().getPath());
GradleExecutionSettings buildSrcProjectSettings;
if (gradleHome != null) {
if (myMainBuildExecutionSettings != null) {
buildSrcProjectSettings = new GradleExecutionSettings(gradleHome,
myMainBuildExecutionSettings.getServiceDirectory(),
DistributionType.LOCAL,
myMainBuildExecutionSettings.isOfflineWork());
buildSrcProjectSettings.setIdeProjectPath(myMainBuildExecutionSettings.getIdeProjectPath());
buildSrcProjectSettings.setJavaHome(myMainBuildExecutionSettings.getJavaHome());
buildSrcProjectSettings.setResolveModulePerSourceSet(myMainBuildExecutionSettings.isResolveModulePerSourceSet());
buildSrcProjectSettings.setUseQualifiedModuleNames(myMainBuildExecutionSettings.isUseQualifiedModuleNames());
buildSrcProjectSettings.setRemoteProcessIdleTtlInMs(myMainBuildExecutionSettings.getRemoteProcessIdleTtlInMs());
buildSrcProjectSettings.setVerboseProcessing(myMainBuildExecutionSettings.isVerboseProcessing());
buildSrcProjectSettings.setWrapperPropertyFile(myMainBuildExecutionSettings.getWrapperPropertyFile());
buildSrcProjectSettings.setDelegatedBuild(myMainBuildExecutionSettings.isDelegatedBuild());
buildSrcProjectSettings.withArguments(myMainBuildExecutionSettings.getArguments())
.withEnvironmentVariables(myMainBuildExecutionSettings.getEnv())
.passParentEnvs(myMainBuildExecutionSettings.isPassParentEnvs())
.withVmOptions(jvmOptions);
reuseTargetEnvironmentConfigurationProvider(buildSrcProjectSettings, myMainBuildExecutionSettings);
}
else {
buildSrcProjectSettings = new GradleExecutionSettings(gradleHome, null, DistributionType.LOCAL, false);
}
includeRootBuildIncludedBuildsIfNeeded(buildSrcProjectSettings, index.compositeBuildData(), buildPath);
}
else {
buildSrcProjectSettings = myMainBuildExecutionSettings;
}
final String buildSrcProjectPath = buildPath + "/buildSrc";
DefaultProjectResolverContext buildSrcResolverCtx =
new DefaultProjectResolverContext(mySyncTaskId, buildSrcProjectPath, buildSrcProjectSettings, myListener, myResolverContext.getPolicy(), false);
myResolverContext.copyUserDataTo(buildSrcResolverCtx);
String buildName = index.buildNames().get(buildPath);
String buildSrcGroup = getBuildSrcGroup(buildPath, buildName);
buildSrcResolverCtx.setBuildSrcGroup(buildSrcGroup);
handleBuildSrcProject(mainBuildProjectDataNode,
buildName,
index.buildClasspathNodesMap().getModifiable(Paths.get(buildPath)),
index.includedModulesPaths(),
buildSrcResolverCtx,
myProjectResolver.getProjectDataFunction(buildSrcResolverCtx, myResolverChain, true));
});
}
@NotNull
public static Index prepareIndexes(@NotNull DataNode<ProjectData> mainBuildProjectDataNode) {
ProjectData mainBuildProjectData = mainBuildProjectDataNode.getData();
String projectPath = mainBuildProjectData.getLinkedExternalProjectPath();
@@ -106,69 +173,13 @@ public final class GradleBuildSrcProjectsResolver {
buildClasspathNodesMap.putValue(Paths.get(rootPath != null ? rootPath : projectPath), scriptClasspathDataNode);
}
}
return new Index(buildNames, compositeBuildData, buildClasspathNodesMap, includedModulesPaths);
}
List<String> jvmOptions = new SmartList<>();
// the BuildEnvironment jvm arguments of the main build should be used for the 'buildSrc' import
// to avoid spawning of the second gradle daemon
BuildEnvironment mainBuildEnvironment = myResolverContext.getModels().getBuildEnvironment();
if (mainBuildEnvironment != null) {
jvmOptions.addAll(mainBuildEnvironment.getJava().getJvmArguments());
}
if (myMainBuildExecutionSettings != null) {
jvmOptions.addAll(myMainBuildExecutionSettings.getJvmArguments());
}
Stream<Build> builds = new ToolingModelsProviderImpl(myResolverContext.getModels()).builds();
builds.forEach(build -> {
String buildPath = FileUtil.toSystemIndependentName(build.getBuildIdentifier().getRootDir().getPath());
Collection<DataNode<BuildScriptClasspathData>> buildClasspathNodes = buildClasspathNodesMap.getModifiable(Paths.get(buildPath));
GradleExecutionSettings buildSrcProjectSettings;
if (gradleHome != null) {
if (myMainBuildExecutionSettings != null) {
buildSrcProjectSettings = new GradleExecutionSettings(gradleHome,
myMainBuildExecutionSettings.getServiceDirectory(),
DistributionType.LOCAL,
myMainBuildExecutionSettings.isOfflineWork());
buildSrcProjectSettings.setIdeProjectPath(myMainBuildExecutionSettings.getIdeProjectPath());
buildSrcProjectSettings.setJavaHome(myMainBuildExecutionSettings.getJavaHome());
buildSrcProjectSettings.setResolveModulePerSourceSet(myMainBuildExecutionSettings.isResolveModulePerSourceSet());
buildSrcProjectSettings.setUseQualifiedModuleNames(myMainBuildExecutionSettings.isUseQualifiedModuleNames());
buildSrcProjectSettings.setRemoteProcessIdleTtlInMs(myMainBuildExecutionSettings.getRemoteProcessIdleTtlInMs());
buildSrcProjectSettings.setVerboseProcessing(myMainBuildExecutionSettings.isVerboseProcessing());
buildSrcProjectSettings.setWrapperPropertyFile(myMainBuildExecutionSettings.getWrapperPropertyFile());
buildSrcProjectSettings.setDelegatedBuild(myMainBuildExecutionSettings.isDelegatedBuild());
buildSrcProjectSettings.withArguments(myMainBuildExecutionSettings.getArguments())
.withEnvironmentVariables(myMainBuildExecutionSettings.getEnv())
.passParentEnvs(myMainBuildExecutionSettings.isPassParentEnvs())
.withVmOptions(jvmOptions);
reuseTargetEnvironmentConfigurationProvider(buildSrcProjectSettings, myMainBuildExecutionSettings);
}
else {
buildSrcProjectSettings = new GradleExecutionSettings(gradleHome, null, DistributionType.LOCAL, false);
}
includeRootBuildIncludedBuildsIfNeeded(buildSrcProjectSettings, compositeBuildData, buildPath);
}
else {
buildSrcProjectSettings = myMainBuildExecutionSettings;
}
final String buildSrcProjectPath = buildPath + "/buildSrc";
DefaultProjectResolverContext buildSrcResolverCtx =
new DefaultProjectResolverContext(mySyncTaskId, buildSrcProjectPath, buildSrcProjectSettings, myListener, myResolverContext.getPolicy(), false);
myResolverContext.copyUserDataTo(buildSrcResolverCtx);
String buildName = buildNames.get(buildPath);
String buildSrcGroup = getBuildSrcGroup(buildPath, buildName);
buildSrcResolverCtx.setBuildSrcGroup(buildSrcGroup);
handleBuildSrcProject(mainBuildProjectDataNode,
buildName,
buildClasspathNodes,
includedModulesPaths,
buildSrcResolverCtx,
myProjectResolver.getProjectDataFunction(buildSrcResolverCtx, myResolverChain, true));
});
public record Index(Map<String, String> buildNames,
CompositeBuildData compositeBuildData,
MultiMap<Path, DataNode<BuildScriptClasspathData>> buildClasspathNodesMap,
Map<String, DataNode<ModuleData>> includedModulesPaths) {
}
private static void reuseTargetEnvironmentConfigurationProvider(@NotNull GradleExecutionSettings buildSrcProjectSettings,
@@ -301,15 +312,22 @@ public final class GradleBuildSrcProjectsResolver {
}
}
if (buildSrcModuleNode != null) {
Set<String> buildSrcRuntimeSourcesPaths = new HashSet<>();
Set<String> buildSrcRuntimeClassesPaths = new HashSet<>();
addBuildSrcToBuildScriptClasspathData(buildClasspathNodes, buildSrcModules, buildSrcModuleNode);
}
}
addSourcePaths(buildSrcRuntimeSourcesPaths, buildSrcModuleNode);
public static void addBuildSrcToBuildScriptClasspathData(@NotNull Collection<DataNode<BuildScriptClasspathData>> buildClasspathNodes,
@NotNull Map<String, DataNode<? extends ModuleData>> buildSrcModules,
@NotNull DataNode<? extends ModuleData> buildSrcModuleNode) {
Set<String> buildSrcRuntimeSourcesPaths = new HashSet<>();
Set<String> buildSrcRuntimeClassesPaths = new HashSet<>();
addSourcePaths(buildSrcRuntimeSourcesPaths, buildSrcModuleNode);
for (DataNode<?> child : buildSrcModuleNode.getChildren()) {
Object childData = child.getData();
if (childData instanceof ModuleDependencyData && ((ModuleDependencyData)childData).getScope().isForProductionRuntime()) {
DataNode<? extends ModuleData> depModuleNode = buildSrcModules.get(((ModuleDependencyData)childData).getTarget().getId());
if (childData instanceof ModuleDependencyData moduleDependencyData && moduleDependencyData.getScope().isForProductionRuntime()) {
DataNode<? extends ModuleData> depModuleNode = buildSrcModules.get(moduleDependencyData.getTarget().getId());
if (depModuleNode != null) {
addSourcePaths(buildSrcRuntimeSourcesPaths, depModuleNode);
}
@@ -325,27 +343,26 @@ public final class GradleBuildSrcProjectsResolver {
}
}
if (!buildSrcRuntimeSourcesPaths.isEmpty() || !buildSrcRuntimeClassesPaths.isEmpty()) {
buildClasspathNodes.forEach(classpathNode -> {
BuildScriptClasspathData copyFrom = classpathNode.getData();
if (!buildSrcRuntimeSourcesPaths.isEmpty() || !buildSrcRuntimeClassesPaths.isEmpty()) {
buildClasspathNodes.forEach(classpathNode -> {
BuildScriptClasspathData copyFrom = classpathNode.getData();
List<BuildScriptClasspathData.ClasspathEntry> classpathEntries = new ArrayList<>(copyFrom.getClasspathEntries().size() + 1);
classpathEntries.addAll(copyFrom.getClasspathEntries());
classpathEntries.add(BuildScriptClasspathData.ClasspathEntry.create(
new HashSet<>(buildSrcRuntimeClassesPaths),
new HashSet<>(buildSrcRuntimeSourcesPaths),
Collections.emptySet()
));
List<BuildScriptClasspathData.ClasspathEntry> classpathEntries = new ArrayList<>(copyFrom.getClasspathEntries().size() + 1);
classpathEntries.addAll(copyFrom.getClasspathEntries());
classpathEntries.add(BuildScriptClasspathData.ClasspathEntry.create(
new HashSet<>(buildSrcRuntimeClassesPaths),
new HashSet<>(buildSrcRuntimeSourcesPaths),
Collections.emptySet()
));
BuildScriptClasspathData buildScriptClasspathData = new BuildScriptClasspathData(GradleConstants.SYSTEM_ID, classpathEntries);
buildScriptClasspathData.setGradleHomeDir(copyFrom.getGradleHomeDir());
BuildScriptClasspathData buildScriptClasspathData = new BuildScriptClasspathData(GradleConstants.SYSTEM_ID, classpathEntries);
buildScriptClasspathData.setGradleHomeDir(copyFrom.getGradleHomeDir());
DataNode<?> parent = classpathNode.getParent();
assert parent != null;
parent.createChild(BuildScriptClasspathData.KEY, buildScriptClasspathData);
classpathNode.clear(true);
});
}
DataNode<?> parent = classpathNode.getParent();
assert parent != null;
parent.createChild(BuildScriptClasspathData.KEY, buildScriptClasspathData);
classpathNode.clear(true);
});
}
}