From c31513837bb8b4d56bea189042dc6aa1cfd4f79e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 23 Mar 2018 20:21:59 +0300 Subject: [PATCH] FIR: fix resolve of function type & its parameters in supertype position --- .../fir/resolve/transformers/FirTypeResolveTransformer.kt | 6 +++++- .../testData/fir/rawBuilder/declarations/derivedClass.txt | 2 +- .../testData/fir/rawBuilder/declarations/nestedClass.txt | 2 +- compiler/testData/fir/resolve/ft.kt | 6 ++++++ compiler/testData/fir/resolve/ft.txt | 5 +++++ compiler/testData/fir/resolve/functionTypes.kt | 8 ++++++++ compiler/testData/fir/resolve/functionTypes.txt | 8 ++++++++ .../jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java | 6 ++++++ 8 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/fir/resolve/ft.kt create mode 100644 compiler/testData/fir/resolve/ft.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 01d304014f9..ae5f356ecf4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -144,6 +144,10 @@ open class FirTypeResolveTransformer : FirTransformer() { return resolvedType.compose() } + override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): CompositeTransformResult { + return valueParameter.also { it.transformChildren(this, data) }.compose() + } + override fun transformTypeProjectionWithVariance( typeProjectionWithVariance: FirTypeProjectionWithVariance, @@ -203,7 +207,7 @@ open class FirTypeResolveTransformer : FirTransformer() { if (symbol != null) walkSymbols(symbol) - if (type !is FirUserType) return myTransformer.transformType(type, data) + if (type !is FirUserType) return type.transform(myTransformer, data) type.transformChildren(myTransformer, null) diff --git a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt index a53ad3c0a85..7996a50fc4c 100644 --- a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt @@ -4,7 +4,7 @@ FILE: derivedClass.kt } public? final class Derived() : Base { - public? constructor(x: T)STUB + public? constructor(x: T): super(STUB) } public? final? function create(x: T): Derived { diff --git a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt index 801754239e9..c04b9b2577e 100644 --- a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt @@ -5,7 +5,7 @@ FILE: nestedClass.kt } public? final class Outer() { public? final class Derived() : Base { - public? constructor(s: String)STUB + public? constructor(s: String): super(STUB) } diff --git a/compiler/testData/fir/resolve/ft.kt b/compiler/testData/fir/resolve/ft.kt new file mode 100644 index 00000000000..eeafcc0583c --- /dev/null +++ b/compiler/testData/fir/resolve/ft.kt @@ -0,0 +1,6 @@ +interface KMutableProperty1 : KProperty1 + +interface KProperty1 : (T) -> Int + + + diff --git a/compiler/testData/fir/resolve/ft.txt b/compiler/testData/fir/resolve/ft.txt new file mode 100644 index 00000000000..0ee2421e34a --- /dev/null +++ b/compiler/testData/fir/resolve/ft.txt @@ -0,0 +1,5 @@ +FILE: ft.kt + public? abstract interface KMutableProperty1() : R|KProperty1| { + } + public? abstract interface KProperty1() : R|(T) -> kotlin/Int| { + } diff --git a/compiler/testData/fir/resolve/functionTypes.kt b/compiler/testData/fir/resolve/functionTypes.kt index 60a3246170d..de0d6b0ae1e 100644 --- a/compiler/testData/fir/resolve/functionTypes.kt +++ b/compiler/testData/fir/resolve/functionTypes.kt @@ -6,3 +6,11 @@ fun List.simpleMap(f: (T) -> R): R { fun simpleWith(t: T, f: T.() -> Unit): Unit = t.f() +interface KMutableProperty1 : KProperty1, KMutableProperty + +interface KProperty1 : KProperty, (T) -> R + +interface KProperty + +interface KMutableProperty + diff --git a/compiler/testData/fir/resolve/functionTypes.txt b/compiler/testData/fir/resolve/functionTypes.txt index 99f05b4cd66..f5b568234a0 100644 --- a/compiler/testData/fir/resolve/functionTypes.txt +++ b/compiler/testData/fir/resolve/functionTypes.txt @@ -7,3 +7,11 @@ FILE: functionTypes.kt public? final? function simpleWith(t: R|T|, f: R|T.() -> kotlin/Unit|): R|kotlin/Unit| { STUB } + public? abstract interface KMutableProperty1() : R|KProperty1|, R|KMutableProperty| { + } + public? abstract interface KProperty1() : R|KProperty|, R|(T) -> R| { + } + public? abstract interface KProperty() { + } + public? abstract interface KMutableProperty() { + } diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 5390a8dd664..c53a8aa4819 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -39,6 +39,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { runTest("compiler/testData/fir/resolve/F.kt"); } + @TestMetadata("ft.kt") + public void testFt() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/ft.kt"); + doTest(fileName); + } + @TestMetadata("functionTypes.kt") public void testFunctionTypes() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/functionTypes.kt");