EOS 2  1.1.0
Einfache Objektbasierte Sprache
SystemFunctionType.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.baseparser;
2 
3 import java.lang.reflect.Method;
4 import java.util.ArrayList;
5 import java.util.LinkedList;
6 import java.util.TreeMap;
7 
8 import de.lathanda.eos.vm.Command;
9 import de.lathanda.eos.vm.MType;
10 import de.lathanda.eos.vm.commands.Function;
11 
18 public class SystemFunctionType implements MethodType {
19  private static TreeMap<String, LinkedList<SystemFunctionType> > systemFunctions = new TreeMap<>();
20  protected final Type[] parameters;
21  protected final Type ret;
22  protected final String name;
23  protected final String originalName;
24  protected final Method method;
25 
36  throws NoSuchMethodException {
37  this.parameters = parameters;
38  Class<?>[] parametersClass = new Class<?>[parameters.length];
39  for (int i = 0; i < parameters.length; i++) {
40  parametersClass[i] = parameters[i].convertToClass();
41  }
42  this.method = target.convertToClass().getMethod(name, parametersClass);
43  this.ret = ret;
44  this.name = name;
45  this.originalName = originalName;
46  }
47 
55  this.parameters = parameters;
56  this.method = null;
57  this.ret = ret;
58  this.name = name;
59  this.originalName = name;
60  }
61 
71  public SystemFunctionType(Class<?> target, SystemType[] parameters, Type ret, String name, String originalName)
72  throws NoSuchMethodException {
73  this.parameters = parameters;
74  Class<?>[] parametersClass = new Class<?>[parameters.length];
75  for (int i = 0; i < parameters.length; i++) {
76  parametersClass[i] = parameters[i].convertToClass();
77  }
78  this.method = target.getMethod(name, parametersClass);
79  this.ret = ret;
80  this.name = name;
81  this.originalName = originalName;
82  }
83 
84  public static void registerSystemFunction(Class<?> target, SystemType[] parameters, Type ret, String name,
85  String originalName) throws NoSuchMethodException {
87  LinkedList<SystemFunctionType> list;
88  if (systemFunctions.containsKey(key)) {
89  list = systemFunctions.get(key);
90  } else {
91  list = new LinkedList<>();
92  systemFunctions.put(key, list);
93  }
94  list.add(new SystemFunctionType(target, parameters, ret, name, originalName));
95  }
96  public boolean checkType(Type[] args) {
97  if (parameters.length != args.length) {
98  return false;
99  }
100  for (int i = 0; i < args.length; i++) {
101  if (!parameters[i].checkType(args[i])) {
102  return false;
103  }
104  }
105  return true;
106  }
107 
108  @Override
109  public Type getReturnType() {
110  return ret;
111  }
112 
113  @Override
114  public Type getParameterType(int i) {
115  return parameters[i];
116  }
117 
118  @Override
119  public String toString() {
120  StringBuilder res = new StringBuilder();
121  boolean first = true;
122  res.append(originalName).append("(");
123  for (AutoCompleteType t : parameters) {
124  if (first) {
125  res.append(t);
126  } else {
127  res.append(",").append(t);
128  first = false;
129  }
130  }
131  res.append(")");
132  if (ret != null && !ret.isVoid()) {
133  res.append(":").append(ret);
134  }
135  return res.toString();
136  }
137 
138  @Override
139  public String getName() {
140  return name;
141  }
142 
143  @Override
144  public MType[] getParameters() {
145  MType[] para = new MType[parameters.length];
146  for (int i = 0; i < para.length; i++) {
147  para[i] = parameters[i].getMType();
148  }
149  return para;
150  }
151 
152  public void compile(ArrayList<Command> ops, Expression target, boolean autowindow) throws Exception {
153  ops.add(new Function(getParameters(), method));
154  }
155 
156  public static SystemFunctionType getSystemFunction(String name, Type[] types) {
157  LinkedList<SystemFunctionType> functions = systemFunctions.get(Signatures.createPreselectionSignature(name, types.length));
158  for(var sf : functions) {
159  if (sf.checkType(types)) {
160  return sf;
161  }
162  }
163  return null;
164  }
165 }
static String createPreselectionSignature(String name, int args)
Definition: Signatures.java:6
static void registerSystemFunction(Class<?> target, SystemType[] parameters, Type ret, String name, String originalName)
SystemFunctionType(String name, Type[] parameters, Type ret)
static SystemFunctionType getSystemFunction(String name, Type[] types)
void compile(ArrayList< Command > ops, Expression target, boolean autowindow)
SystemFunctionType(Class<?> target, SystemType[] parameters, Type ret, String name, String originalName)
SystemFunctionType(SystemType target, SystemType[] parameters, Type ret, String name, String originalName)
Impressum