JavacAdapter.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package de.jplag.java19;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. import java.nio.file.Paths;
  6. import java.util.Collections;
  7. import javax.tools.Diagnostic;
  8. import javax.tools.DiagnosticCollector;
  9. import javax.tools.JavaCompiler;
  10. import javax.tools.JavaFileObject;
  11. import javax.tools.StandardJavaFileManager;
  12. import javax.tools.ToolProvider;
  13. import com.sun.source.tree.CompilationUnitTree;
  14. import com.sun.source.tree.LineMap;
  15. import com.sun.source.util.JavacTask;
  16. import com.sun.source.util.SourcePositions;
  17. import com.sun.source.util.Trees;
  18. public class JavacAdapter {
  19. private static final JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
  20. public int parseFiles(File dir, File[] pathedFiles, final Parser parser) {
  21. final StandardJavaFileManager jfm = javac.getStandardFileManager(null, null, StandardCharsets.UTF_8);
  22. DiagnosticCollector<? super JavaFileObject> diagListen = new DiagnosticCollector<>();
  23. final JavaCompiler.CompilationTask task = javac.getTask(null, jfm, diagListen, null, null, jfm.getJavaFileObjects(pathedFiles));
  24. Iterable<? extends CompilationUnitTree> asts = Collections.emptyList();
  25. try {
  26. asts = ((JavacTask) task).parse();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. final Trees trees = Trees.instance(task);
  31. final SourcePositions positions = trees.getSourcePositions();
  32. for (final CompilationUnitTree ast : asts) {
  33. final String filename;
  34. if (dir == null)
  35. filename = ast.getSourceFile().getName();
  36. else {
  37. filename = Paths.get(dir.toURI()).relativize(Paths.get(ast.getSourceFile().toUri())).toString();
  38. }
  39. final LineMap map = ast.getLineMap();
  40. ast.accept(new TokenGeneratingTreeScanner(filename, parser, map, positions, ast), null);
  41. parser.add(JavaTokenConstants.FILE_END, filename, 1, -1, -1);
  42. }
  43. int errors = 0;
  44. for (Diagnostic<?> diagItem : diagListen.getDiagnostics()) {
  45. if (diagItem.getKind() == javax.tools.Diagnostic.Kind.ERROR) {
  46. parser.getErrorConsumer().addError(diagItem.toString());
  47. errors++;
  48. }
  49. }
  50. return errors;
  51. }
  52. }