Skip to content

Commit

Permalink
fix(JDTTreeBuilderHelper): executable reference return type should ma…
Browse files Browse the repository at this point in the history
…tch actual executable (#3007)
  • Loading branch information
nharrand authored and monperrus committed Jun 5, 2019
1 parent d9f0e1c commit 097a78e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -581,8 +581,8 @@ <T, E extends CtExpression<?>> CtExecutableReferenceExpression<T, E> createExecu
executableReference.setSimpleName(CharOperation.charToString(referenceExpression.selector));
executableReference.setDeclaringType(jdtTreeBuilder.getReferencesBuilder().getTypeReference(referenceExpression.lhs.resolvedType));
}
final CtTypeReference<T> declaringType = (CtTypeReference<T>) executableReference.getDeclaringType();
executableReference.setType(declaringType == null ? null : declaringType.clone());
final CtTypeReference<T> returnType = executableReference.getType();
executableReference.setType(returnType == null ? null : returnType.clone());
executableRef.setExecutable(executableReference);
return executableRef;
}
Expand Down
23 changes: 23 additions & 0 deletions src/test/java/spoon/reflect/ast/AstCheckerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.reference.CtExecutableReference;
import spoon.support.modelobs.FineModelChangeListener;
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtFieldRead;
Expand Down Expand Up @@ -46,8 +48,29 @@
import java.util.Set;
import java.util.stream.Collectors;

import static org.junit.Assert.assertEquals;

public class AstCheckerTest {

@Test
public void testExecutableReference() {

Launcher l = new Launcher();
l.getEnvironment().setNoClasspath(true);
l.addInputResource("./src/test/resources/noclasspath/A4.java");
l.buildModel();

CtClass<Object> klass = l.getFactory().Class().get("A4");
CtMethod<?> bMethod = klass.getMethodsByName("b").get(0);
CtMethod<?> cMethod = klass.getMethodsByName("c").get(0);
List<CtExecutableReference> elements = cMethod.getElements(new TypeFilter<>(CtExecutableReference.class));
CtExecutableReference methodRef = elements.stream().filter(e -> e.getSimpleName().equals("b")).findFirst().get();

//contract: Executable reference declaring type and return type match those of the actual executable
assertEquals(bMethod.getType().getTypeDeclaration(),methodRef.getType().getTypeDeclaration());
assertEquals(bMethod.getDeclaringType(),methodRef.getDeclaringType().getTypeDeclaration());
}

@Test
public void testAvoidSetCollectionSavedOnAST() {
final Launcher launcher = new Launcher();
Expand Down
16 changes: 16 additions & 0 deletions src/test/resources/noclasspath/A4.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import java.util.List;
import java.util.ArrayList;

public class A4 {

int field;

public static boolean b(Integer param) {
return param > 1;
}

public void c(int param) {
List<Integer> list = new ArrayList();
long l = list.stream().filter(A4::b).count();
}
}

0 comments on commit 097a78e

Please sign in to comment.