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