public HierarchyIterator(@Nonnull XClass xclass) { interfacesToVisit = new LinkedList<>(Arrays.asList(xclass.getInterfaceDescriptorList())); visited = new HashSet<>(); superclass = getClassInfo(xclass.getSuperclassDescriptor()); }
public XClass next() { while (!interfacesToVisit.isEmpty()) { ClassDescriptor interfaceDescr = interfacesToVisit.poll(); if (visited.add(interfaceDescr)) { XClass xinterface = getClassInfo(interfaceDescr); if(xinterface != null){ interfacesToVisit.addAll(Arrays.asList(xinterface.getInterfaceDescriptorList())); return xinterface; } } } // no interfaces => check super classes if (superclass == null) { return null; } XClass currentSuperclass = superclass; // compute next one superclass = getClassInfo(superclass.getSuperclassDescriptor()); if(superclass != null){ interfacesToVisit = new LinkedList<>(Arrays.asList(superclass.getInterfaceDescriptorList())); } return currentSuperclass; } }
private static void findSuperMethods(@CheckForNull ClassDescriptor c, XMethod m, Set<XMethod> accumulator) { if (c == null) { return; } try { XClass xc = getXClass(c); XMethod xm = xc.findMatchingMethod(m.getMethodDescriptor()); if (xm != null && !accumulator.add(xm)) { return; } findSuperMethods(xc.getSuperclassDescriptor(), m, accumulator); for (ClassDescriptor i : xc.getInterfaceDescriptorList()) { findSuperMethods(i, m, accumulator); } if (!accumulator.add(m)) { return; } } catch (CheckedAnalysisException e) { AnalysisContext.logError("Error finding super methods for " + m, e); } }
for (ClassDescriptor ifaceDesc : classNameAndInfo.getInterfaceDescriptorList()) { if (addedToWorkList.add(ifaceDesc)) { workList.addLast(ifaceDesc);
public static @CheckForNull XMethod findInvocationLeastUpperBound(XClass jClass, String methodName, String methodSig, boolean invokeStatic, boolean invokeInterface) { XMethod result = findMethod(jClass.getClassDescriptor(), methodName, methodSig, invokeStatic); if (result != null) { return result; } ClassDescriptor sClass = jClass.getSuperclassDescriptor(); if (sClass != null) { result = findInvocationLeastUpperBound(sClass, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } for (ClassDescriptor i : jClass.getInterfaceDescriptorList()) { result = findInvocationLeastUpperBound(i, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } return null; }
public static @CheckForNull XMethod findInvocationLeastUpperBound0(XClass jClass, String methodName, String methodSig, boolean invokeStatic, boolean invokeInterface) { XMethod result = findMethod(jClass.getClassDescriptor(), methodName, methodSig, invokeStatic); if (result != null) { return result; } if (invokeInterface) { for (ClassDescriptor i : jClass.getInterfaceDescriptorList()) { result = findInvocationLeastUpperBound(i, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } } else { ClassDescriptor sClass = jClass.getSuperclassDescriptor(); if (sClass != null) { return findInvocationLeastUpperBound(sClass, methodName, methodSig, invokeStatic, invokeInterface); } } return null; }
ClassDescriptor is[] = classNameAndInfo.getInterfaceDescriptorList(); d = classNameAndInfo.getSuperclassDescriptor(); for (ClassDescriptor i : is) {
/** * Add supertype edges to the InheritanceGraph for given ClassVertex. If any * direct supertypes have not been processed, add them to the worklist. * * @param vertex * a ClassVertex whose supertype edges need to be added * @param workList * work list of ClassVertexes that need to have their supertype * edges added */ private void addSupertypeEdges(ClassVertex vertex, LinkedList<XClass> workList) { XClass xclass = vertex.getXClass(); // Direct superclass ClassDescriptor superclassDescriptor = xclass.getSuperclassDescriptor(); if (superclassDescriptor != null) { addInheritanceEdge(vertex, superclassDescriptor, false, workList); } // Directly implemented interfaces for (ClassDescriptor ifaceDesc : xclass.getInterfaceDescriptorList()) { addInheritanceEdge(vertex, ifaceDesc, true, workList); } }
for (ClassDescriptor i : xClass.getInterfaceDescriptorList()) { worklist.add(i);
private boolean isStaticOnlyClass(XClass xClass) { if (xClass.getInterfaceDescriptorList().length > 0) { return false;
private void traverseSupertypesDepthFirstHelper(ClassDescriptor cur, SupertypeTraversalVisitor visitor, Set<ClassDescriptor> seen) throws ClassNotFoundException { if (seen.contains(cur)) { return; } seen.add(cur); ClassVertex vertex = resolveClassVertex(cur); if (!vertex.isResolved()) { // Unknown class - so, we don't know its immediate supertypes return; } if (!visitor.visitClass(vertex.getClassDescriptor(), vertex.getXClass())) { // Visitor doesn't want to continue on this path return; } // Advance to direct superclass ClassDescriptor superclassDescriptor = vertex.getXClass().getSuperclassDescriptor(); if (superclassDescriptor != null) { traverseSupertypesDepthFirstHelper(superclassDescriptor, visitor, seen); } // Advance to directly-implemented interfaces for (ClassDescriptor ifaceDesc : vertex.getXClass().getInterfaceDescriptorList()) { traverseSupertypesDepthFirstHelper(ifaceDesc, visitor, seen); } }
public boolean isCalledDirectlyOrIndirectly(XMethod m) { if (isCalled(m)) { return true; } if (m.isStatic() || m.isPrivate() || Const.CONSTRUCTOR_NAME.equals(m.getName())) { return false; } try { IAnalysisCache analysisCache = Global.getAnalysisCache(); XClass clazz = analysisCache.getClassAnalysis(XClass.class, m.getClassDescriptor()); if (isCalledDirectlyOrIndirectly(clazz.getSuperclassDescriptor(), m)) { return true; } for (ClassDescriptor i : clazz.getInterfaceDescriptorList()) { if (isCalledDirectlyOrIndirectly(i, m)) { return true; } } return false; } catch (edu.umd.cs.findbugs.classfile.MissingClassException e) { // AnalysisContext.reportMissingClass(e.getClassNotFoundException()); return false; } catch (MissingClassException e) { AnalysisContext.reportMissingClass(e.getClassNotFoundException()); return false; } catch (Exception e) { AnalysisContext.logError("Error checking to see if " + m + " is called (" + e.getClass().getCanonicalName() + ")", e); return false; } }
private boolean isCalledDirectlyOrIndirectly(@CheckForNull ClassDescriptor clazzDescriptor, XMethod m) throws CheckedAnalysisException { if (clazzDescriptor == null) { return false; } IAnalysisCache analysisCache = Global.getAnalysisCache(); XClass clazz = analysisCache.getClassAnalysis(XClass.class, clazzDescriptor); XMethod m2 = clazz.findMethod(m.getName(), m.getSignature(), m.isStatic()); if (m2 != null && isCalled(m2)) { return true; } if (isCalledDirectlyOrIndirectly(clazz.getSuperclassDescriptor(), m)) { return true; } for (ClassDescriptor i : clazz.getInterfaceDescriptorList()) { if (isCalledDirectlyOrIndirectly(i, m)) { return true; } } return false; }
return true; ClassDescriptor[] interfaces = xclass.getInterfaceDescriptorList(); if (interfaces.length == 0) { if (xSuper == null) {
for (ClassDescriptor ifaceDesc : vertex.getXClass().getInterfaceDescriptorList()) { if (traverseEdge(vertex, ifaceDesc, true, visitor)) { addToWorkList(workList, cur, ifaceDesc);
public HierarchyIterator(@Nonnull XClass xclass) { interfacesToVisit = new LinkedList<ClassDescriptor>(Arrays.asList(xclass.getInterfaceDescriptorList())); visited = new HashSet<ClassDescriptor>(); superclass = getClassInfo(xclass.getSuperclassDescriptor()); }
public static @CheckForNull XMethod findInvocationLeastUpperBound0(XClass jClass, String methodName, String methodSig, boolean invokeStatic, boolean invokeInterface) { XMethod result = findMethod(jClass.getClassDescriptor(), methodName, methodSig, invokeStatic); if (result != null) { return result; } if (invokeInterface) { for (ClassDescriptor i : jClass.getInterfaceDescriptorList()) { result = findInvocationLeastUpperBound(i, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } } else { ClassDescriptor sClass = jClass.getSuperclassDescriptor(); if (sClass != null) { return findInvocationLeastUpperBound(sClass, methodName, methodSig, invokeStatic, invokeInterface); } } return null; }
public static @CheckForNull XMethod findInvocationLeastUpperBound(XClass jClass, String methodName, String methodSig, boolean invokeStatic, boolean invokeInterface) { XMethod result = findMethod(jClass.getClassDescriptor(), methodName, methodSig, invokeStatic); if (result != null) { return result; } ClassDescriptor sClass = jClass.getSuperclassDescriptor(); if (sClass != null) { result = findInvocationLeastUpperBound(sClass, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } for (ClassDescriptor i : jClass.getInterfaceDescriptorList()) { result = findInvocationLeastUpperBound(i, methodName, methodSig, invokeStatic, invokeInterface); if (result != null) { return result; } } return null; }
/** * Add supertype edges to the InheritanceGraph for given ClassVertex. If any * direct supertypes have not been processed, add them to the worklist. * * @param vertex * a ClassVertex whose supertype edges need to be added * @param workList * work list of ClassVertexes that need to have their supertype * edges added */ private void addSupertypeEdges(ClassVertex vertex, LinkedList<XClass> workList) { XClass xclass = vertex.getXClass(); // Direct superclass ClassDescriptor superclassDescriptor = xclass.getSuperclassDescriptor(); if (superclassDescriptor != null) { addInheritanceEdge(vertex, superclassDescriptor, false, workList); } // Directly implemented interfaces for (ClassDescriptor ifaceDesc : xclass.getInterfaceDescriptorList()) { addInheritanceEdge(vertex, ifaceDesc, true, workList); } }
private boolean isCalledDirectlyOrIndirectly(@CheckForNull ClassDescriptor clazzDescriptor, XMethod m) throws CheckedAnalysisException { if (clazzDescriptor == null) { return false; } IAnalysisCache analysisCache = Global.getAnalysisCache(); XClass clazz = analysisCache.getClassAnalysis(XClass.class, clazzDescriptor); XMethod m2 = clazz.findMethod(m.getName(), m.getSignature(), m.isStatic()); if (m2 != null && isCalled(m2)) { return true; } if (isCalledDirectlyOrIndirectly(clazz.getSuperclassDescriptor(), m)) { return true; } for (ClassDescriptor i : clazz.getInterfaceDescriptorList()) { if (isCalledDirectlyOrIndirectly(i, m)) { return true; } } return false; }