From d403acf6e1266e73a4ed43b63032be04da2c71d8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 11 Feb 2016 20:33:14 +0000 Subject: Change FieldAccessNode to support static fields --- .../org/zwobble/couscous/ast/FieldAccessNode.java | 35 +++++++++++++++++----- .../backends/python/PythonCodeGenerator.java | 2 +- .../zwobble/couscous/interpreter/Evaluator.java | 6 ++-- 3 files changed, 33 insertions(+), 10 deletions(-) (limited to 'src/main/java/org') 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 { 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 { @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()); } -- cgit v1.2.3