From 60e6d2e521155ab32ad8034f8c09f8d4d7a843d3 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 29 Oct 2019 12:40:43 +0300 Subject: [PATCH] Resolve local declaration statuses & types inside bodies in FirBodyResolveTransformer --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 3 +- .../fir/java/declarations/FirJavaClass.kt | 5 + .../java/declarations/FirJavaConstructor.kt | 9 + .../fir/java/declarations/FirJavaField.kt | 9 + .../converter/DeclarationsConverter.kt | 34 +-- .../kotlin/fir/builder/BaseFirBuilder.kt | 3 + .../kotlin/fir/builder/RawFirBuilder.kt | 20 +- .../kotlin/fir/resolve/ResolutionMode.kt | 10 +- .../FirAbstractTreeTransformer.kt | 4 +- ...irAbstractTreeTransformerWithSuperTypes.kt | 2 +- ...rCallCompletionResultsWriterTransformer.kt | 13 +- .../FirImportResolveTransformer.kt | 2 +- .../FirSpecificTypeResolverTransformer.kt | 2 +- .../FirStatusResolveTransformer.kt | 188 ++++++------- .../FirSupertypeResolverTransformer.kt | 2 +- .../transformers/FirTypeResolveTransformer.kt | 12 +- .../resolve/transformers/TransformUtils.kt | 15 +- .../FirAbstractBodyResolveTransformer.kt | 19 +- .../body/resolve/FirBodyResolveTransformer.kt | 13 +- ...ControlFlowStatementsResolveTransformer.kt | 1 + .../FirDeclarationsResolveTransformer.kt | 258 +++++++++++++----- .../FirExpressionsResolveTransformer.kt | 26 +- .../impl/FirTypeResolveScopeForBodyResolve.kt | 33 +++ .../resolve/testData/resolve/cfg/complex.dot | 2 +- .../resolve/testData/resolve/cfg/complex.txt | 2 +- .../expresssions/localImplicitBodies.txt | 4 +- .../resolve/expresssions/localInnerClass.kt | 11 + .../resolve/expresssions/localInnerClass.txt | 26 ++ .../resolve/expresssions/localScopes.kt | 4 +- .../resolve/expresssions/localScopes.txt | 10 +- .../resolve/expresssions/localTypes.kt | 14 + .../resolve/expresssions/localTypes.txt | 30 ++ .../expresssions/privateObjectLiteral.kt | 13 + .../expresssions/privateObjectLiteral.txt | 39 +++ .../resolve/samConversions/kotlinSam.txt | 4 +- .../notSamBecauseOfSupertype.txt | 8 +- .../resolve/stdlib/anonymousInDelegate.txt | 2 +- .../testData/resolve/stdlib/arrayInLocal.kt | 5 + .../testData/resolve/stdlib/arrayInLocal.txt | 8 + .../testData/resolve/stdlib/problems.txt | 2 +- .../resolve/stdlib/reflectionClass.kt | 5 + .../resolve/stdlib/reflectionClass.txt | 4 + .../fir/FirDiagnosticsTestGenerated.java | 15 + ...FirDiagnosticsWithStdlibTestGenerated.java | 5 + .../fir/declarations/FirAnonymousFunction.kt | 2 + .../declarations/FirCallableDeclaration.kt | 2 + .../FirCallableMemberDeclaration.kt | 4 + .../kotlin/fir/declarations/FirConstructor.kt | 4 + .../kotlin/fir/declarations/FirEnumEntry.kt | 2 + .../fir/declarations/FirErrorFunction.kt | 2 + .../kotlin/fir/declarations/FirField.kt | 4 + .../kotlin/fir/declarations/FirFunction.kt | 2 + .../fir/declarations/FirMemberDeclaration.kt | 2 + .../fir/declarations/FirMemberFunction.kt | 4 + .../kotlin/fir/declarations/FirProperty.kt | 4 + .../fir/declarations/FirPropertyAccessor.kt | 4 + .../fir/declarations/FirRegularClass.kt | 2 + .../kotlin/fir/declarations/FirSealedClass.kt | 2 + .../fir/declarations/FirSimpleFunction.kt | 4 + .../kotlin/fir/declarations/FirTypeAlias.kt | 2 + .../fir/declarations/FirValueParameter.kt | 2 + .../kotlin/fir/declarations/FirVariable.kt | 2 + .../impl/FirAnonymousFunctionImpl.kt | 7 +- .../fir/declarations/impl/FirClassImpl.kt | 7 +- .../declarations/impl/FirConstructorImpl.kt | 14 +- .../impl/FirDefaultSetterValueParameter.kt | 7 +- .../fir/declarations/impl/FirEnumEntryImpl.kt | 7 +- .../declarations/impl/FirErrorFunctionImpl.kt | 4 + .../fir/declarations/impl/FirFieldImpl.kt | 11 +- .../impl/FirModifiableConstructor.kt | 4 + .../impl/FirModifiableFunction.kt | 2 + .../impl/FirModifiableRegularClass.kt | 2 + .../impl/FirModifiableVariable.kt | 2 + .../impl/FirPropertyAccessorImpl.kt | 14 +- .../fir/declarations/impl/FirPropertyImpl.kt | 14 +- .../declarations/impl/FirSealedClassImpl.kt | 7 +- .../impl/FirSimpleFunctionImpl.kt | 14 +- .../fir/declarations/impl/FirTypeAliasImpl.kt | 7 +- .../impl/FirValueParameterImpl.kt | 7 +- .../fir/expressions/FirComponentCall.kt | 2 + .../kotlin/fir/expressions/FirFunctionCall.kt | 2 + .../expressions/impl/FirComponentCallImpl.kt | 7 +- .../expressions/impl/FirFunctionCallImpl.kt | 7 +- .../fir/tree/generator/NodeConfigurator.kt | 8 +- .../localClassWithOverrides.fir.txt | 19 +- .../typeParameterClassLiteral.fir.txt | 12 +- 86 files changed, 857 insertions(+), 276 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeResolveScopeForBodyResolve.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.txt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/localTypes.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/localTypes.txt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.txt create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.kt create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.txt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 51154dc32c6..f63a2a28f87 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -424,9 +424,8 @@ class Fir2IrVisitor( val constructedIrType = constructedTypeRef.toIrType(this@Fir2IrVisitor.session, declarationStorage) // TODO: find delegated constructor correctly val classId = constructedClassSymbol.classId - val provider = this@Fir2IrVisitor.session.firSymbolProvider var constructorSymbol: FirConstructorSymbol? = null - provider.getClassUseSiteMemberScope(classId, this@Fir2IrVisitor.session, ScopeSession())!!.processFunctionsByName( + constructedClassSymbol.buildUseSiteMemberScope(this@Fir2IrVisitor.session, ScopeSession())!!.processFunctionsByName( classId.shortClassName ) { when { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt index 6becb5f25e3..164788d4e4a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaClass.kt @@ -88,4 +88,9 @@ class FirJavaClass internal constructor( superTypeRefs.transformInplace(transformer, data) return this } + + override fun transformStatus(transformer: FirTransformer, data: D): FirJavaClass { + status = status.transformSingle(transformer, data) + return this + } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt index 353e8364d49..9b7637959bd 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaConstructor.kt @@ -102,5 +102,14 @@ class FirJavaConstructor( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirJavaConstructor { + return this + } + + override fun transformStatus(transformer: FirTransformer, data: D): FirJavaConstructor { + status = status.transformSingle(transformer, data) + return this + } + override var containerSource: DeserializedContainerSource? = null } \ No newline at end of file diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index b36b655f23f..ad2f53ce46b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -72,6 +72,10 @@ class FirJavaField( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirField { + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } @@ -88,6 +92,11 @@ class FirJavaField( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirJavaField { + status = status.transformSingle(transformer, data) + return this + } + override val delegate: FirExpression? get() = null diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index e8837196fb9..f35c4f92e17 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -467,24 +467,26 @@ class DeclarationsConverter( superTypeRefs.ifEmpty { superTypeRefs += implicitAnyType } val delegatedType = delegatedSuperTypeRef ?: implicitAnyType - return FirAnonymousObjectImpl(null, session, FirAnonymousObjectSymbol()).apply { - annotations += modifiers.annotations - this.superTypeRefs += superTypeRefs - this.typeRef = superTypeRefs.first() + return withChildClassName(ANONYMOUS_OBJECT_NAME) { + FirAnonymousObjectImpl(null, session, FirAnonymousObjectSymbol()).apply { + annotations += modifiers.annotations + this.superTypeRefs += superTypeRefs + this.typeRef = superTypeRefs.first() - val classWrapper = ClassWrapper( - SpecialNames.NO_NAME_PROVIDED, modifiers, ClassKind.OBJECT, hasPrimaryConstructor = false, - hasSecondaryConstructor = classBody.getChildNodesByType(SECONDARY_CONSTRUCTOR).isNotEmpty(), - delegatedSelfTypeRef = delegatedType, - delegatedSuperTypeRef = delegatedType, - superTypeCallEntry = superTypeCallEntry - ) - //parse primary constructor - convertPrimaryConstructor(primaryConstructor, classWrapper)?.let { this.declarations += it.firConstructor } + val classWrapper = ClassWrapper( + SpecialNames.NO_NAME_PROVIDED, modifiers, ClassKind.OBJECT, hasPrimaryConstructor = false, + hasSecondaryConstructor = classBody.getChildNodesByType(SECONDARY_CONSTRUCTOR).isNotEmpty(), + delegatedSelfTypeRef = delegatedType, + delegatedSuperTypeRef = delegatedType, + superTypeCallEntry = superTypeCallEntry + ) + //parse primary constructor + convertPrimaryConstructor(primaryConstructor, classWrapper)?.let { this.declarations += it.firConstructor } - //parse declarations - classBody?.let { - this.declarations += convertClassBody(it, classWrapper) + //parse declarations + classBody?.let { + this.declarations += convertClassBody(it, classWrapper) + } } } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index bb2471f7997..06e96fdce58 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -70,6 +70,7 @@ abstract class BaseFirBuilder(val session: FirSession, val context: Context = when { local -> CallableId(name) context.className == FqName.ROOT -> CallableId(context.packageFqName, name) + context.className.shortName() === ANONYMOUS_OBJECT_NAME -> CallableId(FqName.ROOT, FqName("anonymous"), name) else -> CallableId(context.packageFqName, context.className, name) } @@ -94,6 +95,8 @@ abstract class BaseFirBuilder(val session: FirSession, val context: Context = /**** Common utils ****/ companion object { val KNPE = Name.identifier("KotlinNullPointerException") + + val ANONYMOUS_OBJECT_NAME = Name.special("") } fun FirExpression.toReturn(baseSource: FirSourceElement? = source, labelName: String? = null): FirReturnExpression { diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 894dbd77116..1d78854e2ab 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -541,16 +541,18 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder override fun visitObjectLiteralExpression(expression: KtObjectLiteralExpression, data: Unit): FirElement { val objectDeclaration = expression.objectDeclaration - return FirAnonymousObjectImpl(expression.toFirSourceElement(), session, FirAnonymousObjectSymbol()).apply { - objectDeclaration.extractAnnotationsTo(this) - objectDeclaration.extractSuperTypeListEntriesTo(this, null) - this.typeRef = superTypeRefs.first() // TODO + return withChildClassName(ANONYMOUS_OBJECT_NAME) { + FirAnonymousObjectImpl(expression.toFirSourceElement(), session, FirAnonymousObjectSymbol()).apply { + objectDeclaration.extractAnnotationsTo(this) + objectDeclaration.extractSuperTypeListEntriesTo(this, null) + this.typeRef = superTypeRefs.first() // TODO - for (declaration in objectDeclaration.declarations) { - declarations += declaration.toFirDeclaration( - delegatedSuperType = null, delegatedSelfType = null, - owner = objectDeclaration, hasPrimaryConstructor = false - ) + for (declaration in objectDeclaration.declarations) { + declarations += declaration.toFirDeclaration( + delegatedSuperType = null, delegatedSelfType = null, + owner = objectDeclaration, hasPrimaryConstructor = false + ) + } } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt index fe253ee777f..6123548ddb6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt @@ -5,15 +5,23 @@ package org.jetbrains.kotlin.fir.resolve +import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef sealed class ResolutionMode { object ContextDependent : ResolutionMode() object ContextIndependent : ResolutionMode() + // TODO: it's better not to use WithExpectedType(FirImplicitTypeRef) class WithExpectedType(val expectedTypeRef: FirTypeRef) : ResolutionMode() + + class WithStatus(val status: FirDeclarationStatus) : ResolutionMode() + class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode() } fun withExpectedType(expectedTypeRef: FirTypeRef?): ResolutionMode = - expectedTypeRef?.let { ResolutionMode.WithExpectedType(it) } ?: ResolutionMode.ContextDependent \ No newline at end of file + expectedTypeRef?.let { ResolutionMode.WithExpectedType(it) } ?: ResolutionMode.ContextDependent + +fun FirDeclarationStatus.mode(): ResolutionMode = + ResolutionMode.WithStatus(this) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformer.kt index 941b284cb2f..1adcc313d87 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformer.kt @@ -10,8 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose -abstract class FirAbstractTreeTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer(phase) { - override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { +abstract class FirAbstractTreeTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer(phase) { + override fun transformElement(element: E, data: D): CompositeTransformResult { @Suppress("UNCHECKED_CAST") return (element.transformChildren(this, data) as E).compose() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt index 57b8771aac2..98ce81a8c06 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult abstract class FirAbstractTreeTransformerWithSuperTypes( phase: FirResolvePhase, reversedScopePriority: Boolean -) : FirAbstractTreeTransformer(phase) { +) : FirAbstractTreeTransformer(phase) { protected val towerScope = FirCompositeScope(mutableListOf(), reversedPriority = reversedScopePriority) protected inline fun withScopeCleanup(crossinline l: () -> T): T { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index a0e0f485f95..d0f3c43eab1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -8,9 +8,11 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl +import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.candidate @@ -22,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl +import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirTypeProjectionWithVarianceImpl import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult @@ -32,7 +35,7 @@ class FirCallCompletionResultsWriterTransformer( override val session: FirSession, private val finalSubstitutor: ConeSubstitutor, private val typeCalculator: ReturnTypeCalculator -) : FirAbstractTreeTransformer(phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { +) : FirAbstractTreeTransformer(phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { override fun transformQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, @@ -42,7 +45,13 @@ class FirCallCompletionResultsWriterTransformer( qualifiedAccessExpression.calleeReference as? FirNamedReferenceWithCandidate ?: return qualifiedAccessExpression.compose() calleeReference.candidate.substitutor - val typeRef = typeCalculator.tryCalculateReturnType(calleeReference.candidateSymbol.phasedFir as FirTypedDeclaration) + val candidateFir = calleeReference.candidateSymbol.phasedFir + val typeRef = (candidateFir as? FirTypedDeclaration)?.let { + typeCalculator.tryCalculateReturnType(it) + } ?: FirErrorTypeRefImpl( + calleeReference.source, + FirSimpleDiagnostic("Callee reference to candidate without return type: ${candidateFir.render()}") + ) val initialType = calleeReference.candidate.substitutor.substituteOrNull(typeRef.type) val finalType = finalSubstitutor.substituteOrNull(initialType) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt index fedb8500d89..505ae7a8969 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirImportResolveTransformer.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -class FirImportResolveTransformer() : FirAbstractTreeTransformer(phase = FirResolvePhase.IMPORTS) { +class FirImportResolveTransformer() : FirAbstractTreeTransformer(phase = FirResolvePhase.IMPORTS) { override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { return element.compose() } 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 ff5926e363d..b3d3c7ac40d 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 @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.visitors.compose class FirSpecificTypeResolverTransformer( private val towerScope: FirScope, override val session: FirSession -) : FirAbstractTreeTransformer(phase = FirResolvePhase.SUPER_TYPES) { +) : FirAbstractTreeTransformer(phase = FirResolvePhase.SUPER_TYPES) { override fun transformTypeRef(typeRef: FirTypeRef, data: Nothing?): CompositeTransformResult { val typeResolver = FirTypeResolver.getInstance(session) typeRef.transformChildren(FirSpecificTypeResolverTransformer(towerScope, session), null) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index 99719dbdba9..4027b72415b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -17,83 +17,23 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose -class FirStatusResolveTransformer : FirAbstractTreeTransformer(phase = FirResolvePhase.STATUS) { - private val declarationsWithStatuses = mutableListOf() - +class FirStatusResolveTransformer : FirAbstractTreeTransformer(phase = FirResolvePhase.STATUS) { private val classes = mutableListOf() - private fun FirDeclaration.resolveVisibility(): Visibility { - if (this is FirConstructor) { - val klass = classes.lastOrNull() - if (klass != null && (klass.classKind == ClassKind.ENUM_CLASS || klass.modality == Modality.SEALED)) { - return Visibilities.PRIVATE - } - } - return Visibilities.PUBLIC // TODO (overrides) - } - - private fun FirDeclaration.resolveModality(): Modality { - return when (this) { - is FirEnumEntry -> Modality.FINAL - is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL - is FirCallableMemberDeclaration<*> -> { - val containingClass = classes.lastOrNull() - when { - containingClass == null -> Modality.FINAL - containingClass.classKind == ClassKind.INTERFACE -> { - when { - visibility == Visibilities.PRIVATE -> - Modality.FINAL - this is FirSimpleFunction && body == null -> - Modality.ABSTRACT - this is FirProperty && initializer == null && getter?.body == null && setter?.body == null -> - Modality.ABSTRACT - else -> - Modality.OPEN - } - } - else -> { - if (isOverride && containingClass.modality != Modality.FINAL) Modality.OPEN else Modality.FINAL - } - } - } - else -> Modality.FINAL - } - } + private val containingClass: FirRegularClass? get() = classes.lastOrNull() override lateinit var session: FirSession - override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + override fun transformFile(file: FirFile, data: FirDeclarationStatus?): CompositeTransformResult { session = file.session return transformElement(file, data) } override fun transformDeclarationStatus( declarationStatus: FirDeclarationStatus, - data: Nothing? + data: FirDeclarationStatus? ): CompositeTransformResult { - if (declarationStatus.visibility == Visibilities.UNKNOWN || declarationStatus.modality == null) { - val declaration = declarationsWithStatuses.last() - val visibility = when (declarationStatus.visibility) { - Visibilities.UNKNOWN -> declaration.resolveVisibility() - else -> declarationStatus.visibility - } - val modality = declarationStatus.modality ?: declaration.resolveModality() - val resolvedStatus = (declarationStatus as FirDeclarationStatusImpl).resolved(visibility, modality) - return resolvedStatus.compose() - } - - return transformElement(declarationStatus, data) - } - - private inline fun storeDeclaration( - declaration: FirDeclaration, - computeResult: () -> CompositeTransformResult - ): CompositeTransformResult { - declarationsWithStatuses += declaration - val result = computeResult() - declarationsWithStatuses.removeAt(declarationsWithStatuses.lastIndex) - return result + return (data ?: declarationStatus).compose() } private inline fun storeClass( @@ -106,63 +46,117 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer(phase = FirResolv return result } - override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): CompositeTransformResult { - return transformMemberDeclaration(typeAlias, data) + override fun transformTypeAlias(typeAlias: FirTypeAlias, data: FirDeclarationStatus?): CompositeTransformResult { + typeAlias.typeParameters.forEach { transformDeclaration(it, data) } + typeAlias.transformStatus(this, typeAlias.resolveStatus(typeAlias.status, containingClass, isLocal = false)) + return typeAlias.compose() } - override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult { + override fun transformRegularClass(regularClass: FirRegularClass, data: FirDeclarationStatus?): CompositeTransformResult { + regularClass.transformStatus(this, regularClass.resolveStatus(regularClass.status, containingClass, isLocal = false)) return storeClass(regularClass) { - transformMemberDeclaration(regularClass, data) + regularClass.typeParameters.forEach { transformDeclaration(it, data) } + transformDeclaration(regularClass, data) } as CompositeTransformResult } - override fun transformMemberDeclaration( - memberDeclaration: FirMemberDeclaration, - data: Nothing? - ): CompositeTransformResult { - return storeDeclaration(memberDeclaration) { - transformDeclaration(memberDeclaration, data) - } - } - override fun transformPropertyAccessor( propertyAccessor: FirPropertyAccessor, - data: Nothing? + data: FirDeclarationStatus? ): CompositeTransformResult { - return storeDeclaration(propertyAccessor) { - transformDeclaration(propertyAccessor, data) - } as CompositeTransformResult + propertyAccessor.transformStatus(this, propertyAccessor.resolveStatus(propertyAccessor.status, containingClass, isLocal = false)) + return transformDeclaration(propertyAccessor, data) as CompositeTransformResult } override fun transformConstructor( constructor: FirConstructor, - data: Nothing? + data: FirDeclarationStatus? ): CompositeTransformResult { - return storeDeclaration(constructor) { - transformDeclaration(constructor, data) - } + constructor.transformStatus(this, constructor.resolveStatus(constructor.status, containingClass, isLocal = false)) + return transformDeclaration(constructor, data) } - override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: Nothing?): CompositeTransformResult { - return storeDeclaration(simpleFunction) { - transformDeclaration(simpleFunction, data) - } + override fun transformSimpleFunction( + simpleFunction: FirSimpleFunction, + data: FirDeclarationStatus? + ): CompositeTransformResult { + simpleFunction.transformStatus(this, simpleFunction.resolveStatus(simpleFunction.status, containingClass, isLocal = false)) + return transformDeclaration(simpleFunction, data) } override fun transformProperty( property: FirProperty, - data: Nothing? + data: FirDeclarationStatus? ): CompositeTransformResult { - return storeDeclaration(property) { - transformDeclaration(property, data) - } + property.transformStatus(this, property.resolveStatus(property.status, containingClass, isLocal = false)) + return transformDeclaration(property, data) } - override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): CompositeTransformResult { - return (transformDeclaration(valueParameter, data).single as FirStatement).compose() + override fun transformValueParameter( + valueParameter: FirValueParameter, + data: FirDeclarationStatus? + ): CompositeTransformResult { + return transformDeclaration(valueParameter, data) as CompositeTransformResult } - override fun transformBlock(block: FirBlock, data: Nothing?): CompositeTransformResult { + override fun transformBlock(block: FirBlock, data: FirDeclarationStatus?): CompositeTransformResult { return block.compose() } + + companion object { + fun FirDeclaration.resolveStatus( + status: FirDeclarationStatus, + containingClass: FirRegularClass?, + isLocal: Boolean + ): FirDeclarationStatus { + if (status.visibility == Visibilities.UNKNOWN || status.modality == null) { + val visibility = when (status.visibility) { + Visibilities.UNKNOWN -> if (isLocal) Visibilities.LOCAL else resolveVisibility(containingClass) + else -> status.visibility + } + val modality = status.modality ?: resolveModality(containingClass) + return (status as FirDeclarationStatusImpl).resolved(visibility, modality) + } + return status + } + + private fun FirDeclaration.resolveVisibility(containingClass: FirRegularClass?): Visibility { + if (this is FirConstructor) { + if (containingClass != null && + (containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.modality == Modality.SEALED) + ) { + return Visibilities.PRIVATE + } + } + return Visibilities.PUBLIC // TODO (overrides) + } + + private fun FirDeclaration.resolveModality(containingClass: FirRegularClass?): Modality { + return when (this) { + is FirEnumEntry -> Modality.FINAL + is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL + is FirCallableMemberDeclaration<*> -> { + when { + containingClass == null -> Modality.FINAL + containingClass.classKind == ClassKind.INTERFACE -> { + when { + visibility == Visibilities.PRIVATE -> + Modality.FINAL + this is FirSimpleFunction && body == null -> + Modality.ABSTRACT + this is FirProperty && initializer == null && getter?.body == null && setter?.body == null -> + Modality.ABSTRACT + else -> + Modality.OPEN + } + } + else -> { + if (isOverride && containingClass.modality != Modality.FINAL) Modality.OPEN else Modality.FINAL + } + } + } + else -> Modality.FINAL + } + } + } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypeResolverTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypeResolverTransformer.kt index d38b758e04f..def1133167b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypeResolverTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypeResolverTransformer.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.name.ClassId -class FirSupertypeResolverTransformer : FirAbstractTreeTransformer(phase = FirResolvePhase.SUPER_TYPES) { +class FirSupertypeResolverTransformer : FirAbstractTreeTransformer(phase = FirResolvePhase.SUPER_TYPES) { override lateinit var session: FirSession private lateinit var file: FirFile diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index f8a51b4c257..0c46c893ecb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.addImportingScopes -import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult @@ -83,16 +82,7 @@ open class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes( override fun transformValueParameter(valueParameter: FirValueParameter, data: Nothing?): CompositeTransformResult { val result = transformDeclaration(valueParameter, data).single as FirValueParameter - if (result.isVararg) { - val returnTypeRef = result.returnTypeRef - val returnType = returnTypeRef.coneTypeUnsafe() - result.transformReturnTypeRef( - StoreType, - result.returnTypeRef.withReplacedConeType( - returnType.createArrayOf(session) - ) - ) - } + result.transformVarargTypeToArrayType() return result.compose() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt index f2796656baf..95b958732cc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt @@ -6,14 +6,15 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference -import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef -import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -102,3 +103,13 @@ internal object StoreReceiver : FirTransformer() { return (data as E).compose() } } + +internal fun FirValueParameter.transformVarargTypeToArrayType() { + if (isVararg) { + val returnType = returnTypeRef.coneTypeUnsafe() + transformReturnTypeRef( + StoreType, + returnTypeRef.withReplacedConeType(returnType.createArrayOf(session)) + ) + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index 432227833ac..94dc32d021d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.inference.FirCallCompleter import org.jetbrains.kotlin.fir.resolve.transformers.* import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope +import org.jetbrains.kotlin.fir.scopes.impl.FirTypeResolveScopeForBodyResolve import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl @@ -73,6 +74,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb protected inline val inferenceComponents: InferenceComponents get() = components.inferenceComponents protected inline val resolutionStageRunner: ResolutionStageRunner get() = components.resolutionStageRunner protected inline val samResolver: FirSamResolver get() = components.samResolver + protected inline val typeResolverTransformer: FirSpecificTypeResolverTransformer get() = components.typeResolverTransformer protected inline val callCompleter: FirCallCompleter get() = components.callCompleter protected inline val dataFlowAnalyzer: FirDataFlowAnalyzer get() = components.dataFlowAnalyzer protected inline val scopeSession: ScopeSession get() = components.scopeSession @@ -114,22 +116,27 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb implicitReceiverStack, qualifiedResolver ) + val typeResolverTransformer = FirSpecificTypeResolverTransformer( + FirTypeResolveScopeForBodyResolve(topLevelScopes, localScopes), session + ) val callCompleter: FirCallCompleter = FirCallCompleter(transformer, this) val dataFlowAnalyzer: FirDataFlowAnalyzer = FirDataFlowAnalyzer(this) override val syntheticCallGenerator: FirSyntheticCallGenerator = FirSyntheticCallGenerator(this, callCompleter) - internal var _container: FirDeclaration? = null + internal var containerIfAny: FirDeclaration? = null + private set + override var container: FirDeclaration - get() = _container!! + get() = containerIfAny!! private set(value) { - _container = value + containerIfAny = value } internal inline fun withContainer(declaration: FirDeclaration, crossinline f: () -> T): T { - val prevContainer = _container - _container = declaration + val prevContainer = containerIfAny + containerIfAny = declaration val result = f() - _container = prevContainer + containerIfAny = prevContainer return result } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt index 02b46b43583..808f326eae2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.scopes.addImportingScopes import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -51,7 +52,10 @@ open class FirBodyResolveTransformer( } override fun transformTypeRef(typeRef: FirTypeRef, data: ResolutionMode): CompositeTransformResult { - return typeRef.compose() + if (typeRef is FirResolvedTypeRef) { + return typeRef.compose() + } + return typeResolverTransformer.transformTypeRef(typeRef, null) } override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: ResolutionMode): CompositeTransformResult { @@ -142,6 +146,13 @@ open class FirBodyResolveTransformer( return declarationsTransformer.transformDeclaration(declaration, data) } + override fun transformDeclarationStatus( + declarationStatus: FirDeclarationStatus, + data: ResolutionMode + ): CompositeTransformResult { + return declarationsTransformer.transformDeclarationStatus(declarationStatus, data) + } + override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult { return declarationsTransformer.transformProperty(property, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index d5686590bd1..efb83e2cf66 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -155,6 +155,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran override fun transformCatch(catch: FirCatch, data: ResolutionMode): CompositeTransformResult { dataFlowAnalyzer.enterCatchClause(catch) + catch.parameter.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) return withScopeCleanup(localScopes) { localScopes += FirLocalScope() catch.transformParameter(transformer, ResolutionMode.ContextIndependent) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index ccd86397f2d..fdab2414d99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -13,17 +13,18 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.expressions.FirStatement -import org.jetbrains.kotlin.fir.resolve.ResolutionMode +import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.extractLambdaInfoFromFunctionalType -import org.jetbrains.kotlin.fir.resolve.constructFunctionalTypeRef -import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.transformers.ControlFlowGraphReferenceTransformer +import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer.Companion.resolveStatus import org.jetbrains.kotlin.fir.resolve.transformers.StoreType -import org.jetbrains.kotlin.fir.resolve.withExpectedType +import org.jetbrains.kotlin.fir.resolve.transformers.transformVarargTypeToArrayType import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope +import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.FirComputingImplicitTypeRef @@ -38,6 +39,8 @@ import org.jetbrains.kotlin.utils.addIfNotNull class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) { private var primaryConstructorParametersScope: FirLocalScope? = null + private var containingClass: FirRegularClass? = null + override fun transformDeclaration(declaration: FirDeclaration, data: ResolutionMode): CompositeTransformResult { return components.withContainer(declaration) { declaration.replaceResolvePhase(transformerPhase) @@ -45,39 +48,77 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) } } - override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult { - if (property.isLocal) return transformLocalVariable(property, data) - val returnTypeRef = property.returnTypeRef - if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return property.compose() - if (property.resolvePhase == transformerPhase) return property.compose() - dataFlowAnalyzer.enterProperty(property) - if (returnTypeRef is FirImplicitTypeRef) { - property.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) - } - return withFullBodyResolve { - withScopeCleanup(localScopes) { - localScopes.addIfNotNull(primaryConstructorParametersScope) - components.withContainer(property) { - property.transformChildrenWithoutAccessors(returnTypeRef) - if (property.initializer != null) { - storeVariableReturnType(property) - } - withScopeCleanup(localScopes) { - localScopes.add(FirLocalScope().apply { - storeBackingField(property) - }) - property.transformAccessors() - } - } - property.replaceResolvePhase(transformerPhase) - val controlFlowGraph = dataFlowAnalyzer.exitProperty(property) - property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph) - property.compose() + override fun transformDeclarationStatus( + declarationStatus: FirDeclarationStatus, + data: ResolutionMode + ): CompositeTransformResult { + return ((data as? ResolutionMode.WithStatus)?.status ?: declarationStatus).compose() + } + + private fun prepareTypeParameterOwnerForBodyResolve(declaration: FirMemberDeclaration) { + if (declaration.typeParameters.isNotEmpty()) { + topLevelScopes += FirMemberTypeParameterScope(declaration) + for (typeParameter in declaration.typeParameters) { + typeParameter.replaceResolvePhase(FirResolvePhase.STATUS) } } } - private fun transformLocalVariable(variable: FirProperty, data: ResolutionMode): CompositeTransformResult { + private fun prepareSignatureForBodyResolve(callableMember: FirCallableMemberDeclaration<*>) { + withScopeCleanup(topLevelScopes) { + callableMember.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) + callableMember.transformReceiverTypeRef(transformer, ResolutionMode.ContextIndependent) + if (callableMember is FirFunction<*>) { + callableMember.valueParameters.forEach { + it.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) + it.transformVarargTypeToArrayType() + } + } + } + } + + override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult { + return withScopeCleanup(topLevelScopes) { + prepareTypeParameterOwnerForBodyResolve(property) + if (property.isLocal) { + prepareSignatureForBodyResolve(property) + property.transformStatus(this, property.resolveStatus(property.status).mode()) + property.getter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } + property.setter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } + return@withScopeCleanup transformLocalVariable(property) + } + val returnTypeRef = property.returnTypeRef + if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return@withScopeCleanup property.compose() + if (property.resolvePhase == transformerPhase) return@withScopeCleanup property.compose() + dataFlowAnalyzer.enterProperty(property) + if (returnTypeRef is FirImplicitTypeRef) { + property.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) + } + withFullBodyResolve { + withScopeCleanup(localScopes) { + localScopes.addIfNotNull(primaryConstructorParametersScope) + components.withContainer(property) { + property.transformChildrenWithoutAccessors(returnTypeRef) + if (property.initializer != null) { + storeVariableReturnType(property) + } + withScopeCleanup(localScopes) { + localScopes.add(FirLocalScope().apply { + storeBackingField(property) + }) + property.transformAccessors() + } + } + property.replaceResolvePhase(transformerPhase) + val controlFlowGraph = dataFlowAnalyzer.exitProperty(property) + property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph) + property.compose() + } + } + } + } + + private fun transformLocalVariable(variable: FirProperty): CompositeTransformResult { assert(variable.isLocal) variable.transformOtherChildren(transformer, withExpectedType(variable.returnTypeRef)) if (variable.initializer != null) { @@ -137,31 +178,97 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) } as CompositeTransformResult } - override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): CompositeTransformResult { - localScopes.lastOrNull()?.storeDeclaration(regularClass) - val oldConstructorScope = primaryConstructorParametersScope - primaryConstructorParametersScope = null - val type = regularClass.defaultType() - val result = withLabelAndReceiverType(regularClass.name, regularClass, type) { - val constructor = regularClass.declarations.firstOrNull() as? FirConstructor - if (constructor?.isPrimary == true) { - primaryConstructorParametersScope = FirLocalScope().apply { - constructor.valueParameters.forEach { this.storeDeclaration(it) } + private fun FirDeclaration.resolveStatus(status: FirDeclarationStatus, containingClass: FirClass<*>? = null): FirDeclarationStatus { + val containingDeclaration = components.containerIfAny + return resolveStatus( + status, containingClass as? FirRegularClass, isLocal = containingDeclaration != null && containingClass == null + ) + } + + private fun prepareLocalClassForBodyResolve(klass: FirClass<*>) { + if (klass.supertypesComputationStatus == SupertypesComputationStatus.NOT_COMPUTED) { + klass.replaceSuperTypeRefs( + klass.superTypeRefs.map { superTypeRef -> + this.transformer.transformTypeRef(superTypeRef, ResolutionMode.ContextIndependent).single + } + ) + klass.replaceSupertypesComputationStatus(SupertypesComputationStatus.COMPUTED) + } + if (klass is FirRegularClass) { + klass.transformStatus(transformer, klass.resolveStatus(klass.status).mode()) + } + // This is necessary because of possible jumps from implicit bodies inside + for (declaration in klass.declarations) { + when (declaration) { + is FirRegularClass -> { + prepareLocalClassForBodyResolve(declaration) + } + is FirCallableMemberDeclaration<*> -> { + withScopeCleanup(topLevelScopes) { + prepareTypeParameterOwnerForBodyResolve(declaration) + prepareSignatureForBodyResolve(declaration) + declaration.transformStatus(transformer, declaration.resolveStatus(declaration.status, klass).mode()) + if (declaration is FirProperty) { + declaration.getter?.let { it.transformStatus(this, it.resolveStatus(it.status, klass).mode()) } + declaration.setter?.let { it.transformStatus(this, it.resolveStatus(it.status, klass).mode()) } + } + } } } - transformDeclaration(regularClass, data) + declaration.replaceResolvePhase(FirResolvePhase.STATUS) + } + if (klass is FirRegularClass) { + for (typeParameter in klass.typeParameters) { + typeParameter.replaceResolvePhase(FirResolvePhase.STATUS) + } + } + } + + override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): CompositeTransformResult { + localScopes.lastOrNull()?.storeDeclaration(regularClass) + return withScopeCleanup(topLevelScopes) { + prepareTypeParameterOwnerForBodyResolve(regularClass) + if (regularClass.symbol.classId.isLocal) { + prepareLocalClassForBodyResolve(regularClass) + } + val companionObjects = regularClass.declarations.filterIsInstance().filter { it.isCompanion } + for (companionObject in companionObjects) { + topLevelScopes += nestedClassifierScope(companionObject) + } + topLevelScopes += nestedClassifierScope(regularClass) + + val oldConstructorScope = primaryConstructorParametersScope + val oldContainingClass = containingClass + primaryConstructorParametersScope = null + containingClass = regularClass + val type = regularClass.defaultType() + val result = withLabelAndReceiverType(regularClass.name, regularClass, type) { + val constructor = regularClass.declarations.firstOrNull() as? FirConstructor + if (constructor?.isPrimary == true) { + primaryConstructorParametersScope = FirLocalScope().apply { + constructor.valueParameters.forEach { this.storeDeclaration(it) } + } + } + transformDeclaration(regularClass, data) + } + containingClass = oldContainingClass + primaryConstructorParametersScope = oldConstructorScope + result as CompositeTransformResult } - primaryConstructorParametersScope = oldConstructorScope - return result as CompositeTransformResult } override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: ResolutionMode): CompositeTransformResult { - val type = anonymousObject.defaultType() - anonymousObject.resultType = FirResolvedTypeRefImpl(anonymousObject.source, type) - val result = withLabelAndReceiverType(null, anonymousObject, type) { - transformDeclaration(anonymousObject, data) + prepareLocalClassForBodyResolve(anonymousObject) + return withScopeCleanup(topLevelScopes) { + topLevelScopes += nestedClassifierScope(anonymousObject) + + val type = anonymousObject.defaultType() + anonymousObject.resultType = FirResolvedTypeRefImpl(anonymousObject.source, type) + val result = withLabelAndReceiverType(null, anonymousObject, type) { + transformDeclaration(anonymousObject, data) + } + result as CompositeTransformResult } - return result as CompositeTransformResult } private fun transformAnonymousFunctionWithLambdaResolution( @@ -192,22 +299,31 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) } override fun transformSimpleFunction(simpleFunction: FirSimpleFunction, data: ResolutionMode): CompositeTransformResult { - val returnTypeRef = simpleFunction.returnTypeRef - if ((returnTypeRef !is FirImplicitTypeRef) && implicitTypeOnly) { - return simpleFunction.compose() - } - return withFullBodyResolve { - if (returnTypeRef is FirImplicitTypeRef) { - simpleFunction.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) + return withScopeCleanup(topLevelScopes) { + prepareTypeParameterOwnerForBodyResolve(simpleFunction) + val containingDeclaration = components.containerIfAny + if (containingDeclaration != null && containingDeclaration !is FirClass<*>) { + // For class members everything should be already prepared + prepareSignatureForBodyResolve(simpleFunction) + simpleFunction.transformStatus(this, simpleFunction.resolveStatus(simpleFunction.status).mode()) } + val returnTypeRef = simpleFunction.returnTypeRef + if ((returnTypeRef !is FirImplicitTypeRef) && implicitTypeOnly) { + return@withScopeCleanup simpleFunction.compose() + } + withFullBodyResolve { + if (returnTypeRef is FirImplicitTypeRef) { + simpleFunction.transformReturnTypeRef(StoreType, FirComputingImplicitTypeRef) + } - val receiverTypeRef = simpleFunction.receiverTypeRef - if (receiverTypeRef != null) { - withLabelAndReceiverType(simpleFunction.name, simpleFunction, receiverTypeRef.coneTypeUnsafe()) { + val receiverTypeRef = simpleFunction.receiverTypeRef + if (receiverTypeRef != null) { + withLabelAndReceiverType(simpleFunction.name, simpleFunction, receiverTypeRef.coneTypeUnsafe()) { + transformFunctionWithGivenSignature(simpleFunction, returnTypeRef) + } + } else { transformFunctionWithGivenSignature(simpleFunction, returnTypeRef) } - } else { - transformFunctionWithGivenSignature(simpleFunction, returnTypeRef) } } } @@ -270,7 +386,16 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) return (transformDeclaration(valueParameter, withExpectedType(valueParameter.returnTypeRef)).single as FirStatement).compose() } - override fun transformAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: ResolutionMode): CompositeTransformResult { + override fun transformAnonymousFunction( + anonymousFunction: FirAnonymousFunction, + data: ResolutionMode + ): CompositeTransformResult { + // Either ContextDependent, ContextIndependent or WithExpectedType could be here + if (data !is ResolutionMode.LambdaResolution) { + anonymousFunction.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) + anonymousFunction.transformReceiverTypeRef(transformer, ResolutionMode.ContextIndependent) + anonymousFunction.valueParameters.forEach { it.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) } + } return when (data) { ResolutionMode.ContextDependent -> { anonymousFunction.compose() @@ -343,9 +468,12 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) af.replaceTypeRef(af.constructFunctionalTypeRef(session)) af.compose() } - is ResolutionMode.ContextIndependent -> { + ResolutionMode.ContextIndependent -> { transformFunction(anonymousFunction, data).single.compose() } + is ResolutionMode.WithStatus -> { + throw AssertionError("Should not be here in WithStatus mode") + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 477d2951ef5..35cf30b0248 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -79,14 +79,23 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : qualifiedAccessExpression } is FirSuperReference -> { - if (callee.superTypeRef is FirResolvedTypeRef) { - qualifiedAccessExpression.resultType = callee.superTypeRef - } else { - val superTypeRef = implicitReceiverStack.lastDispatchReceiver() - ?.boundSymbol?.phasedFir?.superTypeRefs?.firstOrNull() - ?: FirErrorTypeRefImpl(qualifiedAccessExpression.source, FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype)) - qualifiedAccessExpression.resultType = superTypeRef - callee.replaceSuperTypeRef(superTypeRef) + when (val superTypeRef = callee.superTypeRef) { + is FirResolvedTypeRef -> { + qualifiedAccessExpression.resultType = superTypeRef + } + !is FirImplicitTypeRef -> { + callee.transformChildren(transformer, ResolutionMode.ContextIndependent) + qualifiedAccessExpression.resultType = callee.superTypeRef + } + else -> { + val superTypeRefFromStack = implicitReceiverStack.lastDispatchReceiver() + ?.boundSymbol?.phasedFir?.superTypeRefs?.firstOrNull() + ?: FirErrorTypeRefImpl( + qualifiedAccessExpression.source, FirSimpleDiagnostic("No super type", DiagnosticKind.NoSupertype) + ) + qualifiedAccessExpression.resultType = superTypeRefFromStack + callee.replaceSuperTypeRef(superTypeRefFromStack) + } } qualifiedAccessExpression } @@ -139,6 +148,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : dataFlowAnalyzer.enterFunctionCall(functionCall) if (functionCall.calleeReference !is FirSimpleNamedReference) return functionCall.compose() functionCall.transform(InvocationKindTransformer, null) + functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) val expectedTypeRef = data.expectedType val completeInference = try { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeResolveScopeForBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeResolveScopeForBodyResolve.kt new file mode 100644 index 00000000000..aabc05644e6 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeResolveScopeForBodyResolve.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2019 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.scopes.impl + +import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol +import org.jetbrains.kotlin.name.Name + +class FirTypeResolveScopeForBodyResolve( + private val topLevelScopes: List, + private val localScopes: List +) : FirScope() { + override fun processClassifiersByName( + name: Name, + processor: (FirClassifierSymbol<*>) -> ProcessorAction + ): ProcessorAction { + for (scope in localScopes.asReversed()) { + if (!scope.processClassifiersByName(name, processor)) { + return ProcessorAction.STOP + } + } + for (scope in topLevelScopes.asReversed()) { + if (!scope.processClassifiersByName(name, processor)) { + return ProcessorAction.STOP + } + } + return ProcessorAction.NEXT + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/cfg/complex.dot b/compiler/fir/resolve/testData/resolve/cfg/complex.dot index 21b00f8e076..d1a5721600e 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/complex.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/complex.dot @@ -28,7 +28,7 @@ digraph complex_kt { 12 [label="Access variable R|/url|"]; 13 [label="Function call: #.#(R|/url|)"]; 14 [label="Function call: #.#(R|/url|).#( = connect@fun .(): { - GsonBuilder#().create#().fromJson#(it#.inputStream#.reader#(), (Array#()).java#) + GsonBuilder#().create#().fromJson#(it#.inputStream#.reader#(), (Array#()).java#) } )"]; 15 [label="Exit block"]; diff --git a/compiler/fir/resolve/testData/resolve/cfg/complex.txt b/compiler/fir/resolve/testData/resolve/cfg/complex.txt index 61ef2be09d2..5d52e309544 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/complex.txt +++ b/compiler/fir/resolve/testData/resolve/cfg/complex.txt @@ -3,7 +3,7 @@ FILE: complex.kt lval url: R|kotlin/String| = (String(https://plugins.jetbrains.com/api/plugins/), R|/pluginId|.#, String(/updates?version=), R|/version|) lval pluginDTOs: R|kotlin/Array| = try { #.#(R|/url|).#( = connect@fun .(): { - GsonBuilder#().create#().fromJson#(it#.inputStream#.reader#(), (Array#()).java#) + GsonBuilder#().create#().fromJson#(it#.inputStream#.reader#(), (Array#()).java#) } ) } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt b/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt index ba88b60031d..97c8d425e9a 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.txt @@ -6,7 +6,7 @@ FILE: localImplicitBodies.kt } public final fun sss(): { - ^sss R?C|/abc|() + ^sss R?C|/anonymous.abc|() } public final fun abc(): R|kotlin/Int| { @@ -15,5 +15,5 @@ FILE: localImplicitBodies.kt } - lval g: = R|/x|.R?C|/sss|() + lval g: = R|/x|.R?C|/anonymous.sss|() } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt b/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt new file mode 100644 index 00000000000..05d0b6813c8 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt @@ -0,0 +1,11 @@ +interface Foo + +fun bar() { + object : Foo { + fun foo(): Foo { + return Derived(42) + } + + inner class Derived(val x: Int) : Foo + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.txt b/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.txt new file mode 100644 index 00000000000..65760d5db72 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.txt @@ -0,0 +1,26 @@ +FILE: localInnerClass.kt + public abstract interface Foo : R|kotlin/Any| { + } + public final fun bar(): R|kotlin/Unit| { + object : R|Foo| { + private constructor(): R|kotlin/Any| { + super() + } + + public final fun foo(): R|Foo| { + ^foo R|/.Derived.Derived|(Int(42)) + } + + local final inner class Derived : R|Foo| { + public constructor(x: R|kotlin/Int|): R|.Derived| { + super() + } + + public final val x: R|kotlin/Int| = R|/x| + public get(): R|kotlin/Int| + + } + + } + + } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt b/compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt index ef42af97743..568c3628cc5 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt +++ b/compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt @@ -23,6 +23,6 @@ fun test() { val derived = DerivedLocal() derived.gau() - derived.baz() - derived.foo() + derived.baz() + derived.foo() } \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localScopes.txt b/compiler/fir/resolve/testData/resolve/expresssions/localScopes.txt index 368ed9ada9c..277b93cfa92 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/localScopes.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/localScopes.txt @@ -32,11 +32,11 @@ FILE: localScopes.kt } - R|/anonymous|.R|/baz|() + R|/anonymous|.R|/anonymous.baz|() R|/anonymous|.R|/Bar.foo|() - local final class DerivedLocal : R|class error: Symbol not found, for `BaseLocal`| { + local final class DerivedLocal : R|BaseLocal| { public constructor(): R|DerivedLocal| { - super() + super() } public final fun gau(): R|kotlin/Unit| { @@ -46,6 +46,6 @@ FILE: localScopes.kt lval derived: R|DerivedLocal| = R|/DerivedLocal.DerivedLocal|() R|/derived|.R|/DerivedLocal.gau|() - R|/derived|.#() - R|/derived|.#() + R|/derived|.R|/BaseLocal.baz|() + R|/derived|.R|/Bar.foo|() } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localTypes.kt b/compiler/fir/resolve/testData/resolve/expresssions/localTypes.kt new file mode 100644 index 00000000000..725ceddcf86 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/localTypes.kt @@ -0,0 +1,14 @@ +interface Foo + +fun foo() { + val x: Int = 1 + class Bar : Foo { + val y: String = "" + fun Int.bar(s: String): Boolean { + val z: Double = 0.0 + return true + } + val Boolean.w: Char get() = ' ' + fun id(arg: T): T = arg + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/localTypes.txt b/compiler/fir/resolve/testData/resolve/expresssions/localTypes.txt new file mode 100644 index 00000000000..d6c9e10d056 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/localTypes.txt @@ -0,0 +1,30 @@ +FILE: localTypes.kt + public abstract interface Foo : R|kotlin/Any| { + } + public final fun foo(): R|kotlin/Unit| { + lval x: R|kotlin/Int| = Int(1) + local final class Bar : R|Foo| { + public constructor(): R|Bar| { + super() + } + + public final val y: R|kotlin/String| = String() + public get(): R|kotlin/String| + + public final fun R|kotlin/Int|.bar(s: R|kotlin/String|): R|kotlin/Boolean| { + lval z: R|kotlin/Double| = Double(0.0) + ^bar Boolean(true) + } + + public final val R|kotlin/Boolean|.w: R|kotlin/Char| + public get(): R|kotlin/Char| { + ^ Char( ) + } + + public final fun id(arg: R|T|): R|T| { + ^id R|/arg| + } + + } + + } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.kt b/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.kt new file mode 100644 index 00000000000..9cd32f8032f --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.kt @@ -0,0 +1,13 @@ +class C { + private val x = object { + fun foo() = 42 + } + + val y = x.foo() + + internal val z = object { + fun foo() = 13 + } + + val w = z.foo() // ERROR! +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.txt b/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.txt new file mode 100644 index 00000000000..016916f3509 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.txt @@ -0,0 +1,39 @@ +FILE: privateObjectLiteral.kt + public final class C : R|kotlin/Any| { + public constructor(): R|C| { + super() + } + + private final val x: R|anonymous| = object : R|kotlin/Any| { + private constructor(): R|kotlin/Any| { + super() + } + + public final fun foo(): R|kotlin/Int| { + ^foo Int(42) + } + + } + + private get(): R|anonymous| + + public final val y: R|kotlin/Int| = this@R|/C|.R|/C.x|.R|/anonymous.foo|() + public get(): R|kotlin/Int| + + internal final val z: R|anonymous| = object : R|kotlin/Any| { + private constructor(): R|kotlin/Any| { + super() + } + + public final fun foo(): R|kotlin/Int| { + ^foo Int(13) + } + + } + + internal get(): R|anonymous| + + public final val w: R|kotlin/Int| = this@R|/C|.R|/C.z|.R|/anonymous.foo|() + public get(): R|kotlin/Int| + + } diff --git a/compiler/fir/resolve/testData/resolve/samConversions/kotlinSam.txt b/compiler/fir/resolve/testData/resolve/samConversions/kotlinSam.txt index 01d404ce11c..4d95e7aab84 100644 --- a/compiler/fir/resolve/testData/resolve/samConversions/kotlinSam.txt +++ b/compiler/fir/resolve/testData/resolve/samConversions/kotlinSam.txt @@ -38,8 +38,8 @@ FILE: kotlinSam.kt } ) R|/foo1|(R|/f|) - #( = foo2@fun (x: R|kotlin/Nothing|): R|kotlin/Boolean| - >(R|/x|, Int(1)) + #( = foo2@fun .(x: ): { + >(x#, Int(1)) } ) #(R|/f|) diff --git a/compiler/fir/resolve/testData/resolve/samConversions/notSamBecauseOfSupertype.txt b/compiler/fir/resolve/testData/resolve/samConversions/notSamBecauseOfSupertype.txt index e3593f5edc7..be3a9b60091 100644 --- a/compiler/fir/resolve/testData/resolve/samConversions/notSamBecauseOfSupertype.txt +++ b/compiler/fir/resolve/testData/resolve/samConversions/notSamBecauseOfSupertype.txt @@ -2,12 +2,12 @@ FILE: main.kt public final fun foo(m: R|MyRunnable|): R|kotlin/Unit| { } public final fun main(): R|kotlin/Unit| { - Q|JavaUsage|.#( = foo@fun (x: R|kotlin/Nothing|): R|kotlin/Boolean| { - >(R|/x|, Int(1)) + Q|JavaUsage|.#( = foo@fun .(x: ): { + >(x#, Int(1)) } ) - Q|JavaUsage|.#(foo@fun (): R|kotlin/Boolean| { - >(#, Int(1)) + Q|JavaUsage|.#(foo@fun .(): { + >(it#, Int(1)) } ) lval x: R|kotlin/Function1| = fun (x: R|kotlin/Int|): R|kotlin/Boolean| { diff --git a/compiler/fir/resolve/testData/resolve/stdlib/anonymousInDelegate.txt b/compiler/fir/resolve/testData/resolve/stdlib/anonymousInDelegate.txt index 5077ccf3fa6..bdc100152d5 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/anonymousInDelegate.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/anonymousInDelegate.txt @@ -15,7 +15,7 @@ FILE: anonymousInDelegate.kt } - R|/foo|.R|/bar|() + R|/foo|.R|/anonymous.bar|() } ) public get(): R|kotlin/Int| { diff --git a/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.kt b/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.kt new file mode 100644 index 00000000000..e26a1d55b78 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.kt @@ -0,0 +1,5 @@ +fun foo() { + fun convert(vararg paths: String): Array = paths.toList().toTypedArray() + + convert("1", "2", "3") +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.txt b/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.txt new file mode 100644 index 00000000000..f9e1afe7794 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.txt @@ -0,0 +1,8 @@ +FILE: arrayInLocal.kt + public final fun foo(): R|kotlin/Unit| { + local final fun convert(vararg paths: R|kotlin/Array|): R|kotlin/Array| { + ^convert R|/paths|.R|kotlin/collections/toList|().R|kotlin/collections/toTypedArray|() + } + + R|/convert|(String(1), String(2), String(3)) + } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/problems.txt b/compiler/fir/resolve/testData/resolve/stdlib/problems.txt index befefd03d76..845f10fe57c 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/problems.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/problems.txt @@ -10,7 +10,7 @@ FILE: problems.kt public get(): R|kotlin/String| public final fun test(): R|kotlin/Unit| { - R|/name| + R|/anonymous.name| } } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt index eda72a409cc..4d206d88a46 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt +++ b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.kt @@ -3,3 +3,8 @@ import kotlin.reflect.KClass val javaClass: Class = String::class.java val kotlinClass: KClass = String::class +fun foo() { + val stringClass = String::class.java + val arrayStringClass = Array::class.java +} + diff --git a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt index 5e05b619819..9d0d040ebc6 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/reflectionClass.txt @@ -3,3 +3,7 @@ FILE: reflectionClass.kt public get(): R|java/lang/Class| public final val kotlinClass: R|kotlin/reflect/KClass| = (Q|kotlin/String|) public get(): R|kotlin/reflect/KClass| + public final fun foo(): R|kotlin/Unit| { + lval stringClass: R|java/lang/Class| = (Q|kotlin/String|).R|kotlin/jvm/java| + lval arrayStringClass: = (#()).# + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index d8f3828d70c..91f6bf46c9f 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -369,11 +369,21 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.kt"); } + @TestMetadata("localInnerClass.kt") + public void testLocalInnerClass() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/localInnerClass.kt"); + } + @TestMetadata("localScopes.kt") public void testLocalScopes() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/localScopes.kt"); } + @TestMetadata("localTypes.kt") + public void testLocalTypes() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/localTypes.kt"); + } + @TestMetadata("memberExtension.kt") public void testMemberExtension() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt"); @@ -394,6 +404,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/expresssions/outerObject.kt"); } + @TestMetadata("privateObjectLiteral.kt") + public void testPrivateObjectLiteral() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/privateObjectLiteral.kt"); + } + @TestMetadata("qualifiedExpressions.kt") public void testQualifiedExpressions() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/qualifiedExpressions.kt"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index f22d305a097..37bf02adafd 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -38,6 +38,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/resolve/testData/resolve/stdlib/arrayFirstOrNull.kt"); } + @TestMetadata("arrayInLocal.kt") + public void testArrayInLocal() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/stdlib/arrayInLocal.kt"); + } + @TestMetadata("backingField.kt") public void testBackingField() throws Exception { runTest("compiler/fir/resolve/testData/resolve/stdlib/backingField.kt"); diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt index 5f4b003b0e0..cdbe4fd69c0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt @@ -45,6 +45,8 @@ abstract class FirAnonymousFunction : FirPureAbstractElement(), FirFunction transformReturnTypeRef(transformer: FirTransformer, data: D): FirAnonymousFunction + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirAnonymousFunction + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirAnonymousFunction abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirAnonymousFunction diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableDeclaration.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableDeclaration.kt index 620d17213da..13dfeb1b656 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableDeclaration.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableDeclaration.kt @@ -30,4 +30,6 @@ interface FirCallableDeclaration> : FirTypedDeclar override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCallableDeclaration(this, data) override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirCallableDeclaration + + fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirCallableDeclaration } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMemberDeclaration.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMemberDeclaration.kt index f0ca73c0def..33440c92997 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMemberDeclaration.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMemberDeclaration.kt @@ -35,4 +35,8 @@ interface FirCallableMemberDeclaration> : Fi override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCallableMemberDeclaration(this, data) override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirCallableMemberDeclaration + + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirCallableMemberDeclaration + + override fun transformStatus(transformer: FirTransformer, data: D): FirCallableMemberDeclaration } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt index 2814e5b76df..371565f1f68 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirConstructor.kt @@ -44,7 +44,11 @@ interface FirConstructor : FirMemberFunction { override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirConstructor + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirConstructor + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirConstructor override fun transformValueParameters(transformer: FirTransformer, data: D): FirConstructor + + override fun transformStatus(transformer: FirTransformer, data: D): FirConstructor } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt index 4e2fdd96d87..11e21aaa73a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt @@ -40,5 +40,7 @@ abstract class FirEnumEntry : FirPureAbstractElement(), FirRegularClass { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitEnumEntry(this, data) + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirEnumEntry + abstract fun transformArguments(transformer: FirTransformer, data: D): FirEnumEntry } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt index 0971e1ec15f..169c18b847c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirErrorFunction.kt @@ -40,6 +40,8 @@ abstract class FirErrorFunction : FirPureAbstractElement(), FirFunction transformReturnTypeRef(transformer: FirTransformer, data: D): FirErrorFunction + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirErrorFunction + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirErrorFunction abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirErrorFunction diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirField.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirField.kt index a9a1f95d997..d313e296b6a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirField.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirField.kt @@ -46,9 +46,13 @@ abstract class FirField : FirPureAbstractElement(), FirVariable, FirCa abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirField + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirField + abstract override fun transformGetter(transformer: FirTransformer, data: D): FirField abstract override fun transformSetter(transformer: FirTransformer, data: D): FirField + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirField + abstract override fun transformOtherChildren(transformer: FirTransformer, data: D): FirField } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt index 520c2d7477f..e8067f1ad22 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirFunction.kt @@ -40,6 +40,8 @@ interface FirFunction> : FirCallableDeclaration, FirContro override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirFunction + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirFunction + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirFunction fun transformValueParameters(transformer: FirTransformer, data: D): FirFunction diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberDeclaration.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberDeclaration.kt index 8a6f2fc87cd..22a0c7aaf81 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberDeclaration.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberDeclaration.kt @@ -27,4 +27,6 @@ interface FirMemberDeclaration : FirNamedDeclaration, FirAnnotationContainer { val status: FirDeclarationStatus override fun accept(visitor: FirVisitor, data: D): R = visitor.visitMemberDeclaration(this, data) + + fun transformStatus(transformer: FirTransformer, data: D): FirMemberDeclaration } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt index abbbcb75e4c..2e266632832 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirMemberFunction.kt @@ -41,7 +41,11 @@ interface FirMemberFunction> : FirFunction, FirCalla override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirMemberFunction + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirMemberFunction + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirMemberFunction override fun transformValueParameters(transformer: FirTransformer, data: D): FirMemberFunction + + override fun transformStatus(transformer: FirTransformer, data: D): FirMemberFunction } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt index e07ea06b29d..e9fe052e5f8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirProperty.kt @@ -52,11 +52,15 @@ abstract class FirProperty : FirPureAbstractElement(), FirVariable, abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirProperty + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirProperty + abstract override fun transformGetter(transformer: FirTransformer, data: D): FirProperty abstract override fun transformSetter(transformer: FirTransformer, data: D): FirProperty abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirProperty + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirProperty + abstract override fun transformOtherChildren(transformer: FirTransformer, data: D): FirProperty } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt index 713a91814bc..ca5b12415c7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt @@ -42,9 +42,13 @@ abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction transformReturnTypeRef(transformer: FirTransformer, data: D): FirPropertyAccessor + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirPropertyAccessor + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirPropertyAccessor abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirPropertyAccessor abstract override fun transformContractDescription(transformer: FirTransformer, data: D): FirPropertyAccessor + + abstract fun transformStatus(transformer: FirTransformer, data: D): FirPropertyAccessor } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt index d9733a211f2..d5733363447 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirRegularClass.kt @@ -37,4 +37,6 @@ interface FirRegularClass : FirMemberDeclaration, FirTypeParametersOwner, FirCla override fun accept(visitor: FirVisitor, data: D): R = visitor.visitRegularClass(this, data) override fun replaceSuperTypeRefs(newSuperTypeRefs: List) + + override fun transformStatus(transformer: FirTransformer, data: D): FirRegularClass } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSealedClass.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSealedClass.kt index c93e56b241f..390acc21436 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSealedClass.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSealedClass.kt @@ -40,4 +40,6 @@ abstract class FirSealedClass : FirPureAbstractElement(), FirRegularClass { override fun accept(visitor: FirVisitor, data: D): R = visitor.visitSealedClass(this, data) abstract fun replaceInheritors(newInheritors: List) + + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirSealedClass } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt index 9c217efce18..550c63d20d8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt @@ -44,9 +44,13 @@ abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction transformReturnTypeRef(transformer: FirTransformer, data: D): FirSimpleFunction + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirSimpleFunction + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirSimpleFunction abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirSimpleFunction + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirSimpleFunction + abstract override fun transformContractDescription(transformer: FirTransformer, data: D): FirSimpleFunction } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirTypeAlias.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirTypeAlias.kt index 15bb07eb8ce..dffabeb262e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirTypeAlias.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirTypeAlias.kt @@ -34,4 +34,6 @@ abstract class FirTypeAlias : FirPureAbstractElement(), FirClassLikeDeclaration< override fun accept(visitor: FirVisitor, data: D): R = visitor.visitTypeAlias(this, data) abstract fun replaceExpandedTypeRef(newExpandedTypeRef: FirTypeRef) + + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirTypeAlias } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt index 71a87f413aa..d1d4b996a07 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt @@ -46,6 +46,8 @@ abstract class FirValueParameter : FirPureAbstractElement(), FirVariable transformReturnTypeRef(transformer: FirTransformer, data: D): FirValueParameter + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirValueParameter + abstract override fun transformGetter(transformer: FirTransformer, data: D): FirValueParameter abstract override fun transformSetter(transformer: FirTransformer, data: D): FirValueParameter diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirVariable.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirVariable.kt index 3c0146b00cd..abf4c081c4d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirVariable.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirVariable.kt @@ -42,6 +42,8 @@ interface FirVariable> : FirCallableDeclaration, FirNamedD override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirVariable + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirVariable + fun transformGetter(transformer: FirTransformer, data: D): FirVariable fun transformSetter(transformer: FirTransformer, data: D): FirVariable diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt index d5e72dc4dec..2fdade43409 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt @@ -64,7 +64,7 @@ class FirAnonymousFunctionImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirAnonymousFunctionImpl { annotations.transformInplace(transformer, data) transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + transformReceiverTypeRef(transformer, data) transformControlFlowGraphReference(transformer, data) typeParameters.transformInplace(transformer, data) transformValueParameters(transformer, data) @@ -79,6 +79,11 @@ class FirAnonymousFunctionImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirAnonymousFunctionImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirAnonymousFunctionImpl { controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt index 9904e3d245b..a16edea3c9f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt @@ -59,7 +59,7 @@ class FirClassImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirClassImpl { annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) (declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data) declarations.transformInplace(transformer, data) companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion } @@ -67,6 +67,11 @@ class FirClassImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirClassImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt index e0300d56f31..319d12e0ab7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirConstructorImpl.kt @@ -65,11 +65,11 @@ open class FirConstructorImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirConstructorImpl { transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + transformReceiverTypeRef(transformer, data) transformControlFlowGraphReference(transformer, data) transformValueParameters(transformer, data) body = body?.transformSingle(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) annotations.transformInplace(transformer, data) delegatedConstructor = delegatedConstructor?.transformSingle(transformer, data) return this @@ -80,6 +80,11 @@ open class FirConstructorImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirConstructorImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirConstructorImpl { controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) return this @@ -90,6 +95,11 @@ open class FirConstructorImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirConstructorImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt index 4754ae22ba0..329c2f53ee6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt @@ -64,6 +64,7 @@ class FirDefaultSetterValueParameter( override fun transformChildren(transformer: FirTransformer, data: D): FirDefaultSetterValueParameter { transformReturnTypeRef(transformer, data) + transformReceiverTypeRef(transformer, data) transformGetter(transformer, data) transformSetter(transformer, data) transformOtherChildren(transformer, data) @@ -75,6 +76,11 @@ class FirDefaultSetterValueParameter( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirDefaultSetterValueParameter { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformGetter(transformer: FirTransformer, data: D): FirDefaultSetterValueParameter { getter = getter?.transformSingle(transformer, data) return this @@ -86,7 +92,6 @@ class FirDefaultSetterValueParameter( } override fun transformOtherChildren(transformer: FirTransformer, data: D): FirDefaultSetterValueParameter { - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) initializer = initializer?.transformSingle(transformer, data) delegate = delegate?.transformSingle(transformer, data) annotations.transformInplace(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt index 535bd9dc2aa..bd5175dc57e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt @@ -65,7 +65,7 @@ class FirEnumEntryImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirEnumEntryImpl { annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) declarations.transformInplace(transformer, data) superTypeRefs.transformInplace(transformer, data) transformArguments(transformer, data) @@ -73,6 +73,11 @@ class FirEnumEntryImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirEnumEntryImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun transformArguments(transformer: FirTransformer, data: D): FirEnumEntryImpl { arguments.transformInplace(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt index 08dc295003a..669de07abc3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorFunctionImpl.kt @@ -68,6 +68,10 @@ class FirErrorFunctionImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirErrorFunctionImpl { + return this + } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirErrorFunctionImpl { controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt index 3dceaa15e2f..68e54effe65 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt @@ -62,6 +62,7 @@ class FirFieldImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirFieldImpl { transformReturnTypeRef(transformer, data) + transformStatus(transformer, data) transformOtherChildren(transformer, data) return this } @@ -71,6 +72,10 @@ class FirFieldImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirFieldImpl { + return this + } + override fun transformGetter(transformer: FirTransformer, data: D): FirFieldImpl { return this } @@ -79,10 +84,14 @@ class FirFieldImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirFieldImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun transformOtherChildren(transformer: FirTransformer, data: D): FirFieldImpl { annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) return this } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt index 35b57821171..0bc2a78d439 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableConstructor.kt @@ -51,9 +51,13 @@ abstract class FirModifiableConstructor : FirPureAbstractElement(), FirConstruct abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableConstructor + abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirModifiableConstructor + abstract override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableConstructor abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableConstructor + abstract override fun transformStatus(transformer: FirTransformer, data: D): FirModifiableConstructor + abstract override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt index cefba0a0af6..425a3092f54 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableFunction.kt @@ -41,6 +41,8 @@ interface FirModifiableFunction> : FirFunction, FirAbstra override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableFunction + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirModifiableFunction + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirModifiableFunction override fun transformValueParameters(transformer: FirTransformer, data: D): FirModifiableFunction diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableRegularClass.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableRegularClass.kt index e1108da8143..98a1b4e1b1e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableRegularClass.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableRegularClass.kt @@ -42,6 +42,8 @@ interface FirModifiableRegularClass : FirRegularClass, FirModifiableClass override fun transformChildren(transformer: FirTransformer, data: D): FirModifiableRegularClass + override fun transformStatus(transformer: FirTransformer, data: D): FirModifiableRegularClass + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) override fun replaceSupertypesComputationStatus(newSupertypesComputationStatus: SupertypesComputationStatus) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt index 9f6e8cb4903..d1e6c3f0d8c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirModifiableVariable.kt @@ -44,6 +44,8 @@ interface FirModifiableVariable> : FirVariable, FirAbstra override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirModifiableVariable + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirModifiableVariable + override fun transformGetter(transformer: FirTransformer, data: D): FirModifiableVariable override fun transformSetter(transformer: FirTransformer, data: D): FirModifiableVariable diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index c6bf1729830..8bd0b8de308 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -65,13 +65,13 @@ open class FirPropertyAccessorImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + transformReceiverTypeRef(transformer, data) transformControlFlowGraphReference(transformer, data) typeParameters.transformInplace(transformer, data) transformValueParameters(transformer, data) body = body?.transformSingle(transformer, data) transformContractDescription(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) annotations.transformInplace(transformer, data) return this } @@ -81,6 +81,11 @@ open class FirPropertyAccessorImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) return this @@ -96,6 +101,11 @@ open class FirPropertyAccessorImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt index 79ec0ae36e4..b231b98821d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt @@ -75,9 +75,11 @@ class FirPropertyImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirPropertyImpl { transformReturnTypeRef(transformer, data) + transformReceiverTypeRef(transformer, data) transformGetter(transformer, data) transformSetter(transformer, data) transformControlFlowGraphReference(transformer, data) + transformStatus(transformer, data) transformOtherChildren(transformer, data) return this } @@ -87,6 +89,11 @@ class FirPropertyImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirPropertyImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformGetter(transformer: FirTransformer, data: D): FirPropertyImpl { getter = getter?.transformSingle(transformer, data) return this @@ -102,13 +109,16 @@ class FirPropertyImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirPropertyImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun transformOtherChildren(transformer: FirTransformer, data: D): FirPropertyImpl { - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) initializer = initializer?.transformSingle(transformer, data) delegate = delegate?.transformSingle(transformer, data) annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) return this } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSealedClassImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSealedClassImpl.kt index ecd5557e3ed..ffb752db740 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSealedClassImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSealedClassImpl.kt @@ -61,7 +61,7 @@ class FirSealedClassImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirSealedClassImpl { annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) (declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data) declarations.transformInplace(transformer, data) companionObject = declarations.asSequence().filterIsInstance().firstOrNull { it.status.isCompanion } @@ -69,6 +69,11 @@ class FirSealedClassImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirSealedClassImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt index 057603e509f..2c25c5cf920 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt @@ -66,12 +66,12 @@ open class FirSimpleFunctionImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { transformReturnTypeRef(transformer, data) - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + transformReceiverTypeRef(transformer, data) transformControlFlowGraphReference(transformer, data) typeParameters.transformInplace(transformer, data) transformValueParameters(transformer, data) body = body?.transformSingle(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) annotations.transformInplace(transformer, data) transformContractDescription(transformer, data) return this @@ -82,6 +82,11 @@ open class FirSimpleFunctionImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { controlFlowGraphReference = controlFlowGraphReference.transformSingle(transformer, data) return this @@ -92,6 +97,11 @@ open class FirSimpleFunctionImpl( return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun transformContractDescription(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { contractDescription = contractDescription.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt index 66a4c5cccb0..301e3df65ef 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt @@ -50,12 +50,17 @@ class FirTypeAliasImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirTypeAliasImpl { typeParameters.transformInplace(transformer, data) - status = status.transformSingle(transformer, data) + transformStatus(transformer, data) expandedTypeRef = expandedTypeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) return this } + override fun transformStatus(transformer: FirTransformer, data: D): FirTypeAliasImpl { + status = status.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt index d3f662efac0..e5ee22cb5b2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt @@ -64,6 +64,7 @@ open class FirValueParameterImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirValueParameterImpl { transformReturnTypeRef(transformer, data) + transformReceiverTypeRef(transformer, data) transformGetter(transformer, data) transformSetter(transformer, data) transformOtherChildren(transformer, data) @@ -75,6 +76,11 @@ open class FirValueParameterImpl( return this } + override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirValueParameterImpl { + receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) + return this + } + override fun transformGetter(transformer: FirTransformer, data: D): FirValueParameterImpl { getter = getter?.transformSingle(transformer, data) return this @@ -86,7 +92,6 @@ open class FirValueParameterImpl( } override fun transformOtherChildren(transformer: FirTransformer, data: D): FirValueParameterImpl { - receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) initializer = initializer?.transformSingle(transformer, data) delegate = delegate?.transformSingle(transformer, data) annotations.transformInplace(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt index 856ec087ed2..1143113e1e9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt @@ -37,6 +37,8 @@ abstract class FirComponentCall : FirFunctionCall() { abstract override fun transformArguments(transformer: FirTransformer, data: D): FirComponentCall + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCall + abstract override fun transformCalleeReference(transformer: FirTransformer, data: D): FirComponentCall abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirComponentCall diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt index 3280146c499..d9687eec0b6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt @@ -38,5 +38,7 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall { abstract override fun transformArguments(transformer: FirTransformer, data: D): FirFunctionCall + abstract fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCall + abstract override fun transformCalleeReference(transformer: FirTransformer, data: D): FirFunctionCall } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt index 28f5e52931b..f08af71883c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt @@ -56,7 +56,7 @@ class FirComponentCallImpl( typeRef = typeRef.transformSingle(transformer, data) annotations.transformInplace(transformer, data) transformArguments(transformer, data) - typeArguments.transformInplace(transformer, data) + transformTypeArguments(transformer, data) transformCalleeReference(transformer, data) explicitReceiver = explicitReceiver.transformSingle(transformer, data) return this @@ -75,6 +75,11 @@ class FirComponentCallImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirComponentCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformCalleeReference(transformer: FirTransformer, data: D): FirComponentCallImpl { calleeReference = calleeReference.transformSingle(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt index 9fb568b4076..a8a01aff6e6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt @@ -60,7 +60,7 @@ class FirFunctionCallImpl( extensionReceiver = extensionReceiver.transformSingle(transformer, data) } transformArguments(transformer, data) - typeArguments.transformInplace(transformer, data) + transformTypeArguments(transformer, data) transformCalleeReference(transformer, data) return this } @@ -85,6 +85,11 @@ class FirFunctionCallImpl( return this } + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirFunctionCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + override fun transformCalleeReference(transformer: FirTransformer, data: D): FirFunctionCallImpl { calleeReference = calleeReference.transformSingle(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 0c503dacece..6d8b35d8bfa 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 @@ -75,7 +75,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { callableDeclaration.configure { withArg("F", "FirCallableDeclaration") parentArg(symbolOwner, "E", "F") - +field("receiverTypeRef", typeRef, nullable = true) + +field("receiverTypeRef", typeRef, nullable = true).withTransform() +symbol("FirCallableSymbol", "F") } @@ -104,7 +104,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { memberDeclaration.configure { +typeParameters - +status + +status.withTransform() } expression.configure { @@ -183,7 +183,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { } functionCall.configure { - +typeArguments + +typeArguments.withTransform() +field("calleeReference", namedReference) } @@ -296,7 +296,7 @@ object NodeConfigurator : AbstractFieldConfigurator() { +symbol("FirPropertyAccessorSymbol") +booleanField("isGetter") +booleanField("isSetter") - +status + +status.withTransform() +annotations } diff --git a/compiler/testData/ir/irText/declarations/localClassWithOverrides.fir.txt b/compiler/testData/ir/irText/declarations/localClassWithOverrides.fir.txt index 9d0f5a18c76..d35fd0135db 100644 --- a/compiler/testData/ir/irText/declarations/localClassWithOverrides.fir.txt +++ b/compiler/testData/ir/irText/declarations/localClassWithOverrides.fir.txt @@ -34,12 +34,12 @@ FILE fqName: fileName:/localClassWithOverrides.kt overridden: public open fun toString (): kotlin.String declared in kotlin.Any $this: VALUE_PARAMETER name: type:kotlin.Any - CLASS CLASS name:Local modality:FINAL visibility:local superTypes:[IrErrorType] + CLASS CLASS name:Local modality:FINAL visibility:local superTypes:[.outer.ALocal] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.outer.Local CONSTRUCTOR visibility:public <> () returnType:.outer.Local [primary] BLOCK_BODY - ERROR_CALL 'Cannot find delegated constructor call' type=.outer.Local - INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Local modality:FINAL visibility:local superTypes:[IrErrorType]' + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in .outer.ALocal' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Local modality:FINAL visibility:local superTypes:[.outer.ALocal]' FUN name:afun visibility:public modality:FINAL <> ($this:.outer.Local) returnType:kotlin.Unit $this: VALUE_PARAMETER name: type:.outer.Local BLOCK_BODY @@ -73,3 +73,16 @@ FILE fqName: fileName:/localClassWithOverrides.kt SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:avar type:kotlin.Int visibility:private' type=kotlin.Unit origin=null receiver: GET_VAR ': .outer.Local declared in .outer.Local.' type=.outer.Local origin=null value: GET_VAR ': kotlin.Int declared in .outer.Local.' type=kotlin.Int origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt index c7a2282cb80..d929e88877e 100644 --- a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt +++ b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt @@ -4,21 +4,21 @@ FILE fqName: fileName:/typeParameterClassLiteral.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun classRefFun (): kotlin.reflect.KClass [inline] declared in ' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType FUN name:classRefExtFun visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:kotlin.reflect.KClass [inline] TYPE_PARAMETER name:T index:0 variance: superTypes:[] $receiver: VALUE_PARAMETER name: type:kotlin.Any BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun classRefExtFun (): kotlin.reflect.KClass [inline] declared in ' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType PROPERTY name:classRefExtVal visibility:public modality:FINAL [val] FUN name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KClass correspondingProperty: PROPERTY name:classRefExtVal visibility:public modality:FINAL [val] BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass declared in ' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType CLASS CLASS name:Host modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Host CONSTRUCTOR visibility:public <> () returnType:.Host [primary] @@ -31,7 +31,7 @@ FILE fqName: fileName:/typeParameterClassLiteral.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberFun (): kotlin.reflect.KClass [inline] declared in .Host' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType FUN name:classRefGenericMemberExtFun visibility:public modality:FINAL ($this:.Host, $receiver:kotlin.Any) returnType:kotlin.reflect.KClass [inline] TYPE_PARAMETER name:TF index:0 variance: superTypes:[] $this: VALUE_PARAMETER name: type:.Host @@ -39,7 +39,7 @@ FILE fqName: fileName:/typeParameterClassLiteral.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberExtFun (): kotlin.reflect.KClass [inline] declared in .Host' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType PROPERTY name:classRefGenericMemberExtVal visibility:public modality:FINAL [val] FUN name: visibility:public modality:FINAL <> ($this:.Host) returnType:kotlin.reflect.KClass correspondingProperty: PROPERTY name:classRefGenericMemberExtVal visibility:public modality:FINAL [val] @@ -47,7 +47,7 @@ FILE fqName: fileName:/typeParameterClassLiteral.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass declared in .Host' GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: #' type=IrErrorType + ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any