[java] Tidy up ClassScope code

- Sibling node search cn be easier
 - Remove dead code in generic resolution
 - Make sure generics resolution goes up through nested classes
This commit is contained in:
Juan Martín Sotuyo Dodero
2017-02-01 15:46:03 -03:00
committed by Andreas Dangel
parent 50271f2112
commit c5d4951728

View File

@ -19,7 +19,6 @@ import net.sourceforge.pmd.lang.java.ast.ASTBooleanLiteral;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTExtendsList; import net.sourceforge.pmd.lang.java.ast.ASTExtendsList;
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter; import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters; import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters;
@ -541,18 +540,14 @@ public class ClassScope extends AbstractJavaScope {
types.addAll(firstParentOfType.findDescendantsOfType(ASTTypeParameter.class)); types.addAll(firstParentOfType.findDescendantsOfType(ASTTypeParameter.class));
} }
// then search class level types // then search class level types, from inner-most to outer-most
ASTClassOrInterfaceDeclaration enclosingClassOrEnum = argument List<ASTClassOrInterfaceDeclaration> enclosingClasses = argument
.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class); .getParentsOfType(ASTClassOrInterfaceDeclaration.class);
if (enclosingClassOrEnum == null) { for (ASTClassOrInterfaceDeclaration enclosing : enclosingClasses) {
argument.getFirstParentOfType(ASTEnumDeclaration.class); ASTTypeParameters classLevelTypeParameters = enclosing.getFirstChildOfType(ASTTypeParameters.class);
} if (classLevelTypeParameters != null) {
ASTTypeParameters classLevelTypeParameters = null; types.addAll(classLevelTypeParameters.findDescendantsOfType(ASTTypeParameter.class));
if (enclosingClassOrEnum != null) { }
classLevelTypeParameters = enclosingClassOrEnum.getFirstChildOfType(ASTTypeParameters.class);
}
if (classLevelTypeParameters != null) {
types.addAll(classLevelTypeParameters.findDescendantsOfType(ASTTypeParameter.class));
} }
return resolveGenericType(typeImage, types); return resolveGenericType(typeImage, types);
} }
@ -576,14 +571,10 @@ public class ClassScope extends AbstractJavaScope {
} }
private Node getNextSibling(Node current) { private Node getNextSibling(Node current) {
Node nextSibling = null; if (current.jjtGetParent().jjtGetNumChildren() > current.jjtGetChildIndex() + 1) {
for (int i = 0; i < current.jjtGetParent().jjtGetNumChildren() - 1; i++) { return current.jjtGetParent().jjtGetChild(current.jjtGetChildIndex() + 1);
if (current.jjtGetParent().jjtGetChild(i) == current) {
nextSibling = current.jjtGetParent().jjtGetChild(i + 1);
break;
}
} }
return nextSibling; return null;
} }
public String toString() { public String toString() {