diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 54b3320acbe..c3c02604dc4 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -250,12 +250,27 @@ public class ExpressionCodegen extends JetVisitor { @Override public void visitSimpleNameExpression(JetSimpleNameExpression expression) { final DeclarationDescriptor descriptor = bindingContext.resolveReferenceExpression(expression); - int index = myMap.getIndex(descriptor); - if (index >= 0) { - v.visitVarInsn(Opcodes.ALOAD, index); + PsiElement declaration = bindingContext.getDeclarationPsiElement(descriptor); + if (declaration instanceof PsiField) { + PsiField psiField = (PsiField) declaration; + if (psiField.hasModifierProperty(PsiModifier.STATIC)) { + v.visitFieldInsn(Opcodes.GETSTATIC, + jvmName(psiField.getContainingClass()), + psiField.getName(), + psiTypeToAsm(psiField.getType()).getDescriptor()); + } + else { + throw new UnsupportedOperationException("don't know how to generate field reference " + descriptor); + } } else { - throw new UnsupportedOperationException("don't know how to generate reference " + descriptor); + int index = myMap.getIndex(descriptor); + if (index >= 0) { + v.visitVarInsn(Opcodes.ALOAD, index); + } + else { + throw new UnsupportedOperationException("don't know how to generate reference " + descriptor); + } } } @@ -275,8 +290,10 @@ public class ExpressionCodegen extends JetVisitor { if (declarationPsiElement instanceof PsiMethod) { PsiMethod method = (PsiMethod) declarationPsiElement; if (method.hasModifierProperty(PsiModifier.STATIC)) { - PsiClass containingClass = method.getContainingClass(); - v.visitMethodInsn(Opcodes.INVOKESTATIC, jvmName(containingClass), method.getName(), getMethodDescriptor(method)); + v.visitMethodInsn(Opcodes.INVOKESTATIC, + jvmName(method.getContainingClass()), + method.getName(), + getMethodDescriptor(method)); boxIfNeeded(method.getReturnType()); } else { diff --git a/idea/testData/codegen/systemOut.jet b/idea/testData/codegen/systemOut.jet new file mode 100644 index 00000000000..299749860df --- /dev/null +++ b/idea/testData/codegen/systemOut.jet @@ -0,0 +1 @@ +fun f() : Any { return System.out; } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 6da578cfa2f..6f52fda061e 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -88,6 +88,14 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { assertEquals(returnValue, System.identityHashCode(o)); } + public void testSystemOut() throws Exception { + loadFile("systemOut.jet"); + final Class aClass = generateToClass(); + final Method main = firstMethod(aClass); + final Object returnValue = main.invoke(null); + assertEquals(returnValue, System.out); + } + private void loadFile(final String name) { myFixture.configureByFile(JetParsingTest.getTestDataDir() + "/codegen/" + name); }