Forbid manipulations with FirWrappedArgumentExpression type reference

The type of this expression is bound to the type of wrapped expression,
so it's better not to change it directly.
This commit is contained in:
Mikhail Glukhikh
2019-06-10 12:34:55 +03:00
parent b7da2f2ad8
commit b71de954ff
5 changed files with 11 additions and 22 deletions
@@ -937,7 +937,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
}
override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult<FirStatement> {
if (expression.resultType is FirImplicitTypeRef) {
if (expression.resultType is FirImplicitTypeRef && expression !is FirWrappedArgumentExpression) {
val type = FirErrorTypeRefImpl(session, expression.psi, "Type calculating for ${expression::class} is not supported")
expression.resultType = type
}
@@ -17,6 +17,10 @@ interface FirWrappedArgumentExpression : FirExpression {
override val typeRef: FirTypeRef
get() = expression.typeRef
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
throw AssertionError("We should not try to replace type reference in ${this::class}")
}
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitWrappedArgumentExpression(this, data)
@@ -11,20 +11,15 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirLambdaArgumentExpressionImpl(
session: FirSession,
psi: PsiElement?,
override var expression: FirExpression
) : FirLambdaArgumentExpression, FirAbstractExpression(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirLambdaArgumentExpression>.typeRef
set(_) {}
) : FirLambdaArgumentExpression, FirAbstractStatement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data)
}
}
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
@@ -21,13 +20,9 @@ class FirNamedArgumentExpressionImpl(
override val name: Name,
override val isSpread: Boolean,
override var expression: FirExpression
) : FirNamedArgumentExpression, FirAbstractExpression(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirNamedArgumentExpression>.typeRef
set(_) {}
) : FirNamedArgumentExpression, FirAbstractStatement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data)
}
}
@@ -11,20 +11,15 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirSpreadArgumentExpressionImpl(
session: FirSession,
psi: PsiElement?,
override var expression: FirExpression
) : FirSpreadArgumentExpression, FirAbstractExpression(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirSpreadArgumentExpression>.typeRef
set(_) {}
) : FirSpreadArgumentExpression, FirAbstractStatement(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data)
}
}