package org.inferred.freebuilder.processor; import com.google.common.base.Optional; import org.inferred.freebuilder.processor.BuilderFactory.TypeInference; import org.inferred.freebuilder.processor.util.Block; import org.inferred.freebuilder.processor.util.Excerpt; class Declarations { /** * Upcasts a Builder instance to the generated superclass, to allow access to private fields. * * @param block the {@link Block} to add the declaration to * @param metadata metadata about the builder being generated * @param builder the Builder instance to upcast * @returns an Excerpt referencing the upcasted instance */ public static Excerpt upcastToGeneratedBuilder(Block block, Metadata metadata, String builder) { return block.declare( "base", "// Upcast to access private fields; otherwise, oddly, we get an access violation.%n" + "%1$s base = (%1$s) %2$s;", metadata.getGeneratedBuilder(), builder); } /** * Declares a fresh Builder to copy default property values from. * * @returns an Excerpt referencing a fresh Builder, if a no-args factory method is available to * create one with */ public static Optional<Excerpt> freshBuilder(Block block, Metadata metadata) { if (!metadata.getBuilderFactory().isPresent()) { return Optional.absent(); } Excerpt defaults = block.declare("_defaults", "%s _defaults = %s;", metadata.getGeneratedBuilder(), metadata.getBuilderFactory().get() .newBuilder(metadata.getBuilder(), TypeInference.INFERRED_TYPES)); return Optional.of(defaults); } private Declarations() {} }