FIR: transform types inside functions & properties

This commit is contained in:
Mikhail Glukhikh
2018-03-20 16:18:23 +03:00
parent be35b904f2
commit 1ba498b021
14 changed files with 183 additions and 27 deletions
@@ -28,3 +28,7 @@ fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransfor
}
}
fun <T : FirElement, D> T.transformSingle(transformer: FirTransformer<D>, data: D): T {
return this.transform<T, D>(transformer, data).single
}
@@ -8,9 +8,12 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
abstract class FirAbstractCallableMember(
@@ -20,6 +23,14 @@ abstract class FirAbstractCallableMember(
visibility: Visibility,
modality: Modality,
final override val isOverride: Boolean,
final override val receiverType: FirType?,
final override val returnType: FirType
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember
final override var receiverType: FirType?,
final override var returnType: FirType
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
receiverType = receiverType?.transformSingle(transformer, data)
returnType = returnType.transformSingle(transformer, data)
return this
}
}
@@ -6,10 +6,13 @@
package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractFunction(
session: FirSession,
@@ -17,4 +20,10 @@ abstract class FirAbstractFunction(
final override val body: FirBody?
) : FirAbstractAnnotatedDeclaration(session, psi), FirFunction {
final override val valueParameters = mutableListOf<FirValueParameter>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
valueParameters.transformInplace(transformer, data)
return this
}
}
@@ -7,32 +7,62 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.types.impl.FirUnitType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirDefaultPropertyAccessor(
override val session: FirSession,
override val psi: PsiElement?,
override val isGetter: Boolean,
propertyType: FirType
abstract class FirDefaultPropertyAccessor(
final override val session: FirSession,
final override val psi: PsiElement?,
final override val isGetter: Boolean
) : FirPropertyAccessor {
override val visibility =
final override val visibility =
Visibilities.UNKNOWN
override val valueParameters: List<FirValueParameter> =
if (isGetter) emptyList() else listOf(FirDefaultSetterValueParameter(session, psi, propertyType))
override val returnType: FirType =
if (isGetter) propertyType else FirUnitType(session, psi)
override val body: FirBody? =
final override val body: FirBody? =
null
override val annotations: List<FirAnnotationCall>
final override val annotations: List<FirAnnotationCall>
get() = emptyList()
}
class FirDefaultPropertyGetter(
session: FirSession,
psi: PsiElement?,
propertyType: FirType
): FirDefaultPropertyAccessor(session, psi, isGetter = true) {
override val valueParameters: List<FirValueParameter> = emptyList()
override var returnType: FirType = propertyType
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnType = returnType.transformSingle(transformer, data)
return this
}
}
class FirDefaultPropertySetter(
session: FirSession,
psi: PsiElement?,
propertyType: FirType
): FirDefaultPropertyAccessor(session, psi, isGetter = false) {
override val valueParameters = mutableListOf(FirDefaultSetterValueParameter(session, psi, propertyType))
override var returnType: FirType = FirUnitType(session, psi)
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
valueParameters.transformInplace(transformer, data)
returnType = returnType.transformSingle(transformer, data)
return this
}
}
@@ -6,16 +6,19 @@
package org.jetbrains.kotlin.fir.declarations.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.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirDefaultSetterValueParameter(
session: FirSession,
psi: PsiElement?,
override val returnType: FirType
override var returnType: FirType
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
override val isCrossinline = false
@@ -25,6 +28,12 @@ class FirDefaultSetterValueParameter(
override val defaultValue: FirExpression? = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnType = returnType.transformSingle(transformer, data)
return this
}
companion object {
val name = Name.identifier("value")
}
@@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirMemberFunctionImpl(
@@ -33,4 +36,10 @@ class FirMemberFunctionImpl(
) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType),
FirNamedFunction {
override val valueParameters = mutableListOf<FirValueParameter>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
valueParameters.transformInplace(transformer, data)
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
}
}
@@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirMemberPropertyImpl(
@@ -27,8 +30,15 @@ class FirMemberPropertyImpl(
returnType: FirType,
override val isVar: Boolean,
override val initializer: FirExpression?,
override val getter: FirPropertyAccessor,
override val setter: FirPropertyAccessor,
override var getter: FirPropertyAccessor,
override var setter: FirPropertyAccessor,
override val delegate: FirExpression?
) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType),
FirProperty
FirProperty {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
getter = getter.transformSingle(transformer, data)
setter = setter.transformSingle(transformer, data)
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
}
}
@@ -7,16 +7,25 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirPropertyAccessorImpl(
session: FirSession,
psi: PsiElement?,
override val isGetter: Boolean,
override val visibility: Visibility,
override val returnType: FirType,
override var returnType: FirType,
body: FirBody?
) : FirAbstractFunction(session, psi, body), FirPropertyAccessor
) : FirAbstractFunction(session, psi, body), FirPropertyAccessor {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnType = returnType.transformSingle(transformer, data)
return super<FirAbstractFunction>.transformChildren(transformer, data)
}
}
@@ -6,20 +6,29 @@
package org.jetbrains.kotlin.fir.declarations.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.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirValueParameterImpl(
session: FirSession,
psi: PsiElement?,
val isProperty: Boolean,
name: Name,
override val returnType: FirType,
override var returnType: FirType,
override val defaultValue: FirExpression?,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
override val isVararg: Boolean
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnType = returnType.transformSingle(transformer, data)
return this
}
}