blob: 585c013bb575249c65d00862be40cc5884854d56 [file] [log] [blame]
// Copyright 2018 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.android.databinding;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.rules.android.AndroidDataContext;
import com.google.devtools.build.lib.rules.android.AndroidResources;
import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
/** Contains Android Databinding configuration and resource generation information. */
public interface DataBindingContext {
/**
* Returns the file where data binding's resource processing produces binding xml. For example,
* given:
*
* <pre>{@code
* <layout>
* <data>
* <variable name="foo" type="String" />
* </data>
* </layout>
* <LinearLayout>
* ...
* </LinearLayout>
* }</pre>
*
* <p>data binding strips out and processes this part:
*
* <pre>{@code
* <data>
* <variable name="foo" type="String" />
* </data>
* }</pre>
*
* for each layout file with data binding expressions. Since this may produce multiple files,
* outputs are zipped up into a single container.
*/
void supplyLayoutInfo(Consumer<Artifact> consumer);
/** The javac flags that are needed to configure data binding's annotation processor. */
void supplyJavaCoptsUsing(
RuleContext ruleContext,
boolean isBinary,
Consumer<Iterable<String>> consumer);
/**
* Adds data binding's annotation processor as a plugin to the given Java compilation context.
*
* <p>This extends the Java compilation to translate data binding .xml into corresponding
* classes.
*
* The BiConsumer accepts as its first argument the JavaPluginInfoProvider, and the list of
* outputs of the processor as the second argument.
*/
void supplyAnnotationProcessor(
RuleContext ruleContext,
BiConsumer<JavaPluginInfoProvider, Iterable<Artifact>> consumer);
/**
* Processes deps that also apply data binding.
*
* @param ruleContext the current rule
* @param isBinary whether this rule is a "binary" rule (i.e., top-level android rule)
* @return the deps' metadata outputs. These need to be staged as compilation inputs to the
* current rule.
*/
ImmutableList<Artifact> processDeps(RuleContext ruleContext, boolean isBinary);
/**
* Creates and adds the generated Java source for data binding annotation processor to read and
* translate layout info xml (from {@link #supplyLayoutInfo(Consumer)} into the classes that end
* user code consumes.
*
* <p>This triggers the annotation processor. Annotation processor settings are configured
* separately in {@link #supplyJavaCoptsUsing(RuleContext, boolean, Consumer)}.
*/
ImmutableList<Artifact> getAnnotationSourceFiles(RuleContext ruleContext);
/**
* Adds the appropriate {@link UsesDataBindingProvider} for a rule if it should expose one.
*
* <p>A rule exposes {@link UsesDataBindingProvider} if either it or its deps set {@code
* enable_data_binding = 1}.
*/
void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext);
/**
* Process the given Android Resources for databinding. In databinding v2, this strips out the
* databinding and generates the layout info file.
*/
AndroidResources processResources(
AndroidDataContext dataContext,
AndroidResources resources,
String appId);
/** Returns whether this context supports generating AndroidX dependencies. */
boolean usesAndroidX();
}