package com.example;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
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.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.tools.Diagnostic;
@AutoService(Processor.class)
public class AutoParcelProcessor extends AbstractProcessor {
private Filer mFileUtils;
private Elements mElementUtils;
private Messager mMessager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
mFileUtils = processingEnv.getFiler();
mElementUtils = processingEnv.getElementUtils();
mMessager = processingEnv.getMessager();
}
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> annotationTypes = new LinkedHashSet<String>();
annotationTypes.add(TestHelloWorld.class.getCanonicalName());
return annotationTypes;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
Set<? extends Element> set2 = roundEnvironment.getElementsAnnotatedWith(TestHelloWorld.class);
for (Element element : set2) {
if (element.getKind() != ElementKind.CLASS) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "only support class");
}
TestHelloWorld annotation = element.getAnnotation(TestHelloWorld.class);
ClassName classLog = ClassName.get("android.util", "Log");
MethodSpec main = MethodSpec.methodBuilder("main")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class)
.addParameter(String[].class, "args")
.addStatement("$T.out.println($S)", System.class, "u input value is :" + annotation.value())
.build();
MethodSpec register = MethodSpec.methodBuilder("register")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class)
.addParameter(String.class, "where")
.addStatement("android.util.Log.e(\"zxt\", \"Auto created by apt = [\" + $S + \"]\")", annotation.value())
.build();
MethodSpec jump = MethodSpec.methodBuilder("jump")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class)
.addParameter(String.class, "where")
.addStatement("$T.i($S, $S+ $N)", classLog, "zxt/test2","由于$S里的字符串会被自动追加转移字符和引号,所以参数不要在$S里写, get the params is : [","where")
.build();
//First router method, params is Class
MethodSpec zJump = MethodSpec.methodBuilder("zJump")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class)
.addParameter(ClassName.get(element.asType()), "context")
.addParameter(Class.class, "aClass")
.addStatement("$T.e(\"zxt\", \"Auto created22222 by apt = [\" + $S + \"], begin first zJump \" )", classLog, annotation.value())
.addStatement("context.startActivity(new android.content.Intent(context,aClass ));")
.build();
//bindViewMethodSpecBuilder.addStatement(String.format("activity.%s = (%s) activity.findViewById(%s)", item.getSimpleName(), ClassName.get(item.asType()).toString(), diView.value()));
TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(main)
.addMethod(jump)
.addMethod(zJump)
.build();
JavaFile javaFile = JavaFile.builder("com.mcxtzhang", helloWorld)
.build();
try {
javaFile.writeTo(processingEnv.getFiler());
} catch (IOException e) {
e.printStackTrace();
}
}
return (false);
}
}