Get reified signature from JetTypeMapper

#KT-6485 Fixed
This commit is contained in:
Denis Zharkov
2014-12-18 16:01:41 +03:00
parent 6df91fdda7
commit 04e560bc74
6 changed files with 42 additions and 9 deletions
@@ -37,6 +37,7 @@ import org.jetbrains.jet.codegen.context.*;
import org.jetbrains.jet.codegen.inline.*; import org.jetbrains.jet.codegen.inline.*;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod; import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.codegen.when.SwitchCodegen; import org.jetbrains.jet.codegen.when.SwitchCodegen;
@@ -2311,10 +2312,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
TypeParameterDescriptor parameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(entry.getValue()); TypeParameterDescriptor parameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(entry.getValue());
if (parameterDescriptor == null) { if (parameterDescriptor == null) {
// type is not generic // type is not generic
// boxType call needed because inlined method is compiled for T as java/lang/Object BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE);
Type type = typeMapper.mapTypeParameter(entry.getValue(), signatureWriter);
mappings.addParameterMappingToType( mappings.addParameterMappingToType(
key.getName().getIdentifier(), key.getName().getIdentifier(),
boxType(asmType(entry.getValue())) type,
signatureWriter.toString()
); );
} }
else { else {
@@ -105,8 +105,7 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
} }
// else TypeVariable is replaced by concrete type // else TypeVariable is replaced by concrete type
visitClassType(mapping.asmType!!.getInternalName()) SignatureReader(mapping.signature).accept(this)
visitEnd()
} }
override fun visitFormalTypeParameter(name: String?) { override fun visitFormalTypeParameter(name: String?) {
@@ -197,12 +196,12 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
public class ReifiedTypeParameterMappings() { public class ReifiedTypeParameterMappings() {
private val mappingsByName = hashMapOf<String, ReifiedTypeParameterMapping>() private val mappingsByName = hashMapOf<String, ReifiedTypeParameterMapping>()
public fun addParameterMappingToType(name: String, asmType: Type) { public fun addParameterMappingToType(name: String, asmType: Type, signature: String) {
mappingsByName[name] = ReifiedTypeParameterMapping(name, asmType, null) mappingsByName[name] = ReifiedTypeParameterMapping(name, asmType, newName = null, signature = signature)
} }
public fun addParameterMappingToNewParameter(name: String, newName: String) { public fun addParameterMappingToNewParameter(name: String, newName: String) {
mappingsByName[name] = ReifiedTypeParameterMapping(name, null, newName) mappingsByName[name] = ReifiedTypeParameterMapping(name, asmType = null, newName = newName, signature = null)
} }
fun get(name: String): ReifiedTypeParameterMapping? { fun get(name: String): ReifiedTypeParameterMapping? {
@@ -210,7 +209,7 @@ public class ReifiedTypeParameterMappings() {
} }
} }
public class ReifiedTypeParameterMapping(val name: String, val asmType: Type?, val newName: String?) public class ReifiedTypeParameterMapping(val name: String, val asmType: Type?, val newName: String?, val signature: String?)
public class ReifiedTypeParametersUsages { public class ReifiedTypeParametersUsages {
val usedTypeParameters: MutableSet<String> = hashSetOf() val usedTypeParameters: MutableSet<String> = hashSetOf()
@@ -184,6 +184,11 @@ public class JetTypeMapper {
return mapType(jetType, signatureVisitor, JetTypeMapperMode.SUPER_TYPE); return mapType(jetType, signatureVisitor, JetTypeMapperMode.SUPER_TYPE);
} }
@NotNull
public Type mapTypeParameter(@NotNull JetType jetType, @Nullable BothSignatureWriter signatureVisitor) {
return mapType(jetType, signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER);
}
@NotNull @NotNull
public Type mapClass(@NotNull ClassifierDescriptor classifier) { public Type mapClass(@NotNull ClassifierDescriptor classifier) {
return mapType(classifier.getDefaultType(), null, JetTypeMapperMode.IMPL); return mapType(classifier.getDefaultType(), null, JetTypeMapperMode.IMPL);
@@ -0,0 +1,19 @@
import kotlin.test.assertEquals
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
open class TypeLiteral<T> {
val type: Type
get() = (javaClass.getGenericSuperclass() as ParameterizedType).getActualTypeArguments()[0]
}
inline fun <reified T> typeLiteral(): TypeLiteral<T> = object : TypeLiteral<T>() {}
fun box(): String {
assertEquals("class java.lang.String", typeLiteral<String>().type.toString())
assertEquals("java.util.List<?>", typeLiteral<List<*>>().type.toString())
assertEquals("java.lang.String[]", typeLiteral<Array<String>>().type.toString())
assertEquals("java.lang.Integer[]", typeLiteral<Array<Int>>().type.toString())
assertEquals("java.lang.String[][]", typeLiteral<Array<Array<String>>>().type.toString())
return "OK"
}
@@ -2944,6 +2944,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
doTestWithStdlib(fileName); doTestWithStdlib(fileName);
} }
@TestMetadata("kt6485.kt")
public void testKt6485() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/kt6485.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("nestedReified.kt") @TestMetadata("nestedReified.kt")
public void testNestedReified() throws Exception { public void testNestedReified() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/nestedReified.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/nestedReified.kt");
+1 -1
View File
@@ -56,5 +56,5 @@ inline fun <reified T> typeLiteral(): TypeLiteral<T> = object : TypeLiteral<T>()
typeLiteral<String>().type // returns 'class java.lang.String' typeLiteral<String>().type // returns 'class java.lang.String'
typeLiteral<Array<String>>().type // returns '[Ljava.lang.String;' typeLiteral<Array<String>>().type // returns '[Ljava.lang.String;'
typeLiteral<List<*>>().type // returns 'java.util.List<? extends java.lang.Object>' typeLiteral<List<*>>().type // returns 'java.util.List<?>'
``` ```