diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5e8d4dfa0d6..61fb27d8272 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -37,6 +37,7 @@ import org.jetbrains.jet.codegen.context.*; import org.jetbrains.jet.codegen.inline.*; import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod; 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.JetTypeMapper; import org.jetbrains.jet.codegen.when.SwitchCodegen; @@ -2311,10 +2312,13 @@ public class ExpressionCodegen extends JetVisitor implem TypeParameterDescriptor parameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(entry.getValue()); if (parameterDescriptor == null) { // 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( key.getName().getIdentifier(), - boxType(asmType(entry.getValue())) + type, + signatureWriter.toString() ); } else { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt b/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt index 80556472b24..6215215bc82 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/ReifiedTypeInliner.kt @@ -105,8 +105,7 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame } // else TypeVariable is replaced by concrete type - visitClassType(mapping.asmType!!.getInternalName()) - visitEnd() + SignatureReader(mapping.signature).accept(this) } override fun visitFormalTypeParameter(name: String?) { @@ -197,12 +196,12 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame public class ReifiedTypeParameterMappings() { private val mappingsByName = hashMapOf() - public fun addParameterMappingToType(name: String, asmType: Type) { - mappingsByName[name] = ReifiedTypeParameterMapping(name, asmType, null) + public fun addParameterMappingToType(name: String, asmType: Type, signature: String) { + mappingsByName[name] = ReifiedTypeParameterMapping(name, asmType, newName = null, signature = signature) } 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? { @@ -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 { val usedTypeParameters: MutableSet = hashSetOf() diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 900f13c7398..1a4d71cf4a2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -184,6 +184,11 @@ public class JetTypeMapper { 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 public Type mapClass(@NotNull ClassifierDescriptor classifier) { return mapType(classifier.getDefaultType(), null, JetTypeMapperMode.IMPL); diff --git a/compiler/testData/codegen/boxWithStdlib/reified/kt6485.kt b/compiler/testData/codegen/boxWithStdlib/reified/kt6485.kt new file mode 100644 index 00000000000..4b50b92c821 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/reified/kt6485.kt @@ -0,0 +1,19 @@ +import kotlin.test.assertEquals +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +open class TypeLiteral { + val type: Type + get() = (javaClass.getGenericSuperclass() as ParameterizedType).getActualTypeArguments()[0] +} + +inline fun typeLiteral(): TypeLiteral = object : TypeLiteral() {} + +fun box(): String { + assertEquals("class java.lang.String", typeLiteral().type.toString()) + assertEquals("java.util.List", typeLiteral>().type.toString()) + assertEquals("java.lang.String[]", typeLiteral>().type.toString()) + assertEquals("java.lang.Integer[]", typeLiteral>().type.toString()) + assertEquals("java.lang.String[][]", typeLiteral>>().type.toString()) + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 11c68befa55..0d1e285b35e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -2944,6 +2944,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode 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") public void testNestedReified() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/nestedReified.kt"); diff --git a/spec-docs/reified-type-parameters.md b/spec-docs/reified-type-parameters.md index c58427b8465..f986f629f4f 100644 --- a/spec-docs/reified-type-parameters.md +++ b/spec-docs/reified-type-parameters.md @@ -56,5 +56,5 @@ inline fun typeLiteral(): TypeLiteral = object : TypeLiteral() typeLiteral().type // returns 'class java.lang.String' typeLiteral>().type // returns '[Ljava.lang.String;' -typeLiteral>().type // returns 'java.util.List' +typeLiteral>().type // returns 'java.util.List' ```