From 3636046e2dd71cc5306f5c3d8d21de49b0b5f162 Mon Sep 17 00:00:00 2001 From: "victor.petukhov" Date: Thu, 25 Apr 2019 17:20:53 +0300 Subject: [PATCH] [FIR] Add test with potential recursive call in compiler FE on when with sealed class inside it (KT-18583) --- .../recursiveCallOnWhenWithSealedClass.kt | 11 +++++ .../recursiveCallOnWhenWithSealedClass.txt | 42 +++++++++++++++++++ .../fir/FirResolveTestCaseGenerated.java | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.kt create mode 100644 compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt diff --git a/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.kt b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.kt new file mode 100644 index 00000000000..cd9b9c385c7 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.kt @@ -0,0 +1,11 @@ +// Issue: KT-18583 + +sealed class Maybe { + class Nope(val reasonForLog: String, val reasonForUI: String) : Maybe() + class Yeah(val meat: T) : Maybe() + + fun unwrap() = when (this) { + is Nope -> throw Exception("") + is Yeah -> meat + } +} diff --git a/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt new file mode 100644 index 00000000000..cf6d21937da --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt @@ -0,0 +1,42 @@ +FILE: recursiveCallOnWhenWithSealedClass.kt + public sealed class Maybe : R|kotlin/Any| { + private constructor(): R|Maybe| { + super() + } + + public final class Nope : R|Maybe| { + public constructor(reasonForLog: R|kotlin/String|, reasonForUI: R|kotlin/String|): R|Maybe.Nope| { + super|>() + } + + public final val reasonForLog: R|kotlin/String| = R|/reasonForLog| + public get(): R|kotlin/String| + + public final val reasonForUI: R|kotlin/String| = R|/reasonForUI| + public get(): R|kotlin/String| + + } + + public final class Yeah : R|Maybe| { + public constructor(meat: R|T|): R|Maybe.Yeah| { + super|>() + } + + public final val meat: R|T| = R|/meat| + public get(): R|T| + + } + + public final fun unwrap(): R|class error: Unresolved name: meat| { + ^unwrap when (this#) { + ($subj$ is R|Maybe.Nope|) -> { + throw R|java/lang/Exception.Exception|(String()) + } + ($subj$ is R|Maybe.Yeah|) -> { + # + } + } + + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 1a5d76ee282..2051329cfb7 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -94,6 +94,11 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { runTest("compiler/fir/resolve/testData/resolve/NestedSuperType.kt"); } + @TestMetadata("recursiveCallOnWhenWithSealedClass.kt") + public void testRecursiveCallOnWhenWithSealedClass() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.kt"); + } + @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { runTest("compiler/fir/resolve/testData/resolve/simpleClass.kt");