示例#1
0
  public static Set<File> getCompileClasses(File file, SourceProvider sourceProvider)
      throws IOException {
    if (!file.isDirectory()) return null;
    HashSet<File> out = new HashSet<>();
    for (File f : file.listFiles()) {
      if (f.isDirectory()) {
        Set<File> aa = getCompileClasses(f, sourceProvider);
        if (aa != null) out.addAll(aa);
        continue;
      }
      if (!f.isFile()) continue;
      if (!f.getName().endsWith(".class")) continue;
      try (FileInputStream fis = new FileInputStream(f)) {
        ClassReader cr = new ClassReader(fis);
        ClassNode classNode = new ClassNode();
        cr.accept(classNode, 0);

        if (classNode.visibleAnnotations != null)
          for (Object o : classNode.visibleAnnotations) {
            AnnotationNode an = (AnnotationNode) o;
            if (an.desc.equals("L" + JSClass.class.getName().replace('.', '/') + ";")) {
              if (classNode.name.contains("$")) {
                String cn =
                    classNode.name.substring(0, classNode.name.indexOf("$")).replace('/', '.');
                sourceProvider.getSourceForClass(cn).ifPresent(e -> out.add(e));
              } else {
                if (sourceProvider
                    .getSourceForClass(classNode.name.replace('/', '.'))
                    .isPresent()) {
                  out.add(sourceProvider.getSourceForClass(classNode.name.replace('/', '.')).get());
                }
              }
            }
          }
      }
    }

    return out;
  }