diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt index 1e5a4d423bd..a7bce93f63e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt @@ -43,6 +43,9 @@ open class FirDesignation( val path: List, val target: FirElementWithResolvePhase, ) { + val firstNonFileDeclaration: FirElementWithResolvePhase + get() = path.firstOrNull() ?: target + fun toSequence(includeTarget: Boolean): Sequence = sequence { yieldAll(path) if (includeTarget) yield(target) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedStatusResolveTransformer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedStatusResolveTransformer.kt index 064a8a2c07d..1a131fd8b6f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedStatusResolveTransformer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedStatusResolveTransformer.kt @@ -5,18 +5,20 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer -import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirPhaseRunner import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignationWithFile import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LLFirLazyTransformer.Companion.updatePhaseDeep import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkDeclarationStatusIsResolved import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase import org.jetbrains.kotlin.fir.FirElementWithResolvePhase +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer +import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase +import org.jetbrains.kotlin.fir.visitors.transformSingle /** * Transform designation into STATUS phase. Affects only for designation, target declaration, it's children and dependents @@ -26,27 +28,71 @@ internal class LLFirDesignatedStatusResolveTransformer( private val session: FirSession, private val scopeSession: ScopeSession, ) : LLFirLazyTransformer { - private inner class FirDesignatedStatusResolveTransformerForIDE : - FirStatusResolveTransformer(session, scopeSession, StatusComputationSession()) { + private inner class FirDesignatedStatusResolveTransformerForIDE( + private val designationIterator: Iterator + ) : FirStatusResolveTransformer(session, scopeSession, StatusComputationSession()) { - val designationTransformer = LLFirDeclarationTransformer(designation) + private var isInsideTargetDeclaration = false - override fun transformDeclarationContent(declaration: FirDeclaration, data: FirResolvedDeclarationStatus?): FirDeclaration = - designationTransformer.transformDeclarationContent(this, declaration, data) { - super.transformDeclarationContent(declaration, data) + + override fun transformClass(klass: FirClass, data: FirResolvedDeclarationStatus?): FirStatement { + return storeClass(klass) { + resolveClassTypeParameters(klass) + if (isInsideTargetDeclaration) { + transformDeclarationContent(klass, data) + } else { + resolveCallableMembers(klass, data) + moveNextDeclaration() + } + klass + } as FirStatement + } + + private fun resolveClassTypeParameters(klass: FirClass) { + klass.typeParameters.forEach { it.transformSingle(this, data = null) } + } + + private fun resolveCallableMembers( + klass: FirClass, + data: FirResolvedDeclarationStatus? + ) { + for (member in klass.declarations) { + if (member is FirClassLikeDeclaration) continue + // we need the types to be resolved here to compute visibility + // implicit types will not be handled (see bug in the compiler KT-55446) + member.lazyResolveToPhase(FirResolvePhase.TYPES) + member.transformSingle(this, data) } + } + + fun moveNextDeclaration() { + if (!designationIterator.hasNext()) { + isInsideTargetDeclaration = true + designation.target.transform(this, data = null) + return + } + when (val nextElement = designationIterator.next()) { + is FirClass -> { + transformClassContent(nextElement, data = null) + } + else -> { + error("Unexpected declaration in designation: ${nextElement::class.qualifiedName}") + } + } + } } + override fun transformDeclaration(phaseRunner: LLFirPhaseRunner) { if (designation.target.resolvePhase >= FirResolvePhase.STATUS) return designation.target.checkPhase(FirResolvePhase.TYPES) - val transformer = FirDesignatedStatusResolveTransformerForIDE() + val designationIterator = designation.toSequence(includeTarget = false).iterator() + val transformer = FirDesignatedStatusResolveTransformerForIDE(designationIterator) phaseRunner.runPhaseWithCustomResolve(FirResolvePhase.STATUS) { - designation.firFile.transform(transformer, null) + transformer.moveNextDeclaration() } - - transformer.designationTransformer.ensureDesignationPassed() + updatePhaseDeep(designation.target, FirResolvePhase.STATUS) checkIsResolved(designation.target) } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt index 525f030a9f8..ba816b269ad 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt @@ -255,13 +255,13 @@ FILE: annotationParameters.kt } public final [SUPER_TYPES] class B : R|kotlin/Any| { - public? [SUPER_TYPES] [ContainingClassKey=B] constructor(): R|B| { + public [TYPES] [ContainingClassKey=B] constructor(): R|B| { super() } @R|Anno|(X#.A#) public final [STATUS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } - @Anno(X#.A#) public? final? [SUPER_TYPES] fun foo(): R|kotlin/Unit| { LAZY_BLOCK } + @R|Anno|(X#.A#) public final [TYPES] fun foo(): R|kotlin/Unit| { LAZY_BLOCK } } @@ -404,8 +404,8 @@ FILE: annotationParameters.kt LAZY_super } - public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|/args| - public? [SUPER_TYPES] [ContainingClassKey=Anno] get(): A.X + public final [TYPES] [IsFromPrimaryConstructor=true] val args: = R|/args| + public [TYPES] [ContainingClassKey=Anno] get(): } public final [STATUS] class B : R|kotlin/Any| { @@ -443,8 +443,8 @@ FILE: annotationParameters.kt LAZY_super } - public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|/args| - public? [SUPER_TYPES] [ContainingClassKey=Anno] get(): A.X + public final [TYPES] [IsFromPrimaryConstructor=true] val args: = R|/args| + public [TYPES] [ContainingClassKey=Anno] get(): } public final [STATUS] class B : R|kotlin/Any| { @@ -482,8 +482,8 @@ FILE: annotationParameters.kt LAZY_super } - public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|/args| - public? [SUPER_TYPES] [ContainingClassKey=Anno] get(): A.X + public final [TYPES] [IsFromPrimaryConstructor=true] val args: = R|/args| + public [TYPES] [ContainingClassKey=Anno] get(): } public final [STATUS] class B : R|kotlin/Any| { diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt index 481849874f6..13a725551d2 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classMembers.txt @@ -110,18 +110,18 @@ FILE: classMembers.kt STATUS: FILE: classMembers.kt public final [SUPER_TYPES] class A : R|kotlin/Any| { - public? [SUPER_TYPES] [ContainingClassKey=A] constructor(): R|A| { + public [TYPES] [ContainingClassKey=A] constructor(): R|A| { super() } public final [STATUS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } - public? final? [SUPER_TYPES] val x: Int = LAZY_EXPRESSION - public? [SUPER_TYPES] [ContainingClassKey=A] get(): Int { LAZY_BLOCK } + public final [TYPES] val x: R|kotlin/Int| = LAZY_EXPRESSION + public [TYPES] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK } - public? final? [SUPER_TYPES] fun receive([SUPER_TYPES] value: String): R|kotlin/Unit| { LAZY_BLOCK } + public final [TYPES] fun receive([TYPES] value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } - public? final? [SUPER_TYPES] fun functionWithLazyBody(): String { LAZY_BLOCK } + public final [TYPES] fun functionWithLazyBody(): R|kotlin/String| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt index cfccccccd11..1cfe70f93b8 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.txt @@ -86,12 +86,12 @@ FILE: functionInValueClass.kt STATUS: FILE: functionInValueClass.kt @R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { - public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { + public [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { LAZY_super } - public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|/value| - public? [SUPER_TYPES] [ContainingClassKey=Value] get(): Int + public final [TYPES] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|/value| + public [TYPES] [ContainingClassKey=Value] get(): R|kotlin/Int| public final [STATUS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.kt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.kt new file mode 100644 index 00000000000..e44d4a3339b --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.kt @@ -0,0 +1,11 @@ + +interface OV { + val originalExpressions: A + + class ResolveMe: OV { + override val originalExpressions: A + } + +} + +class A \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt new file mode 100644 index 00000000000..0f16f6eb71d --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt @@ -0,0 +1,336 @@ + +RAW_FIR: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [RAW_FIR] interface OV : R|kotlin/Any| { + public? final? [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=OV] get(): A + + public? final? [RAW_FIR] class ResolveMe : OV { + public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=ResolveMe] get(): A + + } + + } + public? final? [RAW_FIR] class A : R|kotlin/Any| { + public? [RAW_FIR] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +IMPORTS: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [RAW_FIR] interface OV : R|kotlin/Any| { + public? final? [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=OV] get(): A + + public? final? [RAW_FIR] class ResolveMe : OV { + public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=ResolveMe] get(): A + + } + + } + public? final? [RAW_FIR] class A : R|kotlin/Any| { + public? [RAW_FIR] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [RAW_FIR] interface OV : R|kotlin/Any| { + public? final? [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=OV] get(): A + + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class ResolveMe : OV { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [COMPILER_REQUIRED_ANNOTATIONS] val originalExpressions: A + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=ResolveMe] get(): A + + } + + } + public? final? [RAW_FIR] class A : R|kotlin/Any| { + public? [RAW_FIR] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +COMPANION_GENERATION: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [RAW_FIR] interface OV : R|kotlin/Any| { + public? final? [RAW_FIR] val originalExpressions: A + public? [RAW_FIR] [ContainingClassKey=OV] get(): A + + public? final? [COMPANION_GENERATION] class ResolveMe : OV { + public? [COMPANION_GENERATION] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [COMPANION_GENERATION] val originalExpressions: A + public? [COMPANION_GENERATION] [ContainingClassKey=ResolveMe] get(): A + + } + + } + public? final? [RAW_FIR] class A : R|kotlin/Any| { + public? [RAW_FIR] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +SUPER_TYPES: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface OV : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] val originalExpressions: A + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=OV] get(): A + + public? final? [SUPER_TYPES] class ResolveMe : R|OV| { + public? [SUPER_TYPES] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [SUPER_TYPES] val originalExpressions: A + public? [SUPER_TYPES] [ContainingClassKey=ResolveMe] get(): A + + } + + } + public? final? [RAW_FIR] class A : R|kotlin/Any| { + public? [RAW_FIR] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +TYPES: +FILE: nestedClassWithPropertiesOverrides.kt + public? final? [SUPER_TYPES] interface OV : R|kotlin/Any| { + public? final? [SUPER_TYPES] val originalExpressions: A + public? [SUPER_TYPES] [ContainingClassKey=OV] get(): A + + public? final? [TYPES] class ResolveMe : R|OV| { + public? [TYPES] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public? open? override [TYPES] val originalExpressions: R|A| + public? [TYPES] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +STATUS: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [SUPER_TYPES] interface OV : R|kotlin/Any| { + public abstract [TYPES] val originalExpressions: R|A| + public [TYPES] [ContainingClassKey=OV] get(): R|A| + + public final [STATUS] class ResolveMe : R|OV| { + public [STATUS] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [ARGUMENTS_OF_ANNOTATIONS] class ResolveMe : R|OV| { + public [ARGUMENTS_OF_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [ARGUMENTS_OF_ANNOTATIONS] val originalExpressions: R|A| + public [ARGUMENTS_OF_ANNOTATIONS] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +CONTRACTS: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [CONTRACTS] class ResolveMe : R|OV| { + public [CONTRACTS] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [CONTRACTS] val originalExpressions: R|A| + public [CONTRACTS] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [IMPLICIT_TYPES_BODY_RESOLVE] class ResolveMe : R|OV| { + public [IMPLICIT_TYPES_BODY_RESOLVE] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [IMPLICIT_TYPES_BODY_RESOLVE] val originalExpressions: R|A| + public [IMPLICIT_TYPES_BODY_RESOLVE] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +ANNOTATIONS_ARGUMENTS_MAPPING: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [ANNOTATIONS_ARGUMENTS_MAPPING] class ResolveMe : R|OV| { + public [ANNOTATIONS_ARGUMENTS_MAPPING] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [ANNOTATIONS_ARGUMENTS_MAPPING] val originalExpressions: R|A| + public [ANNOTATIONS_ARGUMENTS_MAPPING] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +EXPECT_ACTUAL_MATCHING: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [EXPECT_ACTUAL_MATCHING] class ResolveMe : R|OV| { + public [EXPECT_ACTUAL_MATCHING] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super<>() + } + + public final override [EXPECT_ACTUAL_MATCHING] val originalExpressions: R|A| + public [EXPECT_ACTUAL_MATCHING] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +BODY_RESOLVE: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [STATUS] interface OV : R|kotlin/Any| { + public abstract [STATUS] val originalExpressions: R|A| + public [STATUS] [ContainingClassKey=OV] get(): R|A| + + public final [BODY_RESOLVE] class ResolveMe : R|OV| { + public [BODY_RESOLVE] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super() + } + + public final override [BODY_RESOLVE] val originalExpressions: R|A| + public [BODY_RESOLVE] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public? final? [COMPILER_REQUIRED_ANNOTATIONS] class A : R|kotlin/Any| { + public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } + +FILE RAW TO BODY: +FILE: nestedClassWithPropertiesOverrides.kt + public abstract [BODY_RESOLVE] interface OV : R|kotlin/Any| { + public abstract [BODY_RESOLVE] val originalExpressions: R|A| + public [BODY_RESOLVE] [ContainingClassKey=OV] get(): R|A| + + public final [BODY_RESOLVE] class ResolveMe : R|OV| { + public [BODY_RESOLVE] [ContainingClassKey=ResolveMe] constructor(): R|OV.ResolveMe| { + super() + } + + public final override [BODY_RESOLVE] val originalExpressions: R|A| + public [BODY_RESOLVE] [ContainingClassKey=ResolveMe] get(): R|A| + + } + + } + public final [BODY_RESOLVE] class A : R|kotlin/Any| { + public [BODY_RESOLVE] [ContainingClassKey=A] constructor(): R|A| { + super() + } + + } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt index c7667afb873..323bebcc8da 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/enumEntry.txt @@ -1,3 +1,4 @@ + RAW_FIR: FILE: enumEntry.kt public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { @@ -157,19 +158,19 @@ FILE: enumEntry.kt } public final [SUPER_TYPES] enum class Foo : R|kotlin/Enum| { - private [SUPER_TYPES] [ContainingClassKey=Foo] constructor(): R|Foo| { + private [TYPES] [ContainingClassKey=Foo] constructor(): R|Foo| { super|>() } @R|Anno|() public final static [STATUS] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = LAZY_EXPRESSION - public final static [SUPER_TYPES] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { + public final static [TYPES] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { } - public final static [SUPER_TYPES] [ContainingClassKey=Foo] fun valueOf([SUPER_TYPES] value: R|kotlin/String|): R|Foo| { + public final static [TYPES] [ContainingClassKey=Foo] fun valueOf([TYPES] value: R|kotlin/String|): R|Foo| { } - public final static [SUPER_TYPES] [ContainingClassKey=Foo] val entries: R|kotlin/enums/EnumEntries| - public [SUPER_TYPES] get(): R|kotlin/enums/EnumEntries| + public final static [TYPES] [ContainingClassKey=Foo] val entries: R|kotlin/enums/EnumEntries| + public [TYPES] get(): R|kotlin/enums/EnumEntries| } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt b/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt index 70c3e2d5360..aeb449fb4be 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/parameterOfNonLocalSetter.txt @@ -80,7 +80,7 @@ FILE: parameterOfNonLocalSetter.kt STATUS: FILE: parameterOfNonLocalSetter.kt public final [SUPER_TYPES] class X : R|kotlin/Any| { - public? [SUPER_TYPES] [ContainingClassKey=X] constructor(): R|X| { + public [TYPES] [ContainingClassKey=X] constructor(): R|X| { super() } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt index 6873b70dcb8..51067b42060 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfNonLocalFunction.txt @@ -68,7 +68,7 @@ FILE: typeParameterOfNonLocalFunction.kt STATUS: FILE: typeParameterOfNonLocalFunction.kt public final [SUPER_TYPES] class X : R|kotlin/Any| { - public? [SUPER_TYPES] [ContainingClassKey=X] constructor(): R|X| { + public [TYPES] [ContainingClassKey=X] constructor(): R|X| { super() } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java index c0828df4c18..994b4a9b8ce 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java @@ -164,6 +164,12 @@ public class FirLazyDeclarationResolveTestGenerated extends AbstractFirLazyDecla public void testFunctionInValueClass() throws Exception { runTest("analysis/low-level-api-fir/testdata/lazyResolve/classes/functionInValueClass.kt"); } + + @Test + @TestMetadata("nestedClassWithPropertiesOverrides.kt") + public void testNestedClassWithPropertiesOverrides() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.kt"); + } } @Nested 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 6e9ff6ddfb7..0b6f310f8cd 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 @@ -225,7 +225,7 @@ abstract class AbstractFirStatusResolveTransformer( return (data ?: declarationStatus) } - private inline fun storeClass( + protected inline fun storeClass( klass: FirClass, computeResult: () -> FirDeclaration ): FirDeclaration {