EOS 2  1.1.0
Einfache Objektbasierte Sprache
PropertyWrite.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.baseparser;
2 
3 import de.lathanda.eos.vm.Command;
4 import de.lathanda.eos.vm.ReservedVariables;
5 import de.lathanda.eos.vm.commands.StoreVariable;
6 
7 import java.util.ArrayList;
8 
14 public class PropertyWrite extends Node {
15 
16  private Expression target;
17  private final String member;
18  private MethodType methodType;
19  private boolean isVariable;
20 
21  public PropertyWrite(Expression target, String member) {
22  this.target = target;
23  this.member = member.toLowerCase();
24  }
25 
26  public String getMember() {
27  return member;
28  }
29 
30  @Override
31  public void compile(ArrayList<Command> ops, boolean autoWindow) throws Exception {
32  if (isVariable) {
33  ops.add(new StoreVariable(member));
34  } else {
35  if (target != null && methodType != null) {
36  methodType.compile(ops, target, autoWindow);
37  }
38  }
39  }
40 
41  @Override
42  public void resolveNamesAndTypes(Expression with, Environment env) {
43  if (target != null) {
44  // access member
45  target.resolveNamesAndTypes(with, env);
46  accessMember(env);
47  } else {
48  // try direct variable
49  type = env.getVariableType(member);
50  if (!type.isUnknown()) {
51  // variable exists
52  isVariable = true;
53  } else if (with != null) {
54  target = with;
55  // access member
56  target.resolveNamesAndTypes(null, env);
57  accessMember(env);
58  } else {
59  env.addError(marker, "UnknownVariable", member);
60  }
61  }
62  }
63 
64  private void accessMember(Environment env) {
65  // access member
66  type = target.getType();
67  methodType = type.getAssignProperty(member);
68  isVariable = false;
69  if (methodType == null) {
70  env.addError(marker, "UnknownMember", type + "." + member);
71  type = Type.getUnknown();
72  } else {
73  if (env.getLockProperties()) {
74  env.addError(marker, "LockedMember", type + "." + member);
75  type = Type.getUnknown();
76  } else {
77  type = methodType.getParameterType(0);
78  }
79  }
80  }
81 
82  @Override
83  public String toString() {
84  if (target != null) {
85  return target + "." + member;
86  } else {
87  return member;
88  }
89  }
90 
91  @Override
92  public String getLabel() {
93  if (target != null) {
94  return createText("WriteA.Label", target.getLabel(), member);
95  } else {
96  if (member.equals(ReservedVariables.RESULT)) {
97  return createText("Result");
98  } else {
99  return createText("WriteB.Label", member);
100  }
101  }
102  }
103 }
void addError(Marker marker, String errorId, Object... data)
final String createText(String id, Object... args)
Definition: Node.java:34
abstract void resolveNamesAndTypes(Expression with, Environment env)
PropertyWrite(Expression target, String member)
void compile(ArrayList< Command > ops, boolean autoWindow)
void resolveNamesAndTypes(Expression with, Environment env)
abstract MethodType getAssignProperty(String name)
static SystemType getUnknown()
Definition: Type.java:80
void compile(ArrayList< Command > ops, Expression target, boolean autowindow)
Impressum