diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-02 15:55:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-02 15:55:37 +0100 |
| commit | c6f690724da284c8065319252bf79eb166a168c8 (patch) | |
| tree | 8dabaa3fcc11f35711fb2e610e8808a8cac5b9d0 /src/main | |
| parent | d2c63996ece9bb9184a17d5bb24ae03e87eb87f5 (diff) | |
Read qualified names when qualifier is a variable reference
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 0154b1d..e9d6195 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -15,11 +15,13 @@ import java.util.stream.IntStream; import static org.zwobble.couscous.ast.ArrayNode.array; import static org.zwobble.couscous.ast.CastNode.cast; import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; +import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.OperationNode.operation; import static org.zwobble.couscous.ast.Operations.not; +import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator; @@ -192,12 +194,24 @@ public class JavaExpressionReader { } private ExpressionNode readQualifiedName(QualifiedName expression) { + Receiver receiver = toReceiver(expression.getQualifier().resolveBinding()); return FieldAccessNode.fieldAccess( - ScalarType.of(((ITypeBinding)expression.getQualifier().resolveBinding()).getQualifiedName()), + receiver, expression.getName().getIdentifier(), typeOf(expression)); } + private Receiver toReceiver(IBinding binding) { + if (binding instanceof ITypeBinding) { + ScalarType receiver = ScalarType.of(((ITypeBinding) binding).getQualifiedName()); + return staticReceiver(receiver); + } else if (binding instanceof IVariableBinding) { + return instanceReceiver(readVariableBinding((IVariableBinding) binding)); + } else { + throw new UnsupportedOperationException("Unsupported binding: " + binding); + } + } + private ExpressionNode readMethodInvocation(MethodInvocation expression) { String methodName = expression.getName().getIdentifier(); @SuppressWarnings("unchecked") |
