From 2f437d3714be94c37fbb930060f38df0a2b6e0c2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 15 Apr 2011 13:22:08 +0200 Subject: [PATCH] working field read; non-working field write --- .../jet/codegen/ExpressionCodegen.java | 29 +++++++++++-------- .../jet/codegen/NamespaceGenTest.java | 18 ++++++++++++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5fc2509cb5b..9808125e3c8 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -276,15 +276,16 @@ public class ExpressionCodegen extends JetVisitor { PsiElement declaration = bindingContext.getDeclarationPsiElement(descriptor); if (declaration instanceof PsiField) { PsiField psiField = (PsiField) declaration; + final String owner = JetTypeMapper.jvmName(psiField.getContainingClass()); + final Type fieldType = psiTypeToAsm(psiField.getType()); if (psiField.hasModifierProperty(PsiModifier.STATIC)) { - v.visitFieldInsn(Opcodes.GETSTATIC, - JetTypeMapper.jvmName(psiField.getContainingClass()), - psiField.getName(), - psiTypeToAsm(psiField.getType()).getDescriptor()); + v.visitFieldInsn(Opcodes.GETSTATIC, owner, psiField.getName(), fieldType.getDescriptor()); } else { - throw new UnsupportedOperationException("don't know how to generate field reference " + descriptor); + ensureReceiverOnStack(expression); + v.visitFieldInsn(Opcodes.GETFIELD, owner, psiField.getName(), fieldType.getDescriptor()); } + myStack.push(StackValue.onStack(fieldType)); } else { int index = myMap.getIndex(descriptor); @@ -342,13 +343,7 @@ public class ExpressionCodegen extends JetVisitor { } } - if (expression.getParent() instanceof JetDotQualifiedExpression) { - final JetDotQualifiedExpression parent = (JetDotQualifiedExpression) expression.getParent(); - if (!resolvesToClassOrPackage(parent.getReceiverExpression())) { - // we have a receiver on stack - myStack.pop().put(Type.getObjectType(CLASS_OBJECT), v); - } - } + ensureReceiverOnStack(expression); PsiElement declarationPsiElement = bindingContext.getDeclarationPsiElement(funDescriptor); Method methodDescriptor; @@ -387,6 +382,16 @@ public class ExpressionCodegen extends JetVisitor { } } + private void ensureReceiverOnStack(JetElement expression) { + if (expression.getParent() instanceof JetDotQualifiedExpression) { + final JetDotQualifiedExpression parent = (JetDotQualifiedExpression) expression.getParent(); + if (!resolvesToClassOrPackage(parent.getReceiverExpression())) { + // we have a receiver on stack + myStack.pop().put(Type.getObjectType(CLASS_OBJECT), v); + } + } + } + private void pushMethodArguments(JetCall expression, Method method) { final Type[] argTypes = method.getArgumentTypes(); List args = expression.getValueArguments(); diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 3913379d14d..5bae6bab106 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.codegen; import org.jetbrains.jet.parsing.JetParsingTest; +import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -272,4 +273,21 @@ public class NamespaceGenTest extends CodegenTestCase { final Method main = generateFunction(); ArrayList arrayList = (ArrayList) main.invoke(null); } + + public void testFieldRead() throws Exception { + loadText("import java.awt.*; fun foo(c: GridBagConstraints) = c.gridx"); + System.out.println(generateToText()); + final Method main = generateFunction(); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 239; + assertEquals(239, main.invoke(null, c)); + } + + public void testFieldWrite() throws Exception { + loadText("import java.awt.*; fun foo(c: GridBagConstraints) { c.gridx = 239 }"); + final Method main = generateFunction(); + GridBagConstraints c = new GridBagConstraints(); + main.invoke(null, c); + assertEquals(239, c.gridx); + } }