From 4572ada668aab8c058d198b09f35f25e833006f8 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sun, 5 Feb 2012 12:34:30 +0100 Subject: [PATCH] check if annotation processing suppressed --- .../jetbrains/jps/javac/JavacASTAnalyser.java | 79 ++++++++++++++++++- .../org/jetbrains/jps/javac/JavacMain.java | 11 ++- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacASTAnalyser.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacASTAnalyser.java index 92c4390c238a..33d78d74661f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacASTAnalyser.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacASTAnalyser.java @@ -1,9 +1,16 @@ package org.jetbrains.jps.javac; +import com.sun.source.tree.*; +import com.sun.source.util.TreeScanner; +import com.sun.source.util.Trees; + import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.lang.model.element.Element; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; import java.util.Set; @@ -15,12 +22,80 @@ import java.util.Set; //@SupportedSourceVersion(SourceVersion.RELEASE_7) @SupportedAnnotationTypes("*") public class JavacASTAnalyser extends AbstractProcessor{ + private Trees myTrees; + private final boolean mySuppressOtherProcessors; + + public JavacASTAnalyser(boolean suppressOtherProcessors) { + mySuppressOtherProcessors = suppressOtherProcessors; + } + + @Override + public void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + myTrees = Trees.instance(processingEnv); + } @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { + MyAnalyzer scaner = new MyAnalyzer(); for (Element element : roundEnv.getRootElements()) { - System.out.println("Element: " + element.getSimpleName()); + final Tree tree = myTrees.getTree(element); + scaner.scan(tree, myTrees); } - return false; + + return mySuppressOtherProcessors; } + + + private static class MyAnalyzer extends TreeScanner { + @Override + public Object visitImport(ImportTree node, Trees trees) { + return null/*super.visitImport(node, trees)*/; + } + + @Override + public Object visitClass(ClassTree node, Trees trees) { + return scan(node.getMembers(), trees); + } + + @Override + public Object visitVariable(VariableTree node, Trees trees) { + final ModifiersTree modifiers = node.getModifiers(); + final Set flags = modifiers.getFlags(); + if (flags.contains(Modifier.STATIC) && flags.contains(Modifier.FINAL)) { + final Name variableName = node.getName(); + // todo register constant + final ConstantRefsFinder finder = new ConstantRefsFinder(); + finder.scan(node.getInitializer(), trees); + // todo: process found refs + } + return null; + } + + @Override + public Object visitMethod(MethodTree node, Trees trees) { + final ConstantRefsFinder finder = new ConstantRefsFinder(); + finder.scan(node.getBody(), trees); + // todo: process found refs + return null; + } + } + + private static class ConstantRefsFinder extends TreeScanner { + @Override + public Object visitMethodInvocation(MethodInvocationTree node, Trees trees) { + return scan(node.getArguments(), trees); + } + + @Override + public Object visitMemberSelect(MemberSelectTree node, Trees trees) { + return super.visitMemberSelect(node, trees); + } + + @Override + public Object visitIdentifier(IdentifierTree node, Trees trees) { + return super.visitIdentifier(node, trees); + } + } + } diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java index 79526c3785b5..8a942da05654 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java @@ -68,7 +68,7 @@ public class JavacMain { final JavaCompiler.CompilationTask task = compiler.getTask( out, fileManager, outConsumer, filterOptionList(options), null, fileManager.toJavaFileObjects(sources) ); - //final JavacASTAnalyser analyzer = new JavacASTAnalyser(); + //final JavacASTAnalyser analyzer = new JavacASTAnalyser(shouldSuppressAnnotationProcessing(options)); //task.setProcessors(Collections.singleton(analyzer)); return task.call(); } @@ -77,6 +77,15 @@ public class JavacMain { } } + private static boolean shouldSuppressAnnotationProcessing(final Collection options) { + for (String option : options) { + if ("-proc:none".equals(option)) { + return true; + } + } + return false; + } + private static Collection filterOptionList(final Collection options) { if (options.isEmpty()) { return options;