[java] typeresolution: resolve arrays in some cases correctly

This commit is contained in:
Andreas Dangel
2017-10-06 17:13:58 +02:00
parent 04e65cd20c
commit acc05d4c9c
5 changed files with 59 additions and 3 deletions

View File

@ -7,6 +7,8 @@ package net.sourceforge.pmd.lang.java.ast;
import java.util.List;
import net.sourceforge.pmd.lang.ast.Node;
public class ASTClassOrInterfaceType extends AbstractJavaTypeNode {
public ASTClassOrInterfaceType(int id) {
super(id);
@ -51,4 +53,12 @@ public class ASTClassOrInterfaceType extends AbstractJavaTypeNode {
public boolean isAnonymousClass() {
return jjtGetParent().hasDescendantOfType(ASTClassOrInterfaceBody.class);
}
public boolean isArray() {
Node p = jjtGetParent();
if (p instanceof ASTReferenceType) {
return ((ASTReferenceType)p).isArray();
}
return false;
}
}

View File

@ -12,11 +12,11 @@ import static net.sourceforge.pmd.lang.java.typeresolution.typedefinition.TypeDe
import static net.sourceforge.pmd.lang.java.typeresolution.typedefinition.TypeDefinitionType.UPPER_BOUND;
import static net.sourceforge.pmd.lang.java.typeresolution.typedefinition.TypeDefinitionType.UPPER_WILDCARD;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
@ -268,7 +268,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
}
}
populateType(node, typeName);
populateType(node, typeName, node.isArray());
ASTTypeArguments typeArguments = node.getFirstChildOfType(ASTTypeArguments.class);
@ -684,7 +684,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
}
String name = node.getNameDeclaration().getTypeImage();
if (name != null) {
populateType(node, name);
populateType(node, name, node.getNameDeclaration().isArray());
}
return super.visit(node, data);
}
@ -1275,6 +1275,10 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
}
private void populateType(TypeNode node, String className) {
populateType(node, className, false);
}
private void populateType(TypeNode node, String className, boolean isArray) {
String qualifiedName = className;
Class<?> myType = PRIMITIVE_TYPES.get(className);
@ -1328,6 +1332,9 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
node.setTypeDefinition(parameter.getTypeDefinition());
}
} else {
if (isArray) {
myType = Array.newInstance(myType, 0).getClass();
}
node.setType(myType);
}
}

View File

@ -98,6 +98,7 @@ import net.sourceforge.pmd.typeresolution.testdata.MethodStaticAccess;
import net.sourceforge.pmd.typeresolution.testdata.MethodThirdPhase;
import net.sourceforge.pmd.typeresolution.testdata.NestedAnonymousClass;
import net.sourceforge.pmd.typeresolution.testdata.Operators;
import net.sourceforge.pmd.typeresolution.testdata.OverloadedMethodsUsage;
import net.sourceforge.pmd.typeresolution.testdata.Promotion;
import net.sourceforge.pmd.typeresolution.testdata.SubTypeUsage;
import net.sourceforge.pmd.typeresolution.testdata.SuperExpression;
@ -1671,6 +1672,11 @@ public class ClassTypeResolverTest {
parseAndTypeResolveForClass(AbstractReturnTypeUseCase.class, "1.8");
}
@Test
public void testMethodOverloaded() throws Exception {
parseAndTypeResolveForClass(OverloadedMethodsUsage.class, "1.8");
}
private JavaTypeDefinition getChildTypeDef(Node node, int childIndex) {
return ((TypeNode) node.jjtGetChild(childIndex)).getTypeDefinition();
}

View File

@ -0,0 +1,17 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.typeresolution.testdata;
import net.sourceforge.pmd.typeresolution.testdata.dummytypes.OverloadedMethods;
public class OverloadedMethodsUsage {
private String[] arg1 = null;
private String[] arg2 = new String[1];
public void foo() {
OverloadedMethods.equals(arg1, arg2);
}
}

View File

@ -0,0 +1,16 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.typeresolution.testdata.dummytypes;
public class OverloadedMethods {
public static boolean equals(byte[] a, byte[] b) {
return false;
}
public static boolean equals(Object[] a, Object[] b) {
return false;
}
}