EOS 2  1.1.0
Einfache Objektbasierte Sprache
PropertyRead.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.LoadVariable;
6 
7 import java.util.ArrayList;
8 
14 public class PropertyRead extends Expression {
15 
16  private Expression target;
17  private String member;
18  private MethodType methodType;
19  private boolean isVariable;
20 
21  public PropertyRead(Expression target, String member) {
22  this.target = target;
23  this.member = member.toLowerCase();
24  prio = 7;
25  }
26 
27  public String getMember() {
28  return member;
29  }
30 
31  @Override
32  public void compile(ArrayList<Command> ops, boolean autoWindow) throws Exception {
33  if (isVariable) {
34  ops.add(new LoadVariable(member));
35  } else if (target != null && methodType != null) {
36  methodType.compile(ops, target, autoWindow);
37  }
38  }
39 
40  @Override
41  public void resolveNamesAndTypes(Expression with, Environment env) {
42  if (target != null) {
43  // access member
44  target.resolveNamesAndTypes(with, env);
45  accessMember(env);
46  } else {
47  // try direct variable
48  type = env.getVariableType(member);
49  if (!type.isUnknown()) {
50  // variable exists
51  isVariable = true;
52  } else if (with != null) {
53  // try with
54  target = with;
55  target.resolveNamesAndTypes(null, env);
56  // access member
57  accessMember(env);
58  } else if (member.equals(env.getDefaultWindowName())) {
59  env.setFigureExists();
60  if (env.getAutoWindow()) {
61  member = ReservedVariables.WINDOW;
62  isVariable = true;
64  }
65  } else {
66  env.addError(marker, "UnknownVariable", member);
67  type = Type.getUnknown();
68  }
69  }
70 
71  }
72 
73  private void accessMember(Environment env) {
74  // access member
75  type = target.getType();
76  methodType = type.getReadProperty(member);
77  isVariable = false;
78  if (methodType == null) {
79  env.addError(marker, "UnknownMember", type + "." + member);
80  type = Type.getUnknown();
81  } else {
82  if (env.getLockProperties()) {
83  env.addError(marker, "LockedMember", type + "." + member);
84  type = Type.getUnknown();
85  } else {
86  type = methodType.getReturnType();
87  }
88  }
89  }
90 
91  @Override
92  public String toString() {
93  if (target != null) {
94  return target + "." + member;
95  } else {
96  return member;
97  }
98  }
99 
100  @Override
101  public String getLabel() {
102  if (target != null) {
103  return createText("ReadA.Label", getLabelRight(target), member);
104  } else {
105  if (member.equals(ReservedVariables.RESULT)) {
106  return createText("Result");
107  } else {
108  return createText("ReadB.Label", member);
109  }
110  }
111  }
112 
113 }
void addError(Marker marker, String errorId, Object... data)
String getLabelRight(Expression e)
Definition: Expression.java:82
final String createText(String id, Object... args)
Definition: Node.java:34
abstract void resolveNamesAndTypes(Expression with, Environment env)
void resolveNamesAndTypes(Expression with, Environment env)
PropertyRead(Expression target, String member)
void compile(ArrayList< Command > ops, boolean autoWindow)
static SystemType getUnknown()
Definition: Type.java:80
abstract MethodType getReadProperty(String name)
void compile(ArrayList< Command > ops, Expression target, boolean autowindow)
Impressum