javaClass<T> is supported for reified T
This commit is contained in:
committed by
Andrey Breslav
parent
f3c49c605f
commit
fc1d8dd9ce
@@ -3810,7 +3810,7 @@ The "returned" value of try expression with no finally is either the last expres
|
|||||||
return StackValue.onStack(type);
|
return StackValue.onStack(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putReifierMarkerIfTypeIsReifiedParameter(@NotNull JetType type, @NotNull String markerMethodName) {
|
public void putReifierMarkerIfTypeIsReifiedParameter(@NotNull JetType type, @NotNull String markerMethodName) {
|
||||||
TypeParameterDescriptor typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type);
|
TypeParameterDescriptor typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type);
|
||||||
if (typeParameterDescriptor != null && typeParameterDescriptor.isReified()) {
|
if (typeParameterDescriptor != null && typeParameterDescriptor.isReified()) {
|
||||||
v.iconst(typeParameterDescriptor.getIndex());
|
v.iconst(typeParameterDescriptor.getIndex());
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
public val NEW_ARRAY_MARKER_METHOD_NAME: String = "reifyNewArray"
|
public val NEW_ARRAY_MARKER_METHOD_NAME: String = "reifyNewArray"
|
||||||
public val CHECKCAST_MARKER_METHOD_NAME: String = "reifyCheckcast"
|
public val CHECKCAST_MARKER_METHOD_NAME: String = "reifyCheckcast"
|
||||||
public val INSTANCEOF_MARKER_METHOD_NAME: String = "reifyInstanceof"
|
public val INSTANCEOF_MARKER_METHOD_NAME: String = "reifyInstanceof"
|
||||||
|
public val JAVA_CLASS_MARKER_METHOD_NAME: String = "reifyJavaClass"
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun reifyInstructions(instructions: InsnList) {
|
public fun reifyInstructions(instructions: InsnList) {
|
||||||
@@ -62,6 +63,7 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
NEW_ARRAY_MARKER_METHOD_NAME -> processNewArray(insn, asmType)
|
NEW_ARRAY_MARKER_METHOD_NAME -> processNewArray(insn, asmType)
|
||||||
CHECKCAST_MARKER_METHOD_NAME -> processCheckcast(insn, asmType)
|
CHECKCAST_MARKER_METHOD_NAME -> processCheckcast(insn, asmType)
|
||||||
INSTANCEOF_MARKER_METHOD_NAME -> processInstanceof(insn, asmType)
|
INSTANCEOF_MARKER_METHOD_NAME -> processInstanceof(insn, asmType)
|
||||||
|
JAVA_CLASS_MARKER_METHOD_NAME -> processJavaClass(insn, asmType)
|
||||||
else -> false
|
else -> false
|
||||||
}) {
|
}) {
|
||||||
return
|
return
|
||||||
@@ -88,6 +90,13 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun processJavaClass(insn: MethodInsnNode, parameter: Type): Boolean {
|
||||||
|
val next = insn.getNext()
|
||||||
|
if (next !is LdcInsnNode) return false
|
||||||
|
next.cst = parameter
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
private fun getParameterIndex(insn: MethodInsnNode): Int? {
|
private fun getParameterIndex(insn: MethodInsnNode): Int? {
|
||||||
val prev = insn.getPrevious()!!
|
val prev = insn.getPrevious()!!
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||||
import org.jetbrains.jet.codegen.StackValue;
|
import org.jetbrains.jet.codegen.StackValue;
|
||||||
|
import org.jetbrains.jet.codegen.inline.ReifiedTypeInliner;
|
||||||
import org.jetbrains.jet.lang.psi.JetElement;
|
import org.jetbrains.jet.lang.psi.JetElement;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage;
|
import org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage;
|
||||||
@@ -49,7 +50,12 @@ public class JavaClassFunction extends IntrinsicMethod {
|
|||||||
(JetElement) element, codegen.getBindingContext());
|
(JetElement) element, codegen.getBindingContext());
|
||||||
JetType returnType = resolvedCall.getResultingDescriptor().getReturnType();
|
JetType returnType = resolvedCall.getResultingDescriptor().getReturnType();
|
||||||
assert returnType != null;
|
assert returnType != null;
|
||||||
putJavaLangClassInstance(v, codegen.getState().getTypeMapper().mapType(returnType.getArguments().get(0).getType()));
|
|
||||||
|
JetType type = returnType.getArguments().get(0).getType();
|
||||||
|
|
||||||
|
codegen.putReifierMarkerIfTypeIsReifiedParameter(type, ReifiedTypeInliner.JAVA_CLASS_MARKER_METHOD_NAME);
|
||||||
|
|
||||||
|
putJavaLangClassInstance(v, codegen.getState().getTypeMapper().mapType(type));
|
||||||
|
|
||||||
return getType(Class.class);
|
return getType(Class.class);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
inline fun <reified T> foo(x: Class<T> = javaClass<T>()): String = x.getName()
|
||||||
|
|
||||||
|
inline fun <reified R> bar(x: R): String = foo<R>()
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assertEquals("java.lang.String", foo<String>())
|
||||||
|
assertEquals("java.lang.Integer", foo<Int>())
|
||||||
|
assertEquals("java.lang.Object", foo<Any>())
|
||||||
|
|
||||||
|
assertEquals("java.lang.String", bar("abc"))
|
||||||
|
assertEquals("java.lang.Integer", bar(1))
|
||||||
|
assertEquals("java.lang.Object", bar(Any()))
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
inline fun<reified T> javaClassName(): String {
|
||||||
|
return javaClass<T>().getName()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assertEquals("java.lang.String", javaClassName<String>())
|
||||||
|
assertEquals("java.lang.Integer", javaClassName<Int>())
|
||||||
|
assertEquals("java.lang.Object", javaClassName<Any>())
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+12
@@ -2426,6 +2426,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("defaultJavaClass.kt")
|
||||||
|
public void testDefaultJavaClass() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/defaultJavaClass.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("filterIsInstance.kt")
|
@TestMetadata("filterIsInstance.kt")
|
||||||
public void testFilterIsInstance() throws Exception {
|
public void testFilterIsInstance() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/filterIsInstance.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/filterIsInstance.kt");
|
||||||
@@ -2438,6 +2444,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("javaClass.kt")
|
||||||
|
public void testJavaClass() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/javaClass.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("newArrayInt.kt")
|
@TestMetadata("newArrayInt.kt")
|
||||||
public void testNewArrayInt() throws Exception {
|
public void testNewArrayInt() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/newArrayInt.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reified/newArrayInt.kt");
|
||||||
|
|||||||
@@ -118,6 +118,10 @@ public class Intrinsics {
|
|||||||
throwUndefinedForReified();
|
throwUndefinedForReified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void reifyJavaClass(int parameterTypeIndex) {
|
||||||
|
throwUndefinedForReified();
|
||||||
|
}
|
||||||
|
|
||||||
public static <T extends Throwable> T sanitizeStackTrace(T throwable) {
|
public static <T extends Throwable> T sanitizeStackTrace(T throwable) {
|
||||||
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
StackTraceElement[] stackTrace = throwable.getStackTrace();
|
||||||
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>(stackTrace.length);
|
ArrayList<StackTraceElement> list = new ArrayList<StackTraceElement>(stackTrace.length);
|
||||||
|
|||||||
Reference in New Issue
Block a user