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 67d6328773a..e589d5da699 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 @@ -46,6 +46,7 @@ class FirSpecificTypeResolverTransformer( resolvedType ).apply { annotations += typeRef.annotations + delegatedTypeRef = typeRef }.compose() } diff --git a/compiler/fir/resolve/testData/resolve/fakeRecursiveSupertype.kt b/compiler/fir/resolve/testData/resolve/fakeRecursiveSupertype.kt index 1d9882832c0..6735d03f171 100644 --- a/compiler/fir/resolve/testData/resolve/fakeRecursiveSupertype.kt +++ b/compiler/fir/resolve/testData/resolve/fakeRecursiveSupertype.kt @@ -1,7 +1,7 @@ import incorrect.directory.My -class My : My() +class My : My() class Your : His() -class His : Your() \ No newline at end of file +class His : Your() \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/fakeRecursiveTypealias.kt b/compiler/fir/resolve/testData/resolve/fakeRecursiveTypealias.kt index cf2f35a87e1..b67f1545153 100644 --- a/compiler/fir/resolve/testData/resolve/fakeRecursiveTypealias.kt +++ b/compiler/fir/resolve/testData/resolve/fakeRecursiveTypealias.kt @@ -2,4 +2,4 @@ import incorrect.directory.Your typealias My = incorrect.directory.My -typealias Your = Your \ No newline at end of file +typealias Your = Your \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/typeParameterVsNested.kt b/compiler/fir/resolve/testData/resolve/typeParameterVsNested.kt index 3c8e593c9de..25c88871657 100644 --- a/compiler/fir/resolve/testData/resolve/typeParameterVsNested.kt +++ b/compiler/fir/resolve/testData/resolve/typeParameterVsNested.kt @@ -16,4 +16,4 @@ abstract class My { class Some : T() } -abstract class Your : T \ No newline at end of file +abstract class Your : T \ No newline at end of file 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 90c3d10b194..e0896505cb2 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 @@ -20,6 +20,7 @@ abstract class FirErrorTypeRef : FirResolvedTypeRef(), FirDiagnosticHolder { abstract override val source: FirSourceElement? abstract override val annotations: List abstract override val type: ConeKotlinType + abstract override val delegatedTypeRef: FirTypeRef? abstract override val diagnostic: FirDiagnostic override fun accept(visitor: FirVisitor, data: D): R = visitor.visitErrorTypeRef(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedFunctionTypeRef.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedFunctionTypeRef.kt index a01c72c461d..b7f65d32462 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedFunctionTypeRef.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedFunctionTypeRef.kt @@ -19,6 +19,7 @@ abstract class FirResolvedFunctionTypeRef : FirResolvedTypeRef(), FirFunctionTyp abstract override val source: FirSourceElement? abstract override val annotations: List abstract override val type: ConeKotlinType + abstract override val delegatedTypeRef: FirTypeRef? abstract override val isMarkedNullable: Boolean abstract override val receiverTypeRef: FirTypeRef? abstract override val valueParameters: List diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedTypeRef.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedTypeRef.kt index 944af832d1c..6600a2a928e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedTypeRef.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirResolvedTypeRef.kt @@ -19,6 +19,7 @@ abstract class FirResolvedTypeRef : FirPureAbstractElement(), FirTypeRef { abstract override val source: FirSourceElement? abstract override val annotations: List abstract val type: ConeKotlinType + abstract val delegatedTypeRef: FirTypeRef? override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedTypeRef(this, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt index f273d09ca97..97126cb5305 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirErrorTypeRefImpl.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.types.ConeClassErrorType 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.* /* @@ -25,6 +26,7 @@ class FirErrorTypeRefImpl( ) : FirErrorTypeRef(), FirAbstractAnnotatedElement { override val annotations: MutableList = mutableListOf() override val type: ConeKotlinType = ConeClassErrorType(diagnostic.reason) + override val delegatedTypeRef: FirTypeRef? get() = null override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeRefImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeRefImpl.kt index d52bad61c6a..241cf7a676e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeRefImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedFunctionTypeRefImpl.kt @@ -27,6 +27,7 @@ class FirResolvedFunctionTypeRefImpl( override var returnTypeRef: FirTypeRef ) : FirResolvedFunctionTypeRef(), FirAbstractAnnotatedElement { override val annotations: MutableList = mutableListOf() + override val delegatedTypeRef: FirTypeRef? get() = null override val valueParameters: MutableList = mutableListOf() override fun acceptChildren(visitor: FirVisitor, data: D) { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedTypeRefImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedTypeRefImpl.kt index b5c58c92163..b74febec6aa 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedTypeRefImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirResolvedTypeRefImpl.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement 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.* /* @@ -22,13 +23,16 @@ class FirResolvedTypeRefImpl( override val type: ConeKotlinType ) : FirResolvedTypeRef(), FirAbstractAnnotatedElement { override val annotations: MutableList = mutableListOf() + override var delegatedTypeRef: FirTypeRef? = null override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } + delegatedTypeRef?.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedTypeRefImpl { annotations.transformInplace(transformer, data) + delegatedTypeRef = delegatedTypeRef?.transformSingle(transformer, data) return this } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt index 9abd173a9b0..6d17f30837d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeKotlinTypeProjection 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.name.ClassId @@ -28,6 +29,9 @@ sealed class FirImplicitBuiltinTypeRef( override val type: ConeClassLikeType = ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(id), typeArguments, isNullable) + override val delegatedTypeRef: FirTypeRef? + get() = null + override fun acceptChildren(visitor: FirVisitor, data: D) {} override fun transformChildren(transformer: FirTransformer, data: D): FirElement { 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 0e92b3c1f73..534b6e3f8b9 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 @@ -486,13 +486,28 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() noSource() } - impl(resolvedTypeRef) + impl(resolvedTypeRef) { + default("delegatedTypeRef") { + value = "null" + } + } val errorTypeRefImpl = impl(errorTypeRef) { default("type", "ConeClassErrorType(diagnostic.reason)") + default("delegatedTypeRef") { + value = "null" + withGetter = true + } useTypes(coneClassErrorTypeType) } + impl(resolvedFunctionTypeRef) { + default("delegatedTypeRef") { + value = "null" + withGetter = true + } + } + impl(errorFunction) { defaultNull("receiverTypeRef", "body", withGetter = true) default("returnTypeRef", "FirErrorTypeRefImpl(null, diagnostic)") 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 b3bd4cb9b2f..7465795ce47 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 @@ -490,6 +490,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { resolvedTypeRef.configure { +field("type", coneKotlinTypeType) + +field("delegatedTypeRef", typeRef, nullable = true) } delegatedTypeRef.configure { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt index 1269fcf63df..c3f0db85a13 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.selfImportingScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.FirErrorTypeRef +import org.jetbrains.kotlin.fir.types.FirUserTypeRef import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -190,6 +191,10 @@ fun KtElement.getOrBuildFir( override fun visitThisReference(thisReference: FirThisReference) {} override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef) {} + + override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) { + userTypeRef.acceptChildren(this) + } }) var current: PsiElement? = psi while (current is KtElement) {