44 import java.util.ResourceBundle; |
44 import java.util.ResourceBundle; |
45 import java.util.Set; |
45 import java.util.Set; |
46 |
46 |
47 import javax.annotation.processing.AbstractProcessor; |
47 import javax.annotation.processing.AbstractProcessor; |
48 import javax.annotation.processing.Messager; |
48 import javax.annotation.processing.Messager; |
|
49 import javax.annotation.processing.ProcessingEnvironment; |
49 import javax.annotation.processing.RoundEnvironment; |
50 import javax.annotation.processing.RoundEnvironment; |
50 import javax.annotation.processing.SupportedAnnotationTypes; |
51 import javax.annotation.processing.SupportedAnnotationTypes; |
51 import javax.annotation.processing.SupportedSourceVersion; |
|
52 |
52 |
53 import javax.lang.model.SourceVersion; |
53 import javax.lang.model.SourceVersion; |
54 import javax.lang.model.element.ExecutableElement; |
54 import javax.lang.model.element.ExecutableElement; |
55 import javax.lang.model.element.TypeElement; |
55 import javax.lang.model.element.TypeElement; |
56 import javax.lang.model.element.VariableElement; |
56 import javax.lang.model.element.VariableElement; |
69 import javax.tools.JavaFileManager; |
69 import javax.tools.JavaFileManager; |
70 import javax.tools.JavaFileObject; |
70 import javax.tools.JavaFileObject; |
71 import javax.tools.StandardJavaFileManager; |
71 import javax.tools.StandardJavaFileManager; |
72 import javax.tools.StandardLocation; |
72 import javax.tools.StandardLocation; |
73 import javax.tools.ToolProvider; |
73 import javax.tools.ToolProvider; |
|
74 import static javax.tools.Diagnostic.Kind.*; |
|
75 |
|
76 import com.sun.tools.javac.code.Symbol.CompletionFailure; |
74 |
77 |
75 /** |
78 /** |
76 * Javah generates support files for native methods. |
79 * Javah generates support files for native methods. |
77 * Parse commandline options & Invokes javadoc to execute those commands. |
80 * Parse commandline options & Invokes javadoc to execute those commands. |
78 * |
81 * |
473 |
487 |
474 if (fileManager instanceof JavahFileManager) |
488 if (fileManager instanceof JavahFileManager) |
475 ((JavahFileManager) fileManager).setIgnoreSymbolFile(true); |
489 ((JavahFileManager) fileManager).setIgnoreSymbolFile(true); |
476 |
490 |
477 JavaCompiler c = ToolProvider.getSystemJavaCompiler(); |
491 JavaCompiler c = ToolProvider.getSystemJavaCompiler(); |
478 List<String> opts = Arrays.asList("-proc:only"); |
492 List<String> opts = new ArrayList<String>(); |
|
493 opts.add("-proc:only"); |
|
494 opts.addAll(javac_extras); |
479 CompilationTask t = c.getTask(log, fileManager, diagnosticListener, opts, internalize(classes), null); |
495 CompilationTask t = c.getTask(log, fileManager, diagnosticListener, opts, internalize(classes), null); |
480 JavahProcessor p = new JavahProcessor(g); |
496 JavahProcessor p = new JavahProcessor(g); |
481 t.setProcessors(Collections.singleton(p)); |
497 t.setProcessors(Collections.singleton(p)); |
482 |
498 |
483 boolean ok = t.call(); |
499 boolean ok = t.call(); |
640 boolean jni; |
656 boolean jni; |
641 boolean llni; |
657 boolean llni; |
642 boolean doubleAlign; |
658 boolean doubleAlign; |
643 boolean force; |
659 boolean force; |
644 boolean old; |
660 boolean old; |
|
661 Set<String> javac_extras = new LinkedHashSet<String>(); |
645 |
662 |
646 PrintWriter log; |
663 PrintWriter log; |
647 JavaFileManager fileManager; |
664 JavaFileManager fileManager; |
648 DiagnosticListener<? super JavaFileObject> diagnosticListener; |
665 DiagnosticListener<? super JavaFileObject> diagnosticListener; |
649 Locale task_locale; |
666 Locale task_locale; |
650 Map<Locale, ResourceBundle> bundles; |
667 Map<Locale, ResourceBundle> bundles; |
651 |
668 |
652 private static final String progname = "javah"; |
669 private static final String progname = "javah"; |
653 |
670 |
654 @SupportedAnnotationTypes("*") |
671 @SupportedAnnotationTypes("*") |
655 @SupportedSourceVersion(SourceVersion.RELEASE_7) |
|
656 class JavahProcessor extends AbstractProcessor { |
672 class JavahProcessor extends AbstractProcessor { |
|
673 private Messager messager; |
|
674 |
657 JavahProcessor(Gen g) { |
675 JavahProcessor(Gen g) { |
658 this.g = g; |
676 this.g = g; |
659 } |
677 } |
660 |
678 |
|
679 @Override |
|
680 public SourceVersion getSupportedSourceVersion() { |
|
681 // since this is co-bundled with javac, we can assume it supports |
|
682 // the latest source version |
|
683 return SourceVersion.latest(); |
|
684 } |
|
685 |
|
686 @Override |
|
687 public void init(ProcessingEnvironment pEnv) { |
|
688 super.init(pEnv); |
|
689 messager = processingEnv.getMessager(); |
|
690 } |
|
691 |
661 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { |
692 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { |
662 Messager messager = processingEnv.getMessager(); |
693 try { |
663 Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements())); |
694 Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements())); |
664 if (classes.size() > 0) { |
695 if (classes.size() > 0) { |
665 checkMethodParameters(classes); |
696 checkMethodParameters(classes); |
666 g.setProcessingEnvironment(processingEnv); |
697 g.setProcessingEnvironment(processingEnv); |
667 g.setClasses(classes); |
698 g.setClasses(classes); |
668 |
|
669 try { |
|
670 g.run(); |
699 g.run(); |
671 } catch (ClassNotFoundException cnfe) { |
|
672 messager.printMessage(Diagnostic.Kind.ERROR, getMessage("class.not.found", cnfe.getMessage())); |
|
673 } catch (IOException ioe) { |
|
674 messager.printMessage(Diagnostic.Kind.ERROR, getMessage("io.exception", ioe.getMessage())); |
|
675 } catch (Util.Exit e) { |
|
676 exit = e; |
|
677 } |
700 } |
678 } |
701 } catch (CompletionFailure cf) { |
|
702 messager.printMessage(ERROR, getMessage("class.not.found", cf.sym.getQualifiedName().toString())); |
|
703 } catch (ClassNotFoundException cnfe) { |
|
704 messager.printMessage(ERROR, getMessage("class.not.found", cnfe.getMessage())); |
|
705 } catch (IOException ioe) { |
|
706 messager.printMessage(ERROR, getMessage("io.exception", ioe.getMessage())); |
|
707 } catch (Util.Exit e) { |
|
708 exit = e; |
|
709 } |
|
710 |
679 return true; |
711 return true; |
680 } |
712 } |
681 |
713 |
682 private Set<TypeElement> getAllClasses(Set<? extends TypeElement> classes) { |
714 private Set<TypeElement> getAllClasses(Set<? extends TypeElement> classes) { |
683 Set<TypeElement> allClasses = new LinkedHashSet<TypeElement>(); |
715 Set<TypeElement> allClasses = new LinkedHashSet<TypeElement>(); |