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

org.snapscript.core.variable.index.VariablePointerBuilder Maven / Gradle / Ivy

package org.snapscript.core.variable.index;

import java.util.Collection;
import java.util.Map;

import org.snapscript.core.ModifierType;
import org.snapscript.core.constraint.Constraint;
import org.snapscript.core.convert.proxy.ProxyWrapper;
import org.snapscript.core.function.Function;
import org.snapscript.core.module.Module;
import org.snapscript.core.scope.Scope;
import org.snapscript.core.scope.instance.Instance;
import org.snapscript.core.type.Type;
import org.snapscript.core.variable.bind.VariableFinder;

public class VariablePointerBuilder {

   private final VariableFinder finder;
   private final String name;
   
   public VariablePointerBuilder(ProxyWrapper wrapper, String name) {
      this.finder = new VariableFinder(wrapper);
      this.name = name;
   }

   public VariablePointer create(Scope scope) throws Exception {
      if(Instance.class.isInstance(scope)) {
         return new TypeLocalPointer(finder, name);
      }
      return new LocalPointer(finder, name);
   }
   
   public VariablePointer create(Scope scope, Object left) throws Exception {
      Class type = left.getClass();
      
      if(Module.class.isInstance(left)) {
         return new ModulePointer(finder, name);
      }
      if(Map.class.isInstance(left)) {
         return new MapPointer(finder, name);
      }         
      if(Type.class.isInstance(left)) {
         return new TypeStaticPointer(finder, name); // could be either static or instance
      }
      if(Collection.class.isInstance(left)) {
         return new CollectionPointer(finder, name);
      }
      if(Function.class.isInstance(left)) {
         return new ClosurePointer(finder, name);
      }
      if(type.isArray()) {
         return new ArrayPointer(finder, name);
      }
      return new TypeInstancePointer(finder, name);
   }
   
   public VariablePointer create(Scope scope, Constraint left) throws Exception {
      Type type = left.getType(scope);
      
      if(type != null) {
         Class real = type.getType();
         int modifiers = type.getModifiers();
         
         if(left.isModule()) {
            return new ModulePointer(finder, name);
         }
         if(left.isClass()) {
            return new TypeStaticPointer(finder, name);
         }
         if(ModifierType.isFunction(modifiers)) {
            return new ClosurePointer(finder, name);
         }
         if(ModifierType.isArray(modifiers)) {
            return new ArrayPointer(finder, name);
         }
         if(real != null) {
            if(Map.class.isAssignableFrom(real)) {
               return new MapPointer(finder, name);
            }         
            if(Collection.class.isAssignableFrom(real)) {
               return new CollectionPointer(finder, name);
            }
         }
      }
      return new TypeInstancePointer(finder, name);
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy