generic signatures for properties #KT2677 fixed
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user