BuildMethodCreator(@NonNull ExecutableElement override, @NonNull ClassName config) { this.config = config; methodBuilder = Types.overriding(override) .addAnnotation(Types.NON_NULL) .returns(config) .beginControlFlow("if ($L)", Strings.FIELD_ENABLED); anyNonDefault = new LinkedHashMap<>(); statements = new ArrayList<>(); }
private void writePropagatingErrorCase(MethodSpec.Builder methodBuilder) { methodBuilder .beginControlFlow("case $L:", INTERNAL_ON_ERROR_HANDLER_NAME.toString().hashCode()) .addStatement( "dispatchErrorEvent(($L) eventHandler.params[0], ($L) eventState)", mContextClass, ClassNames.ERROR_EVENT) .addStatement("return null") .endControlFlow(); }
private static MethodSpec generateStaticRegisterMethod( ClassName contextClassName, SpecMethodModel<EventMethod, WorkingRangeDeclarationModel> methodModel) { String nameInAnnotation = (methodModel.typeModel != null) ? methodModel.typeModel.name : ""; if (nameInAnnotation == null || nameInAnnotation.length() == 0) { throw new RuntimeException("Must provide a name for @OnEnteredRange and @OnExitedRange."); } final String methodName = "register" + nameInAnnotation.substring(0, 1).toUpperCase(Locale.US) + nameInAnnotation.substring(1) + "WorkingRange"; MethodSpec.Builder registerMethod = MethodSpec.methodBuilder(methodName).addModifiers(Modifier.STATIC); registerMethod .addParameter(contextClassName, "c") .addParameter(ClassNames.WORKING_RANGE, "workingRange") .beginControlFlow("if (workingRange == null)") .addStatement("return") .endControlFlow() .addStatement("$T component = c.getComponentScope()", ClassNames.COMPONENT) .addStatement("registerWorkingRange(\"$L\", workingRange, component)", nameInAnnotation); return registerMethod.build(); } }
@Override public void serialize(Builder builder, int depth, String fieldName, List<String> processedFieldNames, String getter, boolean isObjectProperty, boolean checkIfNull, boolean writeIfNull, boolean writeCollectionElementIfNull) { if (checkIfNull) { builder.beginControlFlow("if ($L != null)", getter); } if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.serialize($L, $L, true)", mJsonMapperVariableName, getter, JSON_GENERATOR_VARIABLE_NAME); if (checkIfNull) { if (writeIfNull) { builder.nextControlFlow("else"); if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.writeNull()", JSON_GENERATOR_VARIABLE_NAME); } builder.endControlFlow(); } }
@Override public void serialize(Builder builder, int depth, String fieldName, List<String> processedFieldNames, String getter, boolean isObjectProperty, boolean checkIfNull, boolean writeIfNull, boolean writeCollectionElementIfNull) { if (checkIfNull) { builder.beginControlFlow("if ($L != null)", getter); } if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.serialize($L, $L, true)", mMapperVariableName, getter, JSON_GENERATOR_VARIABLE_NAME); if (checkIfNull) { if (writeIfNull) { builder.nextControlFlow("else"); if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.writeNull()", JSON_GENERATOR_VARIABLE_NAME); } builder.endControlFlow(); } }
@Override public void parse(Builder builder, int depth, String setter, Object... setterFormatArgs) { Type parameterType = parameterTypes.get(0); final String collectionVarName = "collection" + depth; final String valueVarName = "value" + depth; final String instanceCreator = String.format("$T<%s> $L = new $T<%s>()", parameterType.getParameterizedTypeString(), parameterType.getParameterizedTypeString()); final Object[] instanceCreatorArgs = expandStringArgs(getTypeName(), parameterType.getParameterizedTypeStringArgs(), collectionVarName, getTypeName(), parameterType.getParameterizedTypeStringArgs()); builder.beginControlFlow("if ($L.getCurrentToken() == $T.START_ARRAY)", JSON_PARSER_VARIABLE_NAME, JsonToken.class) .addStatement(instanceCreator, instanceCreatorArgs) .beginControlFlow("while ($L.nextToken() != $T.END_ARRAY)", JSON_PARSER_VARIABLE_NAME, JsonToken.class) .addStatement("$T $L", parameterType.getTypeName(), valueVarName); parameterType.parse(builder, depth + 1, "$L = $L", valueVarName); builder .addStatement("$L.add($L)", collectionVarName, valueVarName) .endControlFlow(); builder .addStatement(setter, expandStringArgs(setterFormatArgs, collectionVarName)) .nextControlFlow("else") .addStatement(setter, expandStringArgs(setterFormatArgs, "null")) .endControlFlow(); }
private MethodSpec buildValidateSameValueMethod() { return MethodSpec.methodBuilder("validateSameModel") .addModifiers(Modifier.PRIVATE) .addParameter(getClassName(UNTYPED_EPOXY_MODEL_TYPE), "expectedObject") .addParameter(getClassName(UNTYPED_EPOXY_MODEL_TYPE), "actualObject") .addParameter(String.class, "fieldName") .addParameter(TypeName.INT, "id") .beginControlFlow("if (expectedObject != actualObject)") .addStatement( "throw new $T(\"Fields annotated with $L cannot be directly assigned. The controller " + "manages these fields for you. (\" + controller.getClass().getSimpleName() + " + "\"#\" + fieldName + \")\")", IllegalStateException.class, AutoModel.class.getSimpleName()) .endControlFlow() .beginControlFlow("if (actualObject != null && actualObject.id() != id)") .addStatement( "throw new $T(\"Fields annotated with $L cannot have their id changed manually. The " + "controller manages the ids of these models for you. (\" + controller.getClass()" + ".getSimpleName() + \"#\" + fieldName + \")\")", IllegalStateException.class, AutoModel.class.getSimpleName()) .endControlFlow() .build(); }
/** * Generate a dispatchOnEvent() implementation for the component. */ static MethodSpec generateDispatchOnEvent(SpecModel specModel) { final MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("dispatchOnEvent") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .returns(TypeName.OBJECT) .addParameter( ParameterSpec.builder(EVENT_HANDLER, "eventHandler", Modifier.FINAL) .build()) .addParameter( ParameterSpec.builder(OBJECT, "eventState", Modifier.FINAL).build()); methodBuilder.addStatement("int id = eventHandler.id"); methodBuilder.beginControlFlow("switch ($L)", "id"); EventCaseGenerator.builder() .contextClass(specModel.getContextClass()) .eventMethodModels(specModel.getEventMethods()) // For now, Sections are not supported for error propagation .withErrorPropagation(specModel.getComponentClass().equals(ClassNames.COMPONENT)) .writeTo(methodBuilder); return methodBuilder.addStatement("default:\nreturn null") .endControlFlow() .build(); }
private static MethodSpec generateEventTriggerChangeKeyMethod( SpecModel specModel, SpecMethodModel<EventMethod, EventDeclarationModel> triggerMethodModel) { final String eventTriggerName = ComponentBodyGenerator.getEventTriggerInstanceName(triggerMethodModel.name); final String implMemberName = getComponentMemberInstanceName(specModel); return MethodSpec.methodBuilder(getEventTriggerKeyResetMethodName(triggerMethodModel.name)) .addModifiers(Modifier.PRIVATE) .addParameter(ClassNames.STRING, "key") .addStatement( "$L $L = this.$L.$L", ClassNames.EVENT_TRIGGER, eventTriggerName, implMemberName, eventTriggerName) .beginControlFlow("if ($L == null)", eventTriggerName) .addStatement( "$L = $L.$L(this.mContext, key)", eventTriggerName, specModel.getComponentName(), eventTriggerName) .endControlFlow() .addStatement("$L($L)", eventTriggerName, eventTriggerName) .build(); }
@Override public void serialize(Builder builder, int depth, String fieldName, List<String> processedFieldNames, String getter, boolean isObjectProperty, boolean checkIfNull, boolean writeIfNull, boolean writeCollectionElementIfNull) { if (!mTypeName.isPrimitive() && checkIfNull) { builder.beginControlFlow("if ($L != null)", getter); } builder.addStatement("$T.typeConverterFor($T.class).serialize($L, $S, $L, $L)", LoganSquare.class, mTypeName, getter, isObjectProperty ? fieldName : null, isObjectProperty, JSON_GENERATOR_VARIABLE_NAME); if (!mTypeName.isPrimitive() && checkIfNull) { if (writeIfNull) { builder.nextControlFlow("else"); if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.writeNull()", JSON_GENERATOR_VARIABLE_NAME); } builder.endControlFlow(); } }
private static MethodSpec generateStaticTriggerMethodWithKey( String componentName, ClassName contextClassName, SpecMethodModel<EventMethod, EventDeclarationModel> eventMethodModel) { MethodSpec.Builder triggerMethod = MethodSpec.methodBuilder(eventMethodModel.name.toString()) .addModifiers(Modifier.PUBLIC, Modifier.STATIC); String methodId = componentName + ComponentBodyGenerator.getEventTriggerInstanceName(eventMethodModel.name); triggerMethod .addParameter(contextClassName, "c") .addParameter(ClassNames.STRING, "key") .addStatement("$T methodId = $L", TypeName.INT, methodId.hashCode()) .addStatement("$T trigger = getEventTrigger(c, methodId, key)", ClassNames.EVENT_TRIGGER); EventDeclarationModel eventDeclaration = eventMethodModel.typeModel; triggerMethod.beginControlFlow("if (trigger == null)"); triggerMethod.addStatement( (eventDeclaration.returnType == null || eventDeclaration.returnType.equals(TypeName.VOID)) ? "return" : "return null"); triggerMethod.endControlFlow(); return generateCommonStaticTriggerMethodCode(contextClassName, eventMethodModel, triggerMethod); }
@Override public void serialize(Builder builder, int depth, String fieldName, List<String> processedFieldNames, String getter, boolean isObjectProperty, boolean checkIfNull, boolean writeIfNull, boolean writeCollectionElementIfNull) { if (checkIfNull) { builder.beginControlFlow("if ($L != null)", getter); } builder.addStatement("$L.serialize($L, $L, $L)", ObjectMapperInjector.getMapperVariableName(ObjectMapper.class), getter, JSON_GENERATOR_VARIABLE_NAME, isObjectProperty); if (checkIfNull) { if (writeIfNull) { builder.nextControlFlow("else"); if (isObjectProperty) { builder.addStatement("$L.writeFieldName($S)", JSON_GENERATOR_VARIABLE_NAME, fieldName); } builder.addStatement("$L.writeNull()", JSON_GENERATOR_VARIABLE_NAME); } builder.endControlFlow(); } }
/** Generate dispatchOnEnteredRange() implementation for the component. */ static MethodSpec generateDispatchOnEnteredRangeMethod(SpecModel specModel) { final MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("dispatchOnEnteredRange") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .returns(TypeName.VOID) .addParameter(ClassNames.STRING, "name"); methodBuilder.addStatement("$T c = getScopedContext()", ClassNames.COMPONENT_CONTEXT); methodBuilder.beginControlFlow("switch (name)"); for (WorkingRangeMethodModel model : specModel.getWorkingRangeMethods()) { if (model.enteredRangeModel != null && model.enteredRangeModel.typeModel != null) { final String nameInAnnotation = model.enteredRangeModel.typeModel.name; methodBuilder.beginControlFlow("case \"$L\":", nameInAnnotation); methodBuilder.addStatement("$L(c)", model.enteredRangeModel.name); methodBuilder.addStatement("return"); methodBuilder.endControlFlow(); } } return methodBuilder.endControlFlow().build(); }
/** Generate dispatchOnExitedRange() implementation for the component. */ static MethodSpec generateDispatchOnExitedRangeMethod(SpecModel specModel) { final MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("dispatchOnExitedRange") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .returns(TypeName.VOID) .addParameter(ClassNames.STRING, "name"); methodBuilder.addStatement("$T c = getScopedContext()", ClassNames.COMPONENT_CONTEXT); methodBuilder.beginControlFlow("switch (name)"); for (WorkingRangeMethodModel model : specModel.getWorkingRangeMethods()) { if (model.exitedRangeModel != null && model.exitedRangeModel.typeModel != null) { final String nameInAnnotation = model.exitedRangeModel.typeModel.name; methodBuilder.beginControlFlow("case \"$L\":", nameInAnnotation); methodBuilder.addStatement("$L(c)", model.exitedRangeModel.name); methodBuilder.addStatement("return"); methodBuilder.endControlFlow(); } } return methodBuilder.endControlFlow().build(); }
static TypeSpecDataHolder generatePopulateTreeProps(SpecModel specModel) { if (specModel.getTreeProps().isEmpty()) { return TypeSpecDataHolder.newBuilder().build(); } final MethodSpec.Builder method = MethodSpec.methodBuilder("populateTreeProps") .addAnnotation(Override.class) .addModifiers(Modifier.PROTECTED) .addParameter(ClassNames.TREE_PROPS, "treeProps") .beginControlFlow("if (treeProps == null)") .addStatement("return") .endControlFlow(); for (TreePropModel treeProp : specModel.getTreeProps()) { method.addStatement( "$L = treeProps.get($L.class)", treeProp.getName(), findTypeByTypeName(treeProp.getTypeName())); } return TypeSpecDataHolder.newBuilder().addMethod(method.build()).build(); }
unbindMethod.beginControlFlow("if ($N != null)", fieldName);
static MethodSpec generateRecordTriggers(SpecModel specModel) { final MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("recordEventTrigger") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .addParameter(ParameterSpec.builder(EVENT_TRIGGER_CONTAINER, "container").build()); for (SpecMethodModel<EventMethod, EventDeclarationModel> eventMethodModel : specModel.getTriggerMethods()) { String trigger = ComponentBodyGenerator.getEventTriggerInstanceName(eventMethodModel.name); methodBuilder .beginControlFlow("if ($L != null)", trigger) .addStatement("$L.mTriggerTarget = this", trigger) .addStatement("container.recordEventTrigger($L)", trigger) .endControlFlow(); } return methodBuilder.build(); }
@NonNull MethodSpec build() { if (anyNonDefault.size() > 0) { methodBuilder.beginControlFlow("if ($L)", anyNonDefault.entrySet().stream().map(field -> CodeBlock.builder().add(field.getKey()).add(" == ").add(field.getValue()).build()) .reduce((c1, c2) -> CodeBlock.builder().add(c1).add(" && ").add(c2).build()).orElseGet(() -> CodeBlock.of("true"))) .addStatement("throw new $T(\"One of $L must not be default\")", ACRAConfigurationException.class, anyNonDefault.keySet().stream().collect(Collectors.joining(", "))) .endControlFlow(); } methodBuilder.endControlFlow(); for (CodeBlock s : statements) { methodBuilder.addCode(s); } methodBuilder.addStatement("return new $T(this)", config); return methodBuilder.build(); }
public void addNotUnset(@NonNull String name, @NonNull TypeName type) { methodBuilder.beginControlFlow("if ($L == $L)", name, getDefault(type)) .addStatement("throw new $T(\"$L has to be set\")", ACRAConfigurationException.class, name) .endControlFlow(); }
public void addNotEmpty(@NonNull String name) { methodBuilder.beginControlFlow("if ($L.length == 0)", name) .addStatement("throw new $T(\"$L cannot be empty\")", ACRAConfigurationException.class, name) .endControlFlow(); }