Clean up FuncallExpression and document it better

With this change, FuncallExpression defers to DotExpression in many cases instead of re-inventing dot expresssion evaluation. This removes some of the code duplication between these two classes.

Additionally, this avoids creating a BuiltinCallable for selfCall methods of objects. This is a benefit in that it cleans up the code (it removes the need for redundant BuiltinCallable code, to be removed in a future change), and it also prevents creating a superfluous object which is to be immediately discarded.

RELNOTES: None.
PiperOrigin-RevId: 219877592
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
index 2809f04..932ce26 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
@@ -734,6 +734,6 @@
         assertThrows(AssertionError.class, () ->
             getConfiguredTarget("//examples/apple_skylark:my_target"));
     assertThat(expected).hasMessageThat()
-        .contains("unexpected keyword 'foo' in call");
+        .contains("unexpected keyword 'foo', in call to AppleStaticLibrary");
   }
 }
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 69511a0..60dc76f 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
@@ -1127,8 +1127,7 @@
 
   @Test
   public void testStructAccessingNonFunctionFieldWithArgs() throws Exception {
-    checkErrorContains(
-        "struct field 'a' is not a function", "x = struct(a = 1, b = 2)", "x1 = x.a(1)");
+    checkErrorContains("'int' object is not callable", "x = struct(a = 1, b = 2)", "x1 = x.a(1)");
   }
 
   @Test
@@ -1140,7 +1139,7 @@
   @Test
   public void testStructPosArgs() throws Exception {
     checkErrorContains(
-        "struct(**kwargs) does not accept positional arguments, but got 1", "x = struct(1, b = 2)");
+        "expected no more than 0 positional arguments, but got 1", "x = struct(1, b = 2)");
   }
 
   @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 4bf5203..fe87346 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
@@ -1292,7 +1292,7 @@
         assertThrows(AssertionError.class, () -> getConfiguredTarget("//test:my_rule"));
     assertThat(expected)
         .hasMessageThat()
-        .contains("unexpected keyword 'foo' in call to DefaultInfo");
+        .contains("unexpected keyword 'foo', in call to DefaultInfo");
   }
 
   @Test
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 732c4e8..682a8a4 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
@@ -1272,7 +1272,7 @@
     new SkylarkTest()
         .update("mock", new Mock())
         .testIfErrorContains(
-            "expected string for 'pos' while calling MockFn but got int instead: 1",
+            "expected value of type 'string' for parameter 'pos', in call to MockFn(int)",
             "v = mock(1)");
   }
 
@@ -2175,19 +2175,11 @@
   }
 
   @Test
-  public void testStructFieldDefinedInValuesAndSkylarkCallable() throws Exception {
-    new SkylarkTest()
-        .update("val", new SkylarkClassObjectWithSkylarkCallables())
-        .setUp("v = val.collision_field")
-        .testLookup("v", "fromSkylarkCallable");
-  }
-
-  @Test
   public void testStructMethodDefinedInValuesAndSkylarkCallable() throws Exception {
     new SkylarkTest()
         .update("val", new SkylarkClassObjectWithSkylarkCallables())
         .setUp("v = val.collision_method()")
-        .testLookup("v", "fromValues");
+        .testLookup("v", "fromSkylarkCallable");
   }
 
   @Test