Enforce via annotation processor that a class may not have two @SkylarkCallable methods with the same name.

This greatly simplifies the code around method retrieval.

Fixes #6490.

RELNOTES: None.
PiperOrigin-RevId: 218568560
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index c0374df..f904c42 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -2042,7 +2042,7 @@
     checkError(
         "test/skylark",
         "r",
-        "struct has no method 'output_group'",
+        "type 'Target' has no method output_group()",
         "load('//test/skylark:extension.bzl',  'my_rule')",
         "cc_binary(name = 'lib', data = ['a.txt'])",
         "my_rule(name='r', dep = ':lib')");
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 0c12754..3337f07 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
@@ -1109,7 +1109,7 @@
   @Test
   public void testStructAccessingUnknownFieldWithArgs() throws Exception {
     checkErrorContains(
-        "struct has no method 'c'", "x = struct(a = 1, b = 2)", "y = x.c()");
+        "type 'struct' has no method c()", "x = struct(a = 1, b = 2)", "y = x.c()");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
index f42b695..0df865c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
@@ -305,4 +305,14 @@
             "Only one of @SkylarkCallable.enablingFlag and @SkylarkCallable.disablingFlag may be "
                 + "specified.");
   }
+
+  @Test
+  public void testConflictingMethodNames() throws Exception {
+    assertAbout(javaSource())
+        .that(getFile("ConflictingMethodNames.java"))
+        .processedWith(new SkylarkCallableProcessor())
+        .failsToCompile()
+        .withErrorContaining("Containing class has more than one method with name "
+            + "'conflicting_method' defined");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java
new file mode 100644
index 0000000..e721402
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java
@@ -0,0 +1,46 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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.skylarkinterface.processor.testsources;
+
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+
+/**
+ * Test case for a class which contains multiple SkylarkCallable methods with the same name.
+ * This should cause a compile failure -- overrides are not allowed.
+ */
+public class ConflictingMethodNames {
+
+  @SkylarkCallable(
+      name = "conflicting_method",
+      documented = false,
+      parameters = {
+          @Param(name = "one", type = String.class, named = true),
+      })
+  public String conflictingMethod(String one) {
+    return "foo";
+  }
+
+  @SkylarkCallable(
+      name = "conflicting_method",
+      documented = false,
+      parameters = {
+          @Param(name = "one", type = String.class, named = true),
+          @Param(name = "two", type = Integer.class, named = true),
+      })
+  public String conflictingMethodTwo(String one, Integer two) {
+    return "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 071019e..d733836 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
@@ -2218,7 +2218,8 @@
         .update("val", new SkylarkClassObjectWithSkylarkCallables())
         .testIfExactError(
             // TODO(bazel-team): This should probably match the error above better.
-            "struct has no method 'nonexistent_method'", "v = val.nonexistent_method()");
+            "type 'SkylarkClassObjectWithSkylarkCallables' has no method nonexistent_method()",
+            "v = val.nonexistent_method()");
   }
 
   @Test