Use auxclasspath ClassLoader to resolve type qualified names
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ public abstract class AbstractLanguageVersionHandler implements LanguageVersionH
|
||||
|
||||
|
||||
@Override
|
||||
public VisitorStarter getQualifiedNameResolutionFacade() {
|
||||
public VisitorStarter getQualifiedNameResolutionFacade(ClassLoader classLoader) {
|
||||
return VisitorStarter.DUMMY;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user