[java] typeresolution: resolve arrays in some cases correctly
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
17
pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/OverloadedMethodsUsage.java
vendored
Normal file
17
pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/OverloadedMethodsUsage.java
vendored
Normal 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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user