Skip to content

Commit

Permalink
Add Data marker interface for transition factories.
Browse files Browse the repository at this point in the history
Part of the fix for #13751.

Closes #13754.

PiperOrigin-RevId: 387161899
  • Loading branch information
katre authored and copybara-github committed Jul 27, 2021
1 parent 525227e commit 59d28ad
Show file tree
Hide file tree
Showing 11 changed files with 50 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,21 +62,22 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
}

/** Returns a {@link TransitionFactory} instance that generates the host transition. */
public static <T> TransitionFactory<T> createFactory() {
public static <T extends TransitionFactory.Data> TransitionFactory<T> createFactory() {
return new AutoValue_HostTransition_Factory<>();
}

/**
* Returns {@code true} if the given {@link TransitionFactory} is an instance of the host
* transition.
*/
public static <T> boolean isInstance(TransitionFactory<T> instance) {
public static <T extends TransitionFactory.Data> boolean isInstance(
TransitionFactory<T> instance) {
return instance instanceof Factory;
}

/** A {@link TransitionFactory} implementation that generates the host transition. */
@AutoValue
abstract static class Factory<T> implements TransitionFactory<T> {
abstract static class Factory<T extends TransitionFactory.Data> implements TransitionFactory<T> {
@Override
public PatchTransition create(T unused) {
return INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public final class TransitionFactories {
private TransitionFactories() {}

/** Returns a {@link TransitionFactory} that wraps a static transition. */
public static <T> TransitionFactory<T> of(ConfigurationTransition transition) {
public static <T extends TransitionFactory.Data> TransitionFactory<T> of(
ConfigurationTransition transition) {
if (transition instanceof HostTransition) {
return HostTransition.createFactory();
} else if (transition instanceof NoTransition) {
Expand All @@ -42,13 +43,15 @@ public static <T> TransitionFactory<T> of(ConfigurationTransition transition) {
}

/** Returns a {@link TransitionFactory} that wraps a static split transition. */
public static <T> TransitionFactory<T> split(SplitTransition splitTransition) {
public static <T extends TransitionFactory.Data> TransitionFactory<T> split(
SplitTransition splitTransition) {
return new AutoValue_TransitionFactories_SplitTransitionFactory<T>(splitTransition);
}

/** A {@link TransitionFactory} implementation that wraps a static transition. */
@AutoValue
abstract static class IdentityFactory<T> implements TransitionFactory<T> {
abstract static class IdentityFactory<T extends TransitionFactory.Data>
implements TransitionFactory<T> {

abstract ConfigurationTransition transition();

Expand All @@ -60,7 +63,8 @@ public ConfigurationTransition create(T data) {

/** A {@link TransitionFactory} implementation that wraps a split transition. */
@AutoValue
abstract static class SplitTransitionFactory<T> implements TransitionFactory<T> {
abstract static class SplitTransitionFactory<T extends TransitionFactory.Data>
implements TransitionFactory<T> {
abstract SplitTransition splitTransition();

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
* </pre>
*/
@AutoValue
public abstract class ComposingTransitionFactory<T> implements TransitionFactory<T> {
public abstract class ComposingTransitionFactory<T extends TransitionFactory.Data>
implements TransitionFactory<T> {

/**
* Creates a {@link ComposingTransitionFactory} that applies the given factories in sequence:
Expand All @@ -39,7 +40,7 @@ public abstract class ComposingTransitionFactory<T> implements TransitionFactory
* one of the transitions is {@link NoTransition} or the host transition, and returns an
* efficiently composed transition.
*/
public static <T> TransitionFactory<T> of(
public static <T extends TransitionFactory.Data> TransitionFactory<T> of(
TransitionFactory<T> transitionFactory1, TransitionFactory<T> transitionFactory2) {

Preconditions.checkNotNull(transitionFactory1);
Expand Down Expand Up @@ -71,11 +72,12 @@ public static <T> TransitionFactory<T> of(
return create(transitionFactory1, transitionFactory2);
}

private static <T> boolean isFinal(TransitionFactory<T> transitionFactory) {
private static <T extends TransitionFactory.Data> boolean isFinal(
TransitionFactory<T> transitionFactory) {
return NullTransition.isInstance(transitionFactory) || transitionFactory.isHost();
}

private static <T> TransitionFactory<T> create(
private static <T extends TransitionFactory.Data> TransitionFactory<T> create(
TransitionFactory<T> transitionFactory1, TransitionFactory<T> transitionFactory2) {
return new AutoValue_ComposingTransitionFactory<T>(transitionFactory1, transitionFactory2);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,22 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
}

/** Returns a {@link TransitionFactory} instance that generates the no transition. */
public static <T> TransitionFactory<T> createFactory() {
public static <T extends TransitionFactory.Data> TransitionFactory<T> createFactory() {
return new AutoValue_NoTransition_Factory<>();
}

/**
* Returns {@code true} if the given {@link TransitionFactory} is an instance of the no
* transition.
*/
public static <T> boolean isInstance(TransitionFactory<T> instance) {
public static <T extends TransitionFactory.Data> boolean isInstance(
TransitionFactory<T> instance) {
return instance instanceof Factory;
}

/** A {@link TransitionFactory} implementation that generates the no transition. */
@AutoValue
abstract static class Factory<T> implements TransitionFactory<T> {
abstract static class Factory<T extends TransitionFactory.Data> implements TransitionFactory<T> {
@Override
public ConfigurationTransition create(T unused) {
return INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,22 @@ public BuildOptions patch(BuildOptionsView options, EventHandler eventHandler) {
}

/** Returns a {@link TransitionFactory} instance that generates the null transition. */
public static <T> TransitionFactory<T> createFactory() {
public static <T extends TransitionFactory.Data> TransitionFactory<T> createFactory() {
return new AutoValue_NullTransition_Factory<>();
}

/**
* Returns {@code true} if the given {@link TransitionFactory} is an instance of the null
* transition.
*/
public static <T> boolean isInstance(TransitionFactory<T> instance) {
public static <T extends TransitionFactory.Data> boolean isInstance(
TransitionFactory<T> instance) {
return instance instanceof Factory;
}

/** A {@link TransitionFactory} implementation that generates the null transition. */
@AutoValue
abstract static class Factory<T> implements TransitionFactory<T> {
abstract static class Factory<T extends TransitionFactory.Data> implements TransitionFactory<T> {
@Override
public ConfigurationTransition create(T unused) {
return INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@
* @param <T> the type of data object passed to the {@link #create} method, used to create the
* actual {@link ConfigurationTransition} instance
*/
public interface TransitionFactory<T> {
public interface TransitionFactory<T extends TransitionFactory.Data> {

/** A marker interface for classes that provide data to TransitionFactory instances. */
interface Data {}

/** Returns a new {@link ConfigurationTransition}, based on the given data. */
ConfigurationTransition create(T data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.analysis.config.transitions.ComposingTransitionFactory;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleTransitionData;
import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagTransitionFactory;
import com.google.devtools.build.lib.rules.objc.AppleBinaryBaseRule;
import com.google.devtools.build.lib.rules.objc.AppleCrosstoolTransition;
Expand All @@ -39,7 +41,8 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env)
ImplicitOutputsFunction.fromFunctions(ObjcRuleClasses.LIPOBIN_OUTPUT))
.cfg(
ComposingTransitionFactory.of(
(rule) -> AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION,
(TransitionFactory<RuleTransitionData>)
(unused) -> AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION,
new ConfigFeatureFlagTransitionFactory("feature_flags")))
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@
package com.google.devtools.build.lib.packages;

import com.google.auto.value.AutoValue;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
import com.google.devtools.build.lib.cmdline.Label;
import javax.annotation.Nullable;

/**
* Helper class which contains data used by a {@link
* com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory} to create a
* transition for attributes.
* Helper class which contains data used by a {@link TransitionFactory} to create a transition for
* attributes.
*/
@AutoValue
public abstract class AttributeTransitionData {
public abstract class AttributeTransitionData implements TransitionFactory.Data {
/** Returns the {@link AttributeMap} which can be used to create a transition. */
public abstract AttributeMap attributes();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
package com.google.devtools.build.lib.packages;

import com.google.auto.value.AutoValue;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;

/**
* Helper class which contains data used by a {@link
* com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory} to create a
* transition for rules.
* Helper class which contains data used by a {@link TransitionFactory} to create a transition for
* rules.
*/
@AutoValue
public abstract class RuleTransitionData {
public abstract class RuleTransitionData implements TransitionFactory.Data {

public static RuleTransitionData create(Rule rule) {
return new AutoValue_RuleTransitionData(rule);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public class TransitionFactoriesTest {

@Test
public void hostTransition() {
TransitionFactory<Object> factory = TransitionFactories.of(HostTransition.INSTANCE);
TransitionFactory<TransitionFactory.Data> factory =
TransitionFactories.of(HostTransition.INSTANCE);
assertThat(factory).isNotNull();
assertThat(HostTransition.isInstance(factory)).isTrue();
assertThat(factory.isHost()).isTrue();
Expand All @@ -39,7 +40,8 @@ public void hostTransition() {

@Test
public void noTransition() {
TransitionFactory<Object> factory = TransitionFactories.of(NoTransition.INSTANCE);
TransitionFactory<TransitionFactory.Data> factory =
TransitionFactories.of(NoTransition.INSTANCE);
assertThat(factory).isNotNull();
assertThat(NoTransition.isInstance(factory)).isTrue();
assertThat(factory.isHost()).isFalse();
Expand All @@ -48,7 +50,8 @@ public void noTransition() {

@Test
public void nullTransition() {
TransitionFactory<Object> factory = TransitionFactories.of(NullTransition.INSTANCE);
TransitionFactory<TransitionFactory.Data> factory =
TransitionFactories.of(NullTransition.INSTANCE);
assertThat(factory).isNotNull();
assertThat(NullTransition.isInstance(factory)).isTrue();
assertThat(factory.isHost()).isFalse();
Expand All @@ -57,7 +60,7 @@ public void nullTransition() {

@Test
public void splitTransition() {
TransitionFactory<Object> factory =
TransitionFactory<TransitionFactory.Data> factory =
TransitionFactories.of(
(SplitTransition)
(buildOptions, eventHandler) ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public void compose_nullTrans_second() {
assertThat(NullTransition.isInstance(composed)).isTrue();
}

private static final class StubData {}
private static final class StubData implements TransitionFactory.Data {}

// Helper methods and classes for the tests.
private static BuildOptions updateOptions(BuildOptions source, Label flag, String value) {
Expand Down

0 comments on commit 59d28ad

Please sign in to comment.