collect configuration files only once during deps resolution

This commit is contained in:
Nikita Skvortsov
2018-05-23 09:55:07 +03:00
parent e29125ee7b
commit 2d30075d48
3 changed files with 40 additions and 13 deletions
@@ -9,6 +9,9 @@ import org.jetbrains.plugins.gradle.model.ExternalDependency;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CompileDependenciesProvider {
public static final String SCOPE = "COMPILE";
@@ -21,26 +24,39 @@ public class CompileDependenciesProvider {
private Configuration myCompileOnlyConfiguration;
private Collection<ExternalDependency> myDependencies;
private Collection<File> myFiles;
private final Map<Configuration, Set<File>> myConfigurationFilesCache = new HashMap<Configuration, Set<File>>();
public CompileDependenciesProvider(SourceSet sourceSet, Project project) {
mySourceSet = sourceSet;
myProject = project;
}
public Configuration getDeprecatedCompileConfiguration() {
return myConfiguration;
public Set<File> getDeprecatedCompileConfigurationFiles() {
return getFilesFromCache(myConfiguration);
}
public Configuration getCompileClasspathConfiguration() {
return myCompileClasspathConfiguration;
}
public Configuration getCompileConfiguration() {
return myCompileConfiguration;
public Set<File> getCompileConfigurationFiles() {
return getFilesFromCache(myCompileConfiguration);
}
public Configuration getCompileOnlyConfiguration() {
return myCompileOnlyConfiguration;
public Set<File> getCompileOnlyConfigurationFiles() {
return getFilesFromCache(myCompileOnlyConfiguration);
}
private Set<File> getFilesFromCache(Configuration key) {
if (key == null) {
return null;
}
Set<File> cached = myConfigurationFilesCache.get(key);
if (cached == null) {
cached = key.getFiles();
myConfigurationFilesCache.put(key, cached);
}
return cached;
}
public Collection<ExternalDependency> getDependencies() {
@@ -476,25 +476,27 @@ public class DependencyResolverImpl implements DependencyResolver {
@NotNull final RuntimeDependenciesProvider runtimeDependenciesProvider,
@NotNull final AbstractExternalDependency dep) {
Collection<File> resolvedFiles = getFiles(dep);
Configuration compileOnlyConfiguration = compileDependenciesProvider.getCompileOnlyConfiguration();
Configuration deprecatedCompileConfiguration = compileDependenciesProvider.getDeprecatedCompileConfiguration();
Configuration compileConfiguration = compileDependenciesProvider.getCompileConfiguration();
boolean checkCompileOnlyDeps = compileDependenciesProvider.getCompileClasspathConfiguration() != null;
final Set<File> compileConfigurationFiles = compileDependenciesProvider.getCompileConfigurationFiles();
final Set<File> compileOnlyConfigurationFiles = compileDependenciesProvider.getCompileOnlyConfigurationFiles();
final Set<File> deprecatedCompileConfigurationFiles = compileDependenciesProvider.getDeprecatedCompileConfigurationFiles();
final Set<File> runtimeConfigurationFiles = runtimeDependenciesProvider.getConfigurationFiles();
// since version 3.4 compileOnly no longer extends compile
// so, we can use compileOnly configuration for the check
if (isJavaLibraryPluginSupported) {
if (compileOnlyConfiguration != null && containsAll(compileOnlyConfiguration, resolvedFiles)) {
if (compileOnlyConfigurationFiles != null && compileOnlyConfigurationFiles.containsAll(resolvedFiles)) {
// deprecated 'compile' configuration still can be used
if (deprecatedCompileConfiguration == null || !containsAll(deprecatedCompileConfiguration, resolvedFiles)) {
if (deprecatedCompileConfigurationFiles == null || !deprecatedCompileConfigurationFiles.containsAll(resolvedFiles)) {
dep.setScope(PROVIDED_SCOPE);
}
}
}
else {
if (checkCompileOnlyDeps
&& !containsAll(compileConfiguration, resolvedFiles)
&& !containsAll(runtimeDependenciesProvider.getConfiguration(), resolvedFiles)) {
&& !compileConfigurationFiles.containsAll(resolvedFiles)
&& !runtimeConfigurationFiles.containsAll(resolvedFiles)) {
dep.setScope(PROVIDED_SCOPE);
}
}
@@ -7,6 +7,7 @@ import org.jetbrains.plugins.gradle.model.ExternalDependency;
import java.io.File;
import java.util.Collection;
import java.util.Set;
public class RuntimeDependenciesProvider {
public static final String SCOPE = "RUNTIME";
@@ -16,6 +17,7 @@ public class RuntimeDependenciesProvider {
private Configuration myConfiguration;
private Collection<ExternalDependency> myDependencies;
private Collection<File> myFiles;
private Set<File> myConfigurationFiles = null;
public RuntimeDependenciesProvider(SourceSet sourceSet,
Project project) {
@@ -27,6 +29,13 @@ public class RuntimeDependenciesProvider {
return myConfiguration;
}
public Set<File> getConfigurationFiles() {
if (myConfigurationFiles == null) {
myConfigurationFiles = myConfiguration.getFiles();
}
return myConfigurationFiles;
}
public Collection<ExternalDependency> getDependencies() {
return myDependencies;
}