From 242ee38606eccf0997cfc6068ea4d9835797dcc6 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 20 Sep 2012 16:39:12 +0300 Subject: [PATCH] generic signatures for properties #KT2677 fixed --- .../jet/codegen/PropertyCodegen.java | 15 ++++--- .../testData/codegen/regressions/kt2677.kt | 13 ++++++ .../jet/codegen/PropertyGenTest.java | 45 +++++++++++++++++-- 3 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2677.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 507d9f69e23..f7326a533dd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -24,6 +24,7 @@ import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.jet.codegen.context.CodegenContext; +import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmPropertyAccessorSignature; import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter; import org.jetbrains.jet.codegen.state.GenerationStateAware; @@ -192,12 +193,13 @@ public class PropertyCodegen extends GenerationStateAware { } JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); - final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); + final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature(); + final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor(); String getterName = getterName(propertyDescriptor.getName()); - MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null); + MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, jvmMethodSignature.getGenericsSignature(), null); PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), - signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, + jvmMethodSignature.getKotlinTypeParameter(), propertyDescriptor, getter == null ? propertyDescriptor.getVisibility() : getter.getVisibility()); @@ -298,12 +300,13 @@ public class PropertyCodegen extends GenerationStateAware { JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind); assert true; - final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); - MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); + final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature(); + final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor(); + MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, jvmMethodSignature.getGenericsSignature(), null); PropertySetterDescriptor setter = propertyDescriptor.getSetter(); assert setter != null; generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), - signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, + jvmMethodSignature.getKotlinTypeParameter(), propertyDescriptor, setter.getVisibility()); assert !setter.hasBody(); diff --git a/compiler/testData/codegen/regressions/kt2677.kt b/compiler/testData/codegen/regressions/kt2677.kt new file mode 100644 index 00000000000..fc1f65ba7bb --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2677.kt @@ -0,0 +1,13 @@ +class U + +open class WeatherReport +{ + public open var forecast: U = U() +} + +open class DerivedWeatherReport() : WeatherReport() +{ + public override var forecast: U + get() = super.forecast + set(newv: U) { super.forecast = newv } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index a353f34a1e8..b6a39fba463 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -19,10 +19,7 @@ package org.jetbrains.jet.codegen; import org.jetbrains.asm4.Opcodes; import org.jetbrains.jet.ConfigurationKind; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; +import java.lang.reflect.*; /** * @author yole @@ -318,4 +315,44 @@ public class PropertyGenTest extends CodegenTestCase { throw new RuntimeException(e); } } + + public void testKt2677() throws Exception { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + loadFile("regressions/kt2677.kt"); + final Class aClass = loadImplementationClass(generateClassesInFile(), "DerivedWeatherReport"); + final Class bClass = aClass.getSuperclass(); + + try { + { + Method get = aClass.getDeclaredMethod("getForecast"); + Type type = get.getGenericReturnType(); + assertInstanceOf(type, ParameterizedType.class); + ParameterizedType parameterizedType = (ParameterizedType) type; + assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]); + + Method set = aClass.getDeclaredMethod("setForecast", (Class)parameterizedType.getRawType()); + type = set.getGenericParameterTypes()[0]; + parameterizedType = (ParameterizedType) type; + assertInstanceOf(type, ParameterizedType.class); + assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]); + } + { + Method get = bClass.getDeclaredMethod("getForecast"); + Type type = get.getGenericReturnType(); + assertInstanceOf(type, ParameterizedType.class); + ParameterizedType parameterizedType = (ParameterizedType) type; + assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]); + + Method set = bClass.getDeclaredMethod("setForecast", (Class)parameterizedType.getRawType()); + type = set.getGenericParameterTypes()[0]; + parameterizedType = (ParameterizedType) type; + assertInstanceOf(type, ParameterizedType.class); + assertEquals(String.class, parameterizedType.getActualTypeArguments()[0]); + } + } + catch (Throwable e) { + System.out.println(generateToText()); + throw new RuntimeException(e); + } + } }