diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java index 78447e8d2b..2dd29786be 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java @@ -123,7 +123,7 @@ public class SourceCodeProcessor { private void resolveQualifiedNames(Node rootNode, LanguageVersionHandler handler) { long start = System.nanoTime(); - handler.getQualifiedNameResolutionFacade().start(rootNode); + handler.getQualifiedNameResolutionFacade(configuration.getClassLoader()).start(rootNode); long end = System.nanoTime(); Benchmarker.mark(Benchmark.QualifiedNameResolution, end - start, 0); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/AbstractLanguageVersionHandler.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/AbstractLanguageVersionHandler.java index e37736795d..400be33c40 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/AbstractLanguageVersionHandler.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/AbstractLanguageVersionHandler.java @@ -62,7 +62,7 @@ public abstract class AbstractLanguageVersionHandler implements LanguageVersionH @Override - public VisitorStarter getQualifiedNameResolutionFacade() { + public VisitorStarter getQualifiedNameResolutionFacade(ClassLoader classLoader) { return VisitorStarter.DUMMY; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionHandler.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionHandler.java index f881f1d45b..8a536a5616 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionHandler.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionHandler.java @@ -100,9 +100,11 @@ public interface LanguageVersionHandler { * Gets the visitor that populates the qualified names of the * nodes. * + * @param classLoader The classloader to use to resolve the types of type qualified names + * * @return The visitor starter */ - VisitorStarter getQualifiedNameResolutionFacade(); + VisitorStarter getQualifiedNameResolutionFacade(ClassLoader classLoader); DFAGraphRule getDFAGraphRule(); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java index cb69fb9122..70bcbb1ea5 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/AbstractJavaHandler.java @@ -123,11 +123,11 @@ public abstract class AbstractJavaHandler extends AbstractLanguageVersionHandler @Override - public VisitorStarter getQualifiedNameResolutionFacade() { + public VisitorStarter getQualifiedNameResolutionFacade(final ClassLoader classLoader) { return new VisitorStarter() { @Override public void start(Node rootNode) { - new QualifiedNameResolver().initializeWith((ASTCompilationUnit) rootNode); + new QualifiedNameResolver().initializeWith(classLoader, (ASTCompilationUnit) rootNode); } }; } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/JavaTypeQualifiedName.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/JavaTypeQualifiedName.java index 8c2dac5444..300805e695 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/JavaTypeQualifiedName.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/JavaTypeQualifiedName.java @@ -25,8 +25,7 @@ public final class JavaTypeQualifiedName extends JavaQualifiedName { /** Local index value for when the class is not local. */ static final int NOTLOCAL_PLACEHOLDER = -1; - // Should we share that with ClassTypeResolver? - private static final PMDASMClassLoader CLASS_LOADER = PMDASMClassLoader.getInstance(JavaTypeQualifiedName.class.getClassLoader()); + private static ClassLoader classLoader = PMDASMClassLoader.getInstance(JavaTypeQualifiedName.class.getClassLoader()); // since we prepend each time, these lists are in the reversed order (innermost elem first). // we use ImmutableList.reverse() to get them in their usual, user-friendly order @@ -61,6 +60,20 @@ public final class JavaTypeQualifiedName extends JavaQualifiedName { } + /** + * Sets the class loader used by qualified names to resolve their types. + * This method is called by the qualified name resolver during initialization. + * + * @param cl a class loader + */ + static void setClassLoader(ClassLoader cl) { + ClassLoader asmCL = PMDASMClassLoader.getInstance(cl); + if (asmCL != classLoader) { + classLoader = asmCL; + } + } + + @Override public JavaTypeQualifiedName getClassName() { return this; @@ -191,7 +204,7 @@ public final class JavaTypeQualifiedName extends JavaQualifiedName { */ private Class loadType() throws ClassNotFoundException { // hence why the toString should follow binary name specification - return CLASS_LOADER.loadClass(getBinaryName()); + return classLoader.loadClass(getBinaryName()); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/QualifiedNameResolver.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/QualifiedNameResolver.java index 63c900ecea..a8c85aef33 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/QualifiedNameResolver.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/qname/QualifiedNameResolver.java @@ -99,7 +99,14 @@ public class QualifiedNameResolver extends JavaParserVisitorReducedAdapter { private ImmutableList classNames; - public void initializeWith(ASTCompilationUnit rootNode) { + /** + * Initialises the visitor and starts it. + * @param classLoader The classloader that will be used by type qualified names + * to load their type. + * @param rootNode The root hierarchy + */ + public void initializeWith(ClassLoader classLoader, ASTCompilationUnit rootNode) { + JavaTypeQualifiedName.setClassLoader(classLoader); rootNode.jjtAccept(this, null); } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ParserTstUtil.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ParserTstUtil.java index 3721505ac4..daa023982e 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ParserTstUtil.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ParserTstUtil.java @@ -93,7 +93,7 @@ public class ParserTstUtil { JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[] { JavaParserVisitor.class }, coll); jpv.visit(cu, null); - new QualifiedNameResolver().initializeWith(cu); + new QualifiedNameResolver().initializeWith(ParserTstUtil.class.getClassLoader(), cu); new SymbolFacade().initializeWith(cu); new DataFlowFacade().initializeWith(languageVersionHandler.getDataFlowHandler(), cu); @@ -214,7 +214,7 @@ public class ParserTstUtil { public static ASTCompilationUnit parseJava(LanguageVersionHandler languageVersionHandler, String code) { ASTCompilationUnit rootNode = (ASTCompilationUnit) languageVersionHandler .getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(code)); - languageVersionHandler.getQualifiedNameResolutionFacade().start(rootNode); + languageVersionHandler.getQualifiedNameResolutionFacade(ParserTstUtil.class.getClassLoader()).start(rootNode); languageVersionHandler.getSymbolFacade().start(rootNode); return rootNode; } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/multifile/JavaMultifileVisitorTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/multifile/JavaMultifileVisitorTest.java index 8bcf177219..28524e29a6 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/multifile/JavaMultifileVisitorTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/multifile/JavaMultifileVisitorTest.java @@ -141,7 +141,7 @@ public class JavaMultifileVisitorTest { static ASTCompilationUnit parseAndVisitForClass(Class clazz) { ASTCompilationUnit acu = ParserTstUtil.parseJavaDefaultVersion(clazz); LanguageVersionHandler handler = ParserTstUtil.getDefaultLanguageVersionHandler(); - handler.getQualifiedNameResolutionFacade().start(acu); + handler.getQualifiedNameResolutionFacade(JavaMultifileVisitorTest.class.getClassLoader()).start(acu); handler.getTypeResolutionFacade(JavaMultifileVisitorTest.class.getClassLoader()).start(acu); handler.getMultifileFacade().start(acu); return acu; 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 7efdb6b25e..fe8a573a87 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 @@ -1858,7 +1858,7 @@ public class ClassTypeResolverTest { .getVersion(version).getLanguageVersionHandler(); ASTCompilationUnit acu = (ASTCompilationUnit) languageVersionHandler .getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(source)); - languageVersionHandler.getQualifiedNameResolutionFacade().start(acu); + languageVersionHandler.getQualifiedNameResolutionFacade(ClassTypeResolverTest.class.getClassLoader()).start(acu); languageVersionHandler.getSymbolFacade().start(acu); languageVersionHandler.getTypeResolutionFacade(ClassTypeResolverTest.class.getClassLoader()).start(acu); return acu; diff --git a/pmd-java8/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverJava8Test.java b/pmd-java8/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverJava8Test.java index a452bfe3a0..349023a998 100644 --- a/pmd-java8/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverJava8Test.java +++ b/pmd-java8/src/test/java/net/sourceforge/pmd/typeresolution/ClassTypeResolverJava8Test.java @@ -109,7 +109,7 @@ public class ClassTypeResolverJava8Test { ASTCompilationUnit acu = (ASTCompilationUnit) languageVersionHandler .getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new InputStreamReader(is)); languageVersionHandler.getSymbolFacade().start(acu); - languageVersionHandler.getQualifiedNameResolutionFacade().start(acu); + languageVersionHandler.getQualifiedNameResolutionFacade(ClassTypeResolverJava8Test.class.getClassLoader()).start(acu); languageVersionHandler.getTypeResolutionFacade(ClassTypeResolverJava8Test.class.getClassLoader()).start(acu); return acu; }