From b71de954ff37e897c747b4b35f70359d50b52abc Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 10 Jun 2019 12:34:55 +0300 Subject: [PATCH] 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. --- .../resolve/transformers/FirBodyResolveTransformer.kt | 2 +- .../fir/expressions/FirWrappedArgumentExpression.kt | 4 ++++ .../expressions/impl/FirLambdaArgumentExpressionImpl.kt | 9 ++------- .../expressions/impl/FirNamedArgumentExpressionImpl.kt | 9 ++------- .../expressions/impl/FirSpreadArgumentExpressionImpl.kt | 9 ++------- 5 files changed, 11 insertions(+), 22 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 84b935e7c72..bdf7bef50e9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -937,7 +937,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult { - 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 } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirWrappedArgumentExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirWrappedArgumentExpression.kt index 6407c23fda2..8eff485c787 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirWrappedArgumentExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirWrappedArgumentExpression.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitWrappedArgumentExpression(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirLambdaArgumentExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirLambdaArgumentExpressionImpl.kt index 96b31f9d045..dc1269e7b6b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirLambdaArgumentExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirLambdaArgumentExpressionImpl.kt @@ -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.typeRef - set(_) {} - +) : FirLambdaArgumentExpression, FirAbstractStatement(session, psi) { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { expression = expression.transformSingle(transformer, data) - return super.transformChildren(transformer, data) + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt index 0eb1b19f873..0a0acdc719c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt @@ -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.typeRef - set(_) {} - +) : FirNamedArgumentExpression, FirAbstractStatement(session, psi) { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { expression = expression.transformSingle(transformer, data) - return super.transformChildren(transformer, data) + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSpreadArgumentExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSpreadArgumentExpressionImpl.kt index 35d009f9d51..8c527edcaee 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSpreadArgumentExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSpreadArgumentExpressionImpl.kt @@ -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.typeRef - set(_) {} - +) : FirSpreadArgumentExpression, FirAbstractStatement(session, psi) { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { expression = expression.transformSingle(transformer, data) - return super.transformChildren(transformer, data) + return super.transformChildren(transformer, data) } } \ No newline at end of file