From 4ce394eca3ca47294c844fbb4e404116fd035700 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 Jul 2020 11:45:17 +0200 Subject: [PATCH 1/5] [java] ImportWrapper - only consider static fields/methods Fixes #2663 --- .../pmd/lang/java/ast/internal/ImportWrapper.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java index fff4b6654b..730759c9da 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java @@ -39,15 +39,9 @@ public class ImportWrapper { this.node = node; this.isStaticDemand = isStaticDemand; - if (node != null && node.getType() != null) { + if (this.isStaticDemand && node != null && node.getType() != null) { Class type = node.getType(); - for (Method m : type.getMethods()) { - allDemands.add(m.getName()); - } - for (Field f : type.getFields()) { - allDemands.add(f.getName()); - } - // also consider static fields, that are not public + // consider static fields, public and non-public for (Field f : type.getDeclaredFields()) { if (Modifier.isStatic(f.getModifiers())) { allDemands.add(f.getName()); From 693613a6a8df96e0040673d62378a11e9c41f560 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 Jul 2020 12:13:24 +0200 Subject: [PATCH 2/5] [java] ImportWrapper - catch and report LinkageErrors --- .../lang/java/ast/internal/ImportWrapper.java | 51 +++++++++++++++---- .../rule/bestpractices/UnusedImportsRule.java | 3 +- .../rule/codestyle/DuplicateImportsRule.java | 3 +- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java index 730759c9da..72f7673ff1 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java @@ -8,10 +8,15 @@ package net.sourceforge.pmd.lang.java.ast.internal; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.sourceforge.pmd.Report.ProcessingError; +import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; @@ -19,40 +24,64 @@ import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; * Helper class to analyze {@link ASTImportDeclaration}s. */ public class ImportWrapper { - private ASTImportDeclaration node; - private String name; - private String fullname; - private boolean isStaticDemand; - private Set allDemands = new HashSet<>(); + private static final Logger LOG = Logger.getLogger(ImportWrapper.class.getName()); + + private final ASTImportDeclaration node; + private final String name; + private final String fullname; + private final boolean isStaticDemand; + private final Set allStaticDemands; public ImportWrapper(String fullname, String name) { this(fullname, name, null); } public ImportWrapper(String fullname, String name, ASTImportDeclaration node) { - this(fullname, name, node, false); + this(fullname, name, node, false, null); } - public ImportWrapper(String fullname, String name, ASTImportDeclaration node, boolean isStaticDemand) { + public ImportWrapper(String fullname, String name, ASTImportDeclaration node, boolean isStaticDemand, RuleContext ctx) { this.fullname = fullname; this.name = name; this.node = node; this.isStaticDemand = isStaticDemand; + this.allStaticDemands = collectStaticFieldsAndMethods(node, ctx); - if (this.isStaticDemand && node != null && node.getType() != null) { + } + + /** + * @param node + */ + private Set collectStaticFieldsAndMethods(ASTImportDeclaration node, RuleContext ctx) { + if (!this.isStaticDemand || node == null || node.getType() == null) { + return Collections.emptySet(); + } + + try { + Set names = new HashSet<>(); Class type = node.getType(); // consider static fields, public and non-public for (Field f : type.getDeclaredFields()) { if (Modifier.isStatic(f.getModifiers())) { - allDemands.add(f.getName()); + names.add(f.getName()); } } // and methods, too for (Method m : type.getDeclaredMethods()) { if (Modifier.isStatic(m.getModifiers())) { - allDemands.add(m.getName()); + names.add(m.getName()); } } + return names; + } catch (LinkageError e) { + String filename = ctx != null ? String.valueOf(ctx.getSourceCodeFile()) : "n/a"; + + if (ctx != null) { + ctx.getReport().addError(new ProcessingError(e, filename)); + } else { + LOG.log(Level.WARNING, "Error while processing file " + filename, e); + } + return Collections.emptySet(); } } @@ -80,7 +109,7 @@ public class ImportWrapper { public boolean matches(ImportWrapper i) { if (isStaticDemand) { - if (allDemands.contains(i.fullname)) { + if (allStaticDemands.contains(i.fullname)) { return true; } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java index 2c952b6489..769a6c4c80 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; @@ -117,7 +118,7 @@ public class UnusedImportsRule extends AbstractJavaRule { public Object visit(ASTImportDeclaration node, Object data) { if (node.isImportOnDemand()) { ASTName importedType = (ASTName) node.getChild(0); - imports.add(new ImportWrapper(importedType.getImage(), null, node, node.isStatic())); + imports.add(new ImportWrapper(importedType.getImage(), null, node, node.isStatic(), (RuleContext) data)); } else { if (!node.isImportOnDemand()) { ASTName importedType = (ASTName) node.getChild(0); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java index 3fa2c2788a..b069ce99f3 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java @@ -9,6 +9,7 @@ import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.Set; +import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; import net.sourceforge.pmd.lang.java.ast.internal.ImportWrapper; @@ -87,7 +88,7 @@ public class DuplicateImportsRule extends AbstractJavaRule { @Override public Object visit(ASTImportDeclaration node, Object data) { ImportWrapper wrapper = new ImportWrapper(node.getImportedName(), node.getImportedName(), - node, node.isStatic() && node.isImportOnDemand()); + node, node.isStatic() && node.isImportOnDemand(), (RuleContext) data); // blahhhh... this really wants to be ASTImportDeclaration to be // polymorphic... From 08b922429ca944cf4d469837ffaa43f309d57766 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 Jul 2020 12:21:44 +0200 Subject: [PATCH 3/5] [java] Catch possible LinkageErrors for other rules --- .../pmd/lang/java/ast/internal/ImportWrapper.java | 6 ++---- .../java/rule/codestyle/DuplicateImportsRule.java | 12 ++++++++---- .../codestyle/UnnecessaryFullyQualifiedNameRule.java | 10 +++++++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java index 72f7673ff1..f8b93bd5ba 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java @@ -74,12 +74,10 @@ public class ImportWrapper { } return names; } catch (LinkageError e) { - String filename = ctx != null ? String.valueOf(ctx.getSourceCodeFile()) : "n/a"; - if (ctx != null) { - ctx.getReport().addError(new ProcessingError(e, filename)); + ctx.getReport().addError(new ProcessingError(e, String.valueOf(ctx.getSourceCodeFile()))); } else { - LOG.log(Level.WARNING, "Error while processing file " + filename, e); + LOG.log(Level.WARNING, "Error while processing imports", e); } return Collections.emptySet(); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java index b069ce99f3..eedb1b9991 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java @@ -69,11 +69,15 @@ public class DuplicateImportsRule extends AbstractJavaRule { } else { Class importClass = node.getClassTypeResolver().loadClassOrNull(thisImportOnDemand.getName()); if (importClass != null) { - for (Method m : importClass.getMethods()) { - if (Modifier.isStatic(m.getModifiers()) && m.getName().equals(singleTypeName)) { - // static method in another imported class - return true; + try { + for (Method m : importClass.getMethods()) { + if (Modifier.isStatic(m.getModifiers()) && m.getName().equals(singleTypeName)) { + // static method in another imported class + return true; + } } + } catch (LinkageError ignored) { + // TODO : This is an incomplete classpath, report the missing class } } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java index a2e4f9252d..f9562ae2da 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java @@ -335,10 +335,14 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { // We need type resolution to make sure there is a // conflicting method if (importDeclaration.getType() != null) { - for (final Method m : importDeclaration.getType().getMethods()) { - if (m.getName().equals(methodCalled)) { - return true; + try { + for (final Method m : importDeclaration.getType().getMethods()) { + if (m.getName().equals(methodCalled)) { + return true; + } } + } catch (LinkageError ignored) { + // TODO : This is an incomplete classpath, report the missing class } } } else if (importDeclaration.getImportedName().endsWith(methodCalled)) { From 22c3ce92ce53c9fa80c334f4c40aa79b7dd7351f Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 31 Jul 2020 12:28:29 +0200 Subject: [PATCH 4/5] [doc] Update release notes, fixes #2663 --- docs/pages/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 088a843d37..2e56fa2fac 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -27,6 +27,7 @@ This is a {{ site.pmd.release_type }} release. * [#2653](https://github.com/pmd/pmd/issues/2653): \[lang-test] Upgrade kotlintest to Kotest * java-bestpractices * [#2471](https://github.com/pmd/pmd/issues/2471): \[java] New Rule: AvoidReassigningCatchVariables + * [#2663](https://github.com/pmd/pmd/issues/2663): \[java] NoClassDefFoundError on upgrade from 6.25.0 to 6.26.0 * [#2668](https://github.com/pmd/pmd/issues/2668): \[java] UnusedAssignment false positives * java-errorprone * [#2431](https://github.com/pmd/pmd/issues/2431): \[java] InvalidLogMessageFormatRule throws IndexOutOfBoundsException when only logging exception message From 839941d4ebad1350377330e7cb658e0ebee85121 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sun, 16 Aug 2020 14:45:45 +0200 Subject: [PATCH 5/5] [java] Don't add linkage errors as processing errors, just log --- .../lang/java/ast/internal/ImportWrapper.java | 17 ++++++----------- .../rule/bestpractices/MissingOverrideRule.java | 4 +++- .../rule/bestpractices/UnusedImportsRule.java | 3 +-- .../rule/codestyle/DuplicateImportsRule.java | 11 +++++++---- .../UnnecessaryFullyQualifiedNameRule.java | 8 ++++++-- .../typeresolution/MethodTypeResolution.java | 5 +++-- 6 files changed, 26 insertions(+), 22 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java index f8b93bd5ba..32d904dd39 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/internal/ImportWrapper.java @@ -15,8 +15,6 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import net.sourceforge.pmd.Report.ProcessingError; -import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; @@ -37,22 +35,22 @@ public class ImportWrapper { } public ImportWrapper(String fullname, String name, ASTImportDeclaration node) { - this(fullname, name, node, false, null); + this(fullname, name, node, false); } - public ImportWrapper(String fullname, String name, ASTImportDeclaration node, boolean isStaticDemand, RuleContext ctx) { + public ImportWrapper(String fullname, String name, ASTImportDeclaration node, boolean isStaticDemand) { this.fullname = fullname; this.name = name; this.node = node; this.isStaticDemand = isStaticDemand; - this.allStaticDemands = collectStaticFieldsAndMethods(node, ctx); + this.allStaticDemands = collectStaticFieldsAndMethods(node); } /** * @param node */ - private Set collectStaticFieldsAndMethods(ASTImportDeclaration node, RuleContext ctx) { + private Set collectStaticFieldsAndMethods(ASTImportDeclaration node) { if (!this.isStaticDemand || node == null || node.getType() == null) { return Collections.emptySet(); } @@ -74,11 +72,8 @@ public class ImportWrapper { } return names; } catch (LinkageError e) { - if (ctx != null) { - ctx.getReport().addError(new ProcessingError(e, String.valueOf(ctx.getSourceCodeFile()))); - } else { - LOG.log(Level.WARNING, "Error while processing imports", e); - } + // This is an incomplete classpath, report the missing class + LOG.log(Level.FINE, "Possible incomplete auxclasspath: Error while processing imports", e); return Collections.emptySet(); } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/MissingOverrideRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/MissingOverrideRule.java index d3bc8e39ed..414b7ce2f2 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/MissingOverrideRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/MissingOverrideRule.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.Stack; +import java.util.logging.Level; import java.util.logging.Logger; import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression; @@ -131,7 +132,8 @@ public class MissingOverrideRule extends AbstractJavaRule { return new MethodLookup(result, overridden); } catch (final LinkageError e) { - // we may have an incomplete auxclasspath + // This is an incomplete classpath, report the missing class + LOG.log(Level.FINE, "Possible incomplete auxclasspath: Error while processing methods", e); return null; } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java index 769a6c4c80..2c952b6489 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/UnusedImportsRule.java @@ -10,7 +10,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; @@ -118,7 +117,7 @@ public class UnusedImportsRule extends AbstractJavaRule { public Object visit(ASTImportDeclaration node, Object data) { if (node.isImportOnDemand()) { ASTName importedType = (ASTName) node.getChild(0); - imports.add(new ImportWrapper(importedType.getImage(), null, node, node.isStatic(), (RuleContext) data)); + imports.add(new ImportWrapper(importedType.getImage(), null, node, node.isStatic())); } else { if (!node.isImportOnDemand()) { ASTName importedType = (ASTName) node.getChild(0); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java index eedb1b9991..fa5d9cc82f 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/DuplicateImportsRule.java @@ -8,14 +8,16 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; -import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; import net.sourceforge.pmd.lang.java.ast.internal.ImportWrapper; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; public class DuplicateImportsRule extends AbstractJavaRule { + private static final Logger LOG = Logger.getLogger(DuplicateImportsRule.class.getName()); private Set singleTypeImports; private Set importOnDemandImports; @@ -76,8 +78,9 @@ public class DuplicateImportsRule extends AbstractJavaRule { return true; } } - } catch (LinkageError ignored) { - // TODO : This is an incomplete classpath, report the missing class + } catch (LinkageError e) { + // This is an incomplete classpath, report the missing class + LOG.log(Level.FINE, "Possible incomplete auxclasspath: Error while processing methods", e); } } } @@ -92,7 +95,7 @@ public class DuplicateImportsRule extends AbstractJavaRule { @Override public Object visit(ASTImportDeclaration node, Object data) { ImportWrapper wrapper = new ImportWrapper(node.getImportedName(), node.getImportedName(), - node, node.isStatic() && node.isImportOnDemand(), (RuleContext) data); + node, node.isStatic() && node.isImportOnDemand()); // blahhhh... this really wants to be ASTImportDeclaration to be // polymorphic... diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java index f9562ae2da..0124eeb25f 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; @@ -32,6 +34,7 @@ import net.sourceforge.pmd.lang.symboltable.NameOccurrence; import net.sourceforge.pmd.lang.symboltable.Scope; public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { + private static final Logger LOG = Logger.getLogger(UnnecessaryFullyQualifiedNameRule.class.getName()); private List imports = new ArrayList<>(); private String currentPackage; @@ -341,8 +344,9 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { return true; } } - } catch (LinkageError ignored) { - // TODO : This is an incomplete classpath, report the missing class + } catch (LinkageError e) { + // This is an incomplete classpath, report the missing class + LOG.log(Level.FINE, "Possible incomplete auxclasspath: Error while processing methods", e); } } } else if (importDeclaration.getImportedName().endsWith(methodCalled)) { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodTypeResolution.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodTypeResolution.java index 6616c74810..5b30f6bd52 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodTypeResolution.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/MethodTypeResolution.java @@ -475,8 +475,9 @@ public final class MethodTypeResolution { result.add(getTypeDefOfMethod(context, method, typeArguments)); } } - } catch (final LinkageError ignored) { - // TODO : This is an incomplete classpath, report the missing class + } catch (final LinkageError e) { + // This is an incomplete classpath, report the missing class + LOG.log(Level.FINE, "Possible incomplete auxclasspath: Error while processing methods", e); } // search it's supertype