public Computation compute(TypeManager types, SerializedValueVisitor<Computation> compiler) { Class<?> clazz = constructorParams.getType(); List<String> statements = new ArrayList<>(); List<Computation> computedParams = constructorParams .getValues() .stream() .map(value -> value.accept(compiler)) .collect(toList()); statements.addAll( computedParams .stream() .flatMap(computation -> computation.getStatements().stream()) .collect(toList())); String[] params = computedParams.stream().map(computation -> computation.getValue()).toArray(String[]::new); String bean = newObject(types.getBestName(clazz), params); String constructorStatement = assignLocalVariableStatement(types.getSimpleName(clazz), name, bean); statements.add(constructorStatement); for (SetterParam param : setterParams) { Computation fieldComputation = param.computeValue().accept(compiler); statements.addAll(fieldComputation.getStatements()); String setStatement = callMethodStatement(name, param.getName(), fieldComputation.getValue()); statements.add(setStatement); } return new Computation(name, true, statements); }
public Object execute() { try { Object base = constructorParams.apply(); for (SetterParam param : setterParams) { param.apply(base); } return base; } catch (ReflectiveOperationException e) { return null; } }