From 873f15b91e21104e5dc2c923002fe4eb42dff02b Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Fri, 20 Mar 2020 13:46:15 +0300 Subject: [PATCH] IDEA-234355 Directories configured in gradle as sourceSetOutput should be excluded from indexing/processing GitOrigin-RevId: 937d8efc9191ffd67a7141d5f3584e92d405ec1d --- .../model/project/LibraryPathType.java | 10 +----- .../project/manage/LibraryDataService.java | 21 ++++++++++-- .../manage/LibraryDependencyDataService.java | 3 +- .../project/GradleProjectResolverUtil.java | 4 +++ .../GradleDependenciesImportingTest.java | 32 ++++++++++++++++++- .../DefaultFileCollectionDependency.java | 12 +++++++ .../ExternalProjectSerializationService.java | 4 +++ .../util/resolve/DependencyResolverImpl.java | 1 + 8 files changed, 73 insertions(+), 14 deletions(-) diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/LibraryPathType.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/LibraryPathType.java index d075ec58b7a5..f07c440346f8 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/LibraryPathType.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/LibraryPathType.java @@ -1,13 +1,5 @@ package com.intellij.openapi.externalSystem.model.project; -import com.intellij.openapi.roots.OrderRootType; - -/** - * Note that current enum duplicates {@link OrderRootType}. We can't use the later directly because it's not properly setup - * for serialization/deserialization. - * - * @author Denis Zhdanov - */ public enum LibraryPathType { - BINARY, SOURCE, DOC, ANNOTATION + BINARY, SOURCE, DOC, ANNOTATION, EXCLUDED } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java index 6fffaf807b54..3cc45d683a66 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java @@ -21,6 +21,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.RootPolicy; +import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.vfs.JarFileSystem; @@ -84,8 +85,9 @@ public final class LibraryDataService extends AbstractProjectDataService excludedPaths = toImport.getPaths(LibraryPathType.EXCLUDED); + registerPaths(toImport.isUnresolved(), libraryFiles, excludedPaths, libraryModel, libraryName); } @NotNull @@ -107,6 +109,7 @@ public final class LibraryDataService extends AbstractProjectDataService> libraryFiles, + @NotNull Set excludedPaths, @NotNull Library.ModifiableModel model, @NotNull String libraryName) { for (Map.Entry> entry: libraryFiles.entrySet()) { @@ -150,6 +153,17 @@ public final class LibraryDataService extends AbstractProjectDataService excludedPaths = externalLibrary.getPaths(LibraryPathType.EXCLUDED); for (Map.Entry> entry: toAdd.entrySet()) { Map> roots = new HashMap<>(); roots.put(entry.getKey(), ContainerUtil.map(entry.getValue(), PATH_TO_FILE)); - registerPaths(externalLibrary.isUnresolved(), roots, libraryModel, externalLibrary.getInternalName()); + registerPaths(externalLibrary.isUnresolved(), roots, excludedPaths, libraryModel, externalLibrary.getInternalName()); } } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java index 243b1e001188..71d5e08937d5 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java @@ -209,7 +209,8 @@ public class LibraryDependencyDataService extends AbstractDependencyDataService< final LibraryData libraryDependencyDataTarget = libraryDependencyData.getTarget(); Map> files = ProjectDataService.EP_NAME.findExtensionOrFail(LibraryDataService.class) .prepareLibraryFiles(libraryDependencyDataTarget); - LibraryDataService.registerPaths(libraryDependencyDataTarget.isUnresolved(), files, libraryModel, libraryName); + Set excludedPaths = libraryDependencyDataTarget.getPaths(LibraryPathType.EXCLUDED); + LibraryDataService.registerPaths(libraryDependencyDataTarget.isUnresolved(), files, excludedPaths, libraryModel, libraryName); LibraryOrderEntry orderEntry = findLibraryOrderEntry(moduleRootModel, library, libraryDependencyData.getScope()); assert orderEntry != null; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java index e1d9f484e1c4..8c20222043a4 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java @@ -757,6 +757,10 @@ public class GradleProjectResolverUtil { for (File file: ((FileCollectionDependency)mergedDependency).getFiles()) { library.addPath(LibraryPathType.BINARY, file.getAbsolutePath()); + if (mergedDependency instanceof DefaultFileCollectionDependency && + ((DefaultFileCollectionDependency)mergedDependency).isExcludedFromIndexing()) { + library.addPath(LibraryPathType.EXCLUDED, file.getAbsolutePath()); + } } ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData); diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java index 4a22b128e341..abe3e01b7cc7 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java @@ -14,6 +14,7 @@ import com.intellij.openapi.externalSystem.service.notification.ExternalSystemPr import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; @@ -581,8 +582,37 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase { assertModules("project", "project.main", "project.test"); final String path = path("build/generated-resources/main"); final String depName = PathUtil.toPresentableUrl(path); - assertModuleLibDep("project.main", depName, "file://" + path); + String root = "file://" + path; + assertModuleLibDep("project.main", depName, root); assertModuleLibDepScope("project.main", depName, DependencyScope.RUNTIME); + + String[] excludedRoots = isNewDependencyResolutionApplicable() ? new String[]{root} : ArrayUtil.EMPTY_STRING_ARRAY; + assertLibraryExcludedRoots("project.main", depName, excludedRoots); + + VirtualFile depJar = createProjectJarSubFile("lib/dep.jar"); + importProject( + "apply plugin: 'java'\n" + + "sourceSets.main.output.dir file(\"$buildDir/generated-resources/main\")\n" + + "dependencies {\n" + + " runtime 'junit:junit:4.11'\n" + + " runtime files('lib/dep.jar')\n" + + "}\n" + ); + + assertLibraryExcludedRoots("project.main", depName, excludedRoots); + assertLibraryExcludedRoots("project.main", depJar.getPresentableUrl(), ArrayUtil.EMPTY_STRING_ARRAY); + assertLibraryExcludedRoots("project.main", "Gradle: junit:junit:4.11", ArrayUtil.EMPTY_STRING_ARRAY); + } + + private void assertLibraryExcludedRoots(String moduleName, String depName, String ... roots) { + List deps = getModuleLibDeps(moduleName, depName); + assertThat(deps).hasSize(1); + LibraryEx library = (LibraryEx)deps.get(0).getLibrary(); + + assertThat(library.getUrls(OrderRootType.CLASSES)).hasSize(1); + + String[] excludedRootUrls = library.getExcludedRootUrls(); + assertThat(excludedRootUrls).containsExactly(roots); } @Test diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultFileCollectionDependency.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultFileCollectionDependency.java index 5d8ba8baa9fc..0768fa04587c 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultFileCollectionDependency.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultFileCollectionDependency.java @@ -2,6 +2,7 @@ package org.jetbrains.plugins.gradle.model; import org.gradle.internal.impldep.com.google.common.base.Objects; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.DefaultExternalDependencyId; import org.jetbrains.plugins.gradle.tooling.util.BooleanBiFunction; @@ -15,6 +16,7 @@ public final class DefaultFileCollectionDependency extends AbstractExternalDepen private static final long serialVersionUID = 1L; private final Collection files; + private boolean excludedFromIndexing; public DefaultFileCollectionDependency() { this(new ArrayList()); @@ -36,6 +38,16 @@ public final class DefaultFileCollectionDependency extends AbstractExternalDepen return files; } + @ApiStatus.Experimental + public boolean isExcludedFromIndexing() { + return excludedFromIndexing; + } + + @ApiStatus.Experimental + public void setExcludedFromIndexing(boolean excludedFromIndexing) { + this.excludedFromIndexing = excludedFromIndexing; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/serialization/ExternalProjectSerializationService.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/serialization/ExternalProjectSerializationService.java index 768e4c8faa50..6833062ec4ee 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/serialization/ExternalProjectSerializationService.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/serialization/ExternalProjectSerializationService.java @@ -297,6 +297,9 @@ public class ExternalProjectSerializationService implements SerializationService writer.writeString(FileCollectionDependency.class.getSimpleName()); writeDependencyCommonFields(writer, context, dependency); writeFiles(writer, "files", dependency.getFiles()); + if (dependency instanceof DefaultFileCollectionDependency) { + writeBoolean(writer, "excludedFromIndexing", ((DefaultFileCollectionDependency)dependency).isExcludedFromIndexing()); + } } writer.stepOut(); } @@ -629,6 +632,7 @@ public class ExternalProjectSerializationService implements SerializationService else if (externalDependency instanceof DefaultFileCollectionDependency) { DefaultFileCollectionDependency fileCollectionDependency = (DefaultFileCollectionDependency)externalDependency; fileCollectionDependency.getFiles().addAll(readFiles(reader)); + fileCollectionDependency.setExcludedFromIndexing(readBoolean(reader, "excludedFromIndexing")); } else if (externalDependency instanceof DefaultUnresolvedExternalDependency) { DefaultUnresolvedExternalDependency unresolvedExternalDependency = (DefaultUnresolvedExternalDependency)externalDependency; diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java index ffbb2d649097..7af1be4368e6 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java @@ -458,6 +458,7 @@ public class DependencyResolverImpl implements DependencyResolver { if (!runtimeOutputDirs.isEmpty()) { DefaultFileCollectionDependency runtimeOutputDirsDependency = new DefaultFileCollectionDependency(runtimeOutputDirs); runtimeOutputDirsDependency.setScope(RUNTIME_SCOPE); + runtimeOutputDirsDependency.setExcludedFromIndexing(true); return runtimeOutputDirsDependency; } return null;