private void replaceObfuscatedMethodNames(AsmagicDiffVisitor dv) {
    for (MethodNode mn : dv.newMethods) {
      if (mn.visibleAnnotations != null) {
        for (Object oan : mn.visibleAnnotations) {
          AnnotationNode an = (AnnotationNode) oan;
          if (an.desc.contains("AsmagicMethodReplace")) {
            List<Object> vals = an.values;

            String alias = null;
            if (vals != null || vals.size() > 1) {
              alias = (String) vals.get(1);
              dv.methodsToReplace.put(alias, 1);
              mn.name = alias;
            }
          }
        }
      }
    }
  }
  /**
   * It is assumed that ALL CLASSES regardless of nesting, have unique names In addition, it is
   * assumed that there is not multi-level nesting A SOURCE STRUCTURE OBJECT CAN ONLY HANDLE ONE
   * LEVEL OF CLASS NESTING
   *
   * @param targetClass
   * @param depth
   * @throws IOException
   */
  private void findNestedInnerClasses(ClassNode2 targetClass, int depth) throws IOException {

    // saves the depth of a particular inner class
    depth++;

    // get the inner classes of a class
    List<InnerClassNode2> innerClassNodes = targetClass.innerClasses;

    // returns if there are no inner classes
    if (innerClassNodes == null) {
      return;
    } else {

      // if there are inner classes, each inner class is converted to a ClassStructure
      // object and stored in an ArrayList
      for (int i = 0; i < innerClassNodes.size(); i++) {
        classStructures.add(new ClassStructure(innerClassNodes.get(i).name, depth));
      }
    }
  }