--- a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Tue Oct 12 13:15:46 2010 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Tue Oct 12 13:19:47 2010 -0700
@@ -46,9 +46,9 @@
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Messager;
+import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
-import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.ExecutableElement;
@@ -71,6 +71,9 @@
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
+import static javax.tools.Diagnostic.Kind.*;
+
+import com.sun.tools.javac.code.Symbol.CompletionFailure;
/**
* Javah generates support files for native methods.
@@ -233,6 +236,15 @@
task.doubleAlign = true;
}
},
+
+ new HiddenOption(false) {
+ boolean matches(String opt) {
+ return opt.startsWith("-XD");
+ }
+ void process(JavahTask task, String opt, String arg) {
+ task.javac_extras.add(opt);
+ }
+ },
};
JavahTask() {
@@ -326,6 +338,8 @@
} catch (InternalError e) {
diagnosticListener.report(createDiagnostic("err.internal.error", e.getMessage()));
return 1;
+ } catch (Util.Exit e) {
+ return e.exitValue;
} finally {
log.flush();
}
@@ -475,7 +489,9 @@
((JavahFileManager) fileManager).setIgnoreSymbolFile(true);
JavaCompiler c = ToolProvider.getSystemJavaCompiler();
- List<String> opts = Arrays.asList("-proc:only");
+ List<String> opts = new ArrayList<String>();
+ opts.add("-proc:only");
+ opts.addAll(javac_extras);
CompilationTask t = c.getTask(log, fileManager, diagnosticListener, opts, internalize(classes), null);
JavahProcessor p = new JavahProcessor(g);
t.setProcessors(Collections.singleton(p));
@@ -642,6 +658,7 @@
boolean doubleAlign;
boolean force;
boolean old;
+ Set<String> javac_extras = new LinkedHashSet<String>();
PrintWriter log;
JavaFileManager fileManager;
@@ -652,30 +669,45 @@
private static final String progname = "javah";
@SupportedAnnotationTypes("*")
- @SupportedSourceVersion(SourceVersion.RELEASE_7)
class JavahProcessor extends AbstractProcessor {
+ private Messager messager;
+
JavahProcessor(Gen g) {
this.g = g;
}
- public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
- Messager messager = processingEnv.getMessager();
- Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements()));
- if (classes.size() > 0) {
- checkMethodParameters(classes);
- g.setProcessingEnvironment(processingEnv);
- g.setClasses(classes);
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ // since this is co-bundled with javac, we can assume it supports
+ // the latest source version
+ return SourceVersion.latest();
+ }
+
+ @Override
+ public void init(ProcessingEnvironment pEnv) {
+ super.init(pEnv);
+ messager = processingEnv.getMessager();
+ }
- try {
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ try {
+ Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements()));
+ if (classes.size() > 0) {
+ checkMethodParameters(classes);
+ g.setProcessingEnvironment(processingEnv);
+ g.setClasses(classes);
g.run();
- } catch (ClassNotFoundException cnfe) {
- messager.printMessage(Diagnostic.Kind.ERROR, getMessage("class.not.found", cnfe.getMessage()));
- } catch (IOException ioe) {
- messager.printMessage(Diagnostic.Kind.ERROR, getMessage("io.exception", ioe.getMessage()));
- } catch (Util.Exit e) {
- exit = e;
}
+ } catch (CompletionFailure cf) {
+ messager.printMessage(ERROR, getMessage("class.not.found", cf.sym.getQualifiedName().toString()));
+ } catch (ClassNotFoundException cnfe) {
+ messager.printMessage(ERROR, getMessage("class.not.found", cnfe.getMessage()));
+ } catch (IOException ioe) {
+ messager.printMessage(ERROR, getMessage("io.exception", ioe.getMessage()));
+ } catch (Util.Exit e) {
+ exit = e;
}
+
return true;
}