public static FunctionType makeFunctionType(
     ResolutionErrorListener listener,
     ClassElement element,
     List<VariableElement> parameters,
     Type returnType) {
   List<Type> parameterTypes = new ArrayList<Type>(parameters.size());
   Map<String, Type> optionalParameterTypes = null;
   Map<String, Type> namedParameterTypes = null;
   Type restParameter = null;
   for (VariableElement parameter : parameters) {
     Type type = parameter.getType();
     // TODO(scheglov) one we will make optional parameter not named,
     // check isOptional() before isNamed()
     if (parameter.isNamed()) {
       if (namedParameterTypes == null) {
         namedParameterTypes = new LinkedHashMap<String, Type>();
       }
       namedParameterTypes.put(parameter.getName(), type);
     } else if (parameter.isOptional()) {
       if (optionalParameterTypes == null) {
         optionalParameterTypes = new LinkedHashMap<String, Type>();
       }
       optionalParameterTypes.put(parameter.getName(), type);
     } else {
       parameterTypes.add(type);
     }
   }
   return FunctionTypeImplementation.of(
       element,
       parameterTypes,
       optionalParameterTypes,
       namedParameterTypes,
       restParameter,
       returnType);
 }
 static FunctionType ftype(
     ClassElement element,
     Type returnType,
     Map<String, Type> namedParameterTypes,
     Type rest,
     Type... arguments) {
   return FunctionTypeImplementation.of(
       element, Arrays.asList(arguments), null, namedParameterTypes, rest, returnType);
 }