diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/ClassScope.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/ClassScope.java index e58b8ee002..8492b78f2a 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/ClassScope.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/ClassScope.java @@ -502,8 +502,11 @@ public class ClassScope extends AbstractJavaScope { private Class resolveGenericType(Node argument, String typeImage) { List types = new ArrayList(); // first search only within the same method - types.addAll(argument.getFirstParentOfType(ASTClassOrInterfaceBodyDeclaration.class).findDescendantsOfType( - ASTTypeParameter.class)); + ASTClassOrInterfaceBodyDeclaration firstParentOfType = + argument.getFirstParentOfType(ASTClassOrInterfaceBodyDeclaration.class); + if (firstParentOfType != null) { + types.addAll(firstParentOfType.findDescendantsOfType(ASTTypeParameter.class)); + } // then search class level types ASTClassOrInterfaceDeclaration enclosingClassOrEnum = argument diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/symboltable/ClassScopeTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/symboltable/ClassScopeTest.java index df2e904057..d1f1ad5b76 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/symboltable/ClassScopeTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/symboltable/ClassScopeTest.java @@ -34,6 +34,11 @@ public class ClassScopeTest extends STBBaseTst { parseCode15(ENUM_SCOPE); } + @Test + public void testEnumTypeParameter() { + parseCode15(ENUM_TYPE_PARAMETER); + } + @Test public void testVarArgsEmpty() { parseCode15( @@ -387,6 +392,15 @@ public class ClassScopeTest extends STBBaseTst { " public abstract String getFilterableString(TreeNode node);" + PMD.EOL + "}"; + private static final String ENUM_TYPE_PARAMETER = + "public enum Foo {" + PMD.EOL + + " BAR(isCustomer(BazEnum.FOO_BAR));" + PMD.EOL + + " Foo(boolean isCustomer) { }" + PMD.EOL + + " private static boolean isCustomer(BazEnum baz) {" + PMD.EOL + + " return false;" + PMD.EOL + + " }" + PMD.EOL + + "}"; + public static junit.framework.Test suite() { return new junit.framework.JUnit4TestAdapter(ClassScopeTest.class); }