aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java35
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java6
3 files changed, 33 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
index d05a06a..a949630 100644
--- a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
@@ -4,28 +4,49 @@ import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
+import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
+
public class FieldAccessNode implements AssignableExpressionNode {
public static FieldAccessNode fieldAccess(
ExpressionNode left,
String fieldName,
- TypeName type) {
+ TypeName type)
+ {
+ return fieldAccess(instanceReceiver(left), fieldName, type);
+ }
+
+ public static FieldAccessNode fieldAccess(
+ TypeName left,
+ String fieldName,
+ TypeName type)
+ {
+ return fieldAccess(staticReceiver(left), fieldName, type);
+ }
+
+ public static FieldAccessNode fieldAccess(
+ Receiver left,
+ String fieldName,
+ TypeName type)
+ {
return new FieldAccessNode(left, fieldName, type);
}
- private final ExpressionNode left;
+ private final Receiver left;
private final String fieldName;
private final TypeName type;
public FieldAccessNode(
- ExpressionNode left,
- String fieldName,
- TypeName type) {
+ Receiver left,
+ String fieldName,
+ TypeName type)
+ {
this.left = left;
this.fieldName = fieldName;
this.type = type;
}
- public ExpressionNode getLeft() {
+ public Receiver getLeft() {
return left;
}
@@ -45,7 +66,7 @@ public class FieldAccessNode implements AssignableExpressionNode {
@Override
public ExpressionNode transform(NodeTransformer transformer) {
return new FieldAccessNode(
- transformer.transformExpression(left),
+ transformer.transformReceiver(left),
fieldName,
transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index d7e56aa..c1b04db 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -290,7 +290,7 @@ public class PythonCodeGenerator {
@Override
public PythonExpressionNode visit(FieldAccessNode fieldAccess) {
- return pythonAttributeAccess(generateExpression(fieldAccess.getLeft()), fieldAccess.getFieldName());
+ return pythonAttributeAccess(generateReceiver(fieldAccess.getLeft()), fieldAccess.getFieldName());
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 815bf10..68469fd 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -55,7 +55,8 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
assignment.getTarget().accept(new AssignableExpressionNodeVisitor(){
@Override
public void visit(FieldAccessNode fieldAccess) {
- InterpreterValue left = eval(fieldAccess.getLeft());
+ // TODO: handle static receiver
+ InterpreterValue left = eval(((InstanceReceiver)fieldAccess.getLeft()).getExpression());
left.setField(fieldAccess.getFieldName(), value);
}
@@ -117,7 +118,8 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
@Override
public InterpreterValue visit(FieldAccessNode fieldAccess) {
- InterpreterValue left = eval(fieldAccess.getLeft());
+ // TODO: handle static receiver
+ InterpreterValue left = eval(((InstanceReceiver)fieldAccess.getLeft()).getExpression());
return left.getField(fieldAccess.getFieldName());
}