private static boolean isSubClassOfAny(AsmClass thrownClass, List<AsmClass> thrownClassCandidates) { for (AsmClass current = thrownClass.getSuperClass(); current != null; current = current.getSuperClass()) { for (AsmClass thrownClassCandidate : thrownClassCandidates) { if (current.equals(thrownClassCandidate)) { return true; } } } return false; }
public String getShortClassName(AsmClass asmClass) { return StringUtils.substringAfterLast(asmClass.getInternalName(), "/"); }
private AsmClass getAsmClassFromCacheOrCreateIt(String internalName) { AsmClass asmClass = asmClassCache.get(internalName); if (asmClass == null) { asmClass = new AsmClass(internalName, DETAIL_LEVEL.NOTHING); asmClassCache.put(internalName, asmClass); } return asmClass; }
private static boolean isSubClassOfRuntimeException(AsmClass thrownClass) { for (AsmClass current = thrownClass; current != null; current = current.getSuperClass()) { if ("java/lang/RuntimeException".equals(current.getInternalName())) { return true; } } return false; }
private static boolean isInheritedMethodSignature(AsmClass parent, String key) { if (parent.getSuperClass() != null && (parent.getSuperClass().getMethod(key) != null || isInheritedMethodSignature(parent.getSuperClass(), key))) { return true; } for (AsmClass interfaceClass : parent.getInterfaces()) { if (interfaceClass.getMethod(key) != null || isInheritedMethodSignature(interfaceClass, key)) { return true; } } return false; } }
@Override public void visit(int version, int accessFlags, String internalName, String signature, String superClass, String[] interfaces) { if (asmClass.getDetailLevel() == DETAIL_LEVEL.NOTHING) { asmClass.setAccessFlags(accessFlags); if (asmClass.isInterface()) { if (interfaces.length == 1) { asmClass.setSuperClass(asmClassProvider.getClass(interfaces[0], DETAIL_LEVEL.STRUCTURE)); } } else { if (superClass != null) { asmClass.setSuperClass(asmClassProvider.getClass(superClass, DETAIL_LEVEL.STRUCTURE)); } for (String interfaceName : interfaces) { asmClass.addInterface(asmClassProvider.getClass(interfaceName, DETAIL_LEVEL.STRUCTURE)); } } if (signature != null) { String[] internalNames = AsmSignature.extractInternalNames(signature); AsmClass[] asmClasses = internalNamesToAsmClasses(internalNames, DETAIL_LEVEL.NOTHING); asmClass.addUsesOfClasses(asmClasses); } } asmClass.setDetailLevel(level); }
private AsmMethod findImplementation(AsmClass asmClass, String methodKey) { AsmMethod method = asmClass.getMethod(methodKey); if (method != null && method.isBodyLoaded()) { return method; } if (asmClass.getSuperClass() != null) { return findImplementation(asmClass.getSuperClass(), methodKey); } return null; }
private static boolean isDeclaredMoreThanOnce(AsmClass thrownClass, List<AsmClass> thrownClassCandidates) { int matches = 0; for (AsmClass thrownClassCandidate : thrownClassCandidates) { if (thrownClass.equals(thrownClassCandidate)) { matches++; } } return matches > 1; }
void setSuperClass(AsmClass superClass) { this.superClass = superClass; addEdge(new AsmEdge(this, superClass, SourceCodeEdgeUsage.EXTENDS)); }
@Override public AsmClass getClass(String internalName, DETAIL_LEVEL level) { if (internalName == null) { // TODO Godin: I believe that we should throw IllegalArgumentException instead throw new IllegalStateException("You can try to load a class whose internalName = 'null'"); } AsmClass asmClass = getAsmClassFromCacheOrCreateIt(internalName); if (level.isGreaterThan(asmClass.getDetailLevel())) { decoracteAsmClassFromBytecode(asmClass, level); } return asmClass; }
@Override public void visit(int version, int accessFlags, String internalName, String signature, String superClass, String[] interfaces) { if (asmClass.getDetailLevel() == DETAIL_LEVEL.NOTHING) { asmClass.setAccessFlags(accessFlags); if (asmClass.isInterface()) { if (interfaces.length == 1) { asmClass.setSuperClass(asmClassProvider.getClass(interfaces[0], DETAIL_LEVEL.STRUCTURE)); } } else { if (superClass != null) { asmClass.setSuperClass(asmClassProvider.getClass(superClass, DETAIL_LEVEL.STRUCTURE)); } for (String interfaceName : interfaces) { asmClass.addInterface(asmClassProvider.getClass(interfaceName, DETAIL_LEVEL.STRUCTURE)); } } if (signature != null) { String[] internalNames = AsmSignature.extractInternalNames(signature); AsmClass[] asmClasses = internalNamesToAsmClasses(internalNames, DETAIL_LEVEL.NOTHING); asmClass.addUsesOfClasses(asmClasses); } } asmClass.setDetailLevel(level); }
private boolean isInheritedMethodSignature(AsmClass parent, String key) { if (parent.getSuperClass() != null && (parent.getSuperClass().getMethod(key) != null || isInheritedMethodSignature(parent.getSuperClass(), key))) { return true; } for (AsmClass interfaceClass : parent.getInterfaces()) { if (interfaceClass.getMethod(key) != null || isInheritedMethodSignature(interfaceClass, key)) { return true; } } return false; } }
private static AsmMethod findImplementation(AsmClass asmClass, String methodKey) { AsmMethod method = asmClass.getMethod(methodKey); if (method != null && method.isBodyLoaded()) { return method; } if (asmClass.getSuperClass() != null) { return findImplementation(asmClass.getSuperClass(), methodKey); } return null; }
@Override public boolean equals(Object object) { if (this == object) { return true; } if (object instanceof AsmField) { AsmField otherField = (AsmField) object; return parent.equals(otherField.parent) && name.equals(otherField.name); } return false; }
void setSuperClass(AsmClass superClass) { this.superClass = superClass; addEdge(new AsmEdge(this, superClass, SourceCodeEdgeUsage.EXTENDS)); }
@Override public AsmClass getClass(String internalName, DETAIL_LEVEL level) { if (internalName == null) { // TODO Godin: I believe that we should throw IllegalArgumentException instead throw new IllegalStateException("You can try to load a class whose internalName = 'null'"); } AsmClass asmClass = getAsmClassFromCacheOrCreateIt(internalName); if (level.isGreaterThan(asmClass.getDetailLevel())) { decoracteAsmClassFromBytecode(asmClass, level); } return asmClass; }