diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 19564c51448..e9b0a438789 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirStubDiagnostic import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.FirResolvedReifiedParameterReferenceBuilder -import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl +import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionWithSmartcast import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirSuperReference @@ -457,14 +457,18 @@ fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo(qualifiedAc val allTypes = typesFromSmartCast.also { it += qualifiedAccessExpression.resultType.coneTypeUnsafe() } - val intersectedType = ConeTypeIntersector.intersectTypes(inferenceComponents.ctx as ConeInferenceContext, allTypes) + val intersectedType = ConeTypeIntersector.intersectTypes(inferenceComponents.ctx, allTypes) // TODO: add check that intersectedType is not equal to original type val intersectedTypeRef = buildResolvedTypeRef { source = qualifiedAccessExpression.resultType.source type = intersectedType annotations += qualifiedAccessExpression.resultType.annotations } - return FirExpressionWithSmartcastImpl(qualifiedAccessExpression, intersectedTypeRef, typesFromSmartCast) + return buildExpressionWithSmartcast { + originalExpression = qualifiedAccessExpression + typeRef = intersectedTypeRef + this.typesFromSmartCast = typesFromSmartCast + } } fun CallableId.isInvoke() = 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 114659ea48b..233f233e36f 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 @@ -28,7 +28,7 @@ abstract class FirExpressionWithSmartcast : FirQualifiedAccessExpression() { abstract override val extensionReceiver: FirExpression abstract override val calleeReference: FirReference abstract val originalExpression: FirQualifiedAccessExpression - abstract val typesFromSmartcast: Collection + abstract val typesFromSmartCast: Collection abstract val originalType: FirTypeRef override fun accept(visitor: FirVisitor, data: D): R = visitor.visitExpressionWithSmartcast(this, data) 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 new file mode 100644 index 00000000000..48d595c654d --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/builder/FirExpressionWithSmartcastBuilder.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2020 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.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 + +class FirExpressionWithSmartcastBuilder { + lateinit var originalExpression: FirQualifiedAccessExpression + lateinit var typeRef: FirTypeRef + lateinit var typesFromSmartCast: Collection + + fun build(): FirExpressionWithSmartcast { + return FirExpressionWithSmartcastImpl(originalExpression, typeRef, typesFromSmartCast) + } +} + +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/impl/FirExpressionWithSmartcastImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt index ba05854359d..e388530f56b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirExpressionWithSmartcastImpl.kt @@ -19,10 +19,10 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.transformSingle -class FirExpressionWithSmartcastImpl( +internal class FirExpressionWithSmartcastImpl( override var originalExpression: FirQualifiedAccessExpression, override val typeRef: FirTypeRef, - override val typesFromSmartcast: Collection + override val typesFromSmartCast: Collection ) : FirExpressionWithSmartcast() { init { assert(originalExpression.typeRef is FirResolvedTypeRef) 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 5e81a7face1..3c78cc9e3db 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 @@ -403,7 +403,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild expressionWithSmartcast.configure { +field("originalExpression", qualifiedAccessExpression) - +field("typesFromSmartcast", "Collection", null, customType = coneKotlinTypeType) + +field("typesFromSmartCast", "Collection", null, customType = coneKotlinTypeType) +field("originalType", typeRef) }