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.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"
|
||||||
|
}
|
||||||
+6
@@ -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");
|
||||||
|
|||||||
@@ -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<?>'
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user