From d350bcb49e4f07fb43b85304d6acc8293b320ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?= Date: Fri, 14 Oct 2016 16:05:20 -0300 Subject: [PATCH] Make explicit imports orders of times faster - We can tell if a name can be resolved or not, and we can do so in constant time. --- .../pmd/lang/java/symboltable/TypeSet.java | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) 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); + } } /**