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/frontends/java/JavaExpressionReader.java16
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")