From 20425fb458faee0363074415c81fdb17d18a4e30 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 24 Nov 2021 14:22:00 +0300 Subject: [PATCH] [FIR] Add wrapped expressions for when subject expression with smartcast --- .../expressions/FirExpressionWithSmartcast.kt | 14 ++--- .../FirExpressionWithSmartcastToNull.kt | 6 +-- .../FirWhenSubjectExpressionWithSmartcast.kt | 42 +++++++++++++++ ...henSubjectExpressionWithSmartcastToNull.kt | 43 ++++++++++++++++ .../FirWrappedExpressionWithSmartcast.kt | 37 ++++++++++++++ ...FirWrappedExpressionWithSmartcastToNull.kt | 38 ++++++++++++++ .../kotlin/fir/visitors/FirDefaultVisitor.kt | 8 +-- .../fir/visitors/FirDefaultVisitorVoid.kt | 8 +-- .../kotlin/fir/visitors/FirTransformer.kt | 36 +++++++++++++ .../kotlin/fir/visitors/FirVisitor.kt | 12 +++++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 36 +++++++++++++ .../FirExpressionWithSmartcastBuilder.kt | 12 +---- ...FirExpressionWithSmartcastToNullBuilder.kt | 11 +--- ...enSubjectExpressionWithSmartcastBuilder.kt | 20 ++++++++ ...ectExpressionWithSmartcastToNullBuilder.kt | 26 ++++++++++ ...irWrappedExpressionWithSmartcastBuilder.kt | 22 ++++++++ ...rWhenSubjectExpressionWithSmartcastImpl.kt | 50 ++++++++++++++++++ ...ubjectExpressionWithSmartcastToNullImpl.kt | 51 +++++++++++++++++++ .../fir/tree/generator/FirTreeBuilder.kt | 8 ++- .../generator/ImplementationConfigurator.kt | 3 ++ .../fir/tree/generator/NodeConfigurator.kt | 31 ++++++++--- 21 files changed, 468 insertions(+), 46 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcast.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcastToNull.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcast.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcastToNull.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastBuilder.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastToNullBuilder.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWrappedExpressionWithSmartcastBuilder.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastImpl.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastToNullImpl.kt diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt index cf5939907ff..f4dbc9786a1 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcast.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail * DO NOT MODIFY IT MANUALLY */ -abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() { +abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression(), FirWrappedExpressionWithSmartcast { abstract override val source: KtSourceElement? abstract override val typeRef: FirTypeRef abstract override val annotations: List @@ -29,12 +29,12 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() { abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression - abstract val originalExpression: FirQualifiedAccessExpression - abstract val typesFromSmartCast: Collection - abstract val originalType: FirTypeRef - abstract val smartcastType: FirTypeRef - abstract val isStable: Boolean - abstract val smartcastStability: SmartcastStability + abstract override val originalExpression: FirQualifiedAccessExpression + abstract override val typesFromSmartCast: Collection + abstract override val originalType: FirTypeRef + abstract override val smartcastType: FirTypeRef + abstract override val isStable: Boolean + abstract override val smartcastStability: SmartcastStability override fun accept(visitor: FirVisitor, data: D): R = visitor.visitExpressionWithSmartcast(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcastToNull.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcastToNull.kt index 506637080bc..8f8627ee0d7 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcastToNull.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirExpressionWithSmartcastToNull.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail * DO NOT MODIFY IT MANUALLY */ -abstract class FirExpressionWithSmartcastToNull : FirExpressionWithSmartcast() { +abstract class FirExpressionWithSmartcastToNull : FirExpressionWithSmartcast(), FirWrappedExpressionWithSmartcastToNull { abstract override val source: KtSourceElement? abstract override val typeRef: FirTypeRef abstract override val annotations: List @@ -29,13 +29,13 @@ abstract class FirExpressionWithSmartcastToNull : FirExpressionWithSmartcast() { abstract override val explicitReceiver: FirExpression? abstract override val dispatchReceiver: FirExpression abstract override val extensionReceiver: FirExpression - abstract override val isStable: Boolean abstract override val originalExpression: FirQualifiedAccessExpression abstract override val typesFromSmartCast: Collection abstract override val originalType: FirTypeRef abstract override val smartcastType: FirTypeRef - abstract val smartcastTypeWithoutNullableNothing: FirTypeRef + abstract override val isStable: Boolean abstract override val smartcastStability: SmartcastStability + abstract override val smartcastTypeWithoutNullableNothing: FirTypeRef override fun accept(visitor: FirVisitor, data: D): R = visitor.visitExpressionWithSmartcastToNull(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcast.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcast.kt new file mode 100644 index 00000000000..6c640f712de --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcast.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirExpressionRef +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.types.SmartcastStability +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirWhenSubjectExpressionWithSmartcast : FirWhenSubjectExpression(), FirWrappedExpressionWithSmartcast { + abstract override val source: KtSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract override val whenRef: FirExpressionRef + abstract override val originalExpression: FirWhenSubjectExpression + abstract override val typesFromSmartCast: Collection + abstract override val originalType: FirTypeRef + abstract override val smartcastType: FirTypeRef + abstract override val isStable: Boolean + abstract override val smartcastStability: SmartcastStability + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitWhenSubjectExpressionWithSmartcast(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformWhenSubjectExpressionWithSmartcast(this, data) as E + + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirWhenSubjectExpressionWithSmartcast +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcastToNull.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcastToNull.kt new file mode 100644 index 00000000000..10d6da3be36 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWhenSubjectExpressionWithSmartcastToNull.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirExpressionRef +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.types.SmartcastStability +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirWhenSubjectExpressionWithSmartcastToNull : FirWhenSubjectExpression(), FirWrappedExpressionWithSmartcastToNull { + abstract override val source: KtSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract override val whenRef: FirExpressionRef + abstract override val originalExpression: FirWhenSubjectExpression + abstract override val typesFromSmartCast: Collection + abstract override val originalType: FirTypeRef + abstract override val smartcastType: FirTypeRef + abstract override val isStable: Boolean + abstract override val smartcastStability: SmartcastStability + abstract override val smartcastTypeWithoutNullableNothing: FirTypeRef + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitWhenSubjectExpressionWithSmartcastToNull(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformWhenSubjectExpressionWithSmartcastToNull(this, data) as E + + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirWhenSubjectExpressionWithSmartcastToNull +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcast.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcast.kt new file mode 100644 index 00000000000..c5af6e81aac --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcast.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.types.SmartcastStability +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +interface FirWrappedExpressionWithSmartcast : FirElement { + override val source: KtSourceElement? + val typeRef: FirTypeRef + val originalExpression: E + val typesFromSmartCast: Collection + val originalType: FirTypeRef + val smartcastType: FirTypeRef + val isStable: Boolean + val smartcastStability: SmartcastStability + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitWrappedExpressionWithSmartcast(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformWrappedExpressionWithSmartcast(this, data) as E + + fun replaceTypeRef(newTypeRef: FirTypeRef) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcastToNull.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcastToNull.kt new file mode 100644 index 00000000000..8ef7592c4bd --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirWrappedExpressionWithSmartcastToNull.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.types.SmartcastStability +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +interface FirWrappedExpressionWithSmartcastToNull : FirWrappedExpressionWithSmartcast { + override val source: KtSourceElement? + override val typeRef: FirTypeRef + override val originalExpression: E + override val typesFromSmartCast: Collection + override val originalType: FirTypeRef + override val smartcastType: FirTypeRef + override val isStable: Boolean + override val smartcastStability: SmartcastStability + val smartcastTypeWithoutNullableNothing: FirTypeRef + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitWrappedExpressionWithSmartcastToNull(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformWrappedExpressionWithSmartcastToNull(this, data) as E + + override fun replaceTypeRef(newTypeRef: FirTypeRef) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index 857cf82f2f4..fbdd78c092f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -96,6 +96,8 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -115,6 +117,8 @@ import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -216,9 +220,7 @@ abstract class FirDefaultVisitor : FirVisitor() { override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: D): R = visitQualifiedAccessExpression(thisReceiverExpression, data) - override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): R = visitQualifiedAccessExpression(expressionWithSmartcast, data) - - override fun visitExpressionWithSmartcastToNull(expressionWithSmartcastToNull: FirExpressionWithSmartcastToNull, data: D): R = visitExpressionWithSmartcast(expressionWithSmartcastToNull, data) + override fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull, data: D): R = visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcastToNull, data) override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression, data: D): R = visitExpression(safeCallExpression, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 287587f7f6f..fb8efa36dac 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -96,6 +96,8 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -115,6 +117,8 @@ import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -216,9 +220,7 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression) = visitQualifiedAccessExpression(thisReceiverExpression) - override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast) = visitQualifiedAccessExpression(expressionWithSmartcast) - - override fun visitExpressionWithSmartcastToNull(expressionWithSmartcastToNull: FirExpressionWithSmartcastToNull) = visitExpressionWithSmartcast(expressionWithSmartcastToNull) + override fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull) = visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcastToNull) override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression) = visitExpression(safeCallExpression) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 3430a1a0fdd..3ff6dac543d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -96,6 +96,8 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -115,6 +117,8 @@ import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -507,6 +511,14 @@ abstract class FirTransformer : FirVisitor() { return transformElement(thisReceiverExpression, data) } + open fun transformWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast: FirWrappedExpressionWithSmartcast, data: D): FirWrappedExpressionWithSmartcast { + return transformElement(wrappedExpressionWithSmartcast, data) + } + + open fun transformWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull, data: D): FirWrappedExpressionWithSmartcastToNull { + return transformElement(wrappedExpressionWithSmartcastToNull, data) + } + open fun transformExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): FirStatement { return transformElement(expressionWithSmartcast, data) } @@ -583,6 +595,14 @@ abstract class FirTransformer : FirVisitor() { return transformElement(whenSubjectExpression, data) } + open fun transformWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast: FirWhenSubjectExpressionWithSmartcast, data: D): FirStatement { + return transformElement(whenSubjectExpressionWithSmartcast, data) + } + + open fun transformWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull: FirWhenSubjectExpressionWithSmartcastToNull, data: D): FirStatement { + return transformElement(whenSubjectExpressionWithSmartcastToNull, data) + } + open fun transformWrappedDelegateExpression(wrappedDelegateExpression: FirWrappedDelegateExpression, data: D): FirStatement { return transformElement(wrappedDelegateExpression, data) } @@ -1035,6 +1055,14 @@ abstract class FirTransformer : FirVisitor() { return transformThisReceiverExpression(thisReceiverExpression, data) } + final override fun visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast: FirWrappedExpressionWithSmartcast, data: D): FirWrappedExpressionWithSmartcast { + return transformWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast, data) + } + + final override fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull, data: D): FirWrappedExpressionWithSmartcastToNull { + return transformWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull, data) + } + final override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): FirStatement { return transformExpressionWithSmartcast(expressionWithSmartcast, data) } @@ -1111,6 +1139,14 @@ abstract class FirTransformer : FirVisitor() { return transformWhenSubjectExpression(whenSubjectExpression, data) } + final override fun visitWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast: FirWhenSubjectExpressionWithSmartcast, data: D): FirStatement { + return transformWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast, data) + } + + final override fun visitWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull: FirWhenSubjectExpressionWithSmartcastToNull, data: D): FirStatement { + return transformWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull, data) + } + final override fun visitWrappedDelegateExpression(wrappedDelegateExpression: FirWrappedDelegateExpression, data: D): FirStatement { return transformWrappedDelegateExpression(wrappedDelegateExpression, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index c5ed2fff817..38d206b1aa5 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -96,6 +96,8 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -115,6 +117,8 @@ import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -326,6 +330,10 @@ abstract class FirVisitor { open fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: D): R = visitElement(thisReceiverExpression, data) + open fun visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast: FirWrappedExpressionWithSmartcast, data: D): R = visitElement(wrappedExpressionWithSmartcast, data) + + open fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull, data: D): R = visitElement(wrappedExpressionWithSmartcastToNull, data) + open fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): R = visitElement(expressionWithSmartcast, data) open fun visitExpressionWithSmartcastToNull(expressionWithSmartcastToNull: FirExpressionWithSmartcastToNull, data: D): R = visitElement(expressionWithSmartcastToNull, data) @@ -364,6 +372,10 @@ abstract class FirVisitor { open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): R = visitElement(whenSubjectExpression, data) + open fun visitWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast: FirWhenSubjectExpressionWithSmartcast, data: D): R = visitElement(whenSubjectExpressionWithSmartcast, data) + + open fun visitWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull: FirWhenSubjectExpressionWithSmartcastToNull, data: D): R = visitElement(whenSubjectExpressionWithSmartcastToNull, data) + open fun visitWrappedDelegateExpression(wrappedDelegateExpression: FirWrappedDelegateExpression, data: D): R = visitElement(wrappedDelegateExpression, data) open fun visitNamedReference(namedReference: FirNamedReference, data: D): R = visitElement(namedReference, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 45091afb7c8..521641c029c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -96,6 +96,8 @@ import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWrappedExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression @@ -115,6 +117,8 @@ import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -506,6 +510,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(thisReceiverExpression) } + open fun visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast: FirWrappedExpressionWithSmartcast) { + visitElement(wrappedExpressionWithSmartcast) + } + + open fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull) { + visitElement(wrappedExpressionWithSmartcastToNull) + } + open fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast) { visitElement(expressionWithSmartcast) } @@ -582,6 +594,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(whenSubjectExpression) } + open fun visitWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast: FirWhenSubjectExpressionWithSmartcast) { + visitElement(whenSubjectExpressionWithSmartcast) + } + + open fun visitWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull: FirWhenSubjectExpressionWithSmartcastToNull) { + visitElement(whenSubjectExpressionWithSmartcastToNull) + } + open fun visitWrappedDelegateExpression(wrappedDelegateExpression: FirWrappedDelegateExpression) { visitElement(wrappedDelegateExpression) } @@ -1034,6 +1054,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitThisReceiverExpression(thisReceiverExpression) } + final override fun visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast: FirWrappedExpressionWithSmartcast, data: Nothing?) { + visitWrappedExpressionWithSmartcast(wrappedExpressionWithSmartcast) + } + + final override fun visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull: FirWrappedExpressionWithSmartcastToNull, data: Nothing?) { + visitWrappedExpressionWithSmartcastToNull(wrappedExpressionWithSmartcastToNull) + } + final override fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: Nothing?) { visitExpressionWithSmartcast(expressionWithSmartcast) } @@ -1110,6 +1138,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitWhenSubjectExpression(whenSubjectExpression) } + final override fun visitWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast: FirWhenSubjectExpressionWithSmartcast, data: Nothing?) { + visitWhenSubjectExpressionWithSmartcast(whenSubjectExpressionWithSmartcast) + } + + final override fun visitWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull: FirWhenSubjectExpressionWithSmartcastToNull, data: Nothing?) { + visitWhenSubjectExpressionWithSmartcastToNull(whenSubjectExpressionWithSmartcastToNull) + } + final override fun visitWrappedDelegateExpression(wrappedDelegateExpression: FirWrappedDelegateExpression, data: Nothing?) { visitWrappedDelegateExpression(wrappedDelegateExpression) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastBuilder.kt index faa0b3f8c65..2be61ea3fc2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastBuilder.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastBuilder.kt @@ -8,16 +8,8 @@ package org.jetbrains.kotlin.fir.expressions.builder import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl -import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.types.SmartcastStability - -class FirExpressionWithSmartcastBuilder { - lateinit var originalExpression: FirQualifiedAccessExpression - lateinit var smartcastType: FirTypeRef - lateinit var typesFromSmartCast: Collection - lateinit var smartcastStability: SmartcastStability +class FirExpressionWithSmartcastBuilder : FirWrappedExpressionWithSmartcastBuilder() { fun build(): FirExpressionWithSmartcast { return FirExpressionWithSmartcastImpl(originalExpression, smartcastType, typesFromSmartCast, smartcastStability) } @@ -25,4 +17,4 @@ class FirExpressionWithSmartcastBuilder { inline fun buildExpressionWithSmartcast(init: FirExpressionWithSmartcastBuilder.() -> Unit): FirExpressionWithSmartcast { return FirExpressionWithSmartcastBuilder().apply(init).build() -} \ No newline at end of file +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastToNullBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastToNullBuilder.kt index 48a285a29b8..d944698331a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastToNullBuilder.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastToNullBuilder.kt @@ -8,17 +8,8 @@ package org.jetbrains.kotlin.fir.expressions.builder import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcastToNull import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastToNullImpl -import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.types.SmartcastStability - -class FirExpressionWithSmartcastToNullBuilder { - lateinit var originalExpression: FirQualifiedAccessExpression - lateinit var smartcastType: FirTypeRef - lateinit var typesFromSmartCast: Collection - lateinit var smartcastStability: SmartcastStability - lateinit var smartcastTypeWithoutNullableNothing: FirTypeRef +class FirExpressionWithSmartcastToNullBuilder : FirWrappedExpressionWithSmartcastToNullBuilder() { fun build(): FirExpressionWithSmartcastToNull { return FirExpressionWithSmartcastToNullImpl( originalExpression, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastBuilder.kt new file mode 100644 index 00000000000..1032541e2f2 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastBuilder.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions.builder + +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpressionWithSmartcastImpl + +class FirWhenSubjectExpressionWithSmartcastBuilder : FirWrappedExpressionWithSmartcastBuilder() { + fun build(): FirWhenSubjectExpressionWithSmartcast { + return FirWhenSubjectExpressionWithSmartcastImpl(originalExpression, smartcastType, typesFromSmartCast, smartcastStability) + } +} + +fun buildWhenSubjectExpressionWithSmartcast(init: FirWhenSubjectExpressionWithSmartcastBuilder.() -> Unit): FirWhenSubjectExpressionWithSmartcast { + return FirWhenSubjectExpressionWithSmartcastBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastToNullBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastToNullBuilder.kt new file mode 100644 index 00000000000..6ca47e2244c --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWhenSubjectExpressionWithSmartcastToNullBuilder.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions.builder + +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpressionWithSmartcastToNull +import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpressionWithSmartcastToNullImpl + +class FirWhenSubjectExpressionWithSmartcastToNullBuilder : FirWrappedExpressionWithSmartcastToNullBuilder() { + fun build(): FirWhenSubjectExpressionWithSmartcastToNull { + return FirWhenSubjectExpressionWithSmartcastToNullImpl( + originalExpression, + smartcastType, + typesFromSmartCast, + smartcastStability, + smartcastTypeWithoutNullableNothing + ) + } +} + +fun buildWhenSubjectExpressionWithSmartcastToNull(init: FirWhenSubjectExpressionWithSmartcastToNullBuilder.() -> Unit): FirWhenSubjectExpressionWithSmartcastToNull { + return FirWhenSubjectExpressionWithSmartcastToNullBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWrappedExpressionWithSmartcastBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWrappedExpressionWithSmartcastBuilder.kt new file mode 100644 index 00000000000..bae17482087 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirWrappedExpressionWithSmartcastBuilder.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions.builder + +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.types.SmartcastStability + +abstract class FirWrappedExpressionWithSmartcastBuilder { + lateinit var originalExpression: E + lateinit var smartcastType: FirTypeRef + lateinit var typesFromSmartCast: Collection + lateinit var smartcastStability: SmartcastStability +} + +abstract class FirWrappedExpressionWithSmartcastToNullBuilder : FirWrappedExpressionWithSmartcastBuilder() { + lateinit var smartcastTypeWithoutNullableNothing: FirTypeRef +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastImpl.kt new file mode 100644 index 00000000000..199e54d8745 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastImpl.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions.impl + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirExpressionRef +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.types.SmartcastStability + +class FirWhenSubjectExpressionWithSmartcastImpl( + override var originalExpression: FirWhenSubjectExpression, + override val smartcastType: FirTypeRef, + override val typesFromSmartCast: Collection, + override val smartcastStability: SmartcastStability +) : FirWhenSubjectExpressionWithSmartcast() { + init { + assert(originalExpression.typeRef is FirResolvedTypeRef) + } + + override val source: KtSourceElement? get() = originalExpression.source + override val annotations: List get() = originalExpression.annotations + override val whenRef: FirExpressionRef get() = originalExpression.whenRef + override val originalType: FirTypeRef get() = originalExpression.typeRef + override val isStable: Boolean get() = smartcastStability == SmartcastStability.STABLE_VALUE + + override val typeRef: FirTypeRef get() = if (isStable) smartcastType else originalExpression.typeRef + + override fun replaceTypeRef(newTypeRef: FirTypeRef) {} + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirWhenSubjectExpressionWithSmartcast { + throw IllegalStateException() + } + + override fun acceptChildren(visitor: FirVisitor, data: D) { + originalExpression.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + throw IllegalStateException() + } +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastToNullImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastToNullImpl.kt new file mode 100644 index 00000000000..3a54e8aeca2 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirWhenSubjectExpressionWithSmartcastToNullImpl.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.expressions.impl + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirExpressionRef +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.types.SmartcastStability + +class FirWhenSubjectExpressionWithSmartcastToNullImpl( + override var originalExpression: FirWhenSubjectExpression, + override val smartcastType: FirTypeRef, + override val typesFromSmartCast: Collection, + override val smartcastStability: SmartcastStability, + override val smartcastTypeWithoutNullableNothing: FirTypeRef +) : FirWhenSubjectExpressionWithSmartcastToNull() { + init { + assert(originalExpression.typeRef is FirResolvedTypeRef) + } + + override val source: KtSourceElement? get() = originalExpression.source + override val annotations: List get() = originalExpression.annotations + override val whenRef: FirExpressionRef get() = originalExpression.whenRef + override val originalType: FirTypeRef get() = originalExpression.typeRef + override val isStable: Boolean get() = smartcastStability == SmartcastStability.STABLE_VALUE + + override val typeRef: FirTypeRef get() = if (isStable) smartcastType else originalExpression.typeRef + + override fun replaceTypeRef(newTypeRef: FirTypeRef) {} + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirWhenSubjectExpressionWithSmartcastToNullImpl { + throw IllegalStateException() + } + + override fun acceptChildren(visitor: FirVisitor, data: D) { + originalExpression.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + throw IllegalStateException() + } +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 5cdf5e88708..b99ca7420f3 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -116,8 +116,10 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val componentCall by element(Expression, functionCall) val callableReferenceAccess by element(Expression, qualifiedAccessExpression) val thisReceiverExpression by element(Expression, qualifiedAccessExpression) - val expressionWithSmartcast by element(Expression, qualifiedAccessExpression) - val expressionWithSmartcastToNull by element(Expression, expressionWithSmartcast) + val wrappedExpressionWithSmartcast by element(Expression) + val wrappedExpressionWithSmartcastToNull by element(Expression, wrappedExpressionWithSmartcast) + val expressionWithSmartcast by element(Expression, qualifiedAccessExpression, wrappedExpressionWithSmartcast) + val expressionWithSmartcastToNull by element(Expression, expressionWithSmartcast, wrappedExpressionWithSmartcastToNull) val safeCallExpression by element(Expression, expression) val checkedSafeCallSubject by element(Expression, expression) val getClassCall by element(Expression, expression, call) @@ -136,6 +138,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val throwExpression by element(Expression, expression) val variableAssignment by element(Expression, qualifiedAccess) val whenSubjectExpression by element(Expression, expression) + val whenSubjectExpressionWithSmartcast by element(Expression, whenSubjectExpression, wrappedExpressionWithSmartcast) + val whenSubjectExpressionWithSmartcastToNull by element(Expression, whenSubjectExpression, wrappedExpressionWithSmartcastToNull) val wrappedDelegateExpression by element(Expression, wrappedExpression) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index b85bcda5f12..891e044036c 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -193,6 +193,9 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() noImpl(expressionWithSmartcast) noImpl(expressionWithSmartcastToNull) + noImpl(whenSubjectExpressionWithSmartcast) + noImpl(whenSubjectExpressionWithSmartcastToNull) + impl(getClassCall) { default("argument") { value = "argumentList.arguments.first()" diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 7b0c52fd02b..04baf885cad 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -476,8 +476,10 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +intField("componentIndex") } - expressionWithSmartcast.configure { - +field("originalExpression", qualifiedAccessExpression) + wrappedExpressionWithSmartcast.configure { + withArg("E", expression) + +typeRefField + +field("originalExpression", "E", packageName = null) +field("typesFromSmartCast", "Collection", null, customType = coneKotlinTypeType) +field("originalType", typeRef) +field("smartcastType", typeRef) @@ -485,13 +487,18 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +smartcastStability } - expressionWithSmartcastToNull.configure { - +field("originalExpression", qualifiedAccessExpression) - +field("typesFromSmartCast", "Collection", null, customType = coneKotlinTypeType) - +field("originalType", typeRef) - +field("smartcastType", typeRef) + wrappedExpressionWithSmartcastToNull.configure { + withArg("E", expression) + parentArg(wrappedExpressionWithSmartcast, "E", "E") +field("smartcastTypeWithoutNullableNothing", typeRef) - +smartcastStability + } + + expressionWithSmartcast.configure { + parentArg(wrappedExpressionWithSmartcast, "E", qualifiedAccessExpression) + } + + expressionWithSmartcastToNull.configure { + parentArg(wrappedExpressionWithSmartcastToNull, "E", qualifiedAccessExpression) } safeCallExpression.configure { @@ -560,6 +567,14 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field("whenRef", whenRefType) } + whenSubjectExpressionWithSmartcast.configure { + parentArg(wrappedExpressionWithSmartcast, "E", whenSubjectExpression) + } + + whenSubjectExpressionWithSmartcastToNull.configure { + parentArg(wrappedExpressionWithSmartcastToNull, "E", whenSubjectExpression) + } + wrappedExpression.configure { +field(expression).withReplace() }