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> { 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") val type = FirErrorTypeRefImpl(session, expression.psi, "Type calculating for ${expression::class} is not supported")
expression.resultType = type expression.resultType = type
} }
@@ -17,6 +17,10 @@ interface FirWrappedArgumentExpression : FirExpression {
override val typeRef: FirTypeRef override val typeRef: FirTypeRef
get() = expression.typeRef 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 = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitWrappedArgumentExpression(this, data) 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirLambdaArgumentExpressionImpl( class FirLambdaArgumentExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var expression: FirExpression override var expression: FirExpression
) : FirLambdaArgumentExpression, FirAbstractExpression(session, psi) { ) : FirLambdaArgumentExpression, FirAbstractStatement(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirLambdaArgumentExpression>.typeRef
set(_) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data) 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -21,13 +20,9 @@ class FirNamedArgumentExpressionImpl(
override val name: Name, override val name: Name,
override val isSpread: Boolean, override val isSpread: Boolean,
override var expression: FirExpression override var expression: FirExpression
) : FirNamedArgumentExpression, FirAbstractExpression(session, psi) { ) : FirNamedArgumentExpression, FirAbstractStatement(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirNamedArgumentExpression>.typeRef
set(_) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data) 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirSpreadArgumentExpressionImpl( class FirSpreadArgumentExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var expression: FirExpression override var expression: FirExpression
) : FirSpreadArgumentExpression, FirAbstractExpression(session, psi) { ) : FirSpreadArgumentExpression, FirAbstractStatement(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirSpreadArgumentExpression>.typeRef
set(_) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data) expression = expression.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super<FirAbstractStatement>.transformChildren(transformer, data)
} }
} }