From 2fd1c89ede5f3a24a75b65a229c7f0b3c73bca8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bendeg=C3=BAz=20Nagy?= Date: Wed, 5 Jul 2017 19:49:29 +0200 Subject: [PATCH] Java, typeres: fix checkstyle and mvn tests --- .../typeresolution/ClassTypeResolver.java | 101 ++++++++++-------- .../lang/java/typeresolution/MethodType.java | 9 +- .../typeresolution/ClassTypeResolverTest.java | 15 +-- .../testdata/MethodAccessibility.java | 4 + .../MethodPotentialApplicability.java | 24 ++++- .../testdata/dummytypes/SuperClassA.java | 4 +- .../testdata/dummytypes/SuperClassB.java | 4 +- 7 files changed, 101 insertions(+), 60 deletions(-) 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 3b84f0aaa4..f0051631e0 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 @@ -74,7 +74,6 @@ import net.sourceforge.pmd.lang.java.ast.ASTUnaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTUnaryExpressionNotPlusMinus; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; -import net.sourceforge.pmd.lang.java.ast.AbstractJavaNode; import net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode; import net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter; import net.sourceforge.pmd.lang.java.ast.Token; @@ -338,56 +337,70 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter { // make sure it handles same name classes and packages // TODO: handle generic static field cases - // handles cases where first part is a fully qualified name - populateType(node, node.getImage()); + Class accessingClass = getEnclosingTypeDeclarationClass(node); - if (node.getType() == null) { - Class accessingClass = getEnclosingTypeDeclarationClass(node); + String[] dotSplitImage = node.getImage().split("\\."); + ASTArguments astArguments = getSuffixMethodArgs(node); + ASTArgumentList astArgumentList = null; + int methodArgsArity = 0; - String[] dotSplitImage = node.getImage().split("\\."); - ASTArguments astArguments = getSuffixMethodArgs(node); - ASTArgumentList astArgumentList = null; - int methodArgsArity = 0; + if (astArguments != null) { + astArgumentList = astArguments.getFirstChildOfType(ASTArgumentList.class); + } - if (astArguments != null) { - astArgumentList = astArguments.getFirstChildOfType(ASTArgumentList.class); - } + if (astArgumentList != null) { + methodArgsArity = astArgumentList.jjtGetNumChildren(); + } - if (astArgumentList != null) { - methodArgsArity = astArgumentList.jjtGetNumChildren(); - } + JavaTypeDefinition previousType = null; + if (dotSplitImage.length == 1 && astArguments != null) { // method - JavaTypeDefinition previousType = null; - if (dotSplitImage.length == 1 && astArguments != null) { // method + List methods = getLocalApplicableMethods(node, dotSplitImage[0], null, + methodArgsArity, accessingClass); - List methods = getLocalApplicableMethods(node, dotSplitImage[0], null, - methodArgsArity, accessingClass); + previousType = getBestMethodReturnType(methods, astArgumentList, null); + } else { + previousType = getTypeDefinitionOfVariableFromScope(node.getScope(), dotSplitImage[0], accessingClass); + } - previousType = getBestMethodReturnType(methods, astArgumentList, null); - } else { - previousType = getTypeDefinitionOfVariableFromScope(node.getScope(), dotSplitImage[0], accessingClass); - } - - for (int i = 1; i < dotSplitImage.length; ++i) { - if (previousType == null) { - break; - } - - if (i == dotSplitImage.length - 1 && astArguments != null) { // method - List methods = getApplicableMethods(previousType, dotSplitImage[i], null, - methodArgsArity, accessingClass); - - previousType = getBestMethodReturnType(methods, astArgumentList, null); - } else { // field - previousType = getFieldType(previousType, dotSplitImage[i], accessingClass); - } - } - - if (previousType != null) { - node.setTypeDefinition(previousType); + // TODO: remove this if branch, it's only purpose is to make JUnitAssertionsShouldIncludeMessage's tests pass + // as the code is not compiled there and symbol table works on uncompiled code + if (node.getNameDeclaration() != null + && previousType == null // if it's not null, then let other code handle things + && node.getNameDeclaration().getNode() instanceof TypeNode) { + // Carry over the type from the declaration + Class nodeType = ((TypeNode) node.getNameDeclaration().getNode()).getType(); + // FIXME : generic classes and class with generic super types could have the wrong type assigned here + if (nodeType != null) { + node.setType(nodeType); } } + if (node.getType() == null) { + // handles cases where first part is a fully qualified name + populateType(node, node.getImage()); + + if (node.getType() == null) { + for (int i = 1; i < dotSplitImage.length; ++i) { + if (previousType == null) { + break; + } + + if (i == dotSplitImage.length - 1 && astArguments != null) { // method + List methods = getApplicableMethods(previousType, dotSplitImage[i], null, + methodArgsArity, accessingClass); + + previousType = getBestMethodReturnType(methods, astArgumentList, null); + } else { // field + previousType = getFieldType(previousType, dotSplitImage[i], accessingClass); + } + } + + if (previousType != null) { + node.setTypeDefinition(previousType); + } + } + } return super.visit(node, data); } @@ -530,7 +543,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter { && prefix.jjtGetParent().jjtGetNumChildren() >= 2) { ASTArguments args = prefix.jjtGetParent().jjtGetChild(1).getFirstChildOfType(ASTArguments.class); // TODO: investigate if this will cause double visitation - if(args != null) { + if (args != null) { super.visit(args, null); } @@ -874,8 +887,8 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter { for (int childIndex = 0; childIndex < primaryNode.jjtGetNumChildren(); ++childIndex) { AbstractJavaTypeNode currentChild = (AbstractJavaTypeNode) primaryNode.jjtGetChild(childIndex); - nextChild = childIndex + 1 < primaryNode.jjtGetNumChildren() ? - (AbstractJavaTypeNode) primaryNode.jjtGetChild(childIndex + 1) : null; + nextChild = childIndex + 1 < primaryNode.jjtGetNumChildren() + ? (AbstractJavaTypeNode) primaryNode.jjtGetChild(childIndex + 1) : null; // skip children which already have their type assigned if (currentChild.getType() == null) { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodType.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodType.java index 4fc95b7e56..ec77a2a285 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodType.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodType.java @@ -1,11 +1,14 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + package net.sourceforge.pmd.lang.java.typeresolution; - -import net.sourceforge.pmd.lang.java.typeresolution.typedefinition.JavaTypeDefinition; - import java.lang.reflect.Method; import java.util.List; +import net.sourceforge.pmd.lang.java.typeresolution.typedefinition.JavaTypeDefinition; + /** * This is really just a POJO. */ 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 26fba1acff..cfae4bc696 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 @@ -16,8 +16,6 @@ import java.util.Comparator; import java.util.List; import java.util.StringTokenizer; -import net.sourceforge.pmd.typeresolution.testdata.MethodAccessibility; -import net.sourceforge.pmd.typeresolution.testdata.MethodPotentialApplicability; import org.apache.commons.io.IOUtils; import org.jaxen.JaxenException; import org.junit.Assert; @@ -69,6 +67,8 @@ import net.sourceforge.pmd.typeresolution.testdata.FieldAccessShadow; import net.sourceforge.pmd.typeresolution.testdata.FieldAccessSuper; import net.sourceforge.pmd.typeresolution.testdata.InnerClass; import net.sourceforge.pmd.typeresolution.testdata.Literals; +import net.sourceforge.pmd.typeresolution.testdata.MethodAccessibility; +import net.sourceforge.pmd.typeresolution.testdata.MethodPotentialApplicability; import net.sourceforge.pmd.typeresolution.testdata.NestedAnonymousClass; import net.sourceforge.pmd.typeresolution.testdata.Operators; import net.sourceforge.pmd.typeresolution.testdata.Promotion; @@ -184,12 +184,13 @@ public class ClassTypeResolverTest { Assert.assertTrue(Comparator.class.isAssignableFrom(child.getType())); Assert.assertSame(Integer.class, child.getTypeDefinition().getGenericType(0).getType()); } - + @Test public void testNestedAnonymousClass() throws Exception { Node acu = parseAndTypeResolveForClass(NestedAnonymousClass.class, "1.8"); ASTAllocationExpression allocationExpression = acu.getFirstDescendantOfType(ASTAllocationExpression.class); - ASTAllocationExpression nestedAllocation = allocationExpression.getFirstDescendantOfType(ASTAllocationExpression.class); + ASTAllocationExpression nestedAllocation + = allocationExpression.getFirstDescendantOfType(ASTAllocationExpression.class); TypeNode child = (TypeNode) nestedAllocation.jjtGetChild(0); Assert.assertTrue(Converter.class.isAssignableFrom(child.getType())); Assert.assertSame(String.class, child.getTypeDefinition().getGenericType(0).getType()); @@ -1128,7 +1129,8 @@ public class ClassTypeResolverTest { assertEquals(String.class, getChildType(expressions.get(index++), 3)); // this.field.first = ""; - assertEquals(String.class, expressions.get(index).getType()); assertEquals(String.class, getChildType(expressions.get(index++), 2)); + assertEquals(String.class, expressions.get(index).getType()); + assertEquals(String.class, getChildType(expressions.get(index++), 2)); // Make sure we got them all assertEquals("All expressions not tested", index, expressions.size()); @@ -1149,7 +1151,7 @@ public class ClassTypeResolverTest { assertEquals(int.class, expressions.get(index).getType()); assertEquals(int.class, getChildType(expressions.get(index), 0)); assertEquals(int.class, getChildType(expressions.get(index++), 1)); - + // int b = vararg("", 10); assertEquals(int.class, expressions.get(index).getType()); assertEquals(int.class, getChildType(expressions.get(index), 0)); @@ -1181,6 +1183,7 @@ public class ClassTypeResolverTest { @Test public void testMethodAccessibility() throws JaxenException { + // ASTCompilationUnit acu = parseAndTypeResolveForClass15(Dummy.class); ASTCompilationUnit acu = parseAndTypeResolveForClass15(MethodAccessibility.class); List expressions = convertList( diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodAccessibility.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodAccessibility.java index a80fa0cb27..6bdd8a73fb 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodAccessibility.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodAccessibility.java @@ -1,3 +1,7 @@ +/** + * 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.SuperClassA; diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodPotentialApplicability.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodPotentialApplicability.java index 43a1cf53c9..a3a1ae2d5d 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodPotentialApplicability.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/MethodPotentialApplicability.java @@ -1,3 +1,7 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + package net.sourceforge.pmd.typeresolution.testdata; public class MethodPotentialApplicability { @@ -24,15 +28,25 @@ public class MethodPotentialApplicability { } // test if variable arity with arity n -> then call arity >= n-1 - int vararg(String b, int... a) { return 0;} + int vararg(String b, int... a) { + return 0; + } - Exception vararg(String a, String b, String c, int... d) {return null;} + Exception vararg(String a, String b, String c, int... d) { + return null; + } // test no arguments - Number noArguments() {return null;} + Number noArguments() { + return null; + } // test not vararg mathching arity - String notVararg(int a, int b) {return null;} + String notVararg(int a, int b) { + return null; + } - Exception notVararg(int a) {return null;} + Exception notVararg(int a) { + return null; + } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassA.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassA.java index fb08cc1a78..4eda06af65 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassA.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassA.java @@ -8,5 +8,7 @@ package net.sourceforge.pmd.typeresolution.testdata.dummytypes; public class SuperClassA extends SuperClassA2 { public SuperClassA s; - public SuperClassA inheritedA() { return null; } + public SuperClassA inheritedA() { + return null; + } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassB.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassB.java index f9ab63ef25..ec4720cad0 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassB.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/dummytypes/SuperClassB.java @@ -9,5 +9,7 @@ public class SuperClassB extends SuperClassB2 { protected SuperClassB bs; private String privateShadow; - public SuperClassB inheritedB() {return null;} + public SuperClassB inheritedB() { + return null; + } }