From 2cd4ff11f0a45373a22090c5140af3022c25f1b5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 27 May 2023 20:55:52 +0200 Subject: [PATCH] [FIR] introduce FirErrorTypeRef.partiallyResolvedTypeRef ^KT-58125 --- .../FirSpecificTypeResolverTransformer.kt | 5 +++++ .../kotlin/fir/types/FirErrorTypeRef.kt | 3 +++ .../types/builder/FirErrorTypeRefBuilder.kt | 11 ++++++---- .../fir/types/impl/FirErrorTypeRefImpl.kt | 21 ++++++++++++++----- .../fir/tree/generator/NodeConfigurator.kt | 4 ++++ 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt index 937b906a6bd..1b5ccdc03b5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt @@ -181,6 +181,11 @@ class FirSpecificTypeResolverTransformer( return resolvedTypeRef } + override fun transformErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: ScopeClassDeclaration): FirTypeRef { + errorTypeRef.transformPartiallyResolvedTypeRef(this, data) + return errorTypeRef + } + override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: ScopeClassDeclaration): FirTypeRef { return implicitTypeRef } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirErrorTypeRef.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirErrorTypeRef.kt index 827118d96b7..015843a6523 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirErrorTypeRef.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirErrorTypeRef.kt @@ -24,6 +24,7 @@ abstract class FirErrorTypeRef : FirResolvedTypeRef(), FirDiagnosticHolder { abstract override val delegatedTypeRef: FirTypeRef? abstract override val isFromStubType: Boolean abstract override val diagnostic: ConeDiagnostic + abstract val partiallyResolvedTypeRef: FirTypeRef? override fun accept(visitor: FirVisitor, data: D): R = visitor.visitErrorTypeRef(this, data) @@ -34,4 +35,6 @@ abstract class FirErrorTypeRef : FirResolvedTypeRef(), FirDiagnosticHolder { abstract override fun replaceAnnotations(newAnnotations: List) abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirErrorTypeRef + + abstract fun transformPartiallyResolvedTypeRef(transformer: FirTransformer, data: D): FirErrorTypeRef } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt index 7176075a26f..c9c38f5b5d6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/builder/FirErrorTypeRefBuilder.kt @@ -5,18 +5,17 @@ package org.jetbrains.kotlin.fir.types.builder -import kotlin.contracts.* import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.types.ConeErrorType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl -import org.jetbrains.kotlin.fir.visitors.* +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract /* * This file was generated automatically @@ -28,6 +27,8 @@ class FirErrorTypeRefBuilder : FirAnnotationContainerBuilder { override var source: KtSourceElement? = null var type: ConeKotlinType? = null var delegatedTypeRef: FirTypeRef? = null + var partiallyResolvedTypeRef: FirTypeRef? = null + lateinit var diagnostic: ConeDiagnostic override fun build(): FirErrorTypeRef { @@ -37,13 +38,15 @@ class FirErrorTypeRefBuilder : FirAnnotationContainerBuilder { source, type, delegatedTypeRef, - diagnostic + diagnostic, + partiallyResolvedTypeRef = partiallyResolvedTypeRef, ) } else { FirErrorTypeRefImpl( source, delegatedTypeRef, diagnostic, + partiallyResolvedTypeRef = partiallyResolvedTypeRef, ) } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt index 3599ccc34a5..5ea953818e3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt @@ -13,29 +13,35 @@ import org.jetbrains.kotlin.fir.types.ConeErrorType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.fir.visitors.* +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.fir.visitors.transformInplace internal class FirErrorTypeRefImpl( override val source: KtSourceElement?, override val type: ConeKotlinType, override var delegatedTypeRef: FirTypeRef?, override val diagnostic: ConeDiagnostic, - override val isFromStubType: Boolean = false + override val isFromStubType: Boolean = false, + override var partiallyResolvedTypeRef: FirTypeRef? = null, ) : FirErrorTypeRef() { - constructor(source: KtSourceElement?, delegatedTypeRef: FirTypeRef?, diagnostic: ConeDiagnostic, - isFromStubType: Boolean = false + constructor( + source: KtSourceElement?, delegatedTypeRef: FirTypeRef?, diagnostic: ConeDiagnostic, + isFromStubType: Boolean = false, partiallyResolvedTypeRef: FirTypeRef? = null, ) : this( source, ConeErrorType(diagnostic), delegatedTypeRef, diagnostic, - isFromStubType + isFromStubType, + partiallyResolvedTypeRef, ) override val annotations: MutableOrEmptyList = MutableOrEmptyList.empty() override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } + partiallyResolvedTypeRef?.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirErrorTypeRefImpl { @@ -51,4 +57,9 @@ internal class FirErrorTypeRefImpl( annotations.transformInplace(transformer, data) return this } + + override fun transformPartiallyResolvedTypeRef(transformer: FirTransformer, data: D): FirErrorTypeRef { + partiallyResolvedTypeRef = partiallyResolvedTypeRef?.transform(transformer, data) + return this + } } 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 6f30bcfffe3..8c938480d56 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 @@ -717,6 +717,10 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +fieldList("contextReceiverTypeRefs", typeRef) } + errorTypeRef.configure { + +field("partiallyResolvedTypeRef", typeRef, nullable = true).withTransform() + } + intersectionTypeRef.configure { +field("leftType", typeRef) +field("rightType", typeRef)