diff options
author | 2017-12-28 07:38:31 -0800 | |
---|---|---|
committer | 2017-12-28 07:40:35 -0800 | |
commit | d331fa7b642ac5487a3e084ad53117fc3c2cf5df (patch) | |
tree | 9955e9e0cea4b4c0e296c901fcdd51593f2f1927 | |
parent | 3c0f67c07498cc97053505ded617320ec459436c (diff) |
Rename some ClassObject/Provider-related methods
The terminology "field" is preferred over "key" for the components of a struct or struct-like object.
RELNOTES: None
PiperOrigin-RevId: 180269374
30 files changed, 153 insertions, 153 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java index 872a153777..d1aa8878fd 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTarget.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfigu import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import com.google.devtools.build.lib.syntax.ClassObject; +import com.google.devtools.build.lib.syntax.EvalException; import javax.annotation.Nullable; /** @@ -63,11 +64,11 @@ public interface ConfiguredTarget extends TransitiveInfoCollection, ClassObject, /** * Returns keys for a legacy Skylark provider. * - * Overrides {@link ClassObject#getKeys()}, but does not allow {@link EvalException} to + * Overrides {@link ClassObject#getFieldNames()}, but does not allow {@link EvalException} to * be thrown. */ @Override - ImmutableCollection<String> getKeys(); + ImmutableCollection<String> getFieldNames(); /** * Returns a legacy Skylark provider. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java index a9b5461759..9af9811a50 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java @@ -96,7 +96,7 @@ public final class DefaultInfo extends NativeInfo { } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return KEYS; } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java index 8c313d091d..73c1f8bcfa 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java @@ -252,7 +252,7 @@ public final class OutputGroupInfo extends NativeInfo } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return outputGroups.keySet(); } @@ -281,8 +281,8 @@ public final class OutputGroupInfo extends NativeInfo } @Override - public String getErrorMessageFormatForInstances() { - return "Output group %s not present"; + public String getErrorMessageFormatForUnknownField() { + return "Output group '%s' not present"; } } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java index d0a779c1c7..d11e3bd5be 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java @@ -53,21 +53,21 @@ public class FragmentCollection implements ClassObject { } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return ruleContext.getSkylarkFragmentNames(transition); } @Override @Nullable - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { return String.format( "There is no configuration fragment named '%s' in %s configuration. " + "Available fragments: %s", - name, getConfigurationName(transition), printKeys()); + name, getConfigurationName(transition), fieldsToString()); } - private String printKeys() { - return String.format("'%s'", Joiner.on("', '").join(getKeys())); + private String fieldsToString() { + return String.format("'%s'", Joiner.on("', '").join(getFieldNames())); } public static String getConfigurationName(Transition config) { @@ -76,6 +76,6 @@ public class FragmentCollection implements ClassObject { @Override public String toString() { - return getConfigurationName(transition) + ": [ " + printKeys() + "]"; + return getConfigurationName(transition) + ": [ " + fieldsToString() + "]"; } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java index ca2fc81fc3..c00f385c8e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java @@ -152,12 +152,12 @@ public abstract class AbstractConfiguredTarget } @Override - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { return null; } @Override - public final ImmutableCollection<String> getKeys() { + public final ImmutableCollection<String> getFieldNames() { ImmutableList.Builder<String> result = ImmutableList.builder(); result.addAll(ImmutableList.of( DATA_RUNFILES_FIELD, diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java index 30959f72be..f79f4cf6db 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java @@ -142,7 +142,7 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { } @Override - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { return Printer.format("%r (rule '%s') doesn't have provider '%s'", this, getTarget().getRuleClass(), name); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java index 1879227a38..e27d47963e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java @@ -1062,11 +1062,11 @@ public class SkylarkRuleClassFunctions { private void printProtoTextMessage( ClassObject object, StringBuilder sb, int indent, Location loc) throws EvalException { - // For determinism sort the keys alphabetically - List<String> keys = new ArrayList<>(object.getKeys()); - Collections.sort(keys); - for (String key : keys) { - printProtoTextMessage(key, object.getValue(key), sb, indent, loc); + // For determinism sort the fields alphabetically. + List<String> fields = new ArrayList<>(object.getFieldNames()); + Collections.sort(fields); + for (String field : fields) { + printProtoTextMessage(field, object.getValue(field), sb, indent, loc); } } @@ -1175,13 +1175,13 @@ public class SkylarkRuleClassFunctions { sb.append("{"); String join = ""; - for (String subKey : ((ClassObject) value).getKeys()) { + for (String field : ((ClassObject) value).getFieldNames()) { sb.append(join); join = ","; sb.append("\""); - sb.append(subKey); + sb.append(field); sb.append("\":"); - printJson(((ClassObject) value).getValue(subKey), sb, loc, "struct field", subKey); + printJson(((ClassObject) value).getValue(field), sb, loc, "struct field", field); } sb.append("}"); } else if (value instanceof List) { diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java index 7f3a3b15b2..b398073f70 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java @@ -66,7 +66,7 @@ public final class SkylarkRuleConfiguredTargetUtil { private SkylarkRuleConfiguredTargetUtil() {} - private static final ImmutableSet<String> DEFAULT_PROVIDER_KEYS = + private static final ImmutableSet<String> DEFAULT_PROVIDER_FIELDS = ImmutableSet.of("files", "runfiles", "data_runfiles", "default_runfiles", "executable"); /** @@ -190,7 +190,7 @@ public final class SkylarkRuleConfiguredTargetUtil { throws EvalException { Location insLoc = insStruct.getCreationLoc(); FileTypeSet fileTypeSet = FileTypeSet.ANY_FILE; - if (insStruct.getKeys().contains("extensions")) { + if (insStruct.getFieldNames().contains("extensions")) { @SuppressWarnings("unchecked") List<String> exts = cast("extensions", insStruct, SkylarkList.class, String.class, insLoc); if (exts.isEmpty()) { @@ -204,12 +204,12 @@ public final class SkylarkRuleConfiguredTargetUtil { } } List<String> dependencyAttributes = Collections.emptyList(); - if (insStruct.getKeys().contains("dependency_attributes")) { + if (insStruct.getFieldNames().contains("dependency_attributes")) { dependencyAttributes = cast("dependency_attributes", insStruct, SkylarkList.class, String.class, insLoc); } List<String> sourceAttributes = Collections.emptyList(); - if (insStruct.getKeys().contains("source_attributes")) { + if (insStruct.getFieldNames().contains("source_attributes")) { sourceAttributes = cast("source_attributes", insStruct, SkylarkList.class, String.class, insLoc); } @@ -280,7 +280,7 @@ public final class SkylarkRuleConfiguredTargetUtil { // Old-style struct, but it may contain declared providers oldStyleProviders = struct; - if (struct.hasKey("providers")) { + if (struct.hasField("providers")) { Iterable iterable = cast("providers", struct, Iterable.class, loc); for (Object o : iterable) { Info declaredProvider = @@ -317,7 +317,7 @@ public final class SkylarkRuleConfiguredTargetUtil { .getProvider() .getKey() .equals(DefaultInfo.PROVIDER.getKey())) { - parseDefaultProviderKeys(declaredProvider, context, builder); + parseDefaultProviderFields(declaredProvider, context, builder); defaultProviderProvidedExplicitly = true; } else { builder.addSkylarkDeclaredProvider(declaredProvider); @@ -325,31 +325,31 @@ public final class SkylarkRuleConfiguredTargetUtil { } if (!defaultProviderProvidedExplicitly) { - parseDefaultProviderKeys(oldStyleProviders, context, builder); + parseDefaultProviderFields(oldStyleProviders, context, builder); } - for (String key : oldStyleProviders.getKeys()) { - if (DEFAULT_PROVIDER_KEYS.contains(key)) { - // These keys have already been parsed above. + for (String field : oldStyleProviders.getFieldNames()) { + if (DEFAULT_PROVIDER_FIELDS.contains(field)) { + // These fields have already been parsed above. // If a default provider has been provided explicitly then it's an error that they also // occur here. if (defaultProviderProvidedExplicitly) { throw new EvalException( loc, "Provider '" - + key + + field + "' should be specified in DefaultInfo if it's provided explicitly."); } - } else if (key.equals("output_groups")) { - addOutputGroups(oldStyleProviders.getValue(key), loc, builder); - } else if (key.equals("instrumented_files")) { + } else if (field.equals("output_groups")) { + addOutputGroups(oldStyleProviders.getValue(field), loc, builder); + } else if (field.equals("instrumented_files")) { Info insStruct = cast("instrumented_files", oldStyleProviders, Info.class, loc); addInstrumentedFiles(insStruct, context.getRuleContext(), builder); - } else if (isNativeDeclaredProviderWithLegacySkylarkName(oldStyleProviders.getValue(key))) { - builder.addNativeDeclaredProvider((Info) oldStyleProviders.getValue(key)); - } else if (!key.equals("providers")) { + } else if (isNativeDeclaredProviderWithLegacySkylarkName(oldStyleProviders.getValue(field))) { + builder.addNativeDeclaredProvider((Info) oldStyleProviders.getValue(field)); + } else if (!field.equals("providers")) { // We handled providers already. - builder.addSkylarkTransitiveInfo(key, oldStyleProviders.getValue(key), loc); + builder.addSkylarkTransitiveInfo(field, oldStyleProviders.getValue(field), loc); } } } @@ -362,10 +362,10 @@ public final class SkylarkRuleConfiguredTargetUtil { } /** - * Parses keys of (not necessarily a default) provider. If it is an actual default provider, - * throws an {@link EvalException} if there are unknown keys. + * Parses fields of (not necessarily a default) provider. If it is an actual default provider, + * throws an {@link EvalException} if there are unknown fields. */ - private static void parseDefaultProviderKeys( + private static void parseDefaultProviderFields( Info provider, SkylarkRuleContext context, RuleConfiguredTargetBuilder builder) throws EvalException { SkylarkNestedSet files = null; @@ -376,23 +376,23 @@ public final class SkylarkRuleConfiguredTargetUtil { Location loc = provider.getCreationLoc(); - for (String key : provider.getKeys()) { - if (key.equals("files")) { + for (String field : provider.getFieldNames()) { + if (field.equals("files")) { files = cast("files", provider, SkylarkNestedSet.class, Artifact.class, loc); - } else if (key.equals("runfiles")) { + } else if (field.equals("runfiles")) { statelessRunfiles = cast("runfiles", provider, Runfiles.class, loc); - } else if (key.equals("data_runfiles")) { + } else if (field.equals("data_runfiles")) { dataRunfiles = cast("data_runfiles", provider, Runfiles.class, loc); - } else if (key.equals("default_runfiles")) { + } else if (field.equals("default_runfiles")) { defaultRunfiles = cast("default_runfiles", provider, Runfiles.class, loc); - } else if (key.equals("executable")) { + } else if (field.equals("executable")) { executable = cast("executable", provider, Artifact.class, loc); } else if (provider .getProvider() .getKey() .equals(DefaultInfo.PROVIDER.getKey())) { - // Custom keys are not allowed for default providers - throw new EvalException(loc, "Invalid key for default provider: " + key); + // Custom fields are not allowed for default providers + throw new EvalException(loc, "Invalid field for default provider: " + field); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java index 1bcc46c5ed..3f8a54a71b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java @@ -366,7 +366,7 @@ public final class SkylarkRuleContext implements SkylarkValue { } @Override - public ImmutableCollection<String> getKeys() throws EvalException { + public ImmutableCollection<String> getFieldNames() throws EvalException { checkMutable(); ImmutableList.Builder<String> result = ImmutableList.builder(); if (context.isExecutable() && executableCreated) { @@ -391,7 +391,7 @@ public final class SkylarkRuleContext implements SkylarkValue { @Nullable @Override - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { return String.format( "No attribute '%s' in outputs. Make sure you declared a rule output with this name.", name); @@ -407,16 +407,16 @@ public final class SkylarkRuleContext implements SkylarkValue { } boolean first = true; printer.append("ctx.outputs("); - // Sort by key to ensure deterministic output. + // Sort by field name to ensure deterministic output. try { - for (String key : Ordering.natural().sortedCopy(getKeys())) { + for (String field : Ordering.natural().sortedCopy(getFieldNames())) { if (!first) { printer.append(", "); } first = false; - printer.append(key); + printer.append(field); printer.append(" = "); - printer.repr(getValue(key)); + printer.repr(getValue(field)); } printer.append(")"); } catch (EvalException e) { diff --git a/src/main/java/com/google/devtools/build/lib/packages/Info.java b/src/main/java/com/google/devtools/build/lib/packages/Info.java index 550ef181ea..b885d65581 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Info.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Info.java @@ -70,14 +70,14 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { public Info(Provider provider, @Nullable Location location) { this.provider = provider; this.creationLoc = location == null ? Location.BUILTIN : location; - this.errorMessageFormatForUnknownField = provider.getErrorMessageFormatForInstances(); + this.errorMessageFormatForUnknownField = provider.getErrorMessageFormatForUnknownField(); } /** Creates a built-in struct (i.e. without a Skylark creation location). */ public Info(Provider provider) { this.provider = provider; this.creationLoc = Location.BUILTIN; - this.errorMessageFormatForUnknownField = provider.getErrorMessageFormatForInstances(); + this.errorMessageFormatForUnknownField = provider.getErrorMessageFormatForUnknownField(); } /** @@ -113,10 +113,9 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { /** * Returns whether the given field name exists. * - * <p>The "key" nomenclature is historic and for consistency with {@link ClassObject}. + * <p>This conceptually extends the API for {@link ClassObject}. */ - // TODO(bazel-team): Rename to hasField(), and likewise in ClassObject. - public abstract boolean hasKey(String name); + public abstract boolean hasField(String name); /** Returns a value and try to cast it into specified type */ public <T> T getValue(String key, Class<T> type) throws EvalException { @@ -144,11 +143,11 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { /** * Returns the fields of this struct. * - * Overrides {@link ClassObject#getKeys()}, but does not allow {@link EvalException} to + * Overrides {@link ClassObject#getFieldNames()}, but does not allow {@link EvalException} to * be thrown. */ @Override - public abstract ImmutableCollection<String> getKeys(); + public abstract ImmutableCollection<String> getFieldNames(); /** * Returns the value associated with the name field in this struct, @@ -161,11 +160,10 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { @Override public abstract Object getValue(String name); - // TODO(bazel-team): Rename to getErrorMessageForUnknownField. @Override - public String errorMessage(String name) { - String suffix = - "Available attributes: " + Joiner.on(", ").join(Ordering.natural().sortedCopy(getKeys())); + public String getErrorMessageForUnknownField(String name) { + String suffix = "Available attributes: " + + Joiner.on(", ").join(Ordering.natural().sortedCopy(getFieldNames())); return String.format(errorMessageFormatForUnknownField, name) + "\n" + suffix; } @@ -181,12 +179,12 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { if (!this.provider.equals(other.provider)) { return false; } - // Compare objects' keys and values - if (!this.getKeys().equals(other.getKeys())) { + // Compare objects' fields and their values + if (!this.getFieldNames().equals(other.getFieldNames())) { return false; } - for (String key : getKeys()) { - if (!this.getValue(key).equals(other.getValue(key))) { + for (String field : getFieldNames()) { + if (!this.getValue(field).equals(other.getValue(field))) { return false; } } @@ -195,13 +193,13 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { @Override public int hashCode() { - List<String> keys = new ArrayList<>(getKeys()); - Collections.sort(keys); + List<String> fields = new ArrayList<>(getFieldNames()); + Collections.sort(fields); List<Object> objectsToHash = new ArrayList<>(); objectsToHash.add(provider); - for (String key : keys) { - objectsToHash.add(key); - objectsToHash.add(getValue(key)); + for (String field : fields) { + objectsToHash.add(field); + objectsToHash.add(getValue(field)); } return Objects.hashCode(objectsToHash.toArray()); } @@ -215,14 +213,14 @@ public abstract class Info implements ClassObject, SkylarkValue, Serializable { boolean first = true; printer.append("struct("); // Sort by key to ensure deterministic output. - for (String key : Ordering.natural().sortedCopy(getKeys())) { + for (String fieldName : Ordering.natural().sortedCopy(getFieldNames())) { if (!first) { printer.append(", "); } first = false; - printer.append(key); + printer.append(fieldName); printer.append(" = "); - printer.repr(getValue(key)); + printer.repr(getValue(fieldName)); } printer.append(")"); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java b/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java index d52fa87a1d..e1035c86e9 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeInfo.java @@ -29,12 +29,12 @@ public class NativeInfo extends Info { } @Override - public boolean hasKey(String name) { + public boolean hasField(String name) { return values.containsKey(name); } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return values.keySet(); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java index 93bbcfe025..0f78e4659c 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java @@ -40,16 +40,16 @@ import javax.annotation.Nullable; * #createInstanceFromSkylark(Object[], Location)} (see {@link #STRUCT} for an example. */ @Immutable -public abstract class NativeProvider<VALUE extends Info> extends Provider { +public abstract class NativeProvider<V extends Info> extends Provider { private final NativeKey key; - private final String errorMessageForInstances; + private final String errorMessageFormatForUnknownField; /** "struct" function. */ public static final StructConstructor STRUCT = new StructConstructor(); - private final Class<VALUE> valueClass; + private final Class<V> valueClass; - public Class<VALUE> getValueClass() { + public Class<V> getValueClass() { return valueClass; } @@ -94,18 +94,18 @@ public abstract class NativeProvider<VALUE extends Info> extends Provider { private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = FunctionSignature.WithValues.create(FunctionSignature.KWARGS); - protected NativeProvider(Class<VALUE> clazz, String name) { + protected NativeProvider(Class<V> clazz, String name) { this(clazz, name, SIGNATURE); } protected NativeProvider( - Class<VALUE> valueClass, + Class<V> valueClass, String name, FunctionSignature.WithValues<Object, SkylarkType> signature) { super(name, signature, Location.BUILTIN); key = new NativeKey(name, getClass()); this.valueClass = valueClass; - errorMessageForInstances = String.format("'%s' object has no attribute '%%s'", name); + errorMessageFormatForUnknownField = String.format("'%s' object has no attribute '%%s'", name); } /** @@ -136,8 +136,8 @@ public abstract class NativeProvider<VALUE extends Info> extends Provider { } @Override - public String getErrorMessageFormatForInstances() { - return errorMessageForInstances; + public String getErrorMessageFormatForUnknownField() { + return errorMessageFormatForUnknownField; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/packages/Provider.java b/src/main/java/com/google/devtools/build/lib/packages/Provider.java index 028a03d446..dc06b664ee 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Provider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Provider.java @@ -17,6 +17,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.syntax.BaseFunction; +import com.google.devtools.build.lib.syntax.ClassObject; import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.FuncallExpression; @@ -93,12 +94,12 @@ public abstract class Provider extends BaseFunction { public abstract String getPrintableName(); /** - * Returns an error message format for instances. + * Returns an error message format string for instances to use for their {@link + * ClassObject#getErrorMessageForUnknownField(String)}. * - * <p>Must contain one {@code '%s'} placeholder for field name. + * <p>The format string must contain one {@code '%s'} placeholder for the field name. */ - // TODO(bazel-team): Rename to getErrorMessageFormatForUnknownField(). - public abstract String getErrorMessageFormatForInstances(); + public abstract String getErrorMessageFormatForUnknownField(); public SkylarkProviderIdentifier id() { return SkylarkProviderIdentifier.forKey(getKey()); diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java index 2025b1e5ba..cc5d3ea93d 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java @@ -85,12 +85,12 @@ public abstract class SkylarkInfo extends Info implements Concatable { } @Override - public boolean hasKey(String name) { + public boolean hasField(String name) { return values.containsKey(name); } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return values.keySet(); } @@ -133,14 +133,14 @@ public abstract class SkylarkInfo extends Info implements Concatable { } @Override - public boolean hasKey(String name) { + public boolean hasField(String name) { Integer index = layout.get(name); return index != null && values[index] != null; } @Override - public ImmutableCollection<String> getKeys() { - ImmutableSet.Builder<String> result = new ImmutableSet.Builder(); + public ImmutableCollection<String> getFieldNames() { + ImmutableSet.Builder<String> result = ImmutableSet.builder(); for (Map.Entry<String, Integer> entry : layout.entrySet()) { if (values[entry.getValue()] != null) { result.add(entry.getKey()); @@ -175,7 +175,7 @@ public abstract class SkylarkInfo extends Info implements Concatable { } SetView<String> commonFields = Sets.intersection( - ImmutableSet.copyOf(lval.getKeys()), ImmutableSet.copyOf(rval.getKeys())); + ImmutableSet.copyOf(lval.getFieldNames()), ImmutableSet.copyOf(rval.getFieldNames())); if (!commonFields.isEmpty()) { throw new EvalException( loc, @@ -198,11 +198,11 @@ public abstract class SkylarkInfo extends Info implements Concatable { compactLeft.getProvider(), compactLeft.layout, newValues, loc); } ImmutableMap.Builder<String, Object> newValues = ImmutableMap.builder(); - for (String key : lval.getKeys()) { - newValues.put(key, lval.getValue(key)); + for (String field : lval.getFieldNames()) { + newValues.put(field, lval.getValue(field)); } - for (String key : rval.getKeys()) { - newValues.put(key, rval.getValue(key)); + for (String field : rval.getFieldNames()) { + newValues.put(field, rval.getValue(field)); } return new MapBackedSkylarkInfo(provider, newValues.build(), loc); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java index 1a94c9cf2b..557b1ca3e8 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java @@ -48,6 +48,7 @@ public class SkylarkProvider extends Provider implements SkylarkExportable { private static final FunctionSignature.WithValues<Object, SkylarkType> SCHEMALESS_SIGNATURE = FunctionSignature.WithValues.create(FunctionSignature.KWARGS); + /** Default value for {@link #errorMessageFormatForUnknownField}. */ private static final String DEFAULT_ERROR_MESSAGE_FORMAT = "Object has no '%s' attribute."; /** @@ -65,7 +66,7 @@ public class SkylarkProvider extends Provider implements SkylarkExportable { private SkylarkKey key; /** Error message format. Reassigned upon exporting. */ - private String errorMessageFormatForInstances; + private String errorMessageFormatForUnknownField; /** * Creates an unexported {@link SkylarkProvider} with no schema. @@ -132,9 +133,9 @@ public class SkylarkProvider extends Provider implements SkylarkExportable { super(/*name=*/ null, buildSignature(fields), location); this.layout = buildLayout(fields); this.key = key; // possibly null - this.errorMessageFormatForInstances = + this.errorMessageFormatForUnknownField = key == null ? DEFAULT_ERROR_MESSAGE_FORMAT - : makeErrorMessageFormatForInstances(key.getExportedName()); + : makeErrorMessageFormatForUnknownField(key.getExportedName()); } @@ -209,18 +210,18 @@ public class SkylarkProvider extends Provider implements SkylarkExportable { } @Override - public String getErrorMessageFormatForInstances() { - return errorMessageFormatForInstances; + public String getErrorMessageFormatForUnknownField() { + return errorMessageFormatForUnknownField; } @Override public void export(Label extensionLabel, String exportedName) { Preconditions.checkState(!isExported()); this.key = new SkylarkKey(extensionLabel, exportedName); - this.errorMessageFormatForInstances = makeErrorMessageFormatForInstances(exportedName); + this.errorMessageFormatForUnknownField = makeErrorMessageFormatForUnknownField(exportedName); } - private static String makeErrorMessageFormatForInstances(String exportedName) { + private static String makeErrorMessageFormatForUnknownField(String exportedName) { return String.format("'%s' object has no attribute '%%s'", exportedName); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java index 0c2b15e467..ff5c287f36 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java @@ -122,12 +122,12 @@ public final class AliasConfiguredTarget implements ConfiguredTarget, ClassObjec } @Override - public ImmutableCollection<String> getKeys() { - return actual.getKeys(); + public ImmutableCollection<String> getFieldNames() { + return actual.getFieldNames(); } @Override - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { // Use the default error message. return null; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index 1eeb89064b..9ac9dcc4b4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -1010,8 +1010,8 @@ public final class ObjcProvider extends NativeInfo { } @Override - public String getErrorMessageFormatForInstances() { - return "ObjcProvider field %s could not be instantiated"; + public String getErrorMessageFormatForUnknownField() { + return "ObjcProvider field '%s' could not be instantiated"; } } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java index 6dc6db113b..09bbad98dc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java @@ -94,8 +94,8 @@ public final class XcTestAppProvider extends NativeInfo { } @Override - public String getErrorMessageFormatForInstances() { - return "XcTestAppProvider field %s could not be instantiated"; + public String getErrorMessageFormatForUnknownField() { + return "XcTestAppProvider field '%s' could not be instantiated"; } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java index 24112a4fae..d66d30bb55 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java @@ -116,11 +116,11 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory { } else { Info struct = (Info) aspectSkylarkObject; Location loc = struct.getCreationLoc(); - for (String key : struct.getKeys()) { - if (key.equals("output_groups")) { - addOutputGroups(struct.getValue(key), loc, builder); - } else if (key.equals("providers")) { - Object value = struct.getValue(key); + for (String field : struct.getFieldNames()) { + if (field.equals("output_groups")) { + addOutputGroups(struct.getValue(field), loc, builder); + } else if (field.equals("providers")) { + Object value = struct.getValue(field); Iterable providers = SkylarkType.cast( value, @@ -131,7 +131,7 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory { EvalUtils.getDataTypeName(value, false)); addDeclaredProviders(builder, providers); } else { - builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc); + builder.addSkylarkTransitiveInfo(field, struct.getValue(field), loc); } } } diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java b/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java index 93cc35c12f..522ecaa052 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/ClassObject.java @@ -11,20 +11,17 @@ // 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.syntax; import com.google.common.collect.ImmutableCollection; import javax.annotation.Nullable; -/** - * An interface for objects behaving like Skylark structs. - */ -// TODO(bazel-team): type checks +/** An interface for Skylark objects (such as structs) that have fields. */ public interface ClassObject { /** - * Returns the value associated with the name field in this struct, - * or null if the field does not exist. + * Returns the value of the field with the given name, or null if the field does not exist. * * @throws EvalException if a user-visible error occurs (other than non-existent field). */ @@ -32,15 +29,17 @@ public interface ClassObject { Object getValue(String name) throws EvalException; /** - * Returns the fields of this struct. + * Returns the names of the fields of this struct, in some canonical order. * - * @throws EvalException if a user-visible error occurs. + * @throws EvalException if a user-visible error occurs */ - ImmutableCollection<String> getKeys() throws EvalException; + ImmutableCollection<String> getFieldNames() throws EvalException; /** - * Returns a customized error message to print if the name is not a valid struct field - * of this struct, or returns null to use the default error message. + * Returns the error message to print for an attempt to access an undefined field. + * + * <p>May return null to use a default error message. */ - @Nullable String errorMessage(String name); + @Nullable + String getErrorMessageForUnknownField(String field); } diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java index 970d0ca14c..8aa0ad92ec 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java @@ -65,11 +65,11 @@ public final class DotExpression extends Expression { } String suffix = ""; if (objValue instanceof ClassObject) { - String customErrorMessage = ((ClassObject) objValue).errorMessage(name); + String customErrorMessage = ((ClassObject) objValue).getErrorMessageForUnknownField(name); if (customErrorMessage != null) { throw new EvalException(loc, customErrorMessage); } - suffix = SpellChecker.didYouMean(name, ((ClassObject) objValue).getKeys()); + suffix = SpellChecker.didYouMean(name, ((ClassObject) objValue).getFieldNames()); } throw new EvalException( loc, diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java index 657d28d4da..f3c0d5f3c1 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java @@ -2066,7 +2066,7 @@ public class MethodLibrary { // Order the fields alphabetically. Set<String> fields = new TreeSet<>(); if (object instanceof ClassObject) { - fields.addAll(((ClassObject) object).getKeys()); + fields.addAll(((ClassObject) object).getFieldNames()); } fields.addAll(Runtime.getBuiltinRegistry().getFunctionNames(object.getClass())); fields.addAll(FuncallExpression.getMethodNames(object.getClass())); diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java index 719c94b961..60c6aece91 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java @@ -64,7 +64,7 @@ public class SkylarkCallbackFunction { String name = names.get(pos); Object value = ctx.getValue(name); if (value == null) { - throw new IllegalArgumentException(ctx.errorMessage(name)); + throw new IllegalArgumentException(ctx.getErrorMessageForUnknownField(name)); } builder.add(value); } diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java index 7b716c3f3a..29ed8aad2e 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java @@ -107,7 +107,7 @@ public class SkylarkRepositoryContextTest { ImmutableMap.<String, Object>of("name", "test", "foo", "bar"), Attribute.attr("foo", Type.STRING).build()); - assertThat(context.getAttr().getKeys()).contains("foo"); + assertThat(context.getAttr().getFieldNames()).contains("foo"); assertThat(context.getAttr().getValue("foo")).isEqualTo("bar"); } diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java index b57b894b2c..cbcfa4835d 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java @@ -101,7 +101,7 @@ public class SkylarkInfoTest { new CompactSkylarkInfo(provider, layout, new Object[] {null, 5}, Location.BUILTIN); Concatable result = p1.getConcatter().concat(p1, p2, Location.BUILTIN); assertThat(result).isInstanceOf(MapBackedSkylarkInfo.class); - assertThat(((SkylarkInfo) result).getKeys()).containsExactly("f1", "f2"); + assertThat(((SkylarkInfo) result).getFieldNames()).containsExactly("f1", "f2"); assertThat(((SkylarkInfo) result).getValue("f1")).isEqualTo(4); assertThat(((SkylarkInfo) result).getValue("f2")).isEqualTo(5); } @@ -117,7 +117,7 @@ public class SkylarkInfoTest { new CompactSkylarkInfo(provider, layout, new Object[] {null, 5}, Location.BUILTIN); Concatable result = p1.getConcatter().concat(p1, p2, Location.BUILTIN); assertThat(result).isInstanceOf(CompactSkylarkInfo.class); - assertThat(((CompactSkylarkInfo) result).getKeys()).containsExactly("f1", "f2"); + assertThat(((CompactSkylarkInfo) result).getFieldNames()).containsExactly("f1", "f2"); assertThat(((CompactSkylarkInfo) result).getValue("f1")).isEqualTo(4); assertThat(((CompactSkylarkInfo) result).getValue("f2")).isEqualTo(5); } diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java index 171bb9f439..26c11763b5 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java @@ -37,7 +37,7 @@ public final class SkylarkProviderTest { assertThat(provider.isExported()).isFalse(); assertThat(provider.getName()).isEqualTo("<no name>"); assertThat(provider.getPrintableName()).isEqualTo("<no name>"); - assertThat(provider.getErrorMessageFormatForInstances()) + assertThat(provider.getErrorMessageFormatForUnknownField()) .isEqualTo("Object has no '%s' attribute."); assertThat(provider.isImmutable()).isFalse(); assertThat(Printer.repr(provider)).isEqualTo("<provider>"); @@ -53,7 +53,7 @@ public final class SkylarkProviderTest { assertThat(provider.isExported()).isTrue(); assertThat(provider.getName()).isEqualTo("prov"); assertThat(provider.getPrintableName()).isEqualTo("prov"); - assertThat(provider.getErrorMessageFormatForInstances()) + assertThat(provider.getErrorMessageFormatForUnknownField()) .isEqualTo("'prov' object has no attribute '%s'"); assertThat(provider.isImmutable()).isTrue(); assertThat(Printer.repr(provider)).isEqualTo("<provider>"); @@ -140,7 +140,7 @@ public final class SkylarkProviderTest { /** Asserts that a {@link SkylarkInfo} has fields a=1, b=2, c=3 (and nothing else). */ private static void assertHasExactlyValuesA1B2C3(SkylarkInfo info) { - assertThat(info.getKeys()).containsExactly("a", "b", "c"); + assertThat(info.getFieldNames()).containsExactly("a", "b", "c"); assertThat(info.getValue("a")).isEqualTo(1); assertThat(info.getValue("b")).isEqualTo(2); assertThat(info.getValue("c")).isEqualTo(3); diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java index 7ba0faa6e0..94ff70e6c4 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSelectionTest.java @@ -124,7 +124,7 @@ public class CcToolchainSelectionTest extends BuildViewTestCase { getRuleContext(target).getToolchainContext().getResolvedToolchainProviders(); ToolchainInfo toolchain = providers.getForToolchainType(Label.parseAbsolute(CPP_TOOLCHAIN_TYPE)); - assertThat(toolchain.getKeys()).isEmpty(); + assertThat(toolchain.getFieldNames()).isEmpty(); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java index 87561bd3b7..930ba2586c 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java @@ -1051,7 +1051,7 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { "y = struct(c = 1, d = 2)", "z = x + y\n"); Info z = (Info) lookup("z"); - assertThat(z.getKeys()).isEqualTo(ImmutableSet.of("a", "b", "c", "d")); + assertThat(z.getFieldNames()).isEqualTo(ImmutableSet.of("a", "b", "c", "d")); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java index 8dfb22dc5a..877bcf8786 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java @@ -1186,7 +1186,7 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase { getConfiguredTarget("//test:my_rule"); fail(); } catch (AssertionError expected) { - assertThat(expected).hasMessageThat().contains("Invalid key for default provider: foo"); + assertThat(expected).hasMessageThat().contains("Invalid field for default provider: foo"); } } diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java index 8aaeb88b00..2f9742c117 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java @@ -235,12 +235,12 @@ public class SkylarkEvaluationTest extends EvaluationTest { } @Override - public ImmutableCollection<String> getKeys() { + public ImmutableCollection<String> getFieldNames() { return ImmutableList.of("field", "nset"); } @Override - public String errorMessage(String name) { + public String getErrorMessageForUnknownField(String name) { return null; } } |