langtools/src/share/classes/com/sun/tools/javah/JavahTask.java
changeset 6930 b6fea484cbb2
parent 6925 2196feb18c96
child 7078 17f1f2bdcb46
equal deleted inserted replaced
6929:81a6a7c1bef1 6930:b6fea484cbb2
    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  *
   231             void process(JavahTask task, String opt, String arg) {
   234             void process(JavahTask task, String opt, String arg) {
   232                 task.llni = true;
   235                 task.llni = true;
   233                 task.doubleAlign = true;
   236                 task.doubleAlign = true;
   234             }
   237             }
   235         },
   238         },
       
   239 
       
   240         new HiddenOption(false) {
       
   241             boolean matches(String opt) {
       
   242                 return opt.startsWith("-XD");
       
   243             }
       
   244             void process(JavahTask task, String opt, String arg) {
       
   245                 task.javac_extras.add(opt);
       
   246             }
       
   247         },
   236     };
   248     };
   237 
   249 
   238     JavahTask() {
   250     JavahTask() {
   239     }
   251     }
   240 
   252 
   324             diagnosticListener.report(createDiagnostic(e.key, e.args));
   336             diagnosticListener.report(createDiagnostic(e.key, e.args));
   325             return 1;
   337             return 1;
   326         } catch (InternalError e) {
   338         } catch (InternalError e) {
   327             diagnosticListener.report(createDiagnostic("err.internal.error", e.getMessage()));
   339             diagnosticListener.report(createDiagnostic("err.internal.error", e.getMessage()));
   328             return 1;
   340             return 1;
       
   341         } catch (Util.Exit e) {
       
   342             return e.exitValue;
   329         } finally {
   343         } finally {
   330             log.flush();
   344             log.flush();
   331         }
   345         }
   332     }
   346     }
   333 
   347 
   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>();