All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.yangxlei.compile.ActionProcessor Maven / Gradle / Ivy

package io.github.yangxlei.compile;

import com.google.auto.service.AutoService;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
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.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;

import io.github.yangxlei.annotation.ActionType;

/**
 * Created by yanglei on 16/9/3.
 */
@AutoService(Processor.class)
public class ActionProcessor extends AbstractProcessor {

    private Elements elementUtils;

    @Override
    public Set getSupportedAnnotationTypes() {
        return Collections.singleton(ActionType.class.getCanonicalName());
    }

    @Override
    public boolean process(Set annotations, RoundEnvironment roundEnv) {
        Set elements = roundEnv.getElementsAnnotatedWith(ActionType.class);

        TypeSpec.Builder builder = TypeSpec.classBuilder("ModuleActionTypes");
        builder.addModifiers(Modifier.FINAL, Modifier.PUBLIC);

        MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("getModuleActionTypes")
                .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                .addStatement("$T map = new $T()", Map.class, HashMap.class)
                .returns(Map.class);

        String packageName = null;

        for (Element element : elements) {
            TypeElement typeElement = (TypeElement) element;
            ActionType action = typeElement.getAnnotation(ActionType.class);
            if (action == null || action.value() == null) continue;

            methodBuilder.addStatement("map.put($S, new $T())", action.value(), typeElement.asType());

            packageName = getPackageName(typeElement);
        }

        if (packageName == null) return false;

        methodBuilder.addStatement("return map");
        builder.addMethod(methodBuilder.build());
        JavaFile javaFile = JavaFile.builder(packageName, builder.build())
                .build();
        try {
            javaFile.writeTo(processingEnv.getFiler());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

    private String getPackageName(TypeElement type) {
        return elementUtils.getPackageOf(type).getQualifiedName().toString();
    }

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        elementUtils = processingEnv.getElementUtils();
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.RELEASE_7;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy