bazel syntax: make some stragglers implement StarlarkValue

- make actions.RunfileSupplier implement StarlarkValue.
  Because it is one, intended or not.
- make tests' dummy values implement StarlarkValue.

PiperOrigin-RevId: 282618274
diff --git a/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java b/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
index f6bac6b..c0c3d4d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/RunfilesSupplier.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import java.util.Map;
@@ -25,7 +26,10 @@
 /** Convenience wrapper around runfiles allowing lazy expansion. */
 // TODO(bazel-team): Ideally we could refer to Runfiles objects directly here, but current package
 // structure makes this difficult. Consider moving things around to make this possible.
-public interface RunfilesSupplier {
+//
+// RunfilesSuppliers appear to be Starlark values;
+// they are exposed through ctx.resolve_tools[2], for example.
+public interface RunfilesSupplier extends StarlarkValue {
 
   /** @return the contained artifacts */
   NestedSet<Artifact> getArtifacts();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkStringRepresentationsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkStringRepresentationsTest.java
index ddcccbb..80bfd8d 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkStringRepresentationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkStringRepresentationsTest.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
+import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.Root;
@@ -239,7 +240,8 @@
     assertThat(skylarkLoadingEval("repr(Label('//foo:bar'))")).isEqualTo("Label(\"//foo:bar\")");
     assertThat(skylarkLoadingEval("'%r' % Label('//foo:bar')")).isEqualTo("Label(\"//foo:bar\")");
 
-    assertThat(skylarkLoadingEval("'{}'.format([Label('//foo:bar')])")).isEqualTo("[Label(\"//foo:bar\")]");
+    assertThat(skylarkLoadingEval("'{}'.format([Label('//foo:bar')])"))
+        .isEqualTo("[Label(\"//foo:bar\")]");
   }
 
   @Test
@@ -375,14 +377,17 @@
     }
   }
 
-  @Test
-  public void testStringRepresentationsOfUnknownObjects() throws Exception {
-    update("mock", new Object());
+  private static class Dummy implements StarlarkValue {}
 
-    assertThat(eval("str(mock)")).isEqualTo("<unknown object java.lang.Object>");
-    assertThat(eval("repr(mock)")).isEqualTo("<unknown object java.lang.Object>");
-    assertThat(eval("'{}'.format(mock)")).isEqualTo("<unknown object java.lang.Object>");
-    assertThat(eval("'%s' % mock")).isEqualTo("<unknown object java.lang.Object>");
-    assertThat(eval("'%r' % mock")).isEqualTo("<unknown object java.lang.Object>");
+  @Test
+  public void testStringRepresentationsOfArbitraryObjects() throws Exception {
+    update("dummy", new Dummy());
+
+    String dummy = "com.google.devtools.build.lib.skylark.SkylarkStringRepresentationsTest$Dummy";
+    assertThat(eval("str(dummy)")).isEqualTo("<unknown object " + dummy + ">");
+    assertThat(eval("repr(dummy)")).isEqualTo("<unknown object " + dummy + ">");
+    assertThat(eval("'{}'.format(dummy)")).isEqualTo("<unknown object " + dummy + ">");
+    assertThat(eval("'%s' % dummy")).isEqualTo("<unknown object " + dummy + ">");
+    assertThat(eval("'%r' % dummy")).isEqualTo("<unknown object " + dummy + ">");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index e259432..2ff2eee 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -664,24 +664,29 @@
     };
   }
 
+  private static class Dummy implements StarlarkValue {}
+
   @Test
-  public void testPercOnObject() throws Exception {
+  public void testPercentOnDummyValue() throws Exception {
     newTest().update("obj", createObjWithStr()).testExpression("'%s' % obj", "<str marker>");
     newTest()
-        .update("unknown", new Object())
-        .testExpression("'%s' % unknown", "<unknown object java.lang.Object>");
+        .update("unknown", new Dummy())
+        .testExpression(
+            "'%s' % unknown",
+            "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>");
   }
 
   @Test
-  public void testPercOnObjectList() throws Exception {
+  public void testPercentOnTupleOfDummyValues() throws Exception {
     newTest()
         .update("obj", createObjWithStr())
         .testExpression("'%s %s' % (obj, obj)", "<str marker> <str marker>");
     newTest()
-        .update("unknown", new Object())
+        .update("unknown", new Dummy())
         .testExpression(
             "'%s %s' % (unknown, unknown)",
-            "<unknown object java.lang.Object> <unknown object java.lang.Object>");
+            "<unknown object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy> <unknown"
+                + " object com.google.devtools.build.lib.syntax.EvaluationTest$Dummy>");
   }
 
   @Test