summaryrefslogtreecommitdiffstats
path: root/args4j/args4j-tools/src
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2015-03-13 16:55:40 +0100
committermikaelpeltier <mikaelpeltier@google.com>2015-03-13 16:55:40 +0100
commit7c94b56d46601db9ed95143dc6889cdca83399e2 (patch)
tree620d5a914f444c3c30c7c6c14b39d9cf0dc0f170 /args4j/args4j-tools/src
parent8007ff78c3d693f7a17350fae567ae5e6e0f0fb2 (diff)
downloadtoolchain_jack-7c94b56d46601db9ed95143dc6889cdca83399e2.tar.gz
toolchain_jack-7c94b56d46601db9ed95143dc6889cdca83399e2.tar.bz2
toolchain_jack-7c94b56d46601db9ed95143dc6889cdca83399e2.zip
Update arg4j to version 2.0.30
Change-Id: Ia94c584414379011b92c7e1d5f1e143bd1d4dc75
Diffstat (limited to 'args4j/args4j-tools/src')
-rw-r--r--args4j/args4j-tools/src/META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory1
-rw-r--r--args4j/args4j-tools/src/META-INF/services/javax.annotation.processing.Processor1
-rw-r--r--args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorFactoryImpl.java154
-rw-r--r--args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorImpl.java169
-rw-r--r--args4j/args4j-tools/src/org/kohsuke/args4j/apt/Main.java18
-rw-r--r--args4j/args4j-tools/src/org/kohsuke/args4j/apt/TxtWriter.java4
-rw-r--r--args4j/args4j-tools/src/org/kohsuke/args4j/apt/XmlWriter.java4
7 files changed, 184 insertions, 167 deletions
diff --git a/args4j/args4j-tools/src/META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory b/args4j/args4j-tools/src/META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory
deleted file mode 100644
index 69cf0687..00000000
--- a/args4j/args4j-tools/src/META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory
+++ /dev/null
@@ -1 +0,0 @@
-org.kohsuke.args4j.apt.AnnotationProcessorFactoryImpl \ No newline at end of file
diff --git a/args4j/args4j-tools/src/META-INF/services/javax.annotation.processing.Processor b/args4j/args4j-tools/src/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 00000000..e36bc647
--- /dev/null
+++ b/args4j/args4j-tools/src/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+org.kohsuke.args4j.apt.AnnotationProcessorImpl
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorFactoryImpl.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorFactoryImpl.java
deleted file mode 100644
index d7148f89..00000000
--- a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorFactoryImpl.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.kohsuke.args4j.apt;
-
-import com.sun.mirror.apt.AnnotationProcessor;
-import com.sun.mirror.apt.AnnotationProcessorEnvironment;
-import com.sun.mirror.apt.AnnotationProcessorFactory;
-import com.sun.mirror.declaration.AnnotationTypeDeclaration;
-import com.sun.mirror.declaration.ClassDeclaration;
-import com.sun.mirror.declaration.Declaration;
-import com.sun.mirror.declaration.FieldDeclaration;
-import com.sun.mirror.declaration.MethodDeclaration;
-import com.sun.mirror.declaration.TypeDeclaration;
-import com.sun.mirror.declaration.MemberDeclaration;
-import com.sun.mirror.type.ClassType;
-import com.sun.mirror.util.SimpleDeclarationVisitor;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.FileInputStream;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.Properties;
-
-/**
- * {@link AnnotationProcessorFactory} to be invoked by APT.
- *
- * This class receives options from the Main method through system properties (ouch!).
- *
- * @author Kohsuke Kawaguchi
- */
-public class AnnotationProcessorFactoryImpl implements AnnotationProcessorFactory {
-
- private File outDir;
- private String format;
- private Properties resource = null;
-
- public AnnotationProcessorFactoryImpl() {
- outDir = new File(System.getProperty("args4j.outdir"));
- format = System.getProperty("args4j.format");
-
- String res = System.getProperty("args4j.resource");
- if(res!=null && res.length()>0) {
- try {
- resource = new Properties();
- resource.load(new FileInputStream(res));
- } catch (IOException e) {
- throw new Error(e);
- }
- }
- }
-
- public Collection<String> supportedOptions() {
- return Collections.emptyList();
- }
-
- public Collection<String> supportedAnnotationTypes() {
- return Arrays.asList(Option.class.getName(),Argument.class.getName());
- }
-
- public AnnotationProcessor getProcessorFor(final Set<AnnotationTypeDeclaration> annotationTypeDeclarations, final AnnotationProcessorEnvironment env) {
- return new AnnotationProcessor() {
- public void process() {
- Collection<Declaration> params = env.getDeclarationsAnnotatedWith((AnnotationTypeDeclaration)env.getTypeDeclaration(Option.class.getName()));
-
- final Set<TypeDeclaration> optionBeans = new HashSet<TypeDeclaration>();
- for (Declaration d : params) {
- d.accept(new SimpleDeclarationVisitor() {
- public void visitFieldDeclaration(FieldDeclaration f) {
- TypeDeclaration dt = f.getDeclaringType();
- optionBeans.add(dt);
- }
-
- public void visitMethodDeclaration(MethodDeclaration m) {
- optionBeans.add(m.getDeclaringType());
- }
- });
- }
-
- for (TypeDeclaration t : optionBeans) {
- // make sure that they are on classes
- if(t instanceof ClassDeclaration) {
- ClassDeclaration cd = (ClassDeclaration)t;
- try {
- AnnotationVisitor writer = createAnnotationVisitor(cd);
- env.getMessager().printNotice("Processing "+cd.getQualifiedName());
- scan(cd, writer);
- } catch (IOException e) {
- env.getMessager().printError(e.getMessage());
- }
- } else {
- env.getMessager().printError(t.getPosition(),
- "args4j annotations need to be placed on a class");
- }
- }
- }
- };
- }
-
- private AnnotationVisitor createAnnotationVisitor(ClassDeclaration cd) throws IOException {
- FileWriter out = new FileWriter(new File(outDir,cd.getQualifiedName()+"."+format.toLowerCase()));
- AnnotationVisitor writer;
- if(format.equals("XML"))
- writer = new XmlWriter(out,cd);
- else if (format.equals("TXT"))
- writer = new TxtWriter(out, cd);
- else
- writer = new HtmlWriter(out);
- return new AnnotationVisitorReorderer(writer);
- }
-
- private void scan(ClassDeclaration decl, AnnotationVisitor visitor) {
- while(decl!=null) {
- for( FieldDeclaration f : decl.getFields() )
- scan(f, visitor);
-
- for (MethodDeclaration m : decl.getMethods())
- scan(m, visitor);
-
- ClassType sc = decl.getSuperclass();
- if(sc==null) break;
-
- decl = sc.getDeclaration();
- }
-
- visitor.done();
- }
-
- private void scan(MemberDeclaration f, AnnotationVisitor visitor) {
- Option o = f.getAnnotation(Option.class);
- if(o==null) return;
-
- String usage = getUsage(o);
- if(isOptionHidden(usage)) return;
-
- visitor.onOption(new OptionWithUsage(o, usage));
- }
-
- private boolean isOptionHidden(String usage) {
- return usage==null || usage.length()==0;
- }
-
- private String getUsage(Option o) {
- if(resource==null)
- return o.usage();
- else
- return resource.getProperty(o.usage());
- }
-
-}
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorImpl.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorImpl.java
new file mode 100644
index 00000000..e7bedd82
--- /dev/null
+++ b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/AnnotationProcessorImpl.java
@@ -0,0 +1,169 @@
+package org.kohsuke.args4j.apt;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Messager;
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.Processor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.util.SimpleElementVisitor6;
+import javax.lang.model.util.Types;
+import javax.tools.Diagnostic.Kind;
+
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+import static javax.tools.Diagnostic.Kind.*;
+
+/**
+ * Annotation {@link Processor} to be invoked by javac.
+ *
+ * This class receives options from the Main method through system properties
+ * (ouch!).
+ *
+ * @author Kohsuke Kawaguchi
+ */
+@SuppressWarnings("Since15")
+public class AnnotationProcessorImpl extends AbstractProcessor {
+
+ private File outDir;
+ private String format;
+ private Properties resource = null;
+ private Types typeUtils;
+ private Messager messenger;
+
+ public AnnotationProcessorImpl() {
+ outDir = new File(System.getProperty("args4j.outdir"));
+ format = System.getProperty("args4j.format");
+
+ String res = System.getProperty("args4j.resource");
+ if(res!=null && res.length()>0) {
+ try {
+ resource = new Properties();
+ resource.load(new FileInputStream(res));
+ } catch (IOException e) {
+ throw new Error(e);
+ }
+ }
+ }
+
+ @Override
+ public synchronized void init(ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ typeUtils = processingEnv.getTypeUtils();
+ messenger = processingEnv.getMessager();
+ }
+
+ @Override
+ public Set<String> getSupportedAnnotationTypes() {
+ return new HashSet<String>(Arrays.asList(
+ Option.class.getName(),
+ Argument.class.getName()));
+ }
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+
+ private AnnotationVisitor createAnnotationVisitor(TypeElement te)
+ throws IOException {
+ FileWriter out = new FileWriter(new File(outDir, te.getQualifiedName()
+ + "." + format.toLowerCase()));
+ AnnotationVisitor writer;
+ if(format.equals("XML"))
+ writer = new XmlWriter(out, te);
+ else if (format.equals("TXT"))
+ writer = new TxtWriter(out, te);
+ else
+ writer = new HtmlWriter(out);
+ return new AnnotationVisitorReorderer(writer);
+ }
+
+ private void scan(TypeElement decl, AnnotationVisitor visitor) {
+ while (decl != null) {
+ for (Element f : decl.getEnclosedElements()) {
+ scan(f, visitor);
+ }
+ decl = (TypeElement) typeUtils.asElement(decl.getSuperclass());
+ }
+
+ visitor.done();
+ }
+
+ private void scan(Element f, AnnotationVisitor visitor) {
+ Option o = f.getAnnotation(Option.class);
+ if(o==null) return;
+
+ String usage = getUsage(o);
+ if(isOptionHidden(usage)) return;
+
+ visitor.onOption(new OptionWithUsage(o, usage));
+ }
+
+ private boolean isOptionHidden(String usage) {
+ return usage==null || usage.length()==0;
+ }
+
+ private String getUsage(Option o) {
+ if(resource==null)
+ return o.usage();
+ else
+ return resource.getProperty(o.usage());
+ }
+
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+
+ Set<? extends Element> params = roundEnv.getElementsAnnotatedWith(Option.class);
+
+ final Set<TypeElement> optionBeans = new HashSet<TypeElement>();
+
+ for (Element d : params) {
+
+ d.accept(new SimpleElementVisitor6<Void, Void>() {
+ @Override
+ public Void visitVariable(VariableElement e, Void p) {
+ TypeElement dt = (TypeElement) e.getEnclosingElement();
+ optionBeans.add(dt);
+ return null;
+ }
+
+ public Void visitExecutable(ExecutableElement m, Void p) {
+ optionBeans.add((TypeElement) m.getEnclosingElement());
+ return null;
+ }
+ }, null);
+ }
+
+ for (TypeElement t : optionBeans) {
+ // make sure that they are on classes
+ if (t.getKind().isClass()) {
+ try {
+ AnnotationVisitor writer = createAnnotationVisitor(t);
+ messenger.printMessage(NOTE, "Processing " + t.getQualifiedName());
+ scan(t, writer);
+ } catch (IOException e) {
+ messenger.printMessage(ERROR, e.getMessage());
+ }
+ } else {
+ messenger.printMessage(ERROR, "args4j annotations need to be placed on a class", t);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/Main.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/Main.java
index 38394470..91bd47a3 100644
--- a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/Main.java
+++ b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/Main.java
@@ -13,8 +13,12 @@ import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+
/**
* Entry point that invokes APT.
+ *
* @author Kohsuke Kawaguchi
*/
public class Main {
@@ -61,15 +65,13 @@ public class Main {
if(resourceName==null) resourceName = ""; // can't have null in properties
System.setProperty("args4j.resource",resourceName);
- aptArgs.add(0,"-nocompile");
+ aptArgs.add(0, "-proc:only");
+ aptArgs.add(1, "-processor");
+ aptArgs.add(2, AnnotationProcessorImpl.class.getName());
+
+ JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
- // locate tools.jar
- ClassLoader cl = loadToolsJar();
- Class<?> apt = cl.loadClass("com.sun.tools.apt.Main");
- Method main = getProcessMethod(apt);
- return (Integer)main.invoke(null,new Object[]{
- cl.loadClass("org.kohsuke.args4j.apt.AnnotationProcessorFactoryImpl").newInstance(),
- aptArgs.toArray(new String[0])});
+ return javac.run(System.in, System.out, System.err, aptArgs.toArray(new String[0]));
}
private void printUsage(CmdLineParser parser) {
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/TxtWriter.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/TxtWriter.java
index fc73b5cf..ca98d8ba 100644
--- a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/TxtWriter.java
+++ b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/TxtWriter.java
@@ -1,6 +1,6 @@
package org.kohsuke.args4j.apt;
-import com.sun.mirror.declaration.ClassDeclaration;
+import javax.lang.model.element.TypeElement;
import org.kohsuke.args4j.Option;
import java.io.PrintWriter;
@@ -14,7 +14,7 @@ import java.io.Writer;
class TxtWriter implements AnnotationVisitor {
private final PrintWriter out;
- public TxtWriter(Writer out, ClassDeclaration d) {
+ public TxtWriter(Writer out, TypeElement d) {
this.out = new PrintWriter(out);
this.out.println("Usage: " + d.getQualifiedName());
}
diff --git a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/XmlWriter.java b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/XmlWriter.java
index 1fcc5e59..0b20f313 100644
--- a/args4j/args4j-tools/src/org/kohsuke/args4j/apt/XmlWriter.java
+++ b/args4j/args4j-tools/src/org/kohsuke/args4j/apt/XmlWriter.java
@@ -1,6 +1,6 @@
package org.kohsuke.args4j.apt;
-import com.sun.mirror.declaration.ClassDeclaration;
+import javax.lang.model.element.TypeElement;
import java.io.PrintWriter;
import java.io.Writer;
@@ -13,7 +13,7 @@ import java.io.Writer;
class XmlWriter implements AnnotationVisitor {
private final PrintWriter out;
- public XmlWriter(Writer out, ClassDeclaration d) {
+ public XmlWriter(Writer out, TypeElement d) {
this.out = new PrintWriter(out);
this.out.println("<usage class=\'"+d.getQualifiedName()+"\'>");
}