Skip to content

Commit

Permalink
fix: fix regression with a lambda expression extends Function (#1178)
Browse files Browse the repository at this point in the history
  • Loading branch information
surli authored and monperrus committed Feb 9, 2017
1 parent fb9016f commit b63ac18
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/main/java/spoon/support/reflect/code/CtLambdaImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public <R> CtMethod<R> 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) {
Expand Down
15 changes: 15 additions & 0 deletions src/test/java/spoon/test/lambda/LambdaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -47,6 +50,7 @@ public class LambdaTest {
private CtType<Bar> bar;
private CtType<Object> panini;
private CtType<Object> tacos;
private CtType<LambdaRxJava> lambdaRxJava;
private SpoonModelBuilder compiler;

@Before
Expand All @@ -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
Expand Down Expand Up @@ -369,6 +374,16 @@ public void testLambdaMethod() throws Exception {
*/
}

@Test
public void testGetOverriddenMethodWithFunction() throws Exception {
List<CtLambda<?>> allLambdas = lambdaRxJava.getElements(new TypeFilter<CtLambda<?>>(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());
}
Expand Down
18 changes: 18 additions & 0 deletions src/test/java/spoon/test/lambda/testclasses/LambdaRxJava.java
Original file line number Diff line number Diff line change
@@ -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<String, Integer> {}

public Integer bla(NbpOperator toto) {
return toto.apply("truc");
}

public void toto() {
bla((NbpOperator) t -> { return t.length(); });
}
}

0 comments on commit b63ac18

Please sign in to comment.