Use auxclasspath ClassLoader to resolve type qualified names

This commit is contained in:
Clément Fournier
2018-03-24 19:03:29 +01:00
parent 045308948a
commit a193af1d4a
10 changed files with 36 additions and 14 deletions

View File

@ -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);
}

View File

@ -62,7 +62,7 @@ public abstract class AbstractLanguageVersionHandler implements LanguageVersionH
@Override
public VisitorStarter getQualifiedNameResolutionFacade() {
public VisitorStarter getQualifiedNameResolutionFacade(ClassLoader classLoader) {
return VisitorStarter.DUMMY;
}

View File

@ -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();

View File

@ -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);
}
};
}

View File

@ -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());
}

View File

@ -99,7 +99,14 @@ public class QualifiedNameResolver extends JavaParserVisitorReducedAdapter {
private ImmutableList<String> 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);
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}