Program: 83923
Project: 83923
Buggy source:
public List<Extension> extract() throws IOException, InterruptedException {
  File tempDir=File.createTempFile("String_Node_Str","String_Node_Str");
  tempDir.delete();
  tempDir.mkdirs();
  StandardJavaFileManager fileManager=null;
  try {
    File srcdir=new File(tempDir,"String_Node_Str");
    File libdir=new File(tempDir,"String_Node_Str");
    FileUtils.unzip(hpi.resolveSources(),srcdir);
    File pom=hpi.resolvePOM();
    FileUtils.copyFile(pom,new File(srcdir,"String_Node_Str"));
    downloadDependencies(srcdir,libdir);
    JavaCompiler javac1=JavacTool.create();
    DiagnosticListener<? super JavaFileObject> errorListener=new DiagnosticListener<JavaFileObject>(){
      public void report(      Diagnostic<? extends JavaFileObject> diagnostic){
        System.out.println(diagnostic);
      }
    }
;
    fileManager=javac1.getStandardFileManager(errorListener,Locale.getDefault(),Charset.defaultCharset());
    fileManager.setLocation(StandardLocation.CLASS_PATH,generateClassPath(libdir));
    List<String> options=Arrays.asList("String_Node_Str");
    Iterable<? extends JavaFileObject> files=fileManager.getJavaFileObjectsFromFiles(generateSources(srcdir));
    JavaCompiler.CompilationTask task=javac1.getTask(null,fileManager,errorListener,options,null,files);
    final JavacTask javac=(JavacTask)task;
    final Trees trees=Trees.instance(javac);
    final Elements elements=javac.getElements();
    final Types types=javac.getTypes();
    Iterable<? extends CompilationUnitTree> parsed=javac.parse();
    javac.analyze();
    final List<Extension> r=new ArrayList<Extension>();
    TreePathScanner<?,?> classScanner=new TreePathScanner<Void,Void>(){
      final TypeElement extensionPoint=elements.getTypeElement("String_Node_Str");
      public Void visitClass(      ClassTree ct,      Void _){
        TreePath path=getCurrentPath();
        TypeElement e=(TypeElement)trees.getElement(path);
        if (e != null)         checkIfExtension(path,e,e);
        return super.visitClass(ct,_);
      }
      private void checkIfExtension(      TreePath pathToRoot,      TypeElement root,      TypeElement e){
        for (        TypeMirror i : e.getInterfaces()) {
          if (types.asElement(i).equals(extensionPoint))           r.add(new Extension(hpi,javac,trees,root,pathToRoot,e));
          checkIfExtension(pathToRoot,root,(TypeElement)types.asElement(i));
        }
        TypeMirror s=e.getSuperclass();
        if (!(s instanceof NoType))         checkIfExtension(pathToRoot,root,(TypeElement)types.asElement(s));
      }
    }
;
    for (    CompilationUnitTree u : parsed)     classScanner.scan(u,null);
    return r;
  }
  finally {
    FileUtils.deleteDirectory(tempDir);
    if (fileManager != null)     fileManager.close();
  }
}

Fixed version (ground truth):
public List<Extension> extract() throws IOException, InterruptedException {
  File tempDir=File.createTempFile("String_Node_Str","String_Node_Str");
  tempDir.delete();
  tempDir.mkdirs();
  StandardJavaFileManager fileManager=null;
  try {
    File srcdir=new File(tempDir,"String_Node_Str");
    File libdir=new File(tempDir,"String_Node_Str");
    FileUtils.unzip(artifact.resolveSources(),srcdir);
    File pom=artifact.resolvePOM();
    FileUtils.copyFile(pom,new File(srcdir,"String_Node_Str"));
    downloadDependencies(srcdir,libdir);
    JavaCompiler javac1=JavacTool.create();
    DiagnosticListener<? super JavaFileObject> errorListener=new DiagnosticListener<JavaFileObject>(){
      public void report(      Diagnostic<? extends JavaFileObject> diagnostic){
        System.out.println(diagnostic);
      }
    }
;
    fileManager=javac1.getStandardFileManager(errorListener,Locale.getDefault(),Charset.defaultCharset());
    fileManager.setLocation(StandardLocation.CLASS_PATH,generateClassPath(libdir));
    List<String> options=Arrays.asList("String_Node_Str");
    Iterable<? extends JavaFileObject> files=fileManager.getJavaFileObjectsFromFiles(generateSources(srcdir));
    JavaCompiler.CompilationTask task=javac1.getTask(null,fileManager,errorListener,options,null,files);
    final JavacTask javac=(JavacTask)task;
    final Trees trees=Trees.instance(javac);
    final Elements elements=javac.getElements();
    final Types types=javac.getTypes();
    Iterable<? extends CompilationUnitTree> parsed=javac.parse();
    javac.analyze();
    final List<Extension> r=new ArrayList<Extension>();
    TreePathScanner<?,?> classScanner=new TreePathScanner<Void,Void>(){
      final TypeElement extensionPoint=elements.getTypeElement("String_Node_Str");
      public Void visitClass(      ClassTree ct,      Void _){
        TreePath path=getCurrentPath();
        TypeElement e=(TypeElement)trees.getElement(path);
        if (e != null)         checkIfExtension(path,e,e);
        return super.visitClass(ct,_);
      }
      private void checkIfExtension(      TreePath pathToRoot,      TypeElement root,      TypeElement e){
        for (        TypeMirror i : e.getInterfaces()) {
          if (types.asElement(i).equals(extensionPoint))           r.add(new Extension(artifact,javac,trees,root,pathToRoot,e));
          checkIfExtension(pathToRoot,root,(TypeElement)types.asElement(i));
        }
        TypeMirror s=e.getSuperclass();
        if (!(s instanceof NoType))         checkIfExtension(pathToRoot,root,(TypeElement)types.asElement(s));
      }
    }
;
    for (    CompilationUnitTree u : parsed)     classScanner.scan(u,null);
    return r;
  }
  finally {
    FileUtils.deleteDirectory(tempDir);
    if (fileManager != null)     fileManager.close();
  }
}