| // 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 static com.google.devtools.build.lib.rules.java.JavaInfo.nullIfNone; |
| |
| import com.google.auto.value.AutoValue; |
| import com.google.common.collect.ImmutableList; |
| import com.google.devtools.build.lib.actions.Artifact; |
| import com.google.devtools.build.lib.collect.nestedset.Depset; |
| 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 com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; |
| import com.google.devtools.build.lib.packages.StructImpl; |
| import com.google.devtools.build.lib.rules.java.JavaInfo.JavaInfoInternalProvider; |
| import com.google.devtools.build.lib.starlarkbuildapi.java.JavaAnnotationProcessingApi; |
| import java.util.List; |
| import javax.annotation.Nullable; |
| import net.starlark.java.eval.EvalException; |
| import net.starlark.java.eval.Sequence; |
| import net.starlark.java.eval.Starlark; |
| |
| /** The collection of gen jars from the transitive closure. */ |
| public interface JavaGenJarsProvider |
| extends JavaInfoInternalProvider, JavaAnnotationProcessingApi<Artifact> { |
| |
| JavaGenJarsProvider EMPTY = |
| new AutoValue_JavaGenJarsProvider_NativeJavaGenJarsProvider( |
| false, |
| null, |
| null, |
| NestedSetBuilder.emptySet(Order.STABLE_ORDER), |
| NestedSetBuilder.emptySet(Order.STABLE_ORDER), |
| NestedSetBuilder.emptySet(Order.STABLE_ORDER), |
| NestedSetBuilder.emptySet(Order.STABLE_ORDER)); |
| |
| static JavaGenJarsProvider create( |
| boolean usesAnnotationProcessing, |
| @Nullable Artifact genClassJar, |
| @Nullable Artifact genSourceJar, |
| JavaPluginInfo plugins, |
| List<JavaGenJarsProvider> transitiveJavaGenJars) |
| throws RuleErrorException { |
| if (!usesAnnotationProcessing |
| && genClassJar == null |
| && genSourceJar == null |
| && plugins.isEmpty() |
| && transitiveJavaGenJars.isEmpty()) { |
| return EMPTY; |
| } |
| |
| NestedSetBuilder<Artifact> classJarsBuilder = NestedSetBuilder.stableOrder(); |
| NestedSetBuilder<Artifact> sourceJarsBuilder = NestedSetBuilder.stableOrder(); |
| |
| if (genClassJar != null) { |
| classJarsBuilder.add(genClassJar); |
| } |
| if (genSourceJar != null) { |
| sourceJarsBuilder.add(genSourceJar); |
| } |
| for (JavaGenJarsProvider dep : transitiveJavaGenJars) { |
| classJarsBuilder.addTransitive(dep.getTransitiveGenClassJars()); |
| sourceJarsBuilder.addTransitive(dep.getTransitiveGenSourceJars()); |
| } |
| return new AutoValue_JavaGenJarsProvider_NativeJavaGenJarsProvider( |
| usesAnnotationProcessing, |
| genClassJar, |
| genSourceJar, |
| plugins.plugins().processorClasspath(), |
| plugins.plugins().processorClasses(), |
| classJarsBuilder.build(), |
| sourceJarsBuilder.build()); |
| } |
| |
| static JavaGenJarsProvider from(Object obj) throws EvalException { |
| if (obj == null || obj == Starlark.NONE) { |
| return EMPTY; |
| } else if (obj instanceof JavaGenJarsProvider) { |
| return (JavaGenJarsProvider) obj; |
| } else if (obj instanceof StructImpl struct) { |
| return new AutoValue_JavaGenJarsProvider_NativeJavaGenJarsProvider( |
| struct.getValue("enabled", Boolean.class), |
| nullIfNone(struct.getValue("class_jar"), Artifact.class), |
| nullIfNone(struct.getValue("source_jar"), Artifact.class), |
| Depset.cast( |
| struct.getValue("processor_classpath"), Artifact.class, "processor_classpath"), |
| NestedSetBuilder.wrap( |
| Order.NAIVE_LINK_ORDER, |
| Sequence.cast( |
| struct.getValue("processor_classnames"), String.class, "processor_classnames")), |
| Depset.cast( |
| struct.getValue("transitive_class_jars"), Artifact.class, "transitive_class_jars"), |
| Depset.cast( |
| struct.getValue("transitive_source_jars"), Artifact.class, "transitive_source_jars")); |
| } |
| throw Starlark.errorf("wanted JavaGenJarsProvider, got %s", Starlark.type(obj)); |
| } |
| |
| default boolean isEmpty() throws EvalException, RuleErrorException { |
| return !usesAnnotationProcessing() |
| && getGenClassJar() == null |
| && getGenSourceJar() == null |
| && getTransitiveGenClassJars().isEmpty() |
| && getTransitiveGenSourceJars().isEmpty(); |
| } |
| |
| NestedSet<Artifact> getTransitiveGenClassJars() throws RuleErrorException; |
| |
| NestedSet<Artifact> getTransitiveGenSourceJars() throws RuleErrorException; |
| |
| NestedSet<Artifact> getProcessorClasspath() throws EvalException; |
| |
| /** Natively constructed JavaGenJarsProvider */ |
| @Immutable |
| @AutoValue |
| abstract class NativeJavaGenJarsProvider implements JavaGenJarsProvider { |
| |
| @Override |
| public boolean isImmutable() { |
| return true; |
| } |
| |
| @Override |
| public abstract boolean usesAnnotationProcessing(); |
| |
| @Nullable |
| @Override |
| public abstract Artifact getGenClassJar(); |
| |
| @Nullable |
| @Override |
| public abstract Artifact getGenSourceJar(); |
| |
| @Override |
| public abstract NestedSet<Artifact> getProcessorClasspath(); |
| |
| public abstract NestedSet<String> getProcessorClassnames(); |
| |
| @Override |
| public abstract NestedSet<Artifact> getTransitiveGenClassJars(); |
| |
| @Override |
| public abstract NestedSet<Artifact> getTransitiveGenSourceJars(); |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveGenClassJarsForStarlark() { |
| return Depset.of(Artifact.class, getTransitiveGenClassJars()); |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getTransitiveGenSourceJarsForStarlark() { |
| return Depset.of(Artifact.class, getTransitiveGenSourceJars()); |
| } |
| |
| @Override |
| public Depset /*<Artifact>*/ getProcessorClasspathForStarlark() { |
| return Depset.of(Artifact.class, getProcessorClasspath()); |
| } |
| |
| @Override |
| public ImmutableList<String> getProcessorClassNamesList() { |
| return getProcessorClassnames().toList(); |
| } |
| } |
| } |