diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTClassOrInterfaceType.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTClassOrInterfaceType.java index f1a1480859..5a00288515 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTClassOrInterfaceType.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTClassOrInterfaceType.java @@ -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; + } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java index 9c1abaa9fd..12a8099624 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java @@ -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); } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverTest.java index 1c1527b749..d439ec31ba 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverTest.java @@ -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(); } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/OverloadedMethodsUsage.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/OverloadedMethodsUsage.java new file mode 100644 index 0000000000..7827d619ea --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/OverloadedMethodsUsage.java @@ -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); + } +} diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/OverloadedMethods.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/OverloadedMethods.java new file mode 100644 index 0000000000..439952fb2c --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/OverloadedMethods.java @@ -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; + } +}