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

com.wangjiegulu.rapidooo.library.compiler.part.impl.InterfacePartBrew Maven / Gradle / Ivy

package com.wangjiegulu.rapidooo.library.compiler.part.impl;

import com.google.auto.common.MoreTypes;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import com.wangjiegulu.rapidooo.library.compiler.RapidOOOConstants;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.OOOConversionEntry;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.OOOEntry;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.OOOFieldEntry;
import com.wangjiegulu.rapidooo.library.compiler.part.PartBrew;
import com.wangjiegulu.rapidooo.library.compiler.part.statement.contact.IParcelableStatementBrew;
import com.wangjiegulu.rapidooo.library.compiler.part.statement.parcelable.ParcelableStatementUtil;
import com.wangjiegulu.rapidooo.library.compiler.util.EasyType;
import com.wangjiegulu.rapidooo.library.compiler.util.ElementUtil;
import com.wangjiegulu.rapidooo.library.compiler.util.LogUtil;

import java.io.Serializable;
import java.util.Map;

import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeMirror;

/**
 * Author: wangjie Email: [email protected] Date: 2019-06-14.
 */
public class InterfacePartBrew implements PartBrew {

    public InterfacePartBrew() {

    }

    @Override
    public void brew(OOOEntry oooEntry, TypeSpec.Builder result) {
        for(Map.Entry ee : oooEntry.getSupportedInterfaces().entrySet()){
            String interfaceName = ee.getKey();
            TypeMirror interf = ee.getValue();
            if(Serializable.class.getCanonicalName().equals(interfaceName)){
                result.addSuperinterface(ClassName.get(interf));
            } else if(RapidOOOConstants.CLASS_NAME_PARCELABLE.equals(interfaceName)){
                if(oooEntry.isParcelable()){
                    result.addSuperinterface(ClassName.get(interf));
                    boolean supperParcelableInterface = ElementUtil.isSupperParcelableInterfaceDeep(MoreTypes.asElement(oooEntry.getFrom()));
                    generateParcelableElements(result, oooEntry, supperParcelableInterface);
                }
            } else {
                LogUtil.logger("[WARN]Interface[" + interf.toString() + "] is not supported yet, ignored.");
            }
        }
    }

    private void generateParcelableElements(TypeSpec.Builder result, OOOEntry oooEntry, boolean supperParcelableInterface) {
        ClassName parcelClassName = ClassName.bestGuess("android.os.Parcel");
        MethodSpec.Builder parcelConstructorMethodBuilder = MethodSpec.constructorBuilder()
                .addModifiers(Modifier.PROTECTED)
                .addParameter(parcelClassName, "parcel");

        if (supperParcelableInterface) {
            parcelConstructorMethodBuilder.addStatement("super(parcel)");
        }

        String targetClassSimpleName = oooEntry.getTargetClassSimpleName();
        FieldSpec.Builder fieldSpec = FieldSpec.builder(EasyType.bestGuessDeep2(RapidOOOConstants.CLASS_NAME_PARCELABLE + ".Creator<" + targetClassSimpleName + ">"), "CREATOR", Modifier.STATIC, Modifier.PUBLIC)
                .initializer("new Parcelable.Creator<" + targetClassSimpleName + ">() {\n" +
                        "        @Override\n" +
                        "        public " + targetClassSimpleName + " createFromParcel($T source) {\n" +
                        "            return new " + targetClassSimpleName + "(source);\n" +
                        "        }\n" +
                        "\n" +
                        "        @Override\n" +
                        "        public " + targetClassSimpleName + "[] newArray(int size) {\n" +
                        "            return new " + targetClassSimpleName + "[size];\n" +
                        "        }\n" +
                        "    }", parcelClassName);
        result.addField(fieldSpec.build());

        // describeContents()
        MethodSpec.Builder describeContentsMethod = MethodSpec.methodBuilder("describeContents")
                .returns(int.class)
                .addAnnotation(Override.class)
                .addModifiers(Modifier.PUBLIC)
                .addStatement("return 0");

        result.addMethod(describeContentsMethod.build());


        MethodSpec.Builder writeToParcelMethod = MethodSpec.methodBuilder("writeToParcel")
                .returns(void.class)
                .addAnnotation(Override.class)
                .addParameter(parcelClassName, "dest")
                .addParameter(int.class, "flags")
                .addModifiers(Modifier.PUBLIC);

        if (supperParcelableInterface) {
            writeToParcelMethod.addStatement("super.writeToParcel(dest, flags)");
        }


        // Continuing fields
        for (Map.Entry fieldE : oooEntry.getAllContinuingFields().entrySet()) {
            OOOFieldEntry fieldEntry = fieldE.getValue();

            if(fieldEntry.isParcelable()){
                String fieldName = fieldEntry.getSimpleName();
                for(IParcelableStatementBrew parcelableStatementBrew : ParcelableStatementUtil.parcelableStatementBrews){
//                    TypeName fieldTypeName = fieldEntry.getTypeName();
//                    LogUtil.logger("[fieldTypeName]" + fieldTypeName.getClass() + ", " + fieldTypeName);
                    if(parcelableStatementBrew.match(fieldEntry.getOooTypeEntry())){
                        parcelableStatementBrew.read(parcelConstructorMethodBuilder, "", RapidOOOConstants.EMPTY_ARRAY, "this." + fieldName, fieldEntry.getOooTypeEntry(), fieldName);
                        parcelableStatementBrew.write(writeToParcelMethod, "", RapidOOOConstants.EMPTY_ARRAY, "this." + fieldName, fieldEntry.getOooTypeEntry(), fieldName);
                        break;
                    }
                }
            }
        }
        // Conversion fields
        for (Map.Entry conversionFieldE : oooEntry.getConversions().entrySet()) {
            OOOConversionEntry conversionEntry = conversionFieldE.getValue();
            if(conversionEntry.isParcelable()){
                String fieldName = conversionEntry.getTargetFieldName();
                for(IParcelableStatementBrew parcelableStatementBrew : ParcelableStatementUtil.parcelableStatementBrews){
                    if(parcelableStatementBrew.match(conversionEntry.getTargetFieldTypeEntry())){
                        parcelableStatementBrew.read(parcelConstructorMethodBuilder, "", RapidOOOConstants.EMPTY_ARRAY, "this." + fieldName, conversionEntry.getTargetFieldTypeEntry(), fieldName);
                        parcelableStatementBrew.write(writeToParcelMethod, "", RapidOOOConstants.EMPTY_ARRAY, "this." + fieldName, conversionEntry.getTargetFieldTypeEntry(), fieldName);
                        break;
                    }
                }
            }
        }

        result.addMethod(parcelConstructorMethodBuilder.build());
        result.addMethod(writeToParcelMethod.build());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy