From fca3d391161ae4c92cf289a897db2a1c69a9b334 Mon Sep 17 00:00:00 2001 From: dbabkin Date: Thu, 18 Jan 2018 02:46:28 -0800 Subject: Create function createJavaInfo with new API. Implement JavaExportsProvider. Added tests for checking JavaExportsProvider state. Refactored logic working with collection in favor of using Streams to improve readability. All other providers will be implemented in next CLs. previous CL with JavaCompilationArgsProvider implementation is https://github.com/bazelbuild/bazel/commit/32dff21d00ad7d1bdf50e8761d675a6e7e002de9, JavaSourceJarsProvider : https://github.com/bazelbuild/bazel/commit/5bd53cb609480ca896ca2d011f415b424c63ce63 RELNOTES:none PiperOrigin-RevId: 182342490 --- scripts/bootstrap/compile.sh | 2 +- src/create_embedded_tools.py | 4 +- .../rules/java/JavaCompilationArgsProvider.java | 8 +- .../build/lib/rules/java/JavaInfoBuildHelper.java | 125 +++--- .../build/lib/rules/java/JavaSkylarkApiTest.java | 417 +++++++++++++-------- src/test/shell/testenv.sh | 4 +- 6 files changed, 346 insertions(+), 214 deletions(-) diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh index 3fbd6333a8..c7b26ccc72 100755 --- a/scripts/bootstrap/compile.sh +++ b/scripts/bootstrap/compile.sh @@ -17,7 +17,7 @@ # Script for building bazel from scratch without bazel PROTO_FILES=$(ls src/main/protobuf/*.proto src/main/java/com/google/devtools/build/lib/buildeventstream/proto/*.proto) -LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ") +LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv /javac-9-dev-r3297-4.jar | grep -Fv /javac-9-dev-4023-3.jar | grep -Fv /javac7.jar | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ") GRPC_JAVA_VERSION=1.7.0 GRPC_LIBRARY_JARS=$(find third_party/grpc -name '*.jar' | grep -e ".*${GRPC_JAVA_VERSION}.*jar" | tr "\n" " ") GUAVA_VERSION=23.1 diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py index 352069c411..17d747fafc 100644 --- a/src/create_embedded_tools.py +++ b/src/create_embedded_tools.py @@ -35,8 +35,8 @@ output_paths = [ ('*JacocoCoverage*_deploy.jar', lambda x: 'tools/jdk/JacocoCoverage_deploy.jar'), ('*turbine_deploy.jar', lambda x: 'tools/jdk/turbine_deploy.jar'), - ('*javac-9+181-r4173-1.jar', - lambda x: 'third_party/java/jdk/langtools/javac-9+181-r4173-1.jar'), + ('*javac-9-dev-r4023-3.jar', + lambda x: 'third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar'), ('*SingleJar_deploy.jar', lambda x: 'tools/jdk/singlejar/SingleJar_deploy.jar'), ('*GenClass_deploy.jar', lambda x: 'tools/jdk/GenClass_deploy.jar'), diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java index d93f4dba1e..34b0ddb17c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java @@ -15,13 +15,14 @@ package com.google.devtools.build.lib.rules.java; import com.google.auto.value.AutoValue; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import java.util.List; +import java.util.Collection; /** * An interface for objects that provide information on how to include them in @@ -87,9 +88,10 @@ public abstract class JavaCompilationArgsProvider implements TransitiveInfoProvi */ public abstract NestedSet getRunTimeJavaDependencyArtifacts(); - public static JavaCompilationArgsProvider merge(List providers) { + public static JavaCompilationArgsProvider merge( + Collection providers) { if (providers.size() == 1) { - return providers.get(0); + return Iterables.get(providers, 0); } JavaCompilationArgs.Builder javaCompilationArgs = JavaCompilationArgs.builder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java index 38c25b1c18..3abd390817 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java @@ -13,22 +13,25 @@ // limitations under the License. package com.google.devtools.build.lib.rules.java; +import static com.google.common.collect.Iterables.concat; import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH; import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.COMPILE_ONLY; import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.RUNTIME_ONLY; +import static java.util.stream.Stream.concat; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.Runfiles; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode; import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory; import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -39,6 +42,9 @@ import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.syntax.SkylarkType; import com.google.devtools.build.lib.vfs.FileSystemUtils; import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; import javax.annotation.Nullable; /** Implements logic for creating JavaInfo from different set of input parameters. */ @@ -71,7 +77,7 @@ final class JavaInfoBuildHelper { * @return new created JavaInfo instance * @throws EvalException if some mandatory parameter are missing */ - // TODO(b/69780248) only populates JavaInfo with JavaCompilationArgsProvider. See #3769 + // TODO(b/69780248): only populates JavaInfo with JavaCompilationArgsProvider. See #3769 public JavaInfo createJavaInfo( Artifact outputJar, SkylarkList sourceFiles, @@ -80,7 +86,7 @@ final class JavaInfoBuildHelper { Boolean neverlink, SkylarkList compileTimeDeps, SkylarkList runtimeDeps, - SkylarkList exports, // TODO(b/69780248) handle exports. See #3769 + SkylarkList exports, // TODO(b/69780248): handle exports. See #3769 Object action, Object javaToolchain, Location location) @@ -108,44 +114,90 @@ final class JavaInfoBuildHelper { JavaCompilationArgs.Builder recursiveJavaCompilationArgsBuilder = JavaCompilationArgs.Builder.copyOf(javaCompilationArgsBuilder); - ClasspathType type = neverlink ? COMPILE_ONLY : BOTH; - recursiveJavaCompilationArgsBuilder.addTransitiveArgs( - fetchAggregatedRecursiveJavaCompilationArgsFromProvider(compileTimeDeps), type); - recursiveJavaCompilationArgsBuilder.addTransitiveArgs( - fetchAggregatedRecursiveJavaCompilationArgsFromProvider(runtimeDeps), RUNTIME_ONLY); + fetchProviders(exports, JavaCompilationArgsProvider.class) + .map(JavaCompilationArgsProvider::getJavaCompilationArgs) + .forEach(args->javaCompilationArgsBuilder.addTransitiveArgs(args, type)); + + fetchProviders(concat(exports, compileTimeDeps), JavaCompilationArgsProvider.class) + .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs) + .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, type)); - javaInfoBuilder.addProvider( - JavaCompilationArgsProvider.class, + fetchProviders(runtimeDeps, JavaCompilationArgsProvider.class) + .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs) + .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, RUNTIME_ONLY)); + + javaInfoBuilder.addProvider(JavaCompilationArgsProvider.class, JavaCompilationArgsProvider.create( javaCompilationArgsBuilder.build(), recursiveJavaCompilationArgsBuilder.build())); + javaInfoBuilder.addProvider(JavaExportsProvider.class, createJavaExportsProvider(exports)); + + javaInfoBuilder.addProvider(JavaSourceJarsProvider.class, + createJavaSourceJarsProvider(sourceJars, concat(compileTimeDeps, runtimeDeps, exports))); + + // TODO(b/69780248): add other providers. See #3769 + + return javaInfoBuilder.build(); + } + + private JavaSourceJarsProvider createJavaSourceJarsProvider( + Iterable sourceJars, Iterable transitiveDeps) { NestedSetBuilder transitiveSourceJars = NestedSetBuilder.stableOrder(); + transitiveSourceJars.addAll(sourceJars); - addSourceJars(transitiveSourceJars, Iterables.concat(compileTimeDeps, runtimeDeps)); - javaInfoBuilder.addProvider( - JavaSourceJarsProvider.class, - JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars)); + fetchSourceJars(transitiveDeps) + .forEach(transitiveSourceJars::addTransitive); - // TODO(b/69780248) add other providers. See #3769 + return JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars); + } - return javaInfoBuilder.build(); + private Iterable> fetchSourceJars(Iterable javaInfos) { + Stream> sourceJars = + fetchProviders(javaInfos, JavaSourceJarsProvider.class) + .map(JavaSourceJarsProvider::getSourceJars) + .map(sourceJarsList -> NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJarsList)); + + Stream> transitiveSourceJars = + fetchProviders(javaInfos, JavaSourceJarsProvider.class) + .map(JavaSourceJarsProvider::getTransitiveSourceJars); + + return concat(sourceJars, transitiveSourceJars)::iterator; + } + + /** + * Returns Stream of not null Providers. + * + * Gets Stream from dependencies, transforms to Provider defined by providerClass param + * and filters nulls. + * + * @see JavaInfo#merge(List) + */ + private

Stream

fetchProviders(Iterable javaInfos, + Class

providerClass){ + return StreamSupport.stream(javaInfos.spliterator(), /*parallel=*/ false) + .map(javaInfo -> javaInfo.getProvider(providerClass)) + .filter(Objects::nonNull); } + private JavaExportsProvider createJavaExportsProvider(Iterable javaInfos) { + NestedSet