diff options
author | 2017-07-31 21:07:51 +0200 | |
---|---|---|
committer | 2017-08-01 12:21:52 +0200 | |
commit | de965ac47e5dedf9dd43004d7523dbfa5ab64de1 (patch) | |
tree | 1bca577a04df1c739807a8d3490296717a3b7d7b /src/main/java/com/google/devtools/build/lib/packages | |
parent | 24183314aaa7887d80d6c1b7b9ce613889bea8e5 (diff) |
Better names for declared providers-related classes.
Follows
https://docs.google.com/document/d/1aAIVWvHPERDz2cv_PCFGwr8dvh5FcAkENFoRsNS4clk/.
RELNOTES: None.
PiperOrigin-RevId: 163728291
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
11 files changed, 186 insertions, 232 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java index 1f1ddd6d85..3f8686b16a 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java @@ -164,7 +164,7 @@ public final class AdvertisedProviderSet { return this; } - public Builder addSkylark(ClassObjectConstructor.Key id) { + public Builder addSkylark(Provider.Key id) { skylarkProviders.add(SkylarkProviderIdentifier.forKey(id)); return this; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java index 7114040300..bd3605627f 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java @@ -950,18 +950,18 @@ public final class Attribute implements Comparable<Attribute> { /** * If this is a label or label-list attribute, then this sets the allowed rule types with - * warning for the labels occurring in the attribute. This must be a disjoint set from - * {@link #allowedRuleClasses}. + * warning for the labels occurring in the attribute. This must be a disjoint set from {@link + * #allowedRuleClasses}. * * <p>If the attribute contains Labels of any other rule type (other than this or those set in - * allowedRuleClasses()) and they fulfill {@link #getRequiredProviders()}}, the build - * continues without error. Else the build fails during analysis. + * allowedRuleClasses()) and they fulfill {@link #getRequiredProviders()}}, the build continues + * without error. Else the build fails during analysis. * - * <p>If neither this nor {@link #allowedRuleClassesForLabels} is set, only rules that - * fulfill {@link #getRequiredProviders()} build without error. + * <p>If neither this nor {@link #allowedRuleClassesForLabels} is set, only rules that fulfill + * {@link #getRequiredProviders()} build without error. * - * <p>This only works on a per-target basis, not on a per-file basis; with other words, it - * works for 'deps' attributes, but not 'srcs' attributes. + * <p>This only works on a per-target basis, not on a per-file basis; with other words, it works + * for 'deps' attributes, but not 'srcs' attributes. */ public Builder<TYPE> allowedRuleClassesWithWarning(String... allowedRuleClasses) { return allowedRuleClassesWithWarning(ImmutableSet.copyOf(allowedRuleClasses)); @@ -1514,7 +1514,7 @@ public final class Attribute implements Comparable<Attribute> { private Object invokeCallback(Map<String, Object> attrValues) throws EvalException, InterruptedException { ClassObject attrs = - NativeClassObjectConstructor.STRUCT.create( + NativeProvider.STRUCT.create( attrValues, "No such regular (non computed) attribute '%s'."); Object result = callback.call(attrs); try { @@ -1792,19 +1792,16 @@ public final class Attribute implements Comparable<Attribute> { private final ImmutableList<RuleAspect<?>> aspects; /** - * Constructs a rule attribute with the specified name, type and default - * value. + * Constructs a rule attribute with the specified name, type and default value. * * @param name the name of the attribute * @param type the type of the attribute - * @param defaultValue the default value to use for this attribute if none is - * specified in rule declaration in the BUILD file. Must be null, or of - * type "type". May be an instance of ComputedDefault, in which case - * its getDefault() method must return an instance of "type", or null. - * Must be immutable. - * @param configTransition the configuration transition for this attribute - * (which must be of type LABEL, LABEL_LIST, NODEP_LABEL or - * NODEP_LABEL_LIST). + * @param defaultValue the default value to use for this attribute if none is specified in rule + * declaration in the BUILD file. Must be null, or of type "type". May be an instance of + * ComputedDefault, in which case its getDefault() method must return an instance of "type", + * or null. Must be immutable. + * @param configTransition the configuration transition for this attribute (which must be of type + * LABEL, LABEL_LIST, NODEP_LABEL or NODEP_LABEL_LIST). */ private Attribute( String name, diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java index 525055476c..ecb9cf862f 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java @@ -94,10 +94,11 @@ public abstract class ImplicitOutputsFunction { attrValues.put(attrName, value == null ? Runtime.NONE : value); } } - ClassObject attrs = NativeClassObjectConstructor.STRUCT.create( - attrValues, - "Attribute '%s' either doesn't exist " - + "or uses a select() (i.e. could have multiple values)"); + ClassObject attrs = + NativeProvider.STRUCT.create( + attrValues, + "Attribute '%s' either doesn't exist " + + "or uses a select() (i.e. could have multiple values)"); try { ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); for (Map.Entry<String, String> entry : castMap(callback.call(attrs), diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObject.java b/src/main/java/com/google/devtools/build/lib/packages/Info.java index fa84c3eff6..059c55efb2 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObject.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Info.java @@ -21,7 +21,6 @@ import com.google.common.collect.Ordering; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.packages.NativeClassObjectConstructor.StructConstructor; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; @@ -40,7 +39,7 @@ import java.util.List; import java.util.Map; import javax.annotation.Nullable; -/** An implementation class of ClassObject for structs created in Skylark code. */ +/** Represents information provided by a {@link Provider}. */ @SkylarkModule( name = "struct", category = SkylarkModuleCategory.BUILTIN, @@ -49,53 +48,48 @@ import javax.annotation.Nullable; + "See the global <a href=\"globals.html#struct\">struct</a> function " + "for more details." ) -public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable, Serializable { - private final ClassObjectConstructor constructor; +public class Info implements ClassObject, SkylarkValue, Concatable, Serializable { + private final Provider provider; private final ImmutableMap<String, Object> values; private final Location creationLoc; private final String errorMessage; /** Creates an empty struct with a given location. */ - public SkylarkClassObject(ClassObjectConstructor constructor, Location location) { - this.constructor = constructor; + public Info(Provider provider, Location location) { + this.provider = provider; this.values = ImmutableMap.of(); this.creationLoc = location; - this.errorMessage = constructor.getErrorMessageFormatForInstances(); + this.errorMessage = provider.getErrorMessageFormatForInstances(); } - /** - * Creates a built-in struct (i.e. without creation loc). - */ - public SkylarkClassObject(ClassObjectConstructor constructor, - Map<String, Object> values) { - this.constructor = constructor; + /** Creates a built-in struct (i.e. without creation loc). */ + public Info(Provider provider, Map<String, Object> values) { + this.provider = provider; this.values = copyValues(values); this.creationLoc = null; - this.errorMessage = constructor.getErrorMessageFormatForInstances(); + this.errorMessage = provider.getErrorMessageFormatForInstances(); } /** * Creates a built-in struct (i.e. without creation loc). * - * Allows to supply a specific error message. - * Only used in {@link StructConstructor#create(Map, String)} - * If you need to override an error message, preferred way is to create a specific - * {@link NativeClassObjectConstructor}. + * <p>Allows to supply a specific error message. Only used in + * {@link com.google.devtools.build.lib.packages.NativeProvider.StructConstructor#create(Map, + * String)} If you need to override an error message, preferred way is to create a specific {@link + * NativeProvider}. */ - SkylarkClassObject(ClassObjectConstructor constructor, - Map<String, Object> values, String errorMessage) { - this.constructor = constructor; + Info(Provider provider, Map<String, Object> values, String errorMessage) { + this.provider = provider; this.values = copyValues(values); this.creationLoc = null; this.errorMessage = Preconditions.checkNotNull(errorMessage); } - public SkylarkClassObject(ClassObjectConstructor constructor, - Map<String, Object> values, Location creationLoc) { - this.constructor = constructor; + public Info(Provider provider, Map<String, Object> values, Location creationLoc) { + this.provider = provider; this.values = copyValues(values); this.creationLoc = Preconditions.checkNotNull(creationLoc); - this.errorMessage = constructor.getErrorMessageFormatForInstances(); + this.errorMessage = provider.getErrorMessageFormatForInstances(); } // Ensure that values are all acceptable to Skylark before to stuff them in a ClassObject @@ -117,9 +111,7 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable return values.containsKey(name); } - /** - * Returns a value and try to cast it into specified type - */ + /** Returns a value and try to cast it into specified type */ public <TYPE> TYPE getValue(String key, Class<TYPE> type) throws EvalException { Object obj = values.get(key); if (obj == null) { @@ -135,17 +127,16 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable } public Location getCreationLoc() { - return Preconditions.checkNotNull(creationLoc, - "This struct was not created in a Skylark code"); + return Preconditions.checkNotNull(creationLoc, "This struct was not created in a Skylark code"); } @Override public Concatter getConcatter() { return StructConcatter.INSTANCE; } - - public ClassObjectConstructor getConstructor() { - return constructor; + + public Provider getProvider() { + return provider; } @Nullable @@ -159,27 +150,25 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable private StructConcatter() {} @Override - public SkylarkClassObject concat( - Concatable left, Concatable right, Location loc) throws EvalException { - SkylarkClassObject lval = (SkylarkClassObject) left; - SkylarkClassObject rval = (SkylarkClassObject) right; - if (!lval.constructor.equals(rval.constructor)) { - throw new EvalException(loc, - String.format("Cannot concat %s with %s", - lval.constructor.getPrintableName(), - rval.constructor.getPrintableName())); + public Info concat(Concatable left, Concatable right, Location loc) throws EvalException { + Info lval = (Info) left; + Info rval = (Info) right; + if (!lval.provider.equals(rval.provider)) { + throw new EvalException( + loc, + String.format( + "Cannot concat %s with %s", + lval.provider.getPrintableName(), rval.provider.getPrintableName())); } - SetView<String> commonFields = Sets - .intersection(lval.values.keySet(), rval.values.keySet()); + SetView<String> commonFields = Sets.intersection(lval.values.keySet(), rval.values.keySet()); if (!commonFields.isEmpty()) { - throw new EvalException(loc, "Cannot concat structs with common field(s): " - + Joiner.on(",").join(commonFields)); + throw new EvalException( + loc, + "Cannot concat structs with common field(s): " + Joiner.on(",").join(commonFields)); } - return new SkylarkClassObject(lval.constructor, - ImmutableMap.<String, Object>builder() - .putAll(lval.values) - .putAll(rval.values) - .build(), + return new Info( + lval.provider, + ImmutableMap.<String, Object>builder().putAll(lval.values).putAll(rval.values).build(), loc); } } @@ -194,8 +183,8 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable @Override public boolean isImmutable() { - // If the constructor is not yet exported the hash code of the object is subject to change - if (!constructor.isExported()) { + // If the provider is not yet exported the hash code of the object is subject to change + if (!provider.isExported()) { return false; } for (Object item : values.values()) { @@ -208,14 +197,14 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable @Override public boolean equals(Object otherObject) { - if (!(otherObject instanceof SkylarkClassObject)) { + if (!(otherObject instanceof Info)) { return false; } - SkylarkClassObject other = (SkylarkClassObject) otherObject; + Info other = (Info) otherObject; if (this == other) { return true; } - if (!this.constructor.equals(other.constructor)) { + if (!this.provider.equals(other.provider)) { return false; } // Compare objects' keys and values @@ -235,7 +224,7 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable List<String> keys = new ArrayList<>(getKeys()); Collections.sort(keys); List<Object> objectsToHash = new ArrayList<>(); - objectsToHash.add(constructor); + objectsToHash.add(provider); for (String key : keys) { objectsToHash.add(key); objectsToHash.add(getValue(key)); @@ -267,7 +256,7 @@ public class SkylarkClassObject implements ClassObject, SkylarkValue, Concatable @Override public void reprLegacy(SkylarkPrinter printer) { boolean first = true; - printer.append(constructor.getPrintableName()); + printer.append(provider.getPrintableName()); printer.append("("); // Sort by key to ensure deterministic output. for (String key : Ordering.natural().sortedCopy(values.keySet())) { diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java index 6bcce0fc00..f6f7d8ecb6 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java @@ -23,31 +23,27 @@ import java.util.Map; import javax.annotation.Nullable; /** - * Base class for declared providers {@see ClassObjectConstructor} defined in native code. + * Base class for declared providers {@see Provider} defined in native code. * - * <p>Every non-abstract derived class of {@link NativeClassObjectConstructor} corresponds to a - * single declared provider. This is enforced by final {@link #equals(Object)} and {@link - * #hashCode()}. + * <p>Every non-abstract derived class of {@link NativeProvider} corresponds to a single declared + * provider. This is enforced by final {@link #equals(Object)} and {@link #hashCode()}. * * <p>Typical implementation of a non-constructable from Skylark declared provider is as follows: * * <pre> - * public static final ClassObjectConstructor CC_LINK_PARAMS = - * new NativeClassObjectConstructor("link_params") { }; + * public static final Provider CC_LINK_PARAMS = + * new NativeProvider("link_params") { }; * </pre> * * To allow construction from Skylark and custom construction logic, override {@link * #createInstanceFromSkylark(Object[], Location)} (see {@link #STRUCT} for an example. */ @Immutable -public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObject> - extends ClassObjectConstructor { +public abstract class NativeProvider<VALUE extends Info> extends Provider { private final NativeKey key; private final String errorMessageForInstances; - /** - * "struct" function. - */ + /** "struct" function. */ public static final StructConstructor STRUCT = new StructConstructor(); private final Class<VALUE> valueClass; @@ -57,13 +53,11 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj } /** - * Implement this to mark that a native provider should be exported with - * certain name to Skylark. - * Broken: only works for rules, not for aspects. - * DO NOT USE FOR NEW CODE! + * Implement this to mark that a native provider should be exported with certain name to Skylark. + * Broken: only works for rules, not for aspects. DO NOT USE FOR NEW CODE! * - * Use native declared providers mechanism - * exclusively to expose providers to both native and Skylark code. + * <p>Use native declared providers mechanism exclusively to expose providers to both native and + * Skylark code. */ @Deprecated public static interface WithLegacySkylarkName { @@ -75,36 +69,35 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj * * <p>Singleton, instance is {@link #STRUCT}. */ - public static final class StructConstructor - extends NativeClassObjectConstructor<SkylarkClassObject> { + public static final class StructConstructor extends NativeProvider<Info> { private StructConstructor() { - super(SkylarkClassObject.class, "struct"); + super(Info.class, "struct"); } @Override - protected SkylarkClassObject createInstanceFromSkylark(Object[] args, Location loc) { + protected Info createInstanceFromSkylark(Object[] args, Location loc) { @SuppressWarnings("unchecked") Map<String, Object> kwargs = (Map<String, Object>) args[0]; - return new SkylarkClassObject(this, kwargs, loc); + return new Info(this, kwargs, loc); } - public SkylarkClassObject create(Map<String, Object> values, String message) { - return new SkylarkClassObject(this, values, message); + public Info create(Map<String, Object> values, String message) { + return new Info(this, values, message); } - public SkylarkClassObject create(Location loc) { - return new SkylarkClassObject(this, loc); + public Info create(Location loc) { + return new Info(this, loc); } } private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = FunctionSignature.WithValues.create(FunctionSignature.KWARGS); - protected NativeClassObjectConstructor(Class<VALUE> clazz, String name) { + protected NativeProvider(Class<VALUE> clazz, String name) { this(clazz, name, SIGNATURE); } - protected NativeClassObjectConstructor( + protected NativeProvider( Class<VALUE> valueClass, String name, FunctionSignature.WithValues<Object, SkylarkType> signature) { @@ -117,8 +110,8 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj /** * equals() implements singleton class semantics. * - * Every non-abstract derived class of {@link NativeClassObjectConstructor} - * corresponds to a single declared provider. + * <p>Every non-abstract derived class of {@link NativeProvider} corresponds to a single declared + * provider. */ @Override public final boolean equals(@Nullable Object other) { @@ -128,8 +121,8 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj /** * hashCode() implements singleton class semantics. * - * Every non-abstract derived class of {@link NativeClassObjectConstructor} - * corresponds to a single declared provider. + * <p>Every non-abstract derived class of {@link NativeProvider} corresponds to a single declared + * provider. */ @Override public final int hashCode() { @@ -157,10 +150,9 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj } @Override - protected SkylarkClassObject createInstanceFromSkylark(Object[] args, Location loc) - throws EvalException { - throw new EvalException(loc, - String.format("'%s' cannot be constructed from Skylark", getPrintableName())); + protected Info createInstanceFromSkylark(Object[] args, Location loc) throws EvalException { + throw new EvalException( + loc, String.format("'%s' cannot be constructed from Skylark", getPrintableName())); } public static Pair<String, String> getSerializedRepresentationForNativeKey(NativeKey key) { @@ -169,26 +161,24 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj public static NativeKey getNativeKeyFromSerializedRepresentation(Pair<String, String> serialized) throws ClassNotFoundException { - Class<? extends NativeClassObjectConstructor> aClass = - Class.forName(serialized.second).asSubclass(NativeClassObjectConstructor.class); + Class<? extends NativeProvider> aClass = + Class.forName(serialized.second).asSubclass(NativeProvider.class); return new NativeKey(serialized.first, aClass); } /** - * A serializable representation of {@link NativeClassObjectConstructor}. + * A serializable representation of {@link NativeProvider}. * - * Just a wrapper around its class. + * <p>Just a wrapper around its class. */ // todo(vladmos,dslomov): when we allow declared providers in `requiredProviders`, // we will need to serialize this somehow. @Immutable public static final class NativeKey extends Key { private final String name; - private final Class<? extends NativeClassObjectConstructor> aClass; + private final Class<? extends NativeProvider> aClass; - private NativeKey( - String name, - Class<? extends NativeClassObjectConstructor> aClass) { + private NativeKey(String name, Class<? extends NativeProvider> aClass) { this.name = name; this.aClass = aClass; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index 1ca18e2129..b03acc5610 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -1592,8 +1592,7 @@ public final class PackageFactory { builder.put(function.getName(), function); } } - return NativeClassObjectConstructor.STRUCT.create( - builder.build(), "no native function or rule '%s'"); + return NativeProvider.STRUCT.create(builder.build(), "no native function or rule '%s'"); } /** @param fakeEnv specify if we declare no-op functions, or real functions. */ diff --git a/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/Provider.java index 2356d7190a..b497b76131 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Provider.java @@ -25,16 +25,16 @@ import com.google.devtools.build.lib.syntax.SkylarkType; import javax.annotation.Nullable; /** - * Declared Provider (a constructor for {@link SkylarkClassObject}). + * Declared Provider (a constructor for {@link Info}). * - * <p>Declared providers can be declared either natively ({@link NativeClassObjectConstructor} or in - * Skylark {@link SkylarkClassObjectConstructor}. + * <p>Declared providers can be declared either natively ({@link NativeProvider} or in Skylark + * {@link SkylarkProvider}. * - * <p>{@link ClassObjectConstructor} serves both as "type identifier" for declared provider - * instances and as a function that can be called to construct a provider. + * <p>{@link Provider} serves both as "type identifier" for declared provider instances and as a + * function that can be called to construct a provider. * - * <p>Prefer to use {@link Key} as a serializable identifier of {@link ClassObjectConstructor}. In - * particular, {@link Key} should be used in all data structures exposed to Skyframe. + * <p>Prefer to use {@link Key} as a serializable identifier of {@link Provider}. In particular, + * {@link Key} should be used in all data structures exposed to Skyframe. */ @SkylarkModule( name = "Provider", @@ -60,35 +60,29 @@ import javax.annotation.Nullable; + "<a href=\"globals.html#provider\">provider</a> function." ) @Immutable -public abstract class ClassObjectConstructor extends BaseFunction { +public abstract class Provider extends BaseFunction { - protected ClassObjectConstructor(String name, - FunctionSignature.WithValues<Object, SkylarkType> signature, - Location location) { + protected Provider( + String name, FunctionSignature.WithValues<Object, SkylarkType> signature, Location location) { super(name, signature, location); } /** - * Has this {@link ClassObjectConstructor} been exported? - * All native constructors are always exported. Skylark constructors are exported - * if they are assigned to top-level name in a Skylark module. + * Has this {@link Provider} been exported? All native providers are always exported. Skylark + * providers are exported if they are assigned to top-level name in a Skylark module. */ public abstract boolean isExported(); - /** - * Returns a serializable representation of this constructor. - */ + /** Returns a serializable representation of this {@link Provider}. */ public abstract Key getKey(); - /** - * Returns a name of this constructor that should be used in error messages. - */ + /** Returns a name of this {@link Provider} that should be used in error messages. */ public abstract String getPrintableName(); /** * Returns an error message format for instances. * - * Must contain one '%s' placeholder for field name. + * <p>Must contain one '%s' placeholder for field name. */ public abstract String getErrorMessageFormatForInstances(); @@ -104,22 +98,17 @@ public abstract class ClassObjectConstructor extends BaseFunction { } /** - * Override this method to provide logic that is used to instantiate a declared provider - * from Skylark. + * Override this method to provide logic that is used to instantiate a declared provider from + * Skylark. * - * This is a method that is called when a constructor {@code c} is invoked as<br> + * <p>This is a method that is called when a constructor {@code c} is invoked as<br> * {@code c(arg1 = val1, arg2 = val2, ...)}. * - * @param args an array of argument values sorted as per the signature - * ({@see BaseFunction#call}) + * @param args an array of argument values sorted as per the signature ({@see BaseFunction#call}) */ - protected abstract SkylarkClassObject createInstanceFromSkylark(Object[] args, Location loc) + protected abstract Info createInstanceFromSkylark(Object[] args, Location loc) throws EvalException; - /** - * A serializable representation of {@link ClassObjectConstructor}. - */ - // todo(vladmos,dslomov): when we allow declared providers in `requiredProviders`, - // we will need to serialize this somehow. + /** A serializable representation of {@link Provider}. */ public abstract static class Key {} } diff --git a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java index e9298bd08c..5b494b7d07 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java @@ -72,7 +72,8 @@ public final class RequiredProviders { } @Override - public boolean satisfies(Predicate<Class<?>> hasNativeProvider, + public boolean satisfies( + Predicate<Class<?>> hasNativeProvider, Predicate<SkylarkProviderIdentifier> hasSkylarkProvider, RequiredProviders requiredProviders, Builder missingProviders) { @@ -100,7 +101,8 @@ public final class RequiredProviders { } @Override - public boolean satisfies(Predicate<Class<?>> hasNativeProvider, + public boolean satisfies( + Predicate<Class<?>> hasNativeProvider, Predicate<SkylarkProviderIdentifier> hasSkylarkProvider, RequiredProviders requiredProviders, Builder missingProviders) { @@ -121,19 +123,23 @@ public final class RequiredProviders { /** Accept a dependency that has all providers from one of the sets. */ RESTRICTED { @Override - public boolean satisfies(final AdvertisedProviderSet advertisedProviderSet, - RequiredProviders requiredProviders, Builder missing) { + public boolean satisfies( + final AdvertisedProviderSet advertisedProviderSet, + RequiredProviders requiredProviders, + Builder missing) { if (advertisedProviderSet.canHaveAnyProvider()) { return true; } return satisfies( advertisedProviderSet.getNativeProviders()::contains, advertisedProviderSet.getSkylarkProviders()::contains, - requiredProviders, missing); + requiredProviders, + missing); } @Override - public boolean satisfies(Predicate<Class<?>> hasNativeProvider, + public boolean satisfies( + Predicate<Class<?>> hasNativeProvider, Predicate<SkylarkProviderIdentifier> hasSkylarkProvider, RequiredProviders requiredProviders, Builder missingProviders) { @@ -145,10 +151,11 @@ public final class RequiredProviders { // Collect missing providers if (missingProviders != null) { missingProviders.addNativeSet( - nativeProviderSet.stream().filter(hasNativeProvider.negate()) + nativeProviderSet + .stream() + .filter(hasNativeProvider.negate()) .collect(ImmutableSet.toImmutableSet())); } - } for (ImmutableSet<SkylarkProviderIdentifier> skylarkProviderSet @@ -159,7 +166,9 @@ public final class RequiredProviders { // Collect missing providers if (missingProviders != null) { missingProviders.addSkylarkSet( - skylarkProviderSet.stream().filter(hasSkylarkProvider.negate()) + skylarkProviderSet + .stream() + .filter(hasSkylarkProvider.negate()) .collect(ImmutableSet.toImmutableSet())); } } @@ -185,30 +194,28 @@ public final class RequiredProviders { describe(result, providers.nativeProviders, Class::getSimpleName); describe(result, providers.skylarkProviders, id -> "'" + id.toString() + "'"); return result.toString(); - } }; /** Checks if {@code advertisedProviderSet} satisfies these {@code RequiredProviders} */ - public abstract boolean satisfies(AdvertisedProviderSet advertisedProviderSet, - RequiredProviders requiredProviders, Builder missing); + public abstract boolean satisfies( + AdvertisedProviderSet advertisedProviderSet, + RequiredProviders requiredProviders, + Builder missing); /** - * Checks if a set of providers encoded by predicates {@code hasNativeProviders} - * and {@code hasSkylarkProvider} satisfies these {@code RequiredProviders} + * Checks if a set of providers encoded by predicates {@code hasNativeProviders} and {@code + * hasSkylarkProvider} satisfies these {@code RequiredProviders} */ abstract boolean satisfies( Predicate<Class<?>> hasNativeProvider, Predicate<SkylarkProviderIdentifier> hasSkylarkProvider, RequiredProviders requiredProviders, - @Nullable - Builder missingProviders); + @Nullable Builder missingProviders); abstract Builder copyAsBuilder(RequiredProviders providers); - /** - * Returns a string describing the providers that can be presented to the user. - */ + /** Returns a string describing the providers that can be presented to the user. */ abstract String getDescription(RequiredProviders providers); } @@ -228,8 +235,8 @@ public final class RequiredProviders { } /** - * Returns providers that are missing. If none are missing, returns - * {@code RequiredProviders} that accept anything. + * Returns providers that are missing. If none are missing, returns {@code RequiredProviders} that + * accept anything. */ public RequiredProviders getMissing( Predicate<Class<?>> hasNativeProvider, @@ -243,8 +250,8 @@ public final class RequiredProviders { } /** - * Returns providers that are missing. If none are missing, returns - * {@code RequiredProviders} that accept anything. + * Returns providers that are missing. If none are missing, returns {@code RequiredProviders} that + * accept anything. */ public RequiredProviders getMissing(AdvertisedProviderSet set) { Builder builder = acceptAnyBuilder(); @@ -255,10 +262,7 @@ public final class RequiredProviders { return builder.build(); } - - /** - * Returns true if this {@code RequiredProviders} instance accept any set of providers. - */ + /** Returns true if this {@code RequiredProviders} instance accept any set of providers. */ public boolean acceptsAny() { return constraint.equals(Constraint.ANY); } @@ -278,11 +282,11 @@ public final class RequiredProviders { this.skylarkProviders = skylarkProviders; } - /** - * Helper method to describe lists of sets of things. - */ - private static <T> void describe(StringBuilder result, - ImmutableList<ImmutableSet<T>> listOfSets, Function<T, String> describeOne) { + /** Helper method to describe lists of sets of things. */ + private static <T> void describe( + StringBuilder result, + ImmutableList<ImmutableSet<T>> listOfSets, + Function<T, String> describeOne) { Joiner joiner = Joiner.on(", "); for (ImmutableSet<T> ids : listOfSets) { if (result.length() > 0) { @@ -294,7 +298,6 @@ public final class RequiredProviders { } } - /** * A builder for {@link RequiredProviders} that accepts any dependency * unless restriction provider sets are added. @@ -311,9 +314,7 @@ public final class RequiredProviders { return new Builder(true); } - /** - * Returns a Builder initialized to the same value as this {@code RequiredProvider} - */ + /** Returns a Builder initialized to the same value as this {@code RequiredProvider} */ public Builder copyAsBuilder() { return constraint.copyAsBuilder(this); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java index 8bd600852a..ea341b3171 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java @@ -31,40 +31,36 @@ import javax.annotation.Nullable; * <p>This is a result of calling {@code provider()} function from Skylark ({@link * com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions#provider}). */ -public class SkylarkClassObjectConstructor extends ClassObjectConstructor - implements SkylarkExportable { +public class SkylarkProvider extends Provider implements SkylarkExportable { private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = FunctionSignature.WithValues.create(FunctionSignature.KWARGS); - @Nullable - private SkylarkKey key; - @Nullable - private String errorMessageFormatForInstances; + @Nullable private SkylarkKey key; + @Nullable private String errorMessageFormatForInstances; private static final String DEFAULT_ERROR_MESSAFE = "Object has no '%s' attribute."; /** - * Creates a Skylark-defined Declared Provider ({@link SkylarkClassObject} constructor). + * Creates a Skylark-defined Declared Provider ({@link Info} constructor). * - * Needs to be exported later. + * <p>Needs to be exported later. */ - public SkylarkClassObjectConstructor(String name, Location location) { + public SkylarkProvider(String name, Location location) { this(name, SIGNATURE, location); } - public SkylarkClassObjectConstructor( + public SkylarkProvider( String name, FunctionSignature.WithValues<Object, SkylarkType> signature, Location location) { super(name, signature, location); this.errorMessageFormatForInstances = DEFAULT_ERROR_MESSAFE; } @Override - protected SkylarkClassObject createInstanceFromSkylark(Object[] args, Location loc) - throws EvalException { + protected Info createInstanceFromSkylark(Object[] args, Location loc) throws EvalException { @SuppressWarnings("unchecked") Map<String, Object> kwargs = (Map<String, Object>) args[0]; - return new SkylarkClassObject(this, kwargs, loc); + return new Info(this, kwargs, loc); } @Override @@ -92,8 +88,8 @@ public class SkylarkClassObjectConstructor extends ClassObjectConstructor public void export(Label extensionLabel, String exportedName) { Preconditions.checkState(!isExported()); this.key = new SkylarkKey(extensionLabel, exportedName); - this.errorMessageFormatForInstances = String.format( - "'%s' object has no attribute '%%s'", exportedName); + this.errorMessageFormatForInstances = + String.format("'%s' object has no attribute '%%s'", exportedName); } @Override @@ -106,10 +102,10 @@ public class SkylarkClassObjectConstructor extends ClassObjectConstructor @Override public boolean equals(@Nullable Object otherObject) { - if (!(otherObject instanceof SkylarkClassObjectConstructor)) { + if (!(otherObject instanceof SkylarkProvider)) { return false; } - SkylarkClassObjectConstructor other = (SkylarkClassObjectConstructor) otherObject; + SkylarkProvider other = (SkylarkProvider) otherObject; if (this.isExported() && other.isExported()) { return this.getKey().equals(other.getKey()); @@ -130,9 +126,8 @@ public class SkylarkClassObjectConstructor extends ClassObjectConstructor } /** - * A serializable representation of Skylark-defined {@link SkylarkClassObjectConstructor} - * that uniquely identifies all {@link SkylarkClassObjectConstructor}s that - * are exposed to SkyFrame. + * A serializable representation of Skylark-defined {@link SkylarkProvider} that uniquely + * identifies all {@link SkylarkProvider}s that are exposed to SkyFrame. */ public static class SkylarkKey extends Key { private final Label extensionLabel; diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java index d9e663c43c..34b507af88 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java @@ -19,21 +19,17 @@ import java.util.Objects; import javax.annotation.Nullable; /** - * A wrapper around Skylark provider identifier, - * representing either a declared provider ({@see SkylarkClassObjectConstructor}) - * or a "legacy" string identifier. + * A wrapper around Skylark provider identifier, representing either a declared provider ({@see + * SkylarkProvider}) or a "legacy" string identifier. */ public final class SkylarkProviderIdentifier { @Nullable private final String legacyId; - @Nullable - private final ClassObjectConstructor.Key key; + @Nullable private final Provider.Key key; - /** - * Creates an id for a declared provider with a given key ({@see SkylarkClassObjectConstructor}). - */ - public static SkylarkProviderIdentifier forKey(ClassObjectConstructor.Key key) { + /** Creates an id for a declared provider with a given key ({@see SkylarkProvider}). */ + public static SkylarkProviderIdentifier forKey(Provider.Key key) { return new SkylarkProviderIdentifier(key); } @@ -49,7 +45,7 @@ public final class SkylarkProviderIdentifier { this.key = null; } - private SkylarkProviderIdentifier(ClassObjectConstructor.Key key) { + private SkylarkProviderIdentifier(Provider.Key key) { this.legacyId = null; this.key = key; } @@ -70,10 +66,8 @@ public final class SkylarkProviderIdentifier { return legacyId; } - /** - * Returns a key identifying the declared provider (only for non-legacy providers). - */ - public ClassObjectConstructor.Key getKey() { + /** Returns a key identifying the declared provider (only for non-legacy providers). */ + public Provider.Key getKey() { Preconditions.checkState(!isLegacy(), "Check !isLegacy() first"); return key; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java index ccb81e1201..292ce4d635 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java @@ -528,8 +528,7 @@ public class WorkspaceFactory { } builder.put("bazel_version", version); - return NativeClassObjectConstructor.STRUCT.create( - builder.build(), "no native function or rule '%s'"); + return NativeProvider.STRUCT.create(builder.build(), "no native function or rule '%s'"); } static ClassObject newNativeModule(RuleClassProvider ruleClassProvider, String version) { |