// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.rules.java; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import java.util.Map; import javax.annotation.Nullable; /** * An object that provides information about API versions used by a proto library. */ @Immutable @AutoValue public abstract class ProtoJavaApiInfoProvider implements TransitiveInfoProvider { public static ProtoJavaApiInfoProvider create( JavaCompilationArgs javaCompilationContext, JavaCompilationArgs transitiveJavaCompilationArgs, JavaCompilationArgs transitiveJavaRpcLibs, JavaCompilationArgs transitiveJavaCompilationArgss1, JavaCompilationArgs transitiveJavaCompilationArgssMutable, JavaCompilationArgs transitiveJavaCompilationArgssImmutable, JavaCompilationArgs javaCompilationArgs1, JavaCompilationArgs javaCompilationArgsMutable, JavaCompilationArgs javaCompilationArgsImmutable, Artifact sourceJar1, Artifact sourceJarMutable, Artifact sourceJarImmutable, ImmutableList<JavaCompilationArgsProvider> protoRuntime1, ImmutableList<JavaCompilationArgsProvider> protoRuntimeMutable, ImmutableList<JavaCompilationArgsProvider> protoRuntimeImmutable, Map<Artifact, Artifact> compileTimeJarToRuntimeJar, boolean mixedApiVersions, int apiVersion, boolean supportsProto1, boolean supportsProto2Mutable, boolean hasProto1OnlyDependency) { return new AutoValue_ProtoJavaApiInfoProvider( javaCompilationContext, transitiveJavaCompilationArgs, transitiveJavaRpcLibs, transitiveJavaCompilationArgss1, transitiveJavaCompilationArgssMutable, transitiveJavaCompilationArgssImmutable, javaCompilationArgs1, javaCompilationArgsMutable, javaCompilationArgsImmutable, sourceJar1, sourceJarMutable, sourceJarImmutable, protoRuntime1, protoRuntimeMutable, protoRuntimeImmutable, mixedApiVersions, apiVersion, supportsProto1, supportsProto2Mutable, hasProto1OnlyDependency, ImmutableMap.copyOf(compileTimeJarToRuntimeJar)); } /** * Returns the Java artifacts created for this target. This method should only be called on * recursive visitations if {@code hasProtoLibraryShellInDeps()} returns {@code false}. */ // TODO(bazel-team): this is mostly used by the tests public abstract JavaCompilationArgs getJavaCompilationContext(); /** * Returns the the transitive Java artifacts created for this target. */ // TODO(bazel-team): this is mostly used by the tests public abstract JavaCompilationArgs getTransitiveJavaCompilationArgs(); /** * Returns the Java RPC library if any dependencies need it, null otherwise. */ public abstract JavaCompilationArgs getTransitiveJavaRpcLibs(); /** * Returns the artifacts for java compilation (API version 1) from the transitive * closure (excluding this target). */ public abstract JavaCompilationArgs getTransitiveJavaCompilationArgs1(); /** * Returns the artifacts for java compilation (API version 2, code for mutable API) * from the transitive closure (excluding this target). */ public abstract JavaCompilationArgs getTransitiveJavaCompilationArgsMutable(); /** * Returns the artifacts for java compilation (API version 2, code for immutable API) * from the transitive closure (excluding this target). */ public abstract JavaCompilationArgs getTransitiveJavaCompilationArgsImmutable(); /** * Returns the artifacts for java compilation (API version 1) for only this target. */ public abstract JavaCompilationArgs getJavaCompilationArgs1(); /** * Returns the artifacts for java compilation (API version 2, code for mutable API) * for only this target. */ public abstract JavaCompilationArgs getJavaCompilationArgsMutable(); /** * Returns the artifacts for java compilation (API version 2, code for immutable API) * for only this target. */ public abstract JavaCompilationArgs getJavaCompilationArgsImmutable(); // The following 3 fields are the -src.jar artifact created by proto_library. If a certain // proto_library does not produce some artifact, it'll be null. This can happen for example when // there are no srcs, or when a certain combination of attributes results in "mutable" not being // produced. @Nullable public abstract Artifact sourceJar1(); @Nullable public abstract Artifact sourceJarMutable(); @Nullable public abstract Artifact sourceJarImmutable(); // The following 3 fields are the jars that proto_library got from the proto runtime, including // Stubby. Different flavors can have different runtimes. If a certain proto_library does not // produce some artifact, it'll be null. This can happen for example when a certain combination of // attributes results in "mutable" not being produced. @Nullable public abstract ImmutableList<JavaCompilationArgsProvider> getProtoRuntime1(); @Nullable public abstract ImmutableList<JavaCompilationArgsProvider> getProtoRuntimeMutable(); @Nullable public abstract ImmutableList<JavaCompilationArgsProvider> getProtoRuntimeImmutable(); /** * Returns true if the transitive closure contains libraries with API versions other than the one * specified in this target. Building in mixed mode will add implicit deps for all the api_version * and might generate adapter code that has some runtime overhead. */ public abstract boolean hasMixedApiVersions(); /** Returns the API version. */ public abstract int getApiVersion(); /** * Returns true if this target support proto1 API. */ public abstract boolean supportsProto1(); /** * Returns true if this target support proto2 mutable API. */ public abstract boolean supportsProto2Mutable(); /** * Returns true if this target has a dependency (can be recursively) that only * supports proto1 API but not proto2 mutable API. */ public abstract boolean hasProto1OnlyDependency(); /** * Returns the runtime jar artifact output created by this proto_libary rule. */ public Artifact getRuntimeJarFor(Artifact compileTimeJar) { return getCompileTimeJarToRuntimeJar().get(compileTimeJar); } abstract ImmutableMap<Artifact, Artifact> getCompileTimeJarToRuntimeJar(); }