
com.wangjiegulu.rapidooo.library.compiler.part.impl.FieldAndGetterSetterPartBrew Maven / Gradle / Ivy
package com.wangjiegulu.rapidooo.library.compiler.part.impl;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import com.wangjiegulu.rapidooo.api.OOOControlMode;
import com.wangjiegulu.rapidooo.library.compiler.entry.GetterSetterMethodNames;
import com.wangjiegulu.rapidooo.library.compiler.util.PoetUtil;
import com.wangjiegulu.rapidooo.library.compiler.util.TextUtil;
import com.wangjiegulu.rapidooo.library.compiler.util.func.Func1R;
import com.wangjiegulu.rapidooo.library.compiler.variables.IOOOVariable;
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 java.util.HashMap;
import java.util.Map;
import javax.lang.model.element.Modifier;
/**
* Author: wangjie Email: [email protected] Date: 2019-06-13.
*/
public class FieldAndGetterSetterPartBrew implements PartBrew {
@Override
public void brew(OOOEntry oooEntry, TypeSpec.Builder result) {
buildAllContinuingFields(oooEntry, result);
buildConversionsFields(oooEntry, result);
}
private void buildAllContinuingFields(OOOEntry oooEntry, TypeSpec.Builder result) {
for (Map.Entry fieldE : oooEntry.getAllContinuingFields().entrySet()){
OOOFieldEntry fieldEntry = fieldE.getValue();
FieldSpec.Builder fieldSpecBuilder = FieldSpec.builder(fieldEntry.getTypeName(), fieldEntry.getSimpleName(), fieldEntry.getModifiers())
.addJavadoc("Field name: {@link $T#$L}\n",
oooEntry.getFromTypeName(),
fieldEntry.getSimpleName()
);
result.addField(fieldSpecBuilder.build());
GetterSetterMethodNames getterSetterMethodNames = PoetUtil.generateGetterSetterMethodName(fieldEntry.getSimpleName(), fieldEntry.getTypeName());
// add getter method
result.addMethod(PoetUtil.obtainGetterMethodsBuilder(fieldEntry.getSimpleName(), fieldEntry.getTypeName(), getterSetterMethodNames).build());
// add setter method
MethodSpec.Builder setterMethodBuilder = PoetUtil.obtainSetterMethodsBuilderDefault(fieldEntry.getSimpleName(), fieldEntry.getTypeName(), getterSetterMethodNames);
// 数据 setter 绑定关联
for(HashMap.Entry ce : oooEntry.getConversions().entrySet()){
OOOConversionEntry conversionEntry = ce.getValue();
// 只有 bind mode 才需要关联
if(OOOControlMode.BIND == conversionEntry.getControlMode()){
for(Map.Entry variableE : conversionEntry.getBindTargetParamFields().entrySet()){
IOOOVariable targetVariable = variableE.getValue();
// 该字段被某个 conversion 的 bind 方法作为参数使用到,则需要绑定
if(TextUtil.equals(fieldEntry.getSimpleName(), targetVariable.fieldName())){
String paramsStr = TextUtil.joinHashMap(conversionEntry.getBindTargetParamFields(), ", ", new Func1R() {
@Override
public String call(IOOOVariable ioooTargetVariable) {
return ioooTargetVariable.inputCode();
}
});
setterMethodBuilder.addComment(conversionEntry.getTargetFieldName() + ", " + conversionEntry.getControlMode().getDesc());
setterMethodBuilder.addStatement(
"this." + conversionEntry.getTargetFieldName() + " = $T." + conversionEntry.getBindMethodName() + "(" + paramsStr + ")",
conversionEntry.getBindMethodClassType()
);
}
}
}
}
result.addMethod(setterMethodBuilder.build());
}
}
private void buildConversionsFields(OOOEntry oooEntry, TypeSpec.Builder result) {
for (Map.Entry conversionFieldE : oooEntry.getConversions().entrySet()){
OOOConversionEntry conversionEntry = conversionFieldE.getValue();
FieldSpec.Builder fieldSpecBuilder = FieldSpec.builder(conversionEntry.getTargetFieldType(), conversionEntry.getTargetFieldName(), Modifier.PRIVATE)
.addJavadoc("Field name conversion : {@link $T}\n",
oooEntry.getOoosEntry().getOooGenerator().getGeneratorClassType()
);
result.addField(fieldSpecBuilder.build());
GetterSetterMethodNames getterSetterMethodNames = PoetUtil.generateGetterSetterMethodName(conversionEntry.getTargetFieldName(), conversionEntry.getTargetFieldType());
// add getter method
result.addMethod(PoetUtil.obtainGetterMethodsBuilder(conversionEntry.getTargetFieldName(), conversionEntry.getTargetFieldType(), getterSetterMethodNames).build());
// add setter method
MethodSpec.Builder setterMethodBuilder = PoetUtil.obtainSetterMethodsBuilderDefault(conversionEntry.getTargetFieldName(), conversionEntry.getTargetFieldType(), getterSetterMethodNames);
// 数据 setter 绑定关联
for(HashMap.Entry ce : oooEntry.getConversions().entrySet()){
OOOConversionEntry _ce = ce.getValue();
for(Map.Entry variableE : _ce.getInverseBindTargetParamFields().entrySet()){
IOOOVariable targetVariable = variableE.getValue();
// 该字段被某个 conversion 的 bind 方法作为参数使用到,则需要绑定
if(TextUtil.equals(conversionEntry.getTargetFieldName(), targetVariable.fieldName())){
String paramsStr = TextUtil.joinHashMap(_ce.getInverseBindTargetParamFields(), ", ", new Func1R() {
@Override
public String call(IOOOVariable ioooTargetVariable) {
return ioooTargetVariable.inputCode();
}
});
setterMethodBuilder.addStatement(
"$T." + _ce.getInverseBindMethodName() + "(" + paramsStr + ")",
_ce.getBindMethodClassType()
);
}
}
}
result.addMethod(setterMethodBuilder.build());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy