diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt index 3ea7460e9e7..25b1ea535ae 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt @@ -61,4 +61,11 @@ abstract class ConeAbbreviatedType : ConeClassLikeType() { abstract class ConeTypeParameterType : ConeSymbolBasedType() { abstract override val symbol: ConeTypeParameterSymbol -} \ No newline at end of file +} + + +abstract class ConeFunctionType : ConeKotlinType() { + abstract val receiverType: ConeKotlinType? + abstract val parameterTypes: List + abstract val returnType: ConeKotlinType +} diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/ConeFunctionTypeImpl.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/ConeFunctionTypeImpl.kt new file mode 100644 index 00000000000..026b08bcb40 --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/impl/ConeFunctionTypeImpl.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir.types.impl + +import org.jetbrains.kotlin.fir.types.ConeFunctionType +import org.jetbrains.kotlin.fir.types.ConeKotlinType + +class ConeFunctionTypeImpl( + override val receiverType: ConeKotlinType?, + override val parameterTypes: List, + override val returnType: ConeKotlinType +) : ConeFunctionType() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index 3d2ef560545..5d4fadc8b9e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -105,7 +105,14 @@ class FirTypeResolverImpl : FirTypeResolver { is FirErrorType -> { ConeKotlinErrorType(type.reason) } - is FirFunctionType, is FirDynamicType, is FirImplicitType, is FirDelegatedType -> { + is FirFunctionType -> { + ConeFunctionTypeImpl( + (type.receiverType as FirResolvedType?)?.type, + type.valueParameters.map { it.returnType.coneTypeUnsafe() }, + type.returnType.coneTypeUnsafe() + ) + } + is FirDynamicType, is FirImplicitType, is FirDelegatedType -> { ConeKotlinErrorType("Not supported: ${type::class.simpleName}") } else -> error("!") 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 b8ca375251e..01d304014f9 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirTypeResolver @@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.impl.FirResolvedFunctionTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeImpl import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -114,7 +116,18 @@ open class FirTypeResolveTransformer : FirTransformer() { } override fun transformFunctionType(functionType: FirFunctionType, data: Nothing?): CompositeTransformResult { - return (functionType.transformChildren(this, data) as FirType).compose() + val typeResolver = FirTypeResolver.getInstance(functionType.session) + functionType.transformChildren(this, data) + return FirResolvedFunctionTypeImpl( + functionType.psi, + functionType.session, + functionType.isNullable, + functionType.annotations as MutableList, + functionType.receiverType, + functionType.valueParameters as MutableList, + functionType.returnType, + typeResolver.resolveType(functionType, scope, FirPosition.OTHER) + ).compose() } private fun transformType(type: FirType, resolvedType: ConeKotlinType): CompositeTransformResult { 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 b568f39cf62..e7fce5cb781 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -441,6 +441,18 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { is ConeTypeParameterType -> { symbol.asString() } + is ConeFunctionType -> { + buildString { + receiverType?.let { + append(it.asString()) + append(".") + } + append("(") + parameterTypes.joinTo(this) { it.asString() } + append(") -> ") + append(returnType.asString()) + } + } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirResolvedType.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirResolvedType.kt index 8e2986bed67..a0fd78668d1 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirResolvedType.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/FirResolvedType.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.types +import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirResolvedType : FirTypeWithNullability { @@ -14,5 +15,10 @@ interface FirResolvedType : FirTypeWithNullability { visitor.visitResolvedType(this, data) } +interface FirResolvedFunctionType : @VisitedSupertype FirResolvedType, FirFunctionType { + override fun accept(visitor: FirVisitor, data: D): R = + visitor.visitResolvedFunctionType(this, data) +} + inline fun FirType.coneTypeUnsafe() = (this as FirResolvedType).type as T inline fun FirType.coneTypeSafe() = (this as? FirResolvedType)?.type as? T \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeImpl.kt new file mode 100644 index 00000000000..ac0aea0d45e --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeImpl.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.fir.types.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirValueParameter +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.transformInplace +import org.jetbrains.kotlin.fir.transformSingle +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirResolvedFunctionType +import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer + +class FirResolvedFunctionTypeImpl( + override val psi: PsiElement?, + override val session: FirSession, + override val isNullable: Boolean, + override val annotations: MutableList, + override var receiverType: FirType?, + override val valueParameters: MutableList, + override var returnType: FirType, + override val type: ConeKotlinType +) : FirResolvedFunctionType { + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + receiverType = receiverType?.transformSingle(transformer, data) + returnType = returnType.transformSingle(transformer, data) + valueParameters.transformInplace(transformer, data) + + return this + } +} diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index 9b98def04c6..510cfaa7afa 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -166,6 +166,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedType(resolvedFunctionType, data) + } + open fun transformUserType(userType: FirUserType, data: D): CompositeTransformResult { return transformTypeWithNullability(userType, data) } @@ -226,6 +230,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedType(resolvedType, data) + } + final override fun visitStatement(statement: FirStatement, data: D): CompositeTransformResult { return transformStatement(statement, data) } @@ -318,6 +326,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedFunctionType(resolvedFunctionType, data) + } + final override fun visitDelegatedType(delegatedType: FirDelegatedType, data: D): CompositeTransformResult { return transformDelegatedType(delegatedType, data) } @@ -346,10 +358,6 @@ abstract class FirTransformer : FirVisitor { - return transformResolvedType(resolvedType, data) - } - final override fun visitUserType(userType: FirUserType, data: D): CompositeTransformResult { return transformUserType(userType, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index 9d85229d8d6..9dd72d2fba7 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -166,6 +166,10 @@ abstract class FirVisitor { return visitTypeWithNullability(resolvedType, data) } + open fun visitResolvedFunctionType(resolvedFunctionType: FirResolvedFunctionType, data: D): R { + return visitResolvedType(resolvedFunctionType, data) + } + open fun visitUserType(userType: FirUserType, data: D): R { return visitTypeWithNullability(userType, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index 7318924b9eb..d548bdfb334 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -166,6 +166,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitTypeWithNullability(resolvedType, null) } + open fun visitResolvedFunctionType(resolvedFunctionType: FirResolvedFunctionType) { + visitResolvedType(resolvedFunctionType, null) + } + open fun visitUserType(userType: FirUserType) { visitTypeWithNullability(userType, null) } @@ -226,6 +230,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitPackageFragment(packageFragment) } + final override fun visitResolvedType(resolvedType: FirResolvedType, data: Nothing?) { + visitResolvedType(resolvedType) + } + final override fun visitStatement(statement: FirStatement, data: Nothing?) { visitStatement(statement) } @@ -318,6 +326,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitFile(file) } + final override fun visitResolvedFunctionType(resolvedFunctionType: FirResolvedFunctionType, data: Nothing?) { + visitResolvedFunctionType(resolvedFunctionType) + } + final override fun visitDelegatedType(delegatedType: FirDelegatedType, data: Nothing?) { visitDelegatedType(delegatedType) } @@ -346,10 +358,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitFunctionType(functionType) } - final override fun visitResolvedType(resolvedType: FirResolvedType, data: Nothing?) { - visitResolvedType(resolvedType) - } - final override fun visitUserType(userType: FirUserType, data: Nothing?) { visitUserType(userType) }