starlark: rename ClassObject to Structure
Neither class nor object are terms that have any meaning in Starlark.
Starlark.classType(Structure.class) now reports "structure" not "ClassObject"
in error messages relating to parameters of that type.
PiperOrigin-RevId: 340693968
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 4d66778..dda55c5 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
@@ -19,7 +19,7 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Structure;
/**
* A {@link ConfiguredTarget} is conceptually a {@link TransitiveInfoCollection} coupled with the
@@ -31,7 +31,7 @@
* their direct dependencies, only the corresponding {@link TransitiveInfoCollection}s. Also, {@link
* ConfiguredTarget} objects should not be accessible from the action graph.
*/
-public interface ConfiguredTarget extends TransitiveInfoCollection, ClassObject {
+public interface ConfiguredTarget extends TransitiveInfoCollection, Structure {
/** All <code>ConfiguredTarget</code>s have a "label" field. */
String LABEL_FIELD = "label";
@@ -63,8 +63,7 @@
/**
* Returns a legacy Starlark provider.
*
- * <p>Overrides {@link ClassObject#getValue(String)}, but does not allow EvalException to be
- * thrown.
+ * <p>Overrides {@link Structure#getValue(String)}, but does not allow EvalException to be thrown.
*/
@Nullable
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
index 0eb4d3e..120aafe 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
@@ -87,7 +87,6 @@
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Printer;
@@ -97,6 +96,7 @@
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
import net.starlark.java.eval.Tuple;
/**
@@ -272,13 +272,13 @@
/**
* Represents `ctx.outputs`.
*
- * <p>A {@link ClassObject} (struct-like data structure) with "executable" field created lazily
- * on-demand.
+ * <p>The value of its {@code ctx.outputs.executable} field is computed on-demand.
*
* <p>Note: There is only one {@code Outputs} object per rule context, so default (object
* identity) equals and hashCode suffice.
*/
- private static class Outputs implements ClassObject, StarlarkValue {
+ // TODO(adonovan): add StarlarkBuiltin(name="ctx.outputs") annotation.
+ private static class Outputs implements Structure, StarlarkValue {
private final Map<String, Object> outputs;
private final StarlarkRuleContext context;
private boolean executableCreated = false;
@@ -648,7 +648,7 @@
}
@Override
- public ClassObject outputs() throws EvalException {
+ public Structure outputs() throws EvalException {
checkMutable("outputs");
if (outputsObject == null) {
throw new EvalException("'outputs' is not defined");
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 ae039c1..4f35aeb 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
@@ -56,11 +56,11 @@
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
/**
* Metadata of a rule attribute. Contains the attribute name and type, and an default value to be
@@ -1478,7 +1478,7 @@
private Object invokeCallback(EventHandler eventHandler, Map<String, Object> attrValues)
throws EvalException, InterruptedException {
- ClassObject attrs =
+ Structure attrs =
StructProvider.STRUCT.create(
attrValues, "No such regular (non computed) attribute '%s'.");
Object result = callback.call(eventHandler, attrs);
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 b345cc4..d0f929a 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
@@ -40,10 +40,10 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.Structure;
/**
* A function interface allowing rules to specify their set of implicit outputs in a more dynamic
@@ -99,7 +99,7 @@
attrValues.put(Attribute.getStarlarkName(attrName), Attribute.valueToStarlark(value));
}
}
- ClassObject attrs =
+ Structure attrs =
StructProvider.STRUCT.create(
attrValues,
"Attribute '%s' either doesn't exist "
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 3e623e2..7b9f0e0 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
@@ -48,7 +48,7 @@
/**
* Returns an error message format string for instances to use for their {@link
- * net.starlark.java.eval.ClassObject#getErrorMessageForUnknownField(String)}.
+ * net.starlark.java.eval.Structure#getErrorMessageForUnknownField(String)}.
*
* <p>The format string must contain one {@code '%s'} placeholder for the field name.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
index 1f3ef02..ca07e41 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkCallbackHelper.java
@@ -18,20 +18,20 @@
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Mutability;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkFunction;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Structure;
/**
* A helper class for calling Starlark functions from Java, where the argument values are supplied
- * by the fields of a ClassObject, as in the case of computed attribute defaults and computed
- * implicit outputs.
+ * by the fields of a Structure, as in the case of computed attribute defaults and computed implicit
+ * outputs.
*
- * TODO(adonovan): eliminate the need for this class by making the Starlark calls in the same
+ * <p>TODO(adonovan): eliminate the need for this class by making the Starlark calls in the same
* Starlark thread that instantiated the rule.
*/
@AutoCodec
@@ -65,9 +65,9 @@
return callback.getParameterNames();
}
- // TODO(adonovan): opt: all current callers are forced to construct a temporary ClassObject.
+ // TODO(adonovan): opt: all current callers are forced to construct a temporary Structure.
// Instead, make them supply a map.
- public Object call(EventHandler eventHandler, ClassObject ctx, Object... arguments)
+ public Object call(EventHandler eventHandler, Structure ctx, Object... arguments)
throws EvalException, InterruptedException {
try (Mutability mu = Mutability.create("callback", callback)) {
StarlarkThread thread = new StarlarkThread(mu, starlarkSemantics);
@@ -87,7 +87,7 @@
* Creates a list of actual arguments that contains the given arguments and all attribute values
* required from the specified context.
*/
- private ImmutableList<Object> buildArgumentList(ClassObject ctx, Object... arguments)
+ private ImmutableList<Object> buildArgumentList(Structure ctx, Object... arguments)
throws EvalException {
ImmutableList.Builder<Object> builder = ImmutableList.builder();
ImmutableList<String> names = getParameterNames();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
index 0bfeb51..ee9000c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
@@ -24,15 +24,15 @@
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.HasBinary;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.Structure;
import net.starlark.java.syntax.Location;
import net.starlark.java.syntax.TokenKind;
/** An Info (provider instance) for providers defined in Starlark. */
-public final class StarlarkInfo extends StructImpl implements HasBinary, ClassObject {
+public final class StarlarkInfo extends StructImpl implements HasBinary, Structure {
public static final Depset.ElementType TYPE = Depset.ElementType.of(StarlarkInfo.class);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
index 13386a3..5f25557 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
@@ -34,7 +34,6 @@
import net.starlark.java.annot.ParamType;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
@@ -44,6 +43,7 @@
import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
import net.starlark.java.lib.json.Json;
import net.starlark.java.syntax.Location;
@@ -139,7 +139,7 @@
+ "# }\n"
+ "</pre>",
parameters = {@Param(name = "x")})
- public String encodeText(ClassObject x) throws EvalException {
+ public String encodeText(Structure x) throws EvalException {
TextEncoder enc = new TextEncoder();
enc.message(x);
return enc.out.toString();
@@ -150,8 +150,8 @@
private final StringBuilder out = new StringBuilder();
private int indent = 0;
- // Encodes ClassObject x as a protocol message.
- private void message(ClassObject x) throws EvalException {
+ // Encodes Structure x as a protocol message.
+ private void message(Structure x) throws EvalException {
// For determinism, sort fields.
String[] fields = x.getFieldNames().toArray(new String[0]);
Arrays.sort(fields);
@@ -164,7 +164,7 @@
}
}
- // Encodes ClassObject field (name, v) as a message field
+ // Encodes Structure field (name, v) as a message field
// (a repeated field, if v is a dict or sequence.)
private void field(String name, Object v) throws EvalException {
// dict?
@@ -210,12 +210,12 @@
}
// Emits field (name, v) as a message field, or one element of a repeated field.
- // v must be an int, float, string, bool, or ClassObject.
+ // v must be an int, float, string, bool, or Structure.
private void fieldElement(String name, Object v) throws EvalException {
- if (v instanceof ClassObject) {
+ if (v instanceof Structure) {
emitLine(name, " {");
indent++;
- message((ClassObject) v);
+ message((Structure) v);
indent--;
emitLine("}");
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
index d949d74..d6c7bc1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
@@ -23,12 +23,12 @@
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Printer;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkInt;
+import net.starlark.java.eval.Structure;
import net.starlark.java.syntax.Location;
/**
@@ -45,7 +45,7 @@
* reported by {@code getFieldNames} their corresponding field values are equivalent, or accessing
* them both returns an error.
*/
-public abstract class StructImpl implements Info, ClassObject, StructApi {
+public abstract class StructImpl implements Info, Structure, StructApi {
private final Provider provider;
private final Location location;
@@ -198,16 +198,16 @@
throws EvalException {
if (value == Starlark.NONE) {
sb.append("null");
- } else if (value instanceof ClassObject) {
+ } else if (value instanceof Structure) {
sb.append("{");
String join = "";
- for (String field : ((ClassObject) value).getFieldNames()) {
+ for (String field : ((Structure) value).getFieldNames()) {
sb.append(join);
join = ",";
appendJSONStringLiteral(sb, field);
sb.append(':');
- printJson(((ClassObject) value).getValue(field), sb, "struct field", field);
+ printJson(((Structure) value).getValue(field), sb, "struct field", field);
}
sb.append("}");
} else if (value instanceof Dict) {
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 cbd6ffc..db1d7aa 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
@@ -31,10 +31,10 @@
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Printer;
import net.starlark.java.eval.StarlarkSemantics;
+import net.starlark.java.eval.Structure;
/**
* This configured target pretends to be whatever type of target "actual" is, returning its label,
@@ -44,7 +44,7 @@
*/
@AutoCodec
@Immutable
-public final class AliasConfiguredTarget implements ConfiguredTarget, ClassObject {
+public final class AliasConfiguredTarget implements ConfiguredTarget, Structure {
private final Label label;
private final BuildConfigurationValue.Key configurationKey;
private final ConfiguredTarget actual;
@@ -131,7 +131,7 @@
return configurationKey;
}
- /* ClassObject methods */
+ /* Structure methods */
@Override
public Object getValue(String name) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 8996be0..9ecacc9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -73,7 +73,6 @@
import java.util.Locale;
import java.util.Set;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
@@ -82,6 +81,7 @@
import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Structure;
import net.starlark.java.eval.Tuple;
/** A module that contains Starlark utilities for C++ support. */
@@ -1048,7 +1048,7 @@
}
}
- private static Object getValueOrNull(ClassObject x, String name) {
+ private static Object getValueOrNull(Structure x, String name) {
try {
return x.getValue(name);
} catch (EvalException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
index 54ccf23..f38e695 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FragmentCollectionApi.java
@@ -16,8 +16,8 @@
import com.google.devtools.build.docgen.annot.DocCategory;
import net.starlark.java.annot.StarlarkBuiltin;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
/** Represents a collection of configuration fragments in Starlark. */
@StarlarkBuiltin(
@@ -31,4 +31,4 @@
+ "may be accessed in this collection.</p>"
+ "<p>See <a href=\"../rules.DOC_EXT#configuration-fragments\">rules documentation</a> "
+ "for details.")
-public interface FragmentCollectionApi extends ClassObject, StarlarkValue {}
+public interface FragmentCollectionApi extends Structure, StarlarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
index 4424695..5d1f70c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
@@ -30,13 +30,13 @@
import net.starlark.java.annot.ParamType;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
import net.starlark.java.eval.Tuple;
/** Interface for a context object given to rule implementation functions. */
@@ -291,7 +291,7 @@
FileRootApi getGenfilesDirectory() throws EvalException;
@StarlarkMethod(name = "outputs", structField = true, doc = OUTPUTS_DOC)
- ClassObject outputs() throws EvalException;
+ Structure outputs() throws EvalException;
@StarlarkMethod(
name = "rule",
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
index 1ef51b9..858cadd 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
@@ -21,13 +21,13 @@
import java.lang.reflect.Array;
import java.util.Map;
import java.util.Set;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Debug;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
/** Helper class for creating {@link StarlarkDebuggingProtos.Value} from Starlark objects. */
final class DebuggerSerialization {
@@ -71,8 +71,8 @@
if (value instanceof StarlarkInt) {
return false;
}
- if (value instanceof ClassObject || value instanceof StarlarkValue) {
- // assuming ClassObject's have at least one child as a temporary optimization
+ if (value instanceof Structure || value instanceof StarlarkValue) {
+ // assuming Structure's have at least one child as a temporary optimization
// TODO(bazel-team): remove once child-listing logic is moved to StarlarkValue
return true;
}
@@ -97,8 +97,8 @@
return getDebugAttributes(objectMap, (Debug.ValueWithDebugAttributes) value);
}
// TODO(bazel-team): move child-listing logic to StarlarkValue where practical
- if (value instanceof ClassObject) {
- return getChildren(objectMap, (ClassObject) value);
+ if (value instanceof Structure) {
+ return getChildren(objectMap, (Structure) value);
}
if (value instanceof StarlarkValue) {
return getChildren(objectMap, (StarlarkValue) value);
@@ -108,7 +108,7 @@
}
private static ImmutableList<Value> getChildren(
- ThreadObjectMap objectMap, ClassObject classObject) {
+ ThreadObjectMap objectMap, Structure classObject) {
ImmutableList.Builder<Value> builder = ImmutableList.builder();
for (String key : Ordering.natural().immutableSortedCopy(classObject.getFieldNames())) {
try {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
index dbe5b38..6cf111e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
@@ -18,7 +18,6 @@
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.starlarkbuildapi.StarlarkNativeModuleApi;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
@@ -29,10 +28,11 @@
import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Structure;
import net.starlark.java.syntax.Location;
/** Fake implementation of {@link StarlarkNativeModuleApi}. */
-public class FakeStarlarkNativeModuleApi implements StarlarkNativeModuleApi, ClassObject {
+public class FakeStarlarkNativeModuleApi implements StarlarkNativeModuleApi, Structure {
@Override
public Sequence<?> glob(
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
index 15185b5..f4812e5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
@@ -22,16 +22,14 @@
import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
import java.util.Map;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Printer;
import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.eval.Structure;
-/**
- * Fake implementation of {@link StructApi}.
- */
-public class FakeStructApi implements StructApi, ClassObject {
+/** Fake implementation of {@link StructApi}. */
+public class FakeStructApi implements StructApi, Structure {
private final Map<String, Object> objects;
@@ -54,7 +52,7 @@
}
/**
- * Wraps {@link ClassObject#getValue(String)}, returning null in cases where {@link EvalException}
+ * Wraps {@link Structure#getValue(String)}, returning null in cases where {@link EvalException}
* would have been thrown.
*/
@VisibleForTesting
diff --git a/src/main/java/net/starlark/java/eval/BUILD b/src/main/java/net/starlark/java/eval/BUILD
index f339938..93fd295 100644
--- a/src/main/java/net/starlark/java/eval/BUILD
+++ b/src/main/java/net/starlark/java/eval/BUILD
@@ -16,7 +16,6 @@
srcs = [
"BuiltinFunction.java",
"CallUtils.java",
- "ClassObject.java",
"CpuProfiler.java",
"Debug.java",
"Dict.java",
@@ -48,6 +47,7 @@
"StarlarkThread.java",
"StarlarkValue.java",
"StringModule.java",
+ "Structure.java",
"Tuple.java",
],
visibility = ["//src/main/java/net/starlark/java:clients"],
diff --git a/src/main/java/net/starlark/java/eval/EvalUtils.java b/src/main/java/net/starlark/java/eval/EvalUtils.java
index 35f0770..8577630 100644
--- a/src/main/java/net/starlark/java/eval/EvalUtils.java
+++ b/src/main/java/net/starlark/java/eval/EvalUtils.java
@@ -477,8 +477,8 @@
/** Updates the named field of x as if by the Starlark statement {@code x.field = value}. */
static void setField(Object x, String field, Object value) throws EvalException {
- if (x instanceof ClassObject) {
- ((ClassObject) x).setField(field, value);
+ if (x instanceof Structure) {
+ ((Structure) x).setField(field, value);
} else {
throw Starlark.errorf("cannot set .%s field of %s value", field, Starlark.type(x));
}
diff --git a/src/main/java/net/starlark/java/eval/Starlark.java b/src/main/java/net/starlark/java/eval/Starlark.java
index a82b453..3a96b4f 100644
--- a/src/main/java/net/starlark/java/eval/Starlark.java
+++ b/src/main/java/net/starlark/java/eval/Starlark.java
@@ -325,6 +325,8 @@
return "sequence";
} else if (c == StarlarkCallable.class) {
return "callable";
+ } else if (c == Structure.class) {
+ return "structure";
}
StarlarkBuiltin module = StarlarkAnnotations.getStarlarkBuiltin(c);
@@ -658,7 +660,7 @@
*/
public static boolean hasattr(StarlarkSemantics semantics, Object x, String name)
throws EvalException {
- return (x instanceof ClassObject && ((ClassObject) x).getValue(name) != null)
+ return (x instanceof Structure && ((Structure) x).getValue(name) != null)
|| CallUtils.getAnnotatedMethods(semantics, x.getClass()).containsKey(name);
}
@@ -685,9 +687,9 @@
}
// user-defined field?
- if (x instanceof ClassObject) {
- ClassObject obj = (ClassObject) x;
- Object field = obj.getValue(semantics, name);
+ if (x instanceof Structure) {
+ Structure struct = (Structure) x;
+ Object field = struct.getValue(semantics, name);
if (field != null) {
return Starlark.checkValid(field);
}
@@ -696,7 +698,7 @@
return defaultValue;
}
- String error = obj.getErrorMessageForUnknownField(name);
+ String error = struct.getErrorMessageForUnknownField(name);
if (error != null) {
throw Starlark.errorf("%s", error);
}
@@ -717,8 +719,8 @@
public static StarlarkList<String> dir(Mutability mu, StarlarkSemantics semantics, Object x) {
// Order the fields alphabetically.
Set<String> fields = new TreeSet<>();
- if (x instanceof ClassObject) {
- fields.addAll(((ClassObject) x).getFieldNames());
+ if (x instanceof Structure) {
+ fields.addAll(((Structure) x).getFieldNames());
}
fields.addAll(CallUtils.getAnnotatedMethods(semantics, x.getClass()).keySet());
return StarlarkList.copyOf(mu, fields);
diff --git a/src/main/java/net/starlark/java/eval/ClassObject.java b/src/main/java/net/starlark/java/eval/Structure.java
similarity index 92%
rename from src/main/java/net/starlark/java/eval/ClassObject.java
rename to src/main/java/net/starlark/java/eval/Structure.java
index b61e207..3487945 100644
--- a/src/main/java/net/starlark/java/eval/ClassObject.java
+++ b/src/main/java/net/starlark/java/eval/Structure.java
@@ -17,9 +17,11 @@
import com.google.common.collect.ImmutableCollection;
import javax.annotation.Nullable;
-/** An interface for Starlark values (such as structs) that have fields. */
-// TODO(adonovan): rename "HasFields".
-public interface ClassObject extends StarlarkValue {
+/**
+ * An interface for Starlark values (such as Bazel structs) with fields that may be accessed using
+ * Starlark's {@code x.field} notation and optionally updating using an {@code x.f=y} assignment.
+ */
+public interface Structure extends StarlarkValue {
/**
* Returns the value of the field with the given name, or null if the field does not exist. The
diff --git a/src/main/java/net/starlark/java/lib/json/Json.java b/src/main/java/net/starlark/java/lib/json/Json.java
index 9ecb90b..c19ada7 100644
--- a/src/main/java/net/starlark/java/lib/json/Json.java
+++ b/src/main/java/net/starlark/java/lib/json/Json.java
@@ -19,7 +19,6 @@
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Mutability;
@@ -30,6 +29,7 @@
import net.starlark.java.eval.StarlarkList;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.Structure;
// Tests at //src/test/java/net/starlark/java/eval:testdata/json.sky
@@ -61,7 +61,7 @@
*
* <p>An application-defined subclass of StarlarkValue may define its own JSON encoding by
* implementing the {@link Encodable} interface. Otherwise, the encoder tests for the {@link Map},
- * {@link StarlarkIterable}, and {@link ClassObject} interfaces, in that order, resulting in
+ * {@link StarlarkIterable}, and {@link Structure} interfaces, in that order, resulting in
* dict-like, list-like, and struct-like encoding, respectively. See the Starlark documentation
* annotation for more detail.
*
@@ -188,8 +188,8 @@
}
// e.g. struct
- if (x instanceof ClassObject) {
- ClassObject obj = (ClassObject) x;
+ if (x instanceof Structure) {
+ Structure obj = (Structure) x;
// Sort keys for determinism.
String[] fields = obj.getFieldNames().toArray(new String[0]);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
index b0a7f79..a5b396e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironmentTest.java
@@ -26,7 +26,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Structure;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -90,8 +90,7 @@
ImmutableMap.of("overridable_symbol", "new_value"),
ImmutableMap.of("overridable_rule", "new_rule"));
assertThat(env).containsEntry("overridable_symbol", "new_value");
- assertThat(((ClassObject) env.get("native")).getValue("overridable_rule"))
- .isEqualTo("new_rule");
+ assertThat(((Structure) env.get("native")).getValue("overridable_rule")).isEqualTo("new_rule");
}
/** Asserts that injection with the given maps fails with the given error substring. */
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
index 0b78a75..d93da55 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunctionTest.java
@@ -26,7 +26,7 @@
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
-import net.starlark.java.eval.ClassObject;
+import net.starlark.java.eval.Structure;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -100,7 +100,7 @@
assertThat(value.predeclaredForBuildBzl).containsEntry("overridable_symbol", "new_value");
// Overridden native field.
Object nativeField =
- ((ClassObject) value.predeclaredForBuildBzl.get("native")).getValue("overridable_rule");
+ ((Structure) value.predeclaredForBuildBzl.get("native")).getValue("overridable_rule");
assertThat(nativeField).isEqualTo("new_rule");
// Stuff for native rules.
assertThat(value.exportedToJava).containsExactly("for_native_code", "secret_sauce").inOrder();
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
index ef01436..502ba79 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
@@ -55,7 +55,6 @@
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.util.FileTypeSet;
import javax.annotation.Nullable;
-import net.starlark.java.eval.ClassObject;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Module;
@@ -63,6 +62,7 @@
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkList;
+import net.starlark.java.eval.Structure;
import net.starlark.java.eval.Tuple;
import net.starlark.java.syntax.ParserInput;
import net.starlark.java.syntax.Program;
@@ -1195,14 +1195,14 @@
public void testStructCreation() throws Exception {
// TODO(fwe): cannot be handled by current testing suite
ev.exec("x = struct(a = 1, b = 2)");
- assertThat(ev.lookup("x")).isInstanceOf(ClassObject.class);
+ assertThat(ev.lookup("x")).isInstanceOf(Structure.class);
}
@Test
public void testStructFields() throws Exception {
// TODO(fwe): cannot be handled by current testing suite
ev.exec("x = struct(a = 1, b = 2)");
- ClassObject x = (ClassObject) ev.lookup("x");
+ Structure x = (Structure) ev.lookup("x");
assertThat(x.getValue("a")).isEqualTo(StarlarkInt.of(1));
assertThat(x.getValue("b")).isEqualTo(StarlarkInt.of(2));
diff --git a/src/test/java/net/starlark/java/eval/MethodLibraryTest.java b/src/test/java/net/starlark/java/eval/MethodLibraryTest.java
index 9c694de..90fc094 100644
--- a/src/test/java/net/starlark/java/eval/MethodLibraryTest.java
+++ b/src/test/java/net/starlark/java/eval/MethodLibraryTest.java
@@ -214,7 +214,7 @@
}
@StarlarkBuiltin(name = "AStruct", documented = false, doc = "")
- static final class AStruct implements ClassObject, StarlarkValue {
+ static final class AStruct implements Structure, StarlarkValue {
@Override
public Object getValue(String name) {
switch (name) {
diff --git a/src/test/java/net/starlark/java/eval/ScriptTest.java b/src/test/java/net/starlark/java/eval/ScriptTest.java
index 5713e7d..2ccf0e6 100644
--- a/src/test/java/net/starlark/java/eval/ScriptTest.java
+++ b/src/test/java/net/starlark/java/eval/ScriptTest.java
@@ -257,7 +257,7 @@
}
// A trivial struct-like class with Starlark fields defined by a map.
- private static class Struct implements StarlarkValue, ClassObject {
+ private static class Struct implements StarlarkValue, Structure {
final Map<String, Object> fields;
Struct(Map<String, Object> fields) {
diff --git a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
index a163c5e..640c273 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
@@ -79,7 +79,7 @@
}
// A trivial struct-like class with Starlark fields defined by a map.
- private static class SimpleStruct implements StarlarkValue, ClassObject {
+ private static class SimpleStruct implements StarlarkValue, Structure {
final ImmutableMap<String, Object> fields;
SimpleStruct(ImmutableMap<String, Object> fields) {
@@ -345,7 +345,7 @@
doc = "Returns a struct containing all callable method objects of this mock",
allowReturnNones = true,
useStarlarkThread = true)
- public ClassObject proxyMethodsObject(StarlarkThread thread)
+ public Structure proxyMethodsObject(StarlarkThread thread)
throws EvalException, InterruptedException {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
for (String name : Starlark.dir(thread.mutability(), thread.getSemantics(), this)) {
@@ -2014,7 +2014,7 @@
@Test
public void testStructMethodDefinedInValuesAndStarlarkMethod() throws Exception {
// This test exercises the resolution of ambiguity between @StarlarkMethod-annotated
- // fields and those reported by ClassObject.getValue.
+ // fields and those reported by Structure.getValue.
ev.new Scenario()
.update("val", new SimpleStructWithMethods())
.setUp("v = val.collision_method()")