@Override public void addToBuilder(@NonNull TypeSpec.Builder builder, @NonNull ClassName builderName, @NonNull CodeBlock.Builder constructorAlways, @NonNull CodeBlock.Builder constructorWhenAnnotationPresent, CodeBlock.Builder constructorWhenAnnotationMissing) { Final.super.addToBuilder(builder, builderName, constructorAlways, constructorWhenAnnotationPresent, constructorWhenAnnotationMissing); constructorAlways.addStatement("$L = $L", getName(), Strings.PARAM_0); } }
@Override public void addToBuilder(@NonNull TypeSpec.Builder builder, @NonNull ClassName builderName, @NonNull CodeBlock.Builder constructorAlways, @NonNull CodeBlock.Builder constructorWhenAnnotationPresent, CodeBlock.Builder constructorWhenAnnotationMissing) { Interface.super.addToBuilder(builder, builderName, constructorAlways, constructorWhenAnnotationPresent, constructorWhenAnnotationMissing); addSetter(builder, builderName); addGetter(builder); constructorAlways.addStatement("$L = $L != null", getName(), Strings.VAR_ANNOTATION); } }
@Override public void addToBuilder(@NonNull TypeSpec.Builder builder, @NonNull ClassName builderName, @NonNull CodeBlock.Builder constructorAlways, @NonNull CodeBlock.Builder constructorWhenAnnotationPresent, CodeBlock.Builder constructorWhenAnnotationMissing) { Final.super.addToBuilder(builder, builderName, constructorAlways, constructorWhenAnnotationPresent, constructorWhenAnnotationMissing); if (hasContextParameter) { constructorAlways.addStatement("$L = new $T($L)", getName(), getType(), Strings.PARAM_0); } else { constructorAlways.addStatement("$L = new $T()", getName(), getType()); } } }
private static MethodSpec varArgBuilderBuilder(SpecModel specModel, final PropModel prop) { final String varArgName = prop.getVarArgsSingleName(); final ParameterizedTypeName varArgType = (ParameterizedTypeName) prop.getTypeName(); final TypeName internalType = varArgType.typeArguments.get(0); final CodeBlock codeBlock = CodeBlock.builder() .addStatement("$L($L.build())", varArgName, varArgName + "Builder") .build(); final TypeName builderParameterType = ParameterizedTypeName.get( ClassNames.COMPONENT_BUILDER, getBuilderGenericTypes(internalType, ClassNames.COMPONENT_BUILDER)); return getMethodSpecBuilder( specModel, Collections.singletonList( parameter(prop, builderParameterType, varArgName + "Builder")), codeBlock, varArgName) .build(); }
private static CodeBlock generateInjectedFieldExtractorBlock( FieldExtractorSpec fieldExtractorSpec) { final DependencyInjectionHelper diHelper = fieldExtractorSpec.specModel.getDependencyInjectionHelper(); if (diHelper == null) { return CodeBlock.builder().build(); } final String getterName = diHelper.generateTestingFieldAccessor( new InjectPropModel(fieldExtractorSpec.propModel, fieldExtractorSpec.isLazy)) .name; return CodeBlock.builder() .addStatement( "final $T $L = impl.$L()", fieldExtractorSpec.propModel.getTypeName(), fieldExtractorSpec.varName, getterName) .build(); }
private static MethodSpec varArgBuilder( SpecModel specModel, final PropModel prop, final AnnotationSpec... extraAnnotations) { final ParameterizedTypeName parameterizedTypeName = (ParameterizedTypeName) prop.getTypeName(); final TypeName singleParameterType = parameterizedTypeName.typeArguments.get(0); final String varArgName = prop.getVarArgsSingleName(); final CodeBlock codeBlock = CodeBlock.builder() .beginControlFlow("if ($L == null)", varArgName) .addStatement("return this") .endControlFlow() .build(); return getMethodSpecBuilder( specModel, Collections.singletonList( parameter(prop, singleParameterType, varArgName, extraAnnotations)), codeBlock, varArgName) .build(); }
private static CodeBlock generateComponentMatchBlock( FieldExtractorSpec fieldExtractorSpec, Function<FieldExtractorSpec, CodeBlock> fieldExtractorBlockFn) { final String matcherName = getPropComponentMatcherName(fieldExtractorSpec.propModel); final String propValueName = getPropValueName(fieldExtractorSpec.propModel) + "Component"; return CodeBlock.builder() .add(fieldExtractorBlockFn.apply(fieldExtractorSpec)) .beginControlFlow( "if ($1N != null && !$1N.matches(value.getNestedInstance($2L)))", matcherName, fieldExtractorSpec.varName) .addStatement("as($N.description())", matcherName) .addStatement("return false") .endControlFlow() .build(); }
public void addDelegateCall(@NonNull String methodName) { statements.add(CodeBlock.builder().addStatement("$L.$L()", Strings.FIELD_DELEGATE, methodName).build()); }
private static MethodSpec.Builder getNoVarArgsMethodSpecBuilder( SpecModel specModel, PropModel prop, int requiredIndex, String name, List<ParameterSpec> parameters, String statement, Object... formatObjects) { CodeBlock codeBlock = CodeBlock.builder() .add("this.$L.$L = ", getComponentMemberInstanceName(specModel), prop.getName()) .addStatement(statement, formatObjects) .build(); return getMethodSpecBuilder(specModel, prop, requiredIndex, name, parameters, codeBlock); }
@Override public void exitVariableAssignStatement(VarAssignStatement assign) { final Object value = blockOrMissing(codeSnippet.get(assign.getValueExpression()), assign.getValueExpression()); final Class type = assign.getValueExpression().getType(); // always hoist declaration hoistedExpressionMembers.add(FieldSpec.builder(type, "var$" + assign.getName(), Modifier.PRIVATE).build()); if (assign.getValueExpression().isConstant()) { // also hoist the assignment hoistedConstantExpressions.addStatement("var$$$L = $L", assign.getName(), value); } else { currentMethod.addStatement("var$$$L = $L", assign.getName(), value); } }
public Builder addStatement(CodeBlock codeBlock) { return addStatement("$L", codeBlock); }
private static CodeBlock generateMatchFailureStatement( final SpecModel enclosedSpecModel, String matcherName, MethodParamModel prop) { return CodeBlock.builder() .add("as(new $T(", ClassNames.ASSERTJ_TEXT_DESCRIPTION) .add( "\"Sub-component of type <$T> with prop <$L> %s (doesn't match %s)\", $N, $L", enclosedSpecModel.getComponentTypeName(), prop.getName(), matcherName, getPropValueName(prop)) .addStatement("))") .build(); }
private static MethodSpec matcherFieldSetterBuilder(SpecModel specModel, PropModel prop) { final String propMatcherName = getPropMatcherName(prop); final String propName = prop.getName(); return getMethodSpecBuilder( specModel, ImmutableList.of(ParameterSpec.builder(getPropMatcherType(prop), "matcher").build()), CodeBlock.builder() .addStatement( "$L = ($L) matcher", propMatcherName, getPropMatcherType(prop).toString()) .build(), propName) .build(); }
@Override public void addInitializer(@NonNull CodeBlock.Builder constructorWhenAnnotationPresent, CodeBlock.Builder constructorWhenAnnotationMissing) { constructorWhenAnnotationPresent.addStatement("$1L = $2L.$1L()", getName(), Strings.VAR_ANNOTATION); if (getDefaultValue() != null) { constructorWhenAnnotationMissing.addStatement("$L = $L", getName(), getDefaultValue().accept(new ToCodeBlockVisitor(getType()), null)); } }
@Override public void addInitializer(@NonNull CodeBlock.Builder constructorWhenAnnotationPresent, CodeBlock.Builder constructorWhenAnnotationMissing) { constructorWhenAnnotationPresent.beginControlFlow("if ($L.$L() != 0)", Strings.VAR_ANNOTATION, originalName) .addStatement("$L = $L.getString($L.$L())", getName(), Strings.FIELD_CONTEXT, Strings.VAR_ANNOTATION, originalName) .endControlFlow(); if (hasDefault) { constructorWhenAnnotationMissing.addStatement("$L = $L.getString($L)", getName(), Strings.FIELD_CONTEXT, getDefaultValue()); } }
@Nonnull private String functionArgsHolder(FunctionDescriptor<?> function) { // create the argument holder for the function invocation (and create the holder class if it doesn't exist yet) final String functionArgsClassname = functionArgsHolderClass(function); final String functionArgsMember = functionReference(function) + "$" + subExpressionName(); classFile.addField(FieldSpec.builder( ClassName.bestGuess(functionArgsClassname), functionArgsMember, Modifier.PRIVATE) .build()); lateConstructorBlock.addStatement("$L = new $L()", functionArgsMember, functionArgsClassname); return functionArgsMember; }
public Builder addStatement(CodeBlock codeBlock) { code.addStatement(codeBlock); return this; }
public Builder addStatement(String format, Object... args) { code.addStatement(format, args); return this; }
private static MethodSpec matcherComponentFieldSetterBuilder( SpecModel specModel, PropModel prop) { final String propMatcherName = getPropComponentMatcherName(prop); final String propName = prop.getName(); return getMethodSpecBuilder( specModel, ImmutableList.of( ParameterSpec.builder(getMatcherConditionTypeName(), "matcher").build()), CodeBlock.builder().addStatement("$L = matcher", propMatcherName).build(), propName) .build(); }
private static CodeBlock generateFieldExtractorBlock(FieldExtractorSpec fieldExtractorSpec) { return CodeBlock.builder() .addStatement( "final $T $L = impl.$L", fieldExtractorSpec.propModel.getTypeName(), fieldExtractorSpec.varName, fieldExtractorSpec.propModel.getName()) .build(); }