mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[gradle] extract local indexes, prepare reusable methods IDEA-313748
GitOrigin-RevId: bacaded45bab3ff4f002c35275ea64d6e15dea69
This commit is contained in:
committed by
intellij-monorepo-bot
parent
711a8ab610
commit
bc682fe448
+102
-85
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user