All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snapscript.core.function.ArgumentConverterBuilder Maven / Gradle / Ivy

package org.snapscript.core.function;

import java.util.List;

import org.snapscript.core.Context;
import org.snapscript.core.constraint.Constraint;
import org.snapscript.core.convert.ConstraintConverter;
import org.snapscript.core.convert.ConstraintMatcher;
import org.snapscript.core.convert.FixedArgumentConverter;
import org.snapscript.core.convert.NoArgumentConverter;
import org.snapscript.core.convert.VariableArgumentConverter;
import org.snapscript.core.module.Module;
import org.snapscript.core.scope.Scope;
import org.snapscript.core.type.Type;

public class ArgumentConverterBuilder {

   public ArgumentConverterBuilder() {
      super();
   }

   public ArgumentConverter create(Scope scope, List parameters) throws Exception {
      int size = parameters.size();

      if(size > 0) {
         Parameter parameter = parameters.get(size - 1);
         boolean variable = parameter.isVariable();

         return create(scope, parameters, variable);
      }
      return create(scope, parameters, false);
   }

   public ArgumentConverter create(Scope scope, List parameters, boolean variable) throws Exception {
      Module module = scope.getModule();
      Context context = module.getContext();
      ConstraintMatcher matcher = context.getMatcher();
      int size = parameters.size();

      if(size > 0) {
         ConstraintConverter[] converters = new ConstraintConverter[size];

         for(int i = 0; i < size - 1; i++) {
            Parameter parameter = parameters.get(i);
            Constraint constraint = parameter.getConstraint();
            Type type = constraint.getType(scope);

            converters[i] = matcher.match(type);
         }
         Parameter parameter = parameters.get(size - 1);
         Constraint constraint = parameter.getConstraint();
         Type type = constraint.getType(scope);

         if(type != null) {
            Type entry = type.getEntry();

            if(variable) {
               converters[size - 1] = matcher.match(entry);
            } else {
               converters[size - 1] = matcher.match(type);
            }
         } else {
            converters[size - 1] = matcher.match(type);
         }
         if(variable) {
            return new VariableArgumentConverter(converters);
         }
         return new FixedArgumentConverter(converters);
      }
      return new NoArgumentConverter();
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy