From aba13415c7ab366935ca19ed13462adba3e9c279 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Apr 2011 15:42:51 +0200 Subject: [PATCH] failing test for property in class --- .../jet/codegen/PropertyCodegen.java | 9 ++++-- idea/testData/codegen/privateVar.jet | 6 ++++ .../jet/codegen/CodegenTestCase.java | 28 +++++++++++++++++-- .../jet/codegen/PropertyGenTest.java | 16 ++++++++++- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 idea/testData/codegen/privateVar.jet diff --git a/idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 8a8def24bef..d890da510f3 100644 --- a/idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -45,7 +45,7 @@ public class PropertyCodegen { } public void gen(JetProperty p, OwnerKind kind) { - if (kind == OwnerKind.NAMESPACE) { + if (kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION) { final VariableDescriptor descriptor = context.getVariableDescriptor(p); if (!(descriptor instanceof PropertyDescriptor)) { throw new UnsupportedOperationException("expect a property to have a property descriptor"); @@ -59,8 +59,11 @@ public class PropertyCodegen { value = ((JetConstantExpression) initializer).getValue(); } } - v.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE, - p.getName(), + int modifiers = Opcodes.ACC_PRIVATE; + if (kind == OwnerKind.NAMESPACE) { + modifiers |= Opcodes.ACC_STATIC; + } + v.visitField(modifiers, p.getName(), mapper.mapType(descriptor.getOutType()).getDescriptor(), null, value); } diff --git a/idea/testData/codegen/privateVar.jet b/idea/testData/codegen/privateVar.jet new file mode 100644 index 00000000000..9a62a4ae075 --- /dev/null +++ b/idea/testData/codegen/privateVar.jet @@ -0,0 +1,6 @@ +class PrivateVar { + private var x = 0; + + fun setValueOfX(val: Int) { x = val } + fun getValueOfX() = x +} diff --git a/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 97958b34e07..56375b2f5f1 100644 --- a/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -16,6 +16,20 @@ import java.util.List; * @author yole */ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase { + private MyClassLoader myClassLoader; + + @Override + protected void setUp() throws Exception { + super.setUp(); + myClassLoader = new MyClassLoader(NamespaceGenTest.class.getClassLoader()); + } + + @Override + protected void tearDown() throws Exception { + myClassLoader = null; + super.tearDown(); + } + protected void loadText(final String text) { myFixture.configureByText(JetFileType.INSTANCE, text); } @@ -55,8 +69,7 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase { for (String file : files) { if (file.equals(fqName.replace('.', '/') + ".class")) { final byte[] data = state.asBytes(file); - MyClassLoader classLoader = new MyClassLoader(NamespaceGenTest.class.getClassLoader()); - return classLoader.doDefineClass(fqName, data); + return myClassLoader.doDefineClass(fqName, data); } } @@ -81,6 +94,10 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase { protected Method generateFunction(String name) { Class aClass = generateNamespaceClass(); + return findMethodByName(aClass, name); + } + + protected static Method findMethodByName(Class aClass, String name) { for (Method method : aClass.getMethods()) { if (method.getName().equals(name)) { return method; @@ -89,11 +106,16 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase { throw new IllegalArgumentException("couldn't find method " + name); } - protected void assertIsCurrentTime(long returnValue) { + protected static void assertIsCurrentTime(long returnValue) { long currentTime = System.currentTimeMillis(); assertTrue(Math.abs(returnValue - currentTime) <= 1L); } + protected Class loadImplementationClass(Codegens codegens, final String name) { + loadClass(name, codegens); + return loadClass(name + "$$Impl", codegens); + } + private static class MyClassLoader extends ClassLoader { public MyClassLoader(ClassLoader parent) { super(parent); diff --git a/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index 5fe4976030e..b4d3dc2bc8f 100644 --- a/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -11,7 +11,21 @@ public class PropertyGenTest extends CodegenTestCase { public void testPrivateVal() throws Exception { loadFile("privateVal.jet"); System.out.println(generateToText()); - // TODO + final Class aClass = loadImplementationClass(generateClassesInFile(), "PrivateVal"); + final Field[] fields = aClass.getDeclaredFields(); + assertEquals(1, fields.length); + final Field field = fields[0]; + assertEquals("prop", field.getName()); + } + + public void testPrivateVar() throws Exception { + loadFile("privateVar.jet"); + final Class aClass = loadImplementationClass(generateClassesInFile(), "PrivateVar"); + final Object instance = aClass.newInstance(); + Method setter = findMethodByName(aClass, "setValueOfX"); + setter.invoke(instance, 239); + Method getter = findMethodByName(aClass, "getValueOfX"); + assertEquals(239, ((Integer) getter.invoke(instance)).intValue()); } public void testPropertyInNamespace() throws Exception {