diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2015-03-13 16:55:40 +0100 |
---|---|---|
committer | mikaelpeltier <mikaelpeltier@google.com> | 2015-03-13 16:55:40 +0100 |
commit | 7c94b56d46601db9ed95143dc6889cdca83399e2 (patch) | |
tree | 620d5a914f444c3c30c7c6c14b39d9cf0dc0f170 /args4j/args4j-tools/src | |
parent | 8007ff78c3d693f7a17350fae567ae5e6e0f0fb2 (diff) | |
download | toolchain_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')
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()+"\'>"); } |