From 19a75b31f9ba327c8f533bee79333f2afa747729 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 23 Aug 2021 18:08:31 +0300 Subject: [PATCH] FIR: avoid resolve loop between accessor and other members #KT-48634 Fixed --- .../intellij/accessInSetter.fir.txt | 73 +++++++++++++++++++ .../intellij/accessInSetter.kt | 28 +++++++ .../runners/FirDiagnosticTestGenerated.java | 6 ++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++ .../FirDeclarationsResolveTransformer.kt | 49 +++++++++---- .../kotlin/fir/declarations/FirProperty.kt | 4 +- .../builder/FirPropertyBuilder.kt | 7 +- .../fir/declarations/impl/FirPropertyImpl.kt | 7 +- .../FirPropertyBodyResolveState.kt | 14 ++++ .../synthetic/FirSyntheticProperty.kt | 6 +- .../fir/tree/generator/BuilderConfigurator.kt | 2 +- .../fir/tree/generator/NodeConfigurator.kt | 2 +- .../kotlin/fir/tree/generator/Types.kt | 1 + .../level/api/api/DeclarationCopyBuilder.kt | 2 +- .../file/structure/FileStructureElement.kt | 2 +- ...nosisCompilerFirTestdataTestGenerated.java | 6 ++ 16 files changed, 186 insertions(+), 29 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyBodyResolveState.kt diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.fir.txt new file mode 100644 index 00000000000..44026e3c080 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.fir.txt @@ -0,0 +1,73 @@ +FILE: accessInSetter.kt + public final class DrawableGrid : R|kotlin/Any| { + public constructor(isEnabled: R|kotlin/Boolean|): R|DrawableGrid| { + super() + } + + public final var isEnabled: R|kotlin/Boolean| = R|/isEnabled| + public get(): R|kotlin/Boolean| + public set(value: R|kotlin/Boolean|): R|kotlin/Unit| + + } + public final class My : R|kotlin/Any| { + public constructor(): R|My| { + super() + } + + private final val drawableGrid: R|DrawableGrid| = this@R|/My|.R|/My.createDrawableGrid|() + private get(): R|DrawableGrid| + + private final var useAll: R|kotlin/Boolean| = Boolean(false) + private get(): R|kotlin/Boolean| + private set(value: R|kotlin/Boolean|): R|kotlin/Unit| { + this@R|/My|.R|/My.drawableGrid|.R|/DrawableGrid.isEnabled| = R|/value|.R|kotlin/Boolean.not|() + } + + private final fun createDrawableGrid(): R|DrawableGrid| { + ^createDrawableGrid R|/DrawableGrid.DrawableGrid|(Boolean(false)).R|kotlin/apply|( = apply@fun R|DrawableGrid|.(): R|kotlin/Unit| { + when () { + this@R|/My|.R|/My.useAll| -> { + Int(-1) + } + else -> { + Int(0) + } + } + + } + ) + } + + } + public final class Your : R|kotlin/Any| { + public constructor(): R|Your| { + super() + } + + private final val drawableGrid: R|DrawableGrid| = this@R|/Your|.R|/Your.createDrawableGrid|() + private get(): R|DrawableGrid| + + private final var useAll: R|kotlin/Boolean| + private get(): R|kotlin/Boolean| { + ^ Boolean(false) + } + private set(value: R|kotlin/Boolean|): R|kotlin/Unit| { + this@R|/Your|.R|/Your.drawableGrid|.R|/DrawableGrid.isEnabled| = R|/value|.R|kotlin/Boolean.not|() + } + + private final fun createDrawableGrid(): R|DrawableGrid| { + ^createDrawableGrid R|/DrawableGrid.DrawableGrid|(Boolean(false)).R|kotlin/apply|( = apply@fun R|DrawableGrid|.(): R|kotlin/Unit| { + when () { + this@R|/Your|.R|/Your.useAll| -> { + Int(-1) + } + else -> { + Int(0) + } + } + + } + ) + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt new file mode 100644 index 00000000000..49172ebcf17 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt @@ -0,0 +1,28 @@ +class DrawableGrid(var isEnabled: Boolean) + +class My { + private val drawableGrid = createDrawableGrid() + + private var useAll = false + set(value) { + drawableGrid.isEnabled = !value + } + + private fun createDrawableGrid() = DrawableGrid(false).apply { + if (useAll) -1 else 0 + } +} + +class Your { + private val drawableGrid = createDrawableGrid() + + private var useAll + get() = false + set(value) { + drawableGrid.isEnabled = !value + } + + private fun createDrawableGrid() = DrawableGrid(false).apply { + if (useAll) -1 else 0 + } +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 7f488dcfbd6..c1cb76520ee 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -5034,6 +5034,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij") @TestDataPath("$PROJECT_ROOT") public class Intellij { + @Test + @TestMetadata("accessInSetter.kt") + public void testAccessInSetter() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt"); + } + @Test public void testAllFilesPresentInIntellij() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true); diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index c17092eab57..01919c947e9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -5034,6 +5034,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij") @TestDataPath("$PROJECT_ROOT") public class Intellij { + @Test + @TestMetadata("accessInSetter.kt") + public void testAccessInSetter() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt"); + } + @Test public void testAllFilesPresentInIntellij() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true); 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 c3eb11e7b4c..4c83829e1e6 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 @@ -47,7 +47,6 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.SpecialNames open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) { private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession) @@ -126,17 +125,23 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } val returnTypeRef = property.returnTypeRef - if (property.initializerAndAccessorsAreResolved) return property + val bodyResolveState = property.bodyResolveState + if (bodyResolveState == FirPropertyBodyResolveState.EVERYTHING_RESOLVED) return property if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return property property.transformReceiverTypeRef(transformer, ResolutionMode.ContextIndependent) dataFlowAnalyzer.enterProperty(property) doTransformTypeParameters(property) + val shouldResolveEverything = !implicitTypeOnly return withFullBodyResolve { + val initializerIsAlreadyResolved = bodyResolveState >= FirPropertyBodyResolveState.INITIALIZER_RESOLVED context.withProperty(property) { context.forPropertyInitializer { property.transformDelegate(transformer, ResolutionMode.ContextDependentDelegate) - property.transformChildrenWithoutAccessors(returnTypeRef) + if (!initializerIsAlreadyResolved) { + property.transformChildrenWithoutAccessors(returnTypeRef) + property.replaceBodyResolveState(FirPropertyBodyResolveState.INITIALIZER_RESOLVED) + } if (property.initializer != null) { storeVariableReturnType(property) } @@ -147,14 +152,26 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor if (property.delegateFieldSymbol != null) { replacePropertyReferenceTypeInDelegateAccessors(property) } + property.replaceBodyResolveState(FirPropertyBodyResolveState.EVERYTHING_RESOLVED) } else { - property.transformAccessors() + val hasNonDefaultAccessors = property.getter != null && property.getter !is FirDefaultPropertyAccessor || + property.setter != null && property.setter !is FirDefaultPropertyAccessor + val mayResolveSetter = shouldResolveEverything || !hasNonDefaultAccessors + val mayResolveGetter = mayResolveSetter || property.initializer == null + if (mayResolveGetter) { + property.transformAccessors(mayResolveSetter) + property.replaceBodyResolveState( + if (mayResolveSetter) FirPropertyBodyResolveState.EVERYTHING_RESOLVED + else FirPropertyBodyResolveState.INITIALIZER_AND_GETTER_RESOLVED + ) + } } } - dataFlowAnalyzer.exitProperty(property)?.let { - property.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(it)) + if (!initializerIsAlreadyResolved) { + dataFlowAnalyzer.exitProperty(property)?.let { + property.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(it)) + } } - property.replaceInitializerAndAccessorsAreResolved(true) property } } @@ -293,10 +310,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor .transformOtherChildren(transformer, data) } - private fun FirProperty.transformAccessors() { + private fun FirProperty.transformAccessors(mayResolveSetter: Boolean = true) { var enhancedTypeRef = returnTypeRef - getter?.let { - transformAccessor(it, enhancedTypeRef, this) + if (bodyResolveState < FirPropertyBodyResolveState.INITIALIZER_AND_GETTER_RESOLVED) { + getter?.let { + transformAccessor(it, enhancedTypeRef, this) + } } if (returnTypeRef is FirImplicitTypeRef) { storeVariableReturnType(this) @@ -304,11 +323,13 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor // We need update type of getter for case when its type was approximated getter?.replaceReturnTypeRef(enhancedTypeRef) } - setter?.let { - if (it.valueParameters[0].returnTypeRef is FirImplicitTypeRef) { - it.valueParameters[0].transformReturnTypeRef(StoreType, enhancedTypeRef) + if (mayResolveSetter) { + setter?.let { + if (it.valueParameters[0].returnTypeRef is FirImplicitTypeRef) { + it.valueParameters[0].transformReturnTypeRef(StoreType, enhancedTypeRef) + } + transformAccessor(it, enhancedTypeRef, this) } - transformAccessor(it, enhancedTypeRef, this) } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt index 5b6e298bb08..e2805310e52 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt @@ -50,7 +50,7 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract val backingFieldSymbol: FirBackingFieldSymbol abstract val delegateFieldSymbol: FirDelegateFieldSymbol? abstract val isLocal: Boolean - abstract val initializerAndAccessorsAreResolved: Boolean + abstract val bodyResolveState: FirPropertyBodyResolveState abstract override val typeParameters: List override fun accept(visitor: FirVisitor, data: D): R = visitor.visitProperty(this, data) @@ -71,7 +71,7 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, FirControlFl abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) - abstract fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean) + abstract fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirProperty diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt index dc81b8f690d..e35ff7b2243 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.FirPropertyBodyResolveState import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder @@ -61,7 +62,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, lateinit var symbol: FirPropertySymbol var delegateFieldSymbol: FirDelegateFieldSymbol? = null var isLocal: Boolean by kotlin.properties.Delegates.notNull() - var initializerAndAccessorsAreResolved: Boolean = false + var bodyResolveState: FirPropertyBodyResolveState = FirPropertyBodyResolveState.NOTHING_RESOLVED override val typeParameters: MutableList = mutableListOf() override fun build(): FirProperty { @@ -87,7 +88,7 @@ class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, symbol, delegateFieldSymbol, isLocal, - initializerAndAccessorsAreResolved, + bodyResolveState, typeParameters, ) } @@ -129,7 +130,7 @@ inline fun buildPropertyCopy(original: FirProperty, init: FirPropertyBuilder.() copyBuilder.symbol = original.symbol copyBuilder.delegateFieldSymbol = original.delegateFieldSymbol copyBuilder.isLocal = original.isLocal - copyBuilder.initializerAndAccessorsAreResolved = original.initializerAndAccessorsAreResolved + copyBuilder.bodyResolveState = original.bodyResolveState copyBuilder.typeParameters.addAll(original.typeParameters) return copyBuilder.apply(init).build() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt index b1f1108e2e7..343ded2a614 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.FirPropertyBodyResolveState import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -55,7 +56,7 @@ internal class FirPropertyImpl( override val symbol: FirPropertySymbol, override val delegateFieldSymbol: FirDelegateFieldSymbol?, override val isLocal: Boolean, - override var initializerAndAccessorsAreResolved: Boolean, + override var bodyResolveState: FirPropertyBodyResolveState, override val typeParameters: MutableList, ) : FirProperty() { override val isVal: Boolean get() = !isVar @@ -169,7 +170,7 @@ internal class FirPropertyImpl( controlFlowGraphReference = newControlFlowGraphReference } - override fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean) { - initializerAndAccessorsAreResolved = newInitializerAndAccessorsAreResolved + override fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) { + bodyResolveState = newBodyResolveState } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyBodyResolveState.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyBodyResolveState.kt new file mode 100644 index 00000000000..925fc9427b8 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyBodyResolveState.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2021 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.declarations + +// Semantically all states here are parts of FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE and just BODY_RESOLVE +enum class FirPropertyBodyResolveState { + NOTHING_RESOLVED, + INITIALIZER_RESOLVED, + INITIALIZER_AND_GETTER_RESOLVED, + EVERYTHING_RESOLVED +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt index 4942e9640c9..ca855b5a4b3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt @@ -82,8 +82,8 @@ class FirSyntheticProperty( // ??? override val backingFieldSymbol: FirBackingFieldSymbol = FirBackingFieldSymbol(symbol.callableId) - override val initializerAndAccessorsAreResolved: Boolean - get() = true + override val bodyResolveState: FirPropertyBodyResolveState + get() = FirPropertyBodyResolveState.EVERYTHING_RESOLVED override fun acceptChildren(visitor: FirVisitor, data: D) { returnTypeRef.accept(visitor, data) @@ -158,7 +158,7 @@ class FirSyntheticProperty( throw AssertionError("Mutation of synthetic property isn't supported") } - override fun replaceInitializerAndAccessorsAreResolved(newInitializerAndAccessorsAreResolved: Boolean) { + override fun replaceBodyResolveState(newBodyResolveState: FirPropertyBodyResolveState) { throw AssertionError("Mutation of synthetic property isn't supported") } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index 8ee4c3042f8..8e37757c39b 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -202,7 +202,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree parents += typeParametersOwnerBuilder defaultNull("getter", "setter", "containerSource", "delegateFieldSymbol") default("resolvePhase", "FirResolvePhase.RAW_FIR") - defaultFalse("initializerAndAccessorsAreResolved") + default("bodyResolveState", "FirPropertyBodyResolveState.NOTHING_RESOLVED") withCopy() } 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 dca0d35b717..e8465d8d519 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 @@ -318,7 +318,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field("backingFieldSymbol", backingFieldSymbolType) +field("delegateFieldSymbol", delegateFieldSymbolType, nullable = true) +booleanField("isLocal") - +booleanField("initializerAndAccessorsAreResolved", withReplace = true) + +field("bodyResolveState", propertyBodyResolveStateType, withReplace = true) +typeParameters } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index b528c7160db..d47a8ea55cd 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -61,6 +61,7 @@ val implicitNothingTypeRefType = generatedType("types.impl", "FirImplicitNothing val implicitStringTypeRefType = generatedType("types.impl", "FirImplicitStringTypeRef") val implicitUnitTypeRefType = generatedType("types.impl", "FirImplicitUnitTypeRef") val resolvePhaseType = type("fir.declarations", "FirResolvePhase") +val propertyBodyResolveStateType = type("fir.declarations", "FirPropertyBodyResolveState") val stubReferenceType = generatedType("references.impl", "FirStubReference") val firBasedSymbolType = type("fir.symbols", "FirBasedSymbol") diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/DeclarationCopyBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/DeclarationCopyBuilder.kt index 132921fb1aa..72b02135352 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/DeclarationCopyBuilder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/DeclarationCopyBuilder.kt @@ -60,7 +60,7 @@ internal object DeclarationCopyBuilder { setter = copySetter if (propertyResolvePhase < FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { - initializerAndAccessorsAreResolved = false + bodyResolveState = FirPropertyBodyResolveState.NOTHING_RESOLVED } initDeclaration(this@withBodyFrom, propertyWithBody) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructureElement.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructureElement.kt index 26ea7b9e76b..09fbee9cb69 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructureElement.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructureElement.kt @@ -200,7 +200,7 @@ internal class ReanalyzablePropertyStructureElement( getter?.replaceResolvePhase(upgradedPhase) setter?.replaceResolvePhase(upgradedPhase) replaceResolvePhase(upgradedPhase) - replaceInitializerAndAccessorsAreResolved(false) + replaceBodyResolveState(FirPropertyBodyResolveState.NOTHING_RESOLVED) } val resolvedDeclaration = firLazyDeclarationResolver.lazyResolveDeclaration( diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 9595aa0b16e..7ca3341faad 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -5034,6 +5034,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis @TestMetadata("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij") @TestDataPath("$PROJECT_ROOT") public class Intellij { + @Test + @TestMetadata("accessInSetter.kt") + public void testAccessInSetter() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/accessInSetter.kt"); + } + @Test public void testAllFilesPresentInIntellij() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij"), Pattern.compile("^([^.]+)\\.kt$"), null, true);