generic signatures for properties #KT2677 fixed

This commit is contained in:
Alex Tkachman
2012-09-20 16:39:12 +03:00
parent eaf9a79420
commit 242ee38606
3 changed files with 63 additions and 10 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.context.CodegenContext; 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.JvmPropertyAccessorSignature;
import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter; import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter;
import org.jetbrains.jet.codegen.state.GenerationStateAware; import org.jetbrains.jet.codegen.state.GenerationStateAware;
@@ -192,12 +193,13 @@ public class PropertyCodegen extends GenerationStateAware {
} }
JvmPropertyAccessorSignature signature = typeMapper.mapGetterSignature(propertyDescriptor, kind); 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()); 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(); PropertyGetterDescriptor getter = propertyDescriptor.getGetter();
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, jvmMethodSignature.getKotlinTypeParameter(), propertyDescriptor,
getter == null getter == null
? propertyDescriptor.getVisibility() ? propertyDescriptor.getVisibility()
: getter.getVisibility()); : getter.getVisibility());
@@ -298,12 +300,13 @@ public class PropertyCodegen extends GenerationStateAware {
JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind); JvmPropertyAccessorSignature signature = typeMapper.mapSetterSignature(propertyDescriptor, kind);
assert true; assert true;
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); final JvmMethodSignature jvmMethodSignature = signature.getJvmMethodSignature();
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); final String descriptor = jvmMethodSignature.getAsmMethod().getDescriptor();
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, jvmMethodSignature.getGenericsSignature(), null);
PropertySetterDescriptor setter = propertyDescriptor.getSetter(); PropertySetterDescriptor setter = propertyDescriptor.getSetter();
assert setter != null; assert setter != null;
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor, jvmMethodSignature.getKotlinTypeParameter(), propertyDescriptor,
setter.getVisibility()); setter.getVisibility());
assert !setter.hasBody(); assert !setter.hasBody();
@@ -0,0 +1,13 @@
class U<T>
open class WeatherReport
{
public open var forecast: U<String> = U<String>()
}
open class DerivedWeatherReport() : WeatherReport()
{
public override var forecast: U<String>
get() = super.forecast
set(newv: U<String>) { super.forecast = newv }
}
@@ -19,10 +19,7 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.asm4.Opcodes; import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import java.lang.reflect.Constructor; import java.lang.reflect.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/** /**
* @author yole * @author yole
@@ -318,4 +315,44 @@ public class PropertyGenTest extends CodegenTestCase {
throw new RuntimeException(e); 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);
}
}
} }