List<Module> (@Nullable Collection<? extends ProjectTask> projectTasks, @NotNull MultiMap<String, String> buildTasksMap, @NotNull MultiMap<String, String> initScripts, @NotNull MultiMap<String, VersionSpecificInitScript> versionedInitScripts) { if (ContainerUtil.isEmpty(projectTasks)) return Collections.emptyList(); List<Module> affectedModules = new SmartList<>(); Map<Module, String> rootPathsMap = FactoryMap.create(module -> notNullize(resolveProjectPath(module))); for (ProjectTask projectTask : projectTasks) { if (!(projectTask instanceof ModuleBuildTask moduleBuildTask)) continue; collectAffectedModules(affectedModules, moduleBuildTask); Module module = moduleBuildTask.getModule(); String rootProjectPath = rootPathsMap.get(module); if (isEmpty(rootProjectPath)) continue; final String projectId = getExternalProjectId(module); if (projectId == null) continue; String externalProjectPath = getExternalProjectPath(module); if (externalProjectPath == null) continue; GradleModuleData gradleModuleData = CachedModuleDataFinder.getGradleModuleData(module); if (gradleModuleData == null) continue; boolean isGradleProjectDirUsedToRunTasks = gradleModuleData.getDirectoryToRunTask().equals(gradleModuleData.getGradleProjectDir()); if (!isGradleProjectDirUsedToRunTasks) { rootProjectPath = gradleModuleData.getDirectoryToRunTask(); } // all buildSrc runtime projects will be built by gradle implicitly if (gradleModuleData.isBuildSrcModule()) { continue; } String gradlePath = gradleModuleData.getGradlePath(); List<TaskData> taskDataList = ContainerUtil.mapNotNull(gradleModuleData.findAll(ProjectKeys.TASK), taskData -> taskData.isInherited() ? null : taskData); if (taskDataList.isEmpty()) continue; String taskPathPrefix = trimEnd(gradleModuleData.getFullGradlePath(), ":") + ":"; List<String> gradleModuleTasks = ContainerUtil.map(taskDataList, data -> trimStart(data.getName(), taskPathPrefix)); Collection<String> projectInitScripts = initScripts.getModifiable(rootProjectPath); Collection<String> buildRootTasks = buildTasksMap.getModifiable(rootProjectPath); final String moduleType = getExternalModuleType(module); if (!moduleBuildTask.isIncrementalBuild() && !(moduleBuildTask instanceof ModuleFilesBuildTask)) { projectInitScripts.add(String.format(FORCE_COMPILE_TASKS_INIT_SCRIPT_TEMPLATE, gradlePath)); } if (moduleBuildTask.isIncludeRuntimeDependencies()) { // if runtime deps are required, force Gradle to process all resources projectInitScripts.add("System.setProperty('org.gradle.java.compile-classpath-packaging', 'true')\n"); } String assembleTask = "assemble"; boolean buildOnlyResources = projectTask instanceof ModuleResourcesBuildTask; String buildTaskPrefix = buildOnlyResources ? "process" : ""; String buildTaskSuffix = buildOnlyResources ? "resources" : "classes"; if (GradleConstants.GRADLE_SOURCE_SET_MODULE_TYPE_KEY.equals(moduleType)) { String sourceSetName = GradleProjectResolverUtil.getSourceSetName(module); String gradleTask = getTaskName(buildTaskPrefix, buildTaskSuffix, sourceSetName); if (!addIfContains(taskPathPrefix, gradleTask, gradleModuleTasks, buildRootTasks) && ("main".equals(sourceSetName) || "test".equals(sourceSetName))) { buildRootTasks.add(taskPathPrefix + assembleTask); } for (GradleBuildTasksProvider buildTasksProvider : GradleBuildTasksProvider.EP_NAME.getExtensions()) { if (buildTasksProvider.isApplicable(moduleBuildTask)) { buildTasksProvider.addBuildTasks( moduleBuildTask, task -> buildTasksMap.putValue(task.getLinkedExternalProjectPath(), task.getName()), (String path, VersionSpecificInitScript script) -> versionedInitScripts.putValue(path, script) ); } } } else { String gradleTask = getTaskName(buildTaskPrefix, buildTaskSuffix, null); if (addIfContains(taskPathPrefix, gradleTask, gradleModuleTasks, buildRootTasks)) { String gradleTestTask = getTaskName(buildTaskPrefix, buildTaskSuffix, "test"); addIfContains(taskPathPrefix, gradleTestTask, gradleModuleTasks, buildRootTasks); } else if (gradleModuleTasks.contains(assembleTask)) { buildRootTasks.add(taskPathPrefix + assembleTask); } } } return affectedModules; }