From 25f51db8d7b23d59685ba432cba71846d5957458 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 19 May 2018 11:38:53 +0200 Subject: [PATCH 1/3] [java] Parser Error / Nullpointer when analyzing local generic class --- .../typeresolution/ClassTypeResolverTest.java | 6 +++ .../testdata/LocalGenericClass.java | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java 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 99c32f613b..6e6581ddea 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.GenericsArrays; import net.sourceforge.pmd.typeresolution.testdata.InnerClass; import net.sourceforge.pmd.typeresolution.testdata.JavaTypeDefinitionToStringNPE; import net.sourceforge.pmd.typeresolution.testdata.Literals; +import net.sourceforge.pmd.typeresolution.testdata.LocalGenericClass; import net.sourceforge.pmd.typeresolution.testdata.MethodAccessibility; import net.sourceforge.pmd.typeresolution.testdata.MethodFirstPhase; import net.sourceforge.pmd.typeresolution.testdata.MethodGenericExplicit; @@ -1829,6 +1830,11 @@ public class ClassTypeResolverTest { parseAndTypeResolveForClass(VarArgsMethodUseCase.class, "1.8"); } + @Test + public void testLocalGenericClass() throws Exception { + parseAndTypeResolveForClass(LocalGenericClass.class, "9"); + } + 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/LocalGenericClass.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java new file mode 100644 index 0000000000..636e4b1404 --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java @@ -0,0 +1,42 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.typeresolution.testdata; + +public class LocalGenericClass { + + public static void localClassInGeneric() { + class MyLocalClass implements MyCombiner, MyLocalClass> { + private T state; + + @Override + public void accept(T t) { } + @Override + public Optional get() { + return Optional.empty(); + } + @Override + public void combine(MyLocalClass other) { + accept(other.state); + } + } + new MyLocalClass(); + } + + private interface MyCombiner extends MyConsumer, MySupplier { + void combine(T t); + } + + private static interface MyConsumer { + void accept(R r); + } + private static interface MySupplier { + S get(); + } + private static class Optional { + public static Optional empty() { + return new Optional(); + } + } +} From 7a23ca638aa631651dcac36d28c1f00863b33c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?= Date: Sun, 20 May 2018 02:25:58 -0300 Subject: [PATCH 2/3] Avoid NPE - Fix a bunch of errors in message building along the way --- .../typedefinition/JavaTypeDefinitionSimple.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSimple.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSimple.java index 5250775feb..29bcc3dd9d 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSimple.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSimple.java @@ -100,7 +100,7 @@ import java.util.logging.Logger; @Override public JavaTypeDefinition getGenericType(final String parameterName) { for (JavaTypeDefinition currTypeDef = this; currTypeDef != null; - currTypeDef = currTypeDef.getEnclosingClass()) { + currTypeDef = currTypeDef.getEnclosingClass()) { int paramIndex = getGenericTypeIndex(currTypeDef.getType().getTypeParameters(), parameterName); if (paramIndex != -1) { @@ -111,16 +111,16 @@ import java.util.logging.Logger; // throw because we could not find parameterName StringBuilder builder = new StringBuilder("No generic parameter by name ").append(parameterName); for (JavaTypeDefinition currTypeDef = this; currTypeDef != null; - currTypeDef = currTypeDef.getEnclosingClass()) { + currTypeDef = currTypeDef.getEnclosingClass()) { builder.append("\n on class "); - builder.append(clazz.getSimpleName()); + builder.append(currTypeDef.getType().getSimpleName()); } LOG.log(Level.FINE, builder.toString()); // TODO: throw eventually //throw new IllegalArgumentException(builder.toString()); - return null; + return forClass(Object.class); } @Override @@ -282,8 +282,11 @@ import java.util.logging.Logger; sb.append(jtd.shallowString()).append(", "); } - return sb.replace(sb.length() - 3, sb.length() - 1, "]") // last comma to bracket - .append(", isGeneric=").append(isGeneric) + if (!genericArgs.isEmpty()) { + sb.replace(sb.length() - 3, sb.length() - 1, ""); // remove last comma + } + + return sb.append("], isGeneric=").append(isGeneric) .append("]\n").toString(); } From 3bbebdcabdf206a6b67d4e23c0bddb6225c3c74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?= Date: Sun, 20 May 2018 02:32:10 -0300 Subject: [PATCH 3/3] Fix checkstyle --- .../pmd/typeresolution/testdata/LocalGenericClass.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java index 636e4b1404..35cf462ad7 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/typeresolution/testdata/LocalGenericClass.java @@ -12,15 +12,18 @@ public class LocalGenericClass { @Override public void accept(T t) { } + @Override public Optional get() { return Optional.empty(); } + @Override public void combine(MyLocalClass other) { accept(other.state); } } + new MyLocalClass(); } @@ -28,12 +31,14 @@ public class LocalGenericClass { void combine(T t); } - private static interface MyConsumer { + private interface MyConsumer { void accept(R r); } - private static interface MySupplier { + + private interface MySupplier { S get(); } + private static class Optional { public static Optional empty() { return new Optional();