FIR: Support function type resolve #KT-24092 Fixed

This commit is contained in:
Simon Ogorodnik
2018-03-23 19:02:56 +03:00
committed by Mikhail Glukhikh
parent 0ea1a5b30f
commit 4fb321fa00
10 changed files with 129 additions and 11 deletions
@@ -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())
}
}
}
}
@@ -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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedFunctionType(this, data)
}
inline fun <reified T : ConeKotlinType> FirType.coneTypeUnsafe() = (this as FirResolvedType).type as T
inline fun <reified T : ConeKotlinType> FirType.coneTypeSafe() = (this as? FirResolvedType)?.type as? T
@@ -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<FirAnnotationCall>,
override var receiverType: FirType?,
override val valueParameters: MutableList<FirValueParameter>,
override var returnType: FirType,
override val type: ConeKotlinType
) : FirResolvedFunctionType {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
receiverType = receiverType?.transformSingle(transformer, data)
returnType = returnType.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data)
return this
}
}
@@ -166,6 +166,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformTypeWithNullability(resolvedType, data)
}
open fun transformResolvedFunctionType(resolvedFunctionType: FirResolvedFunctionType, data: D): CompositeTransformResult<FirType> {
return transformResolvedType(resolvedFunctionType, data)
}
open fun transformUserType(userType: FirUserType, data: D): CompositeTransformResult<FirType> {
return transformTypeWithNullability(userType, data)
}
@@ -226,6 +230,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformPackageFragment(packageFragment, data)
}
final override fun visitResolvedType(resolvedType: FirResolvedType, data: D): CompositeTransformResult<FirElement> {
return transformResolvedType(resolvedType, data)
}
final override fun visitStatement(statement: FirStatement, data: D): CompositeTransformResult<FirElement> {
return transformStatement(statement, data)
}
@@ -318,6 +326,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformFile(file, data)
}
final override fun visitResolvedFunctionType(resolvedFunctionType: FirResolvedFunctionType, data: D): CompositeTransformResult<FirElement> {
return transformResolvedFunctionType(resolvedFunctionType, data)
}
final override fun visitDelegatedType(delegatedType: FirDelegatedType, data: D): CompositeTransformResult<FirElement> {
return transformDelegatedType(delegatedType, data)
}
@@ -346,10 +358,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformFunctionType(functionType, data)
}
final override fun visitResolvedType(resolvedType: FirResolvedType, data: D): CompositeTransformResult<FirElement> {
return transformResolvedType(resolvedType, data)
}
final override fun visitUserType(userType: FirUserType, data: D): CompositeTransformResult<FirElement> {
return transformUserType(userType, data)
}
@@ -166,6 +166,10 @@ abstract class FirVisitor<out R, in D> {
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)
}
@@ -166,6 +166,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
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<Unit, Nothing?>() {
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<Unit, Nothing?>() {
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<Unit, Nothing?>() {
visitFunctionType(functionType)
}
final override fun visitResolvedType(resolvedType: FirResolvedType, data: Nothing?) {
visitResolvedType(resolvedType)
}
final override fun visitUserType(userType: FirUserType, data: Nothing?) {
visitUserType(userType)
}