diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java index a4f4fac903..d54e5bb4c1 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java @@ -108,7 +108,8 @@ public class TypeSet { * explicit import statements. */ public static class ExplicitImportResolver extends AbstractResolver { - private Set importStmts; + private Map importStmts; + /** * Creates a new {@link ExplicitImportResolver}. * @param pmdClassLoader the class loader to use. @@ -116,21 +117,36 @@ public class TypeSet { */ public ExplicitImportResolver(PMDASMClassLoader pmdClassLoader, Set importStmts) { super(pmdClassLoader); - this.importStmts = importStmts; + + // unfold imports, to store both FQ and unqualified names mapped to the FQ name + this.importStmts = new HashMap<>(); + for (final String stmt : importStmts) { + if (stmt.endsWith("*")) { + continue; + } + + this.importStmts.put(stmt, stmt); + final int lastDotItdx = stmt.lastIndexOf('.'); + if (lastDotItdx != -1) { + this.importStmts.put(stmt.substring(lastDotItdx + 1), stmt); + } + } } @Override public Class resolve(String name) throws ClassNotFoundException { - if (name == null) { - throw new ClassNotFoundException(); - } - for (String importStmt : importStmts) { - if (importStmt.endsWith(name)) { - return pmdClassLoader.loadClass(importStmt); - } + final String fqName = importStmts.get(name); + if (fqName != null) { + return pmdClassLoader.loadClass(fqName); } + throw new ClassNotFoundException("Type " + name + " not found"); } + + @Override + public boolean couldResolve(String name) { + return importStmts.containsKey(name); + } } /**