EOS 2  1.1.0
Einfache Objektbasierte Sprache
UserClass.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.baseparser;
2 
3 import java.util.ArrayList;
4 import java.util.TreeMap;
5 
6 import de.lathanda.eos.baseparser.exceptions.CyclicStorageException;
7 import de.lathanda.eos.baseparser.exceptions.DoubleMethodDeclarationException;
8 import de.lathanda.eos.baseparser.exceptions.DoublePropertyDeclarationException;
9 import de.lathanda.eos.vm.Command;
10 import de.lathanda.eos.vm.ReservedVariables;
11 import de.lathanda.eos.vm.commands.LoadVariable;
12 
18 public class UserClass extends MarkedNode {
19  private final TreeMap<String, Method> meths = new TreeMap<>();
20  private final TreeMap<String, Property> props = new TreeMap<>();
21  private final String name;
22  private String sup;
23  private Self self;
24 
28  public UserClass(String name) {
29  this.name = name;
30  sup = null;
31  self = new Self();
32  type = self.getType();
33  }
34 
35  public void setSuperClass(String name) {
36  sup = name;
37  }
38 
39  public void define() {
40  self.define();
41  }
42 
44  for (String name : prop.getNames()) {
45  if (props.containsKey(name)) {
46  throw new DoublePropertyDeclarationException(name, this.name);
47  }
48  props.put(name, prop);
49  }
50  }
51 
53  String key = Signatures.createVMMethodSignature(meth.getMethodType());
54  if (meths.containsKey(key)) {
55  throw new DoubleMethodDeclarationException(meth.toString(), this.name);
56  }
57  meths.put(key, meth);
58  }
59 
60  public String getName() {
61  return name;
62  }
63 
64  @Override
65  public String getLabel() {
66  return name;
67  }
68 
69  public void bind(Environment env) {
70  self.bind(env);
71  }
72 
74  self.ut.checkCyclicStorage();
75  }
76 
77  public void compile() throws Exception {
78  self.ut.compile();
79  }
80 
81  public void resolveNamesAndTypes(Environment env) {
82  env.storeVariables();
83  for (Property p : props.values()) {
84  p.resolveNamesAndTypes(self, env);
85  }
86  for (Method m : meths.values()) {
88  m.resolveNamesAndTypes(self, env);
89  env.restoreVariables();
90  }
91  env.restoreVariables();
92  }
93 
95  return new AutoCompleteInfo(name, self.ut, AutoCompleteInformation.CLASS, name.length(), 0);
96  }
97 
98  private class Self extends Expression {
99  private UserType ut;
100 
101  public Self() {
102  ut = new UserType(UserClass.this.name);
103  type = ut;
104  }
105 
106  public void define() {
107  ut.define();
108  }
109 
110  public void bind(Environment env) {
111  ut.setSuperclass(sup);
112  for (Method m : meths.values()) {
113  ut.addMethod(m);
114  }
115  for (Property p : props.values()) {
116  ut.addProperty(p);
117  }
118  ut.bind(env);
119  }
120 
121  @Override
122  public void compile(ArrayList<Command> ops, boolean autoWindow) throws Exception {
123  ops.add(new LoadVariable(ReservedVariables.SELF));
124  }
125 
126  @Override
127  public void resolveNamesAndTypes(Expression with, Environment env) {
128  // nothing to do
129  }
130 
131  @Override
132  public String getLabel() {
133  return createText("Class.Self");
134  }
135  }
136 }
void setVariableType(String name, Type type)
final String createText(String id, Object... args)
Definition: Node.java:34
static String createVMMethodSignature(MethodType m)
Definition: Signatures.java:27
void resolveNamesAndTypes(Environment env)
Definition: UserClass.java:81
AutoCompleteInformation getAutoComplete()
Definition: UserClass.java:94
void addProperty(Property prop)
Definition: UserType.java:112
void bind(Environment env)
Definition: UserType.java:46
Impressum