diff options
author | 2018-05-24 12:12:07 -0700 | |
---|---|---|
committer | 2018-05-24 12:13:38 -0700 | |
commit | d3d05b2ad55f89f77832880e1088fc472dae1b81 (patch) | |
tree | 19a5dab6c2e65e26ab800cc70c5ec11a2be6b484 /src/test/java/com/google | |
parent | 17c85f366c9e4f6b6d8e7246e0a72ec317e54ac9 (diff) |
Fix SkylarkCallable-annotation detection to appropriately handle methods with generic parameters
RELNOTES: None.
PiperOrigin-RevId: 197932265
Diffstat (limited to 'src/test/java/com/google')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java | 46 |
1 files changed, 29 insertions, 17 deletions
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 422ac033a5..adb8810b12 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 @@ -510,14 +510,35 @@ public class SkylarkEvaluationTest extends EvaluationTest { } } - @SkylarkModule(name = "MockMultipleMethodClass", doc = "") - static final class MockMultipleMethodClass { - @SuppressWarnings("unused") - @SkylarkCallable(documented = false) - public void method(Object o) {} - @SuppressWarnings("unused") - @SkylarkCallable(documented = false) - public void method(String i) {} + @SkylarkModule(name = "ParamterizedMock", doc = "") + static interface ParameterizedApi<ObjectT> { + @SkylarkCallable( + name = "method", + documented = false, + parameters = { + @Param(name = "foo", named = true, positional = true, type = Object.class), + } + ) + public ObjectT method(ObjectT o); + } + + static final class ParameterizedMock implements ParameterizedApi<String> { + @Override + public String method(String o) { + return o; + } + } + + // Verifies that a method implementation overriding a parameterized annotated interface method + // is still treated as skylark-callable. Concretely, method() below should be treated as + // callable even though its method signature isn't an *exact* match of the annotated method + // declaration, due to the interface's method declaration being generic. + @Test + public void testParameterizedMock() throws Exception { + new SkylarkTest() + .update("mock", new ParameterizedMock()) + .setUp("result = mock.method('bar')") + .testLookup("result", "bar"); } @Test @@ -1000,15 +1021,6 @@ public class SkylarkEvaluationTest extends EvaluationTest { } @Test - public void testJavaCallsMultipleMethod() throws Exception { - new SkylarkTest() - .update("mock", new MockMultipleMethodClass()) - .testIfExactError( - "type 'MockMultipleMethodClass' has multiple matches for function method(string)", - "s = mock.method('string')"); - } - - @Test public void testJavaCallWithKwargs() throws Exception { new SkylarkTest() .update("mock", new Mock()) |