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 b43920d83b5..b8ca375251e 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 @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.name.FqName open class FirTypeResolveTransformer : FirTransformer() { override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + @Suppress("UNCHECKED_CAST") return (element.transformChildren(this, data) as E).compose() } @@ -112,6 +113,10 @@ open class FirTypeResolveTransformer : FirTransformer() { return transformType(type, typeResolver.resolveType(type, scope, position = FirPosition.OTHER)) } + override fun transformFunctionType(functionType: FirFunctionType, data: Nothing?): CompositeTransformResult { + return (functionType.transformChildren(this, data) as FirType).compose() + } + private fun transformType(type: FirType, resolvedType: ConeKotlinType): CompositeTransformResult { return FirResolvedTypeImpl( type.session, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 187124fdc0d..b568f39cf62 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid +import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.Printer @@ -92,6 +93,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { visitMemberDeclaration(callableMember) val receiverType = callableMember.receiverType if (receiverType != null) { + print(" ") receiverType.accept(this) print(".") } @@ -324,7 +326,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { if (valueParameter.isVararg) { print("vararg ") } - print(valueParameter.name.toString() + ": ") + if (valueParameter.name != SpecialNames.NO_NAME_PROVIDED) { + print(valueParameter.name.toString() + ": ") + } valueParameter.returnType.accept(this) valueParameter.defaultValue?.let { print(" = ") @@ -399,7 +403,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { print(".") } functionType.valueParameters.renderParameters() - print(": ") + print(" -> ") functionType.returnType.accept(this) print(" )") visitTypeWithNullability(functionType) diff --git a/compiler/testData/fir/rawBuilder/declarations/functionTypes.txt b/compiler/testData/fir/rawBuilder/declarations/functionTypes.txt index 7724d145f5b..085722eb6ea 100644 --- a/compiler/testData/fir/rawBuilder/declarations/functionTypes.txt +++ b/compiler/testData/fir/rawBuilder/declarations/functionTypes.txt @@ -1,9 +1,9 @@ FILE: functionTypes.kt - public? final? function simpleRun(f: ( (: T): Unit )): Unit { + public? final? function simpleRun(f: ( (T) -> Unit )): Unit { STUB } - public? final? function simpleMapList.(f: ( (: T): R )): R { + public? final? function simpleMap List.(f: ( (T) -> R )): R { } - public? final? function simpleWith(t: T, f: ( T.(): Unit )): Unit { + public? final? function simpleWith(t: T, f: ( T.() -> Unit )): Unit { STUB } diff --git a/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt b/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt index b6f253f9be5..a39b6913f9b 100644 --- a/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt +++ b/compiler/testData/fir/rawBuilder/declarations/genericFunctions.txt @@ -1,7 +1,7 @@ FILE: genericFunctions.kt public? abstract interface Any() { } - public? final? inline function safeAsAny.(): T? { + public? final? inline function safeAs Any.(): T? { STUB } public? abstract class Summator() { diff --git a/compiler/testData/fir/resolve/builtins/lists.txt b/compiler/testData/fir/resolve/builtins/lists.txt index 4a6d07ca6b3..c48ff8b19ab 100644 --- a/compiler/testData/fir/resolve/builtins/lists.txt +++ b/compiler/testData/fir/resolve/builtins/lists.txt @@ -3,7 +3,7 @@ FILE: lists.kt } public? abstract class MyMutableStringList() : R/kotlin/collections/MutableList/ { } - public? final? function convertR/kotlin/collections/List/.(): R/MyStringList/ { + public? final? function convert R/kotlin/collections/List/.(): R/MyStringList/ { STUB } public? final? function ret(l: R/kotlin/collections/MutableList/): R/MyMutableStringList/ { diff --git a/compiler/testData/fir/resolve/functionTypes.kt b/compiler/testData/fir/resolve/functionTypes.kt new file mode 100644 index 00000000000..60a3246170d --- /dev/null +++ b/compiler/testData/fir/resolve/functionTypes.kt @@ -0,0 +1,8 @@ +fun simpleRun(f: (T) -> Unit): Unit = f() + +fun List.simpleMap(f: (T) -> R): R { + +} + +fun simpleWith(t: T, f: T.() -> Unit): Unit = t.f() + diff --git a/compiler/testData/fir/resolve/functionTypes.txt b/compiler/testData/fir/resolve/functionTypes.txt new file mode 100644 index 00000000000..1ac576d76a2 --- /dev/null +++ b/compiler/testData/fir/resolve/functionTypes.txt @@ -0,0 +1,9 @@ +FILE: functionTypes.kt + public? final? function simpleRun(f: ( (R/T/) -> R/kotlin/Unit/ )): R/kotlin/Unit/ { + STUB + } + public? final? function simpleMap R/kotlin/collections/List/.(f: ( (R/T/) -> R/R/ )): R/R/ { + } + public? final? function simpleWith(t: R/T/, f: ( R/T/.() -> R/kotlin/Unit/ )): R/kotlin/Unit/ { + STUB + } diff --git a/compiler/testData/fir/resolve/genericFunctions.txt b/compiler/testData/fir/resolve/genericFunctions.txt index 8d3f434656d..7af9e5a6694 100644 --- a/compiler/testData/fir/resolve/genericFunctions.txt +++ b/compiler/testData/fir/resolve/genericFunctions.txt @@ -1,7 +1,7 @@ FILE: genericFunctions.kt public? abstract interface Any() { } - public? final? inline function safeAsR/Any/.(): R/T/ { + public? final? inline function safeAs R/Any/.(): R/T/ { STUB } public? abstract class Summator() { diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 5a91fc2535f..5390a8dd664 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("functionTypes.kt") + public void testFunctionTypes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/functionTypes.kt"); + doTest(fileName); + } + @TestMetadata("genericFunctions.kt") public void testGenericFunctions() throws Exception { runTest("compiler/testData/fir/resolve/genericFunctions.kt");