Get reified signature from JetTypeMapper
#KT-6485 Fixed
This commit is contained in:
@@ -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<StackValue, StackValue> 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 {
|
||||
|
||||
@@ -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<String, ReifiedTypeParameterMapping>()
|
||||
|
||||
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<String> = hashSetOf()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
+6
@@ -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");
|
||||
|
||||
@@ -56,5 +56,5 @@ inline fun <reified T> typeLiteral(): TypeLiteral<T> = object : TypeLiteral<T>()
|
||||
|
||||
typeLiteral<String>().type // returns 'class java.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<?>'
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user