Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2015 Objectos, Fábrica de Software LTDA.
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not
   * use this file except in compliance with the License. You may obtain a copy of
   * the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations under
  * the License.
  */
 package br.com.objectos.way.auto.functional;
 
 import java.util.List;
 
 

Author(s):
marcio.endo@objectos.com.br (Marcio Endo)
 
 abstract class ToFunctionStatic extends AbstractHasToFunction {
 
   ToFunctionStatic(ToFunction function) {
     super(function);
   }
 
   public static ToFunctionStatic wrap(ToFunction function) {
     List<ParameterSpecparameterSpecList = function.parameterSpecList;
     return parameterSpecList.isEmpty()
         ? new ParameterLess(function)
         : new WithParameter(function);
   }
 
   public abstract Optional<FieldSpecgetField();
 
   public abstract MethodSpec getMethod();
 
   void addFieldTo(TypeSpec.Builder type) {
     Optional<FieldSpecmaybeField = getField();
     if (maybeField.isPresent()) {
       FieldSpec field = maybeField.get();
       type.addField(field);
     }
   }
 
   void addMethodTo(TypeSpec.Builder type) {
     MethodSpec method = getMethod();
     type.addMethod(method);
   }
 
   private static class ParameterLess extends ToFunctionStatic {
 
     private ParameterLess(ToFunction function) {
       super(function);
     }
 
     @Override
     public Optional<FieldSpecgetField() {
       FieldSpec field = field();
       return Optional.of(field);
     }
 
     @Override
     public MethodSpec getMethod() {
       return MethodSpec.methodBuilder("get")
           .addModifiers(..)
           .returns(functionTypeName())
           .addStatement("return INSTANCE")
           .build();
     }
 
     private FieldSpec field() {
       return FieldSpec.builder(functionTypeName(), "INSTANCE")
           .initializer("new $T()"className())
           .build();
     }
 
   }
 
   private static class WithParameter extends ToFunctionStatic {
 
     private WithParameter(ToFunction function) {
       super(function);
     }
 
     @Override
     public Optional<FieldSpecgetField() {
      return Optional.absent();
    }
    @Override
    public MethodSpec getMethod() {
      MethodSpec.Builder b = MethodSpec.methodBuilder("get")
          .returns(functionTypeName());
      for (ParameterSpec parameterSpec : parameterSpecList()) {
        b.addParameter(parameterSpec);
      }
      CodeBlock returnStatement = methodInfo().statementWriter()
          .add("return new $T(")
          .add("$L").forEachParameter(", ")
          .add(")")
          .set(className())
          .setParameterName()
          .write();
      return b.addCode(returnStatement)
          .build();
    }
  }
New to GrepCode? Check out our FAQ X