From b63ac185bb5c83b60f1c1bdbc10aa9b4004ae3a6 Mon Sep 17 00:00:00 2001 From: Simon Urli Date: Thu, 9 Feb 2017 15:27:05 +0100 Subject: [PATCH] fix: fix regression with a lambda expression extends Function (#1178) --- .../support/reflect/code/CtLambdaImpl.java | 2 +- .../java/spoon/test/lambda/LambdaTest.java | 15 +++++++++++++++ .../test/lambda/testclasses/LambdaRxJava.java | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/test/java/spoon/test/lambda/testclasses/LambdaRxJava.java diff --git a/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java b/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java index cc74f8c79ae..b52bf81c196 100644 --- a/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtLambdaImpl.java @@ -109,7 +109,7 @@ public CtMethod getOverriddenMethod() { lambdaExecutableMethod = lambdaTypeMethods.iterator().next(); } else { for (CtMethod method : lambdaTypeMethods) { - if (method.isDefaultMethod() || method.hasModifier(ModifierKind.PRIVATE)) { + if (method.isDefaultMethod() || method.hasModifier(ModifierKind.PRIVATE) || method.hasModifier(ModifierKind.STATIC)) { continue; } if (lambdaExecutableMethod != null) { diff --git a/src/test/java/spoon/test/lambda/LambdaTest.java b/src/test/java/spoon/test/lambda/LambdaTest.java index 08c6ccd2fe7..208f624e3f5 100644 --- a/src/test/java/spoon/test/lambda/LambdaTest.java +++ b/src/test/java/spoon/test/lambda/LambdaTest.java @@ -23,13 +23,16 @@ import spoon.test.lambda.testclasses.Bar; import spoon.test.lambda.testclasses.Foo; import spoon.test.lambda.testclasses.Kuu; +import spoon.test.lambda.testclasses.LambdaRxJava; import spoon.test.lambda.testclasses.Panini; import spoon.test.lambda.testclasses.Tacos; import spoon.testing.utils.ModelUtils; import java.io.File; import java.util.List; +import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -47,6 +50,7 @@ public class LambdaTest { private CtType bar; private CtType panini; private CtType tacos; + private CtType lambdaRxJava; private SpoonModelBuilder compiler; @Before @@ -64,6 +68,7 @@ public void setUp() throws Exception { bar = factory.Type().get(Bar.class); panini = factory.Type().get(Panini.class); tacos = factory.Type().get(Tacos.class); + lambdaRxJava = factory.Type().get(LambdaRxJava.class); } @Test @@ -369,6 +374,16 @@ public void testLambdaMethod() throws Exception { */ } + @Test + public void testGetOverriddenMethodWithFunction() throws Exception { + List> allLambdas = lambdaRxJava.getElements(new TypeFilter>(CtLambda.class)); + assertEquals(1, allLambdas.size()); + CtLambda lambda = allLambdas.get(0); + CtMethod method = lambda.getOverriddenMethod(); + CtTypeReference iface = lambda.getType(); + assertEquals(LambdaRxJava.NbpOperator.class.getName(), iface.getQualifiedName()); + } + private void assertTypedBy(Class expectedType, CtTypeReference type) { assertEquals("Lambda must be typed", expectedType, type.getActualClass()); } diff --git a/src/test/java/spoon/test/lambda/testclasses/LambdaRxJava.java b/src/test/java/spoon/test/lambda/testclasses/LambdaRxJava.java new file mode 100644 index 00000000000..bb69bbe9829 --- /dev/null +++ b/src/test/java/spoon/test/lambda/testclasses/LambdaRxJava.java @@ -0,0 +1,18 @@ +package spoon.test.lambda.testclasses; + +import java.util.function.Function; + +/** + * Created by urli on 09/02/2017. + */ +public class LambdaRxJava { + public interface NbpOperator extends Function {} + + public Integer bla(NbpOperator toto) { + return toto.apply("truc"); + } + + public void toto() { + bla((NbpOperator) t -> { return t.length(); }); + } +}