From bc682fe44831a3830dab1cf9080c00acc03fc209 Mon Sep 17 00:00:00 2001 From: "Nikita.Skvortsov" Date: Mon, 20 Feb 2023 18:34:07 +0100 Subject: [PATCH] [gradle] extract local indexes, prepare reusable methods IDEA-313748 GitOrigin-RevId: bacaded45bab3ff4f002c35275ea64d6e15dea69 --- .../GradleBuildSrcProjectsResolver.java | 187 ++++++++++-------- 1 file changed, 102 insertions(+), 85 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleBuildSrcProjectsResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleBuildSrcProjectsResolver.java index 4f3c3565278f..d3bee57129ec 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleBuildSrcProjectsResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleBuildSrcProjectsResolver.java @@ -78,6 +78,73 @@ public final class GradleBuildSrcProjectsResolver { public void discoverAndAppendTo(@NotNull DataNode mainBuildProjectDataNode) { String gradleHome = myGradleUserHome == null ? null : myGradleUserHome.getPath(); + Index index = prepareIndexes(mainBuildProjectDataNode); + + List 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 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 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 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 builds = new ToolingModelsProviderImpl(myResolverContext.getModels()).builds(); - builds.forEach(build -> { - String buildPath = FileUtil.toSystemIndependentName(build.getBuildIdentifier().getRootDir().getPath()); - Collection> 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 buildNames, + CompositeBuildData compositeBuildData, + MultiMap> buildClasspathNodesMap, + Map> includedModulesPaths) { } private static void reuseTargetEnvironmentConfigurationProvider(@NotNull GradleExecutionSettings buildSrcProjectSettings, @@ -301,15 +312,22 @@ public final class GradleBuildSrcProjectsResolver { } } if (buildSrcModuleNode != null) { - Set buildSrcRuntimeSourcesPaths = new HashSet<>(); - Set buildSrcRuntimeClassesPaths = new HashSet<>(); + addBuildSrcToBuildScriptClasspathData(buildClasspathNodes, buildSrcModules, buildSrcModuleNode); + } + } - addSourcePaths(buildSrcRuntimeSourcesPaths, buildSrcModuleNode); + public static void addBuildSrcToBuildScriptClasspathData(@NotNull Collection> buildClasspathNodes, + @NotNull Map> buildSrcModules, + @NotNull DataNode buildSrcModuleNode) { + Set buildSrcRuntimeSourcesPaths = new HashSet<>(); + Set buildSrcRuntimeClassesPaths = new HashSet<>(); + + addSourcePaths(buildSrcRuntimeSourcesPaths, buildSrcModuleNode); for (DataNode child : buildSrcModuleNode.getChildren()) { Object childData = child.getData(); - if (childData instanceof ModuleDependencyData && ((ModuleDependencyData)childData).getScope().isForProductionRuntime()) { - DataNode depModuleNode = buildSrcModules.get(((ModuleDependencyData)childData).getTarget().getId()); + if (childData instanceof ModuleDependencyData moduleDependencyData && moduleDependencyData.getScope().isForProductionRuntime()) { + DataNode 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 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 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); + }); } }