Rename SuccessOrFailure to Result and hide Failure from ABI
* The members of Result are isSuccess, isFailure, exceptionOrNull, getOrNull * The rest of API is implemented via inline-only extensions * There are two internal functions to hide detailed mechanics of an internal Result.Failure class: createFailure and throwOnFailure * Result.toString is explicit: either Success(v) or Failure(x) See KT-26538
This commit is contained in:
@@ -64,7 +64,7 @@ abstract class AbstractCoroutineCodegen(
|
||||
if (languageVersionSettings.isReleaseCoroutines())
|
||||
createImplMethod(
|
||||
INVOKE_SUSPEND_METHOD_NAME,
|
||||
"result" to classDescriptor.module.getSuccessOrFailure(classDescriptor.builtIns.anyType)
|
||||
"result" to classDescriptor.module.getResult(classDescriptor.builtIns.anyType)
|
||||
)
|
||||
else
|
||||
createImplMethod(
|
||||
|
||||
+3
-3
@@ -759,11 +759,11 @@ private fun InstructionAdapter.generateResumeWithExceptionCheck(isReleaseCorouti
|
||||
val noExceptionLabel = Label()
|
||||
|
||||
if (isReleaseCoroutines) {
|
||||
instanceOf(AsmTypes.SUCCESS_OR_FAILURE_FAILURE)
|
||||
instanceOf(AsmTypes.RESULT_FAILURE)
|
||||
ifeq(noExceptionLabel)
|
||||
// TODO: do we need this checkcast?
|
||||
checkcast(AsmTypes.SUCCESS_OR_FAILURE_FAILURE)
|
||||
getfield(AsmTypes.SUCCESS_OR_FAILURE_FAILURE.internalName, "exception", AsmTypes.JAVA_THROWABLE_TYPE.descriptor)
|
||||
checkcast(AsmTypes.RESULT_FAILURE)
|
||||
getfield(AsmTypes.RESULT_FAILURE.internalName, "exception", AsmTypes.JAVA_THROWABLE_TYPE.descriptor)
|
||||
} else {
|
||||
ifnull(noExceptionLabel)
|
||||
}
|
||||
|
||||
+3
-3
@@ -303,16 +303,16 @@ fun <D : FunctionDescriptor> D.createCustomCopy(
|
||||
private fun FunctionDescriptor.getContinuationParameterTypeOfSuspendFunction(isReleaseCoroutines: Boolean) =
|
||||
module.getContinuationOfTypeOrAny(returnType!!, if (this.needsExperimentalCoroutinesWrapper()) false else isReleaseCoroutines)
|
||||
|
||||
fun ModuleDescriptor.getSuccessOrFailure(kotlinType: KotlinType) =
|
||||
fun ModuleDescriptor.getResult(kotlinType: KotlinType) =
|
||||
module.resolveTopLevelClass(
|
||||
DescriptorUtils.SUCCESS_OR_FAILURE_FQ_NAME,
|
||||
DescriptorUtils.RESULT_FQ_NAME,
|
||||
NoLookupLocation.FROM_BACKEND
|
||||
)?.defaultType?.let {
|
||||
KotlinTypeFactory.simpleType(
|
||||
it,
|
||||
arguments = listOf(kotlinType.asTypeProjection())
|
||||
)
|
||||
} ?: ErrorUtils.createErrorType("For SuccessOrFailure")
|
||||
} ?: ErrorUtils.createErrorType("For Result")
|
||||
|
||||
private fun MethodNode.invokeNormalizeContinuation(languageVersionSettings: LanguageVersionSettings) {
|
||||
visitMethodInsn(
|
||||
|
||||
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.codegen.state
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.load.kotlin.getRepresentativeUpperBound
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.RESULT_FQ_NAME
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.SUCCESS_OR_FAILURE_FQ_NAME
|
||||
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
@@ -50,7 +49,7 @@ private fun KotlinType.isInlineClassThatRequiresMangling() =
|
||||
isInlineClassType() && !isDontMangleClass(this.constructor.declarationDescriptor as ClassDescriptor)
|
||||
|
||||
private fun isDontMangleClass(classDescriptor: ClassDescriptor) =
|
||||
classDescriptor.fqNameSafe == SUCCESS_OR_FAILURE_FQ_NAME || classDescriptor.fqNameSafe == RESULT_FQ_NAME
|
||||
classDescriptor.fqNameSafe == RESULT_FQ_NAME
|
||||
|
||||
private fun KotlinType.isTypeParameterWithUpperBoundThatRequiresMangling(): Boolean {
|
||||
val descriptor = constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
|
||||
|
||||
@@ -36,7 +36,7 @@ public class AsmTypes {
|
||||
public static final Type MUTABLE_PROPERTY_REFERENCE1 = Type.getObjectType("kotlin/jvm/internal/MutablePropertyReference1");
|
||||
public static final Type MUTABLE_PROPERTY_REFERENCE2 = Type.getObjectType("kotlin/jvm/internal/MutablePropertyReference2");
|
||||
|
||||
public static final Type SUCCESS_OR_FAILURE_FAILURE = Type.getObjectType("kotlin/SuccessOrFailure$Failure");
|
||||
public static final Type RESULT_FAILURE = Type.getObjectType("kotlin/Result$Failure");
|
||||
|
||||
public static final Type[] PROPERTY_REFERENCE_IMPL = {
|
||||
Type.getObjectType("kotlin/jvm/internal/PropertyReference0Impl"),
|
||||
|
||||
@@ -99,7 +99,7 @@ fun box(): String {
|
||||
if (res != "first") {
|
||||
return "" + res
|
||||
}
|
||||
continuation!!.resumeWith(SuccessOrFailure.success(Unit))
|
||||
continuation!!.resumeWith(Result.success(Unit))
|
||||
res = (continuation!! as BaseContinuationImpl).getSpilledVariableFieldMapping()!!.toMap()["I$0"] ?: "multipleLocalsInOneSlot fail 2"
|
||||
if (res != "second") {
|
||||
return "" + res
|
||||
|
||||
+8
-8
@@ -10,30 +10,30 @@ fun builder(c: suspend () -> Unit) {
|
||||
}
|
||||
|
||||
@Suppress("UNSUPPORTED_FEATURE")
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract suspend fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract suspend fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
inline fun <T> SuccessOrFailureReceiver(crossinline f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override suspend fun receive(result: SuccessOrFailure<T>) {
|
||||
inline fun <T> ResultReceiver(crossinline f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override suspend fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<String> { result ->
|
||||
val receiver = ResultReceiver<String> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
builder {
|
||||
receiver.receive(SuccessOrFailure("42"))
|
||||
receiver.receive(Result("42"))
|
||||
}
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
|
||||
+8
-8
@@ -10,30 +10,30 @@ fun builder(c: suspend () -> Unit) {
|
||||
}
|
||||
|
||||
@Suppress("UNSUPPORTED_FEATURE")
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract suspend fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract suspend fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
fun <T> SuccessOrFailureReceiver(f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override suspend fun receive(result: SuccessOrFailure<T>) {
|
||||
fun <T> ResultReceiver(f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override suspend fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<Int> { result ->
|
||||
val receiver = ResultReceiver<Int> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
builder {
|
||||
receiver.receive(SuccessOrFailure(42))
|
||||
receiver.receive(Result(42))
|
||||
}
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
|
||||
@@ -30,7 +30,7 @@ var proceed = {}
|
||||
|
||||
suspend fun suspendHere() = suspendCoroutineUninterceptedOrReturn<Unit> { cont ->
|
||||
proceed = {
|
||||
cont.resumeWith(SuccessOrFailure.success(Unit))
|
||||
cont.resumeWith(Result.success(Unit))
|
||||
}
|
||||
COROUTINE_SUSPENDED
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ var proceed = {}
|
||||
|
||||
suspend fun suspendHere() = suspendCoroutineUninterceptedOrReturn<Unit> { cont ->
|
||||
proceed = {
|
||||
cont.resumeWith(SuccessOrFailure.success(Unit))
|
||||
cont.resumeWith(Result.success(Unit))
|
||||
}
|
||||
COROUTINE_SUSPENDED
|
||||
}
|
||||
|
||||
+8
-8
@@ -1,29 +1,29 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
fun <T> SuccessOrFailureReceiver(f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override fun receive(result: SuccessOrFailure<T>) {
|
||||
fun <T> ResultReceiver(f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<Int> { result ->
|
||||
val receiver = ResultReceiver<Int> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
receiver.receive(SuccessOrFailure(42))
|
||||
receiver.receive(Result(42))
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
}
|
||||
|
||||
+8
-8
@@ -1,29 +1,29 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
inline fun <T> SuccessOrFailureReceiver(crossinline f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override fun receive(result: SuccessOrFailure<T>) {
|
||||
inline fun <T> ResultReceiver(crossinline f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<String> { result ->
|
||||
val receiver = ResultReceiver<String> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
receiver.receive(SuccessOrFailure("42"))
|
||||
receiver.receive(Result("42"))
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
}
|
||||
|
||||
+8
-8
@@ -1,15 +1,15 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<out T>(val value: Any?) {
|
||||
inline class Result<out T>(val value: Any?) {
|
||||
val isFailure: Boolean get() = value is Failure
|
||||
|
||||
public companion object {
|
||||
public inline fun <T> success(value: T): SuccessOrFailure<T> =
|
||||
SuccessOrFailure(value)
|
||||
public inline fun <T> success(value: T): Result<T> =
|
||||
Result(value)
|
||||
|
||||
public inline fun <T> failure(exception: Throwable): SuccessOrFailure<T> =
|
||||
SuccessOrFailure(Failure(exception))
|
||||
public inline fun <T> failure(exception: Throwable): Result<T> =
|
||||
Result(Failure(exception))
|
||||
}
|
||||
|
||||
class Failure (
|
||||
@@ -17,11 +17,11 @@ inline class SuccessOrFailure<out T>(val value: Any?) {
|
||||
)
|
||||
}
|
||||
|
||||
inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R> {
|
||||
inline fun <R> runCatching(block: () -> R): Result<R> {
|
||||
return try {
|
||||
SuccessOrFailure.success(block())
|
||||
Result.success(block())
|
||||
} catch (e: Throwable) {
|
||||
SuccessOrFailure.failure(e)
|
||||
Result.failure(e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ fun builder(c: suspend () -> Unit) {
|
||||
override val context: CoroutineContext
|
||||
get() = EmptyCoroutineContext
|
||||
|
||||
override fun resumeWith(result: SuccessOrFailure<Unit>) {
|
||||
override fun resumeWith(result: Result<Unit>) {
|
||||
result.getOrThrow()
|
||||
}
|
||||
})
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ fun builder(c: suspend () -> Unit) {
|
||||
override val context: CoroutineContext
|
||||
get() = EmptyCoroutineContext
|
||||
|
||||
override fun resumeWith(result: SuccessOrFailure<Unit>) {
|
||||
override fun resumeWith(result: Result<Unit>) {
|
||||
result.getOrThrow()
|
||||
}
|
||||
})
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ fun builder(c: suspend () -> Unit) {
|
||||
override val context: CoroutineContext
|
||||
get() = EmptyCoroutineContext
|
||||
|
||||
override fun resumeWith(r: SuccessOrFailure<Unit>) {
|
||||
override fun resumeWith(r: Result<Unit>) {
|
||||
r.getOrThrow()
|
||||
proceed = {
|
||||
result = "OK"
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ fun builder(c: suspend () -> Unit) {
|
||||
override val context: CoroutineContext
|
||||
get() = EmptyCoroutineContext
|
||||
|
||||
override fun resumeWith(r: SuccessOrFailure<Unit>) {
|
||||
override fun resumeWith(r: Result<Unit>) {
|
||||
r.getOrThrow()
|
||||
proceed = {
|
||||
result = "OK"
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
import kotlin.coroutines.*
|
||||
import kotlin.coroutines.intrinsics.*
|
||||
suspend fun suspendHere(): String = suspendCoroutineUninterceptedOrReturn { x ->
|
||||
x.resumeWith(SuccessOrFailure.success("OK"))
|
||||
x.resumeWith(Result.success("OK"))
|
||||
}
|
||||
|
||||
suspend fun suspendThere(param: Int, param2: String, param3: Long): String {
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// WITH_COROUTINES
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val result = Result.success("yes!")
|
||||
val failure = Result.failure<String>(Exception())
|
||||
|
||||
if (result.isSuccess) println("success")
|
||||
if (result.isFailure) println("failure")
|
||||
println(result.getOrThrow())
|
||||
println(failure.getOrNull())
|
||||
println(failure.exceptionOrNull())
|
||||
|
||||
val other = Result.success("nope")
|
||||
if (result == other) println("==")
|
||||
if (result != other) println("!=")
|
||||
if (result.equals(other)) println("equals")
|
||||
if (!result.equals(other)) println("!equals")
|
||||
|
||||
println(result.hashCode())
|
||||
println(result.toString())
|
||||
println("$result")
|
||||
|
||||
val ans1 = runCatching { 42 }
|
||||
println(ans1)
|
||||
|
||||
val ans2 = 42.runCatching { this }
|
||||
println(ans2)
|
||||
|
||||
println(result.getOrElse { "oops" })
|
||||
println(result.getOrDefault("oops"))
|
||||
}
|
||||
|
||||
// @TestKt.class:
|
||||
// 0 INVOKESTATIC Result.box-impl
|
||||
// 0 INVOKESTATIC Result.unbox-impl
|
||||
// 0 Result\$Failure
|
||||
// 53 Result
|
||||
Vendored
-36
@@ -1,36 +0,0 @@
|
||||
// WITH_COROUTINES
|
||||
// FILE: test.kt
|
||||
fun testSoF() {
|
||||
val sof = SuccessOrFailure.success("yes!")
|
||||
val failure = SuccessOrFailure.failure<String>(Exception())
|
||||
|
||||
if (sof.isSuccess) println("success")
|
||||
if (sof.isFailure) println("failure")
|
||||
println(sof.getOrThrow())
|
||||
println(failure.getOrNull())
|
||||
println(failure.exceptionOrNull())
|
||||
|
||||
val other = SuccessOrFailure.success("nope")
|
||||
if (sof == other) println("==")
|
||||
if (sof != other) println("!=")
|
||||
if (sof.equals(other)) println("equals")
|
||||
if (!sof.equals(other)) println("!equals")
|
||||
|
||||
println(sof.hashCode())
|
||||
println(sof.toString())
|
||||
println("$sof")
|
||||
|
||||
val ans1 = runCatching { 42 }
|
||||
println(ans1)
|
||||
|
||||
val ans2 = 42.runCatching { this }
|
||||
println(ans2)
|
||||
|
||||
println(sof.getOrElse { "oops" })
|
||||
println(sof.getOrDefault("oops"))
|
||||
}
|
||||
|
||||
// @TestKt.class:
|
||||
// 0 SuccessOrFailure\$Erased
|
||||
// 0 SuccessOrFailure\-Erased
|
||||
// 58 SuccessOrFailure
|
||||
@@ -19,7 +19,7 @@ fun builder(x: suspend () -> Unit) {
|
||||
x.startCoroutine(object : Continuation<Any?> {
|
||||
override val context: CoroutineContext = EmptyCoroutineContext
|
||||
|
||||
override fun resumeWith(result: SuccessOrFailure<Any?>) {
|
||||
override fun resumeWith(result: Result<Any?>) {
|
||||
result.getOrThrow()
|
||||
}
|
||||
})
|
||||
|
||||
@@ -17,7 +17,7 @@ fun createTextForHelpers(isReleaseCoroutines: Boolean): String {
|
||||
val emptyContinuationBody =
|
||||
if (isReleaseCoroutines)
|
||||
"""
|
||||
|override fun resumeWith(result: SuccessOrFailure<Any?>) {
|
||||
|override fun resumeWith(result: Result<Any?>) {
|
||||
| result.getOrThrow()
|
||||
|}
|
||||
""".trimMargin()
|
||||
@@ -30,7 +30,7 @@ fun createTextForHelpers(isReleaseCoroutines: Boolean): String {
|
||||
val handleResultContinuationBody =
|
||||
if (isReleaseCoroutines)
|
||||
"""
|
||||
|override fun resumeWith(result: SuccessOrFailure<T>) {
|
||||
|override fun resumeWith(result: Result<T>) {
|
||||
| x(result.getOrThrow())
|
||||
|}
|
||||
""".trimMargin()
|
||||
@@ -46,7 +46,7 @@ fun createTextForHelpers(isReleaseCoroutines: Boolean): String {
|
||||
val handleExceptionContinuationBody =
|
||||
if (isReleaseCoroutines)
|
||||
"""
|
||||
|override fun resumeWith(result: SuccessOrFailure<Any?>) {
|
||||
|override fun resumeWith(result: Result<Any?>) {
|
||||
| result.exceptionOrNull()?.let(x)
|
||||
|}
|
||||
""".trimMargin()
|
||||
@@ -62,7 +62,7 @@ fun createTextForHelpers(isReleaseCoroutines: Boolean): String {
|
||||
val continuationAdapterBody =
|
||||
if (isReleaseCoroutines)
|
||||
"""
|
||||
|override fun resumeWith(result: SuccessOrFailure<T>) {
|
||||
|override fun resumeWith(result: Result<T>) {
|
||||
| if (result.isSuccess) {
|
||||
| resume(result.getOrThrow())
|
||||
| } else {
|
||||
|
||||
+5
-5
@@ -2168,16 +2168,16 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/propertySetterWithInlineClassTypeArgument.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("resultApiDoesntUseBox.kt")
|
||||
public void testResultApiDoesntUseBox() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/resultApiDoesntUseBox.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("skipCallToUnderlyingValueOfInlineClass.kt")
|
||||
public void testSkipCallToUnderlyingValueOfInlineClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/skipCallToUnderlyingValueOfInlineClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("successOrFailureApiDoesntUseErasedClass.kt")
|
||||
public void testSuccessOrFailureApiDoesntUseErasedClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/successOrFailureApiDoesntUseErasedClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("toStringIsCalledByInlineClass.kt")
|
||||
public void testToStringIsCalledByInlineClass() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeText/inlineClasses/toStringIsCalledByInlineClass.kt");
|
||||
|
||||
Reference in New Issue
Block a user