From 0569f810cf05decf83ba871afa73b8012c9a8682 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Thu, 6 May 2021 14:08:38 +0200 Subject: [PATCH] [FIR IDE] Add OnAir resolve tests --- .../kotlin/generators/tests/GenerateTests.kt | 3 + .../testdata/onAirResolve/classInClass.kt | 9 ++ .../testdata/onAirResolve/classInClass.txt | 10 ++ .../onAirResolve/identifierInContext.kt | 10 ++ .../onAirResolve/identifierInContext.txt | 1 + .../testdata/onAirResolve/inParameter.kt | 6 + .../testdata/onAirResolve/inParameter.txt | 1 + .../onAirResolve/incompleteIdentifier.kt | 8 ++ .../onAirResolve/incompleteIdentifier.txt | 2 + .../testdata/onAirResolve/localClass.kt | 9 ++ .../testdata/onAirResolve/localClass.txt | 10 ++ .../testdata/onAirResolve/localFunction.kt | 6 + .../testdata/onAirResolve/localFunction.txt | 3 + .../testdata/onAirResolve/loopConstruction.kt | 13 ++ .../onAirResolve/loopConstruction.txt | 6 + .../testdata/onAirResolve/memberInClass.kt | 5 + .../testdata/onAirResolve/memberInClass.txt | 3 + .../onAirResolve/memberPropertyInClass.kt | 5 + .../onAirResolve/memberPropertyInClass.txt | 2 + .../onAirResolve/memberWithOverride.kt | 9 ++ .../onAirResolve/memberWithOverride.txt | 3 + .../onAirResolve/onAirTypesResolve.kt | 9 ++ .../onAirResolve/onAirTypesResolve.txt | 23 ++++ .../onAirResolve/replacementInHeader.kt | 9 ++ .../onAirResolve/replacementInHeader.txt | 1 + .../replacementInsidePropertyBody.kt | 8 ++ .../replacementInsidePropertyBody.txt | 2 + .../replacementInsidePropertyBody2.kt | 6 + .../replacementInsidePropertyBody2.txt | 2 + .../testdata/onAirResolve/topLevelFunction.kt | 8 ++ .../onAirResolve/topLevelFunction.txt | 6 + .../testdata/onAirResolve/typeAlias.kt | 8 ++ .../testdata/onAirResolve/typeAlias.txt | 1 + .../level/api/AbstractFirOnAirResolveTest.kt | 43 +++++++ .../api/FirOnAirResolveTestGenerated.java | 111 ++++++++++++++++++ 35 files changed, 361 insertions(+) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirOnAirResolveTest.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirOnAirResolveTestGenerated.java diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 685677172c6..9f96d3dd856 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -1075,6 +1075,9 @@ fun main(args: Array) { testClass { model("resolveSealed", recursive = false, extension = null) } + testClass { + model("onAirResolve") + } testClass { model("lazyResolve") } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.kt new file mode 100644 index 00000000000..9ef2b2fab1c --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.kt @@ -0,0 +1,9 @@ +class X { + class Y + open class BASE + /*PLACE*/class PLACE +} + +/*ONAIR*/inner class ONAIR : BASE() { + fun x() = Y() +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.txt new file mode 100644 index 00000000000..58848e01b02 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.txt @@ -0,0 +1,10 @@ +public final inner [BODY_RESOLVE] class ONAIR : R|X.BASE| { + public [BODY_RESOLVE] constructor(): R|X.ONAIR| { + super() + } + + public final [BODY_RESOLVE] fun x(): R|X.Y| { + ^x R|SubstitutionOverride|() + } + +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.kt new file mode 100644 index 00000000000..47e1d375078 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.kt @@ -0,0 +1,10 @@ + +fun xxx() { + val f = 2 + val g = "x" + /*PLACE*/val x = g +} + +fun x() { + /*ONAIR*/val y = f +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.txt new file mode 100644 index 00000000000..9b9b2ec5cd0 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.txt @@ -0,0 +1 @@ +[BODY_RESOLVE] lval y: R|kotlin/Int| = R|/f| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.kt new file mode 100644 index 00000000000..99af2df9bb1 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.kt @@ -0,0 +1,6 @@ +class X { + class Y + fun x(/*PLACE*/x: Int) {} +} + +fun y(/*ONAIR*/y: Y) {} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.txt new file mode 100644 index 00000000000..7df5d13920f --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.txt @@ -0,0 +1 @@ +[BODY_RESOLVE] y: R|X.Y| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.kt new file mode 100644 index 00000000000..c4f607a50a7 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.kt @@ -0,0 +1,8 @@ +class A { + class B +} + +val a: /*PLACE*/A.B.C + +val b: /*ONAIR*/A.B + diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.txt new file mode 100644 index 00000000000..d58e2427922 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.txt @@ -0,0 +1,2 @@ +public final [BODY_RESOLVE] val b: R|A.B| + [BODY_RESOLVE] public get(): R|A.B| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.kt new file mode 100644 index 00000000000..872060469ce --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.kt @@ -0,0 +1,9 @@ +fun xxx() { + val x = 2 + /*PLACE*/class C +} + + +/*ONAIR*/class E { + fun e() = x +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt new file mode 100644 index 00000000000..42fd6d4e087 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.txt @@ -0,0 +1,10 @@ +public? final? [BODY_RESOLVE] class E : R|kotlin/Any| { + public? [BODY_RESOLVE] constructor(): R|E| { + super() + } + + public? final? [BODY_RESOLVE] fun e(): R|kotlin/Int| { + ^e R|/x| + } + +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.kt new file mode 100644 index 00000000000..0136115982e --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.kt @@ -0,0 +1,6 @@ +fun xxx() { + val x = 3 + /*PLACE*/fun lcl() = "" +} + +/*ONAIR*/fun x() = x \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.txt new file mode 100644 index 00000000000..fa988af35ba --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.txt @@ -0,0 +1,3 @@ +local final [BODY_RESOLVE] fun x(): R|kotlin/Int| { + ^x R|/x| +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.kt new file mode 100644 index 00000000000..a80453e231a --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.kt @@ -0,0 +1,13 @@ +class X +fun f(): X { + var x = 3 + val y = 4 + /*PLACE*/while(true) {} +} + +fun g(): X { + /*ONAIR*/while (x < 2) { + x-- + val z = y + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.txt new file mode 100644 index 00000000000..3efcdb03784 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.txt @@ -0,0 +1,6 @@ +while(CMP(<, R|/x|.R|kotlin/Int.compareTo|(Int(2)))) { + [BODY_RESOLVE] lval : R|kotlin/Int| = R|/x| + R|/x| = R|/|.R|kotlin/Int.dec|() + R|/| + [BODY_RESOLVE] lval z: R|kotlin/Int| = R|/y| +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.kt new file mode 100644 index 00000000000..253899274d4 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.kt @@ -0,0 +1,5 @@ +class Cls { + /*PLACE*/fun member(x: Int) = 2 +} + +/*ONAIR*/fun niewbe(a: Char, b: Double) = "Trololo" diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.txt new file mode 100644 index 00000000000..21e5cf140bc --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.txt @@ -0,0 +1,3 @@ +public final [BODY_RESOLVE] fun niewbe([BODY_RESOLVE] a: R|kotlin/Char|, [BODY_RESOLVE] b: R|kotlin/Double|): R|kotlin/String| { + ^niewbe String(Trololo) +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.kt new file mode 100644 index 00000000000..7fa0cd7c00a --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.kt @@ -0,0 +1,5 @@ +class Cls { + /*PLACE*/val memberProperty = 2 +} + +/*ONAIR*/val niewbe = "Hello" diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.txt new file mode 100644 index 00000000000..040fad74bf5 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.txt @@ -0,0 +1,2 @@ +public final [BODY_RESOLVE] val niewbe: R|kotlin/String| = String(Hello) + [BODY_RESOLVE] public get(): R|kotlin/String| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.kt new file mode 100644 index 00000000000..6b7b67d5125 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.kt @@ -0,0 +1,9 @@ +interface Base { + fun baseMember(): Int +} + +class Derived : Base { + /*PLACE*/fun someMember() = "Hello" +} + +/*ONAIR*/override fun baseMember() = 3 \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.txt new file mode 100644 index 00000000000..66e4edf5d7e --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.txt @@ -0,0 +1,3 @@ +public final override [BODY_RESOLVE] fun baseMember(): R|kotlin/Int| { + ^baseMember Int(3) +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.kt new file mode 100644 index 00000000000..acbcd9c074b --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.kt @@ -0,0 +1,9 @@ +open class X { + /*PLACE*/class PLACE +} + +/*ONAIR*/class Y { + open class BASE : X() + class DERIVED : BASE() + fun withType(arg: BASE) { } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.txt new file mode 100644 index 00000000000..c2f3a2230f6 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.txt @@ -0,0 +1,23 @@ +public final [BODY_RESOLVE] class Y : R|kotlin/Any| { + public [BODY_RESOLVE] constructor(): R|X.Y| { + super() + } + + public? open [BODY_RESOLVE] class BASE : R|X| { + public? [BODY_RESOLVE] constructor(): R|X.Y.BASE| { + super() + } + + } + + public? final? [BODY_RESOLVE] class DERIVED : R|X.Y.BASE| { + public? [BODY_RESOLVE] constructor(): R|X.Y.DERIVED| { + super() + } + + } + + public final [BODY_RESOLVE] fun withType([BODY_RESOLVE] arg: R|X.Y.BASE|): R|kotlin/Unit| { + } + +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.kt new file mode 100644 index 00000000000..6e7114e224a --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.kt @@ -0,0 +1,9 @@ +class C { + fun x(/*PLACE*/a: Int) { + + } +} + +fun y(/*ONAIR*/b: T) { + +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.txt new file mode 100644 index 00000000000..1158513b350 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.txt @@ -0,0 +1 @@ +[BODY_RESOLVE] b: R|T| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.kt new file mode 100644 index 00000000000..d8673abcda6 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.kt @@ -0,0 +1,8 @@ + +val x: Int get() { + val qqq = "Hello" + /*PLACE*/val x = 42 + 2 +} + +/*ONAIR*/val z = qqq \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.txt new file mode 100644 index 00000000000..e8e37cd1748 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.txt @@ -0,0 +1,2 @@ +public? final? [BODY_RESOLVE] val z: R|kotlin/String| = R|/qqq| + [BODY_RESOLVE] public? get(): R|kotlin/String| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.kt new file mode 100644 index 00000000000..a74761f68a3 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.kt @@ -0,0 +1,6 @@ +var x = 2 + set(value) { + /*PLACE*/val inside = "" + } + +/*ONAIR*/val inSetter = value diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.txt new file mode 100644 index 00000000000..2779a1df7b7 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.txt @@ -0,0 +1,2 @@ +public? final? [BODY_RESOLVE] val inSetter: R|kotlin/Int| = R|/value| + [BODY_RESOLVE] public? get(): R|kotlin/Int| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.kt new file mode 100644 index 00000000000..ee00cf73b60 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.kt @@ -0,0 +1,8 @@ +/*PLACE*/fun place(): Int { + fun xxx() = 2 +} + + +/*ONAIR*/fun onAir(): Int { + fun yyy() = "hello" +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.txt new file mode 100644 index 00000000000..d1c859b8802 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.txt @@ -0,0 +1,6 @@ +public final [BODY_RESOLVE] fun onAir(): R|kotlin/Int| { + local final [BODY_RESOLVE] fun yyy(): R|kotlin/String| { + ^yyy String(hello) + } + +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.kt new file mode 100644 index 00000000000..8c6c11e5160 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.kt @@ -0,0 +1,8 @@ + +class X { + /*PLACE*/private typealias A = List +} + +class Y { + /*ONAIR*/public typealias B = Set +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.txt new file mode 100644 index 00000000000..471926e0e25 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.txt @@ -0,0 +1 @@ +public final [BODY_RESOLVE] typealias B = R|kotlin/collections/Set| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirOnAirResolveTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirOnAirResolveTest.kt new file mode 100644 index 00000000000..adf40ee0a75 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirOnAirResolveTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api + +import com.intellij.openapi.util.io.FileUtil +import com.intellij.testFramework.LightProjectDescriptor +import org.jetbrains.kotlin.fir.FirRenderer +import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.util.findElementByCommentPrefix +import java.io.File + +abstract class AbstractFirOnAirResolveTest : KotlinLightCodeInsightFixtureTestCase() { + override fun isFirPlugin(): Boolean = true + + fun doTest(path: String) { + val testDataFile = File(path) + val ktFile = myFixture.configureByText(testDataFile.name, FileUtil.loadFile(testDataFile)) as KtFile + + val place = ktFile.findElementByCommentPrefix("/*PLACE*/") as KtElement + val onAir = ktFile.findElementByCommentPrefix("/*ONAIR*/") as KtElement + + check(place::class == onAir::class) + + resolveWithClearCaches(ktFile) { firModuleResolveState -> + check(firModuleResolveState is FirModuleResolveStateImpl) + val firElement = LowLevelFirApiFacadeForResolveOnAir.onAirResolveElement(firModuleResolveState, place, onAir) + val rendered = firElement.render(FirRenderer.RenderMode.WithResolvePhases) + val expectedFileName = testDataFile.name.replace(".kt", ".txt") + KotlinTestUtils.assertEqualsToFile(testDataFile.parentFile.resolve(expectedFileName), rendered) + } + } + + override fun getProjectDescriptor(): LightProjectDescriptor = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirOnAirResolveTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirOnAirResolveTestGenerated.java new file mode 100644 index 00000000000..f9df0cf4ccb --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirOnAirResolveTestGenerated.java @@ -0,0 +1,111 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class FirOnAirResolveTestGenerated extends AbstractFirOnAirResolveTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInOnAirResolve() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("classInClass.kt") + public void testClassInClass() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/classInClass.kt"); + } + + @TestMetadata("identifierInContext.kt") + public void testIdentifierInContext() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/identifierInContext.kt"); + } + + @TestMetadata("inParameter.kt") + public void testInParameter() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/inParameter.kt"); + } + + @TestMetadata("incompleteIdentifier.kt") + public void testIncompleteIdentifier() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/incompleteIdentifier.kt"); + } + + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localClass.kt"); + } + + @TestMetadata("localFunction.kt") + public void testLocalFunction() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/localFunction.kt"); + } + + @TestMetadata("loopConstruction.kt") + public void testLoopConstruction() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/loopConstruction.kt"); + } + + @TestMetadata("memberInClass.kt") + public void testMemberInClass() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberInClass.kt"); + } + + @TestMetadata("memberPropertyInClass.kt") + public void testMemberPropertyInClass() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberPropertyInClass.kt"); + } + + @TestMetadata("memberWithOverride.kt") + public void testMemberWithOverride() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/memberWithOverride.kt"); + } + + @TestMetadata("onAirTypesResolve.kt") + public void testOnAirTypesResolve() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/onAirTypesResolve.kt"); + } + + @TestMetadata("replacementInHeader.kt") + public void testReplacementInHeader() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInHeader.kt"); + } + + @TestMetadata("replacementInsidePropertyBody.kt") + public void testReplacementInsidePropertyBody() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody.kt"); + } + + @TestMetadata("replacementInsidePropertyBody2.kt") + public void testReplacementInsidePropertyBody2() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/replacementInsidePropertyBody2.kt"); + } + + @TestMetadata("topLevelFunction.kt") + public void testTopLevelFunction() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/topLevelFunction.kt"); + } + + @TestMetadata("typeAlias.kt") + public void testTypeAlias() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/onAirResolve/typeAlias.kt"); + } +}