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

com.wangjiegulu.rapidooo.library.compiler.part.statement.parcelable.ParcelableMapStatementBrew Maven / Gradle / Ivy

package com.wangjiegulu.rapidooo.library.compiler.part.statement.parcelable;

import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeName;
import com.wangjiegulu.rapidooo.library.compiler.RapidOOOConstants;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.type.OOOMapTypeEntry;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.type.OOOTypeEntry;
import com.wangjiegulu.rapidooo.library.compiler.oooentry.type.OOOTypeEntryFactory;
import com.wangjiegulu.rapidooo.library.compiler.part.statement.contact.IParcelableStatementBrew;

/**
 * Author: wangjie Email: [email protected] Date: 2019-06-18.
 */
public class ParcelableMapStatementBrew implements IParcelableStatementBrew {
    @Override
    public boolean match(OOOTypeEntry typeEntry) {
        return typeEntry.isMap();
    }

    @Override
    public void read(MethodSpec.Builder methodBuilder, String statementPrefix, Object[] statementPrefixTypes, String fieldCode, OOOTypeEntry oooTypeEntry, String fieldName) {
        OOOMapTypeEntry mapTypeEntry = (OOOMapTypeEntry) oooTypeEntry;

        TypeName keyTypeName = mapTypeEntry.getKeyTypeName();
        TypeName valueTypeName = mapTypeEntry.getValueTypeName();

        String mapSizeFieldName = fieldName + "Size";
        methodBuilder.addCode("int " + mapSizeFieldName + " = parcel.readInt();\n" +
                fieldCode + " = new $T<$T, $T>(" + (mapTypeEntry.isHashMap() ? mapSizeFieldName : "") + ");\n" +
                "for (int i = 0; i < " + mapSizeFieldName + "; i++) {\n", mapTypeEntry.getRawType(), keyTypeName, valueTypeName);
        OOOTypeEntry keyTypeEntry = OOOTypeEntryFactory.create(keyTypeName);
        OOOTypeEntry valueTypeEntry = OOOTypeEntryFactory.create(valueTypeName);

        boolean keyMatched = false;
        boolean valueMatched = false;
        for (IParcelableStatementBrew parcelableStatementBrew : ParcelableStatementUtil.parcelableStatementBrews) {
            if (!keyMatched && parcelableStatementBrew.match(keyTypeEntry)) {
                parcelableStatementBrew.read(methodBuilder, "    $T ", new Object[]{keyTypeEntry.getTypeName()}, "key", keyTypeEntry, "");
                keyMatched = true;
            }
            if (!valueMatched && parcelableStatementBrew.match(valueTypeEntry)) {
                parcelableStatementBrew.read(methodBuilder, "    $T ", new Object[]{valueTypeEntry.getTypeName()}, "value", valueTypeEntry, "");
                valueMatched = true;
            }
            if (keyMatched && valueMatched) {
                break;
            }
        }
        methodBuilder.addCode("    " + fieldCode + ".put(key, value);\n}\n");
    }


    @Override
    public void write(MethodSpec.Builder methodBuilder, String statementPrefix, Object[] statementPrefixTypes, String fieldCode, OOOTypeEntry oooTypeEntry, String fieldName) {
        OOOMapTypeEntry mapTypeEntry = (OOOMapTypeEntry) oooTypeEntry;

        TypeName keyTypeName = mapTypeEntry.getKeyTypeName();
        TypeName valueTypeName = mapTypeEntry.getValueTypeName();

        methodBuilder.addStatement("dest.writeInt(this." + fieldName + ".size())");
        methodBuilder.addCode("for (Map.Entry<$T, $T> entry : this." + fieldName + ".entrySet()) {\n", keyTypeName, valueTypeName);

        OOOTypeEntry keyTypeEntry = OOOTypeEntryFactory.create(keyTypeName);
        OOOTypeEntry valueTypeEntry = OOOTypeEntryFactory.create(valueTypeName);

        boolean keyMatched = false;
        boolean valueMatched = false;
        for (IParcelableStatementBrew parcelableStatementBrew : ParcelableStatementUtil.parcelableStatementBrews) {
            if (!keyMatched && parcelableStatementBrew.match(keyTypeEntry)) {
                parcelableStatementBrew.write(methodBuilder, "    ", RapidOOOConstants.EMPTY_ARRAY, "entry.getKey()", keyTypeEntry, "");
                keyMatched = true;
            }
            if (!valueMatched && parcelableStatementBrew.match(valueTypeEntry)) {
                parcelableStatementBrew.write(methodBuilder, "    ", RapidOOOConstants.EMPTY_ARRAY, "entry.getValue()", valueTypeEntry, "");
                valueMatched = true;
            }
            if (keyMatched && valueMatched) {
                break;
            }
        }
        methodBuilder.addCode("}\n");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy