Java: resolve 'super' expression's type

This commit is contained in:
Bendegúz Nagy
2017-05-30 20:01:21 +02:00
parent babe32a16c
commit 0ec1e44b13
7 changed files with 100 additions and 9 deletions

View File

@ -10,18 +10,14 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
import net.sourceforge.pmd.typeresolution.testdata.ThisExpression;
import net.sourceforge.pmd.lang.java.ast.*;
import net.sourceforge.pmd.typeresolution.testdata.*;
import org.jaxen.JaxenException;
import org.junit.Test;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.LanguageVersionHandler;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.typeresolution.testdata.UsesJavaStreams;
import net.sourceforge.pmd.typeresolution.testdata.UsesRepeatableAnnotations;
import static org.junit.Assert.assertEquals;
@ -60,6 +56,22 @@ public class ClassTypeResolverJava8Test {
assertEquals("All expressions not tested", index, prefixes.size());
}
@Test
public void testSuperExpression() throws JaxenException {
ASTCompilationUnit acu = parseAndTypeResolveForClass18(SuperExpression.class);
List<AbstractJavaTypeNode> expressions = convertList(
acu.findChildNodesWithXPath("//VariableInitializer/Expression/PrimaryExpression/PrimaryPrefix"),
AbstractJavaTypeNode.class);
int index = 0;
assertEquals(SuperClass.class, expressions.get(index++).getType());
// Make sure we got them all
assertEquals("All expressions not tested", index, expressions.size());
}
private static <T> List<T> convertList(List<Node> nodes, Class<T> target) {
List<T> converted = new ArrayList<>();
for (Node n : nodes) {

View File

@ -0,0 +1,5 @@
package net.sourceforge.pmd.typeresolution.testdata;
public class SuperClass {
protected SuperClass s;
}

View File

@ -0,0 +1,8 @@
package net.sourceforge.pmd.typeresolution.testdata;
public class SuperExpression extends SuperClass {
public void foo() {
((Runnable) (() -> { SuperClass a = super.s; })).run();
}
}