From c52b9032ce54c718c5cf87a0c0dc3b88b88ab951 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 6 Feb 2024 17:33:53 +0100 Subject: [PATCH] [LL FIR] pull up custom logic for synthetic properties and accessors We should process them independently as they can be not related to each other ^KT-65563 Fixed --- .../LLFirResolveMultiDesignationCollector.kt | 4 +- .../getterFromLibraryAndSetterFromSources.kt | 27 +++ .../getterFromLibraryAndSetterFromSources.txt | 169 +++++++++++++++++ .../setterFromLibraryAndGetterFromSources.kt | 27 +++ .../setterFromLibraryAndGetterFromSources.txt | 178 ++++++++++++++++++ ...otLazyDeclarationResolveTestGenerated.java | 12 ++ ...ceLazyDeclarationResolveTestGenerated.java | 12 ++ .../fir/symbols/FirLazyDeclarationResolver.kt | 11 +- 8 files changed, 437 insertions(+), 3 deletions(-) create mode 100644 analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt create mode 100644 analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.txt create mode 100644 analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt create mode 100644 analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.txt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirResolveMultiDesignationCollector.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirResolveMultiDesignationCollector.kt index 0f946aa8c61..96305e11594 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirResolveMultiDesignationCollector.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirResolveMultiDesignationCollector.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirWholeEle import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.asResolveTarget import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError import org.jetbrains.kotlin.analysis.low.level.api.fir.api.tryCollectDesignationWithFile +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer import org.jetbrains.kotlin.fir.declarations.* @@ -23,8 +24,7 @@ import org.jetbrains.kotlin.fir.isCopyCreatedInScope internal object LLFirResolveMultiDesignationCollector { fun getDesignationsToResolve(target: FirElementWithResolveState): List = when (target) { is FirFile -> listOf(FirDesignation(target).asResolveTarget()) - is FirSyntheticPropertyAccessor -> getDesignationsToResolve(target.delegate) - is FirSyntheticProperty -> getDesignationsToResolve(target.getter) + target.setter?.let(::getDesignationsToResolve).orEmpty() + is FirSyntheticPropertyAccessor, is FirSyntheticProperty -> errorWithFirSpecificEntries("Unsupported element", fir = target) else -> listOfNotNull(getMainDesignationToResolve(target)) } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt new file mode 100644 index 00000000000..1524a68a7da --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt @@ -0,0 +1,27 @@ +// SKIP_WHEN_OUT_OF_CONTENT_ROOT +// MODULE: lib +// MODULE_KIND: LibraryBinary +// FILE: BaseKotlin.kt +open class BaseKotlin : BaseJava() { + override fun getSomething(): String = "42" +} + +// FILE: BaseJava.java +public class BaseJava { + public String getSomething() { + return ""; + } + + public void setSomething(String s) { + + } +} + +// MODULE: main(lib) +// MEMBER_NAME_FILTER: something +// FILE: main.kt +class Derived : BaseKotlin() { + override fun setSomething(s: String) { + + } +} diff --git a/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.txt b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.txt new file mode 100644 index 00000000000..4b6040118c3 --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.txt @@ -0,0 +1,169 @@ +STATUS: +TARGET: public open [ STATUS] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(STATUS)] set([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(STATUS)] fun setSomething([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + + } + +EXPECT_ACTUAL_MATCHING: +TARGET: public open [ EXPECT_ACTUAL_MATCHING] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(EXPECT_ACTUAL_MATCHING)] set([ResolvedTo(EXPECT_ACTUAL_MATCHING)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun setSomething([ResolvedTo(EXPECT_ACTUAL_MATCHING)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } + + } + +CONTRACTS: +TARGET: public open [ CONTRACTS] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(CONTRACTS)] set([ResolvedTo(CONTRACTS)] s: R|kotlin/String|): R|kotlin/Unit| { + } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(CONTRACTS)] fun setSomething([ResolvedTo(CONTRACTS)] s: R|kotlin/String|): R|kotlin/Unit| { + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +TARGET: public open [ IMPLICIT_TYPES_BODY_RESOLVE] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] set([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { + } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun setSomething([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { + } + + } + +ANNOTATION_ARGUMENTS: +TARGET: public open [ ANNOTATION_ARGUMENTS] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(ANNOTATION_ARGUMENTS)] set([ResolvedTo(ANNOTATION_ARGUMENTS)] s: R|kotlin/String|): R|kotlin/Unit| { + } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(ANNOTATION_ARGUMENTS)] fun setSomething([ResolvedTo(ANNOTATION_ARGUMENTS)] s: R|kotlin/String|): R|kotlin/Unit| { + } + + } + +BODY_RESOLVE: +TARGET: public open [ BODY_RESOLVE] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { + } + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun getSomething(): kotlin.String { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(BODY_RESOLVE)] fun setSomething([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(BODY_RESOLVE)] main.kt + public final [ResolvedTo(BODY_RESOLVE)] class Derived : R|BaseKotlin| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Derived] constructor(): R|Derived| { + super() + } + + public open override [ResolvedTo(BODY_RESOLVE)] fun setSomething([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { + } + + } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt new file mode 100644 index 00000000000..920ed4b9b66 --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt @@ -0,0 +1,27 @@ +// SKIP_WHEN_OUT_OF_CONTENT_ROOT +// MODULE: lib +// MODULE_KIND: LibraryBinary +// FILE: BaseKotlin.kt +open class BaseKotlin : BaseJava() { + override fun setSomething(s: String) { + + } +} + +// FILE: BaseJava.java +public class BaseJava { + public String getSomething() { + return ""; + } + + public void setSomething(String s) { + + } +} + +// MODULE: main(lib) +// MEMBER_NAME_FILTER: something +// FILE: main.kt +class Derived : BaseKotlin() { + override fun getSomething(): String = "42" +} diff --git a/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.txt b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.txt new file mode 100644 index 00000000000..a61930254af --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.txt @@ -0,0 +1,178 @@ +STATUS: +TARGET: public open override [ STATUS] var something: R|kotlin/String| + public [ ResolvedTo(STATUS)] get(): R|kotlin/String| { LAZY_BLOCK } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(STATUS)] fun getSomething(): R|kotlin/String| { LAZY_BLOCK } + + } + +EXPECT_ACTUAL_MATCHING: +TARGET: public open override [ EXPECT_ACTUAL_MATCHING] var something: R|kotlin/String| + public [ ResolvedTo(EXPECT_ACTUAL_MATCHING)] get(): R|kotlin/String| { LAZY_BLOCK } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun getSomething(): R|kotlin/String| { LAZY_BLOCK } + + } + +CONTRACTS: +TARGET: public open override [ CONTRACTS] var something: R|kotlin/String| + public [ ResolvedTo(CONTRACTS)] get(): R|kotlin/String| { + ^getSomething String(42) + } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(CONTRACTS)] fun getSomething(): R|kotlin/String| { + ^getSomething String(42) + } + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +TARGET: public open override [ IMPLICIT_TYPES_BODY_RESOLVE] var something: R|kotlin/String| + public [ ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] get(): R|kotlin/String| { + ^getSomething String(42) + } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun getSomething(): R|kotlin/String| { + ^getSomething String(42) + } + + } + +ANNOTATION_ARGUMENTS: +TARGET: public open override [ ANNOTATION_ARGUMENTS] var something: R|kotlin/String| + public [ ResolvedTo(ANNOTATION_ARGUMENTS)] get(): R|kotlin/String| { + ^getSomething String(42) + } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(ANNOTATION_ARGUMENTS)] fun getSomething(): R|kotlin/String| { + ^getSomething String(42) + } + + } + +BODY_RESOLVE: +TARGET: public open override [ BODY_RESOLVE] var something: R|kotlin/String| + public [ ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/String| { + ^getSomething String(42) + } + public [ ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| + +FILE: [ResolvedTo(RAW_FIR)] BaseKotlin.class + public open [ResolvedTo(RAW_FIR)] class BaseKotlin : BaseJava { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=BaseKotlin] constructor(): R|BaseKotlin| { + LAZY_super<> + } + + public open [ResolvedTo(RAW_FIR)] fun setSomething([ResolvedTo(RAW_FIR)] s: kotlin.String): kotlin.Unit { LAZY_BLOCK } + + } + +FILE: [ResolvedTo(IMPORTS)] main.kt + public final [ResolvedTo(STATUS)] class Derived : R|BaseKotlin| { + public [ResolvedTo(STATUS)] [ContainingClassKey=Derived] constructor(): R|Derived| { + LAZY_super + } + + public open override [ResolvedTo(BODY_RESOLVE)] fun getSomething(): R|kotlin/String| { + ^getSomething String(42) + } + + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(BODY_RESOLVE)] main.kt + public final [ResolvedTo(BODY_RESOLVE)] class Derived : R|BaseKotlin| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Derived] constructor(): R|Derived| { + super() + } + + public open override [ResolvedTo(BODY_RESOLVE)] fun getSomething(): R|kotlin/String| { + ^getSomething String(42) + } + + } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java index 6a375a14b62..95a866df688 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java @@ -1203,6 +1203,12 @@ public class FirOutOfContentRootLazyDeclarationResolveTestGenerated extends Abst runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/explicitReturnTypeAndAnnotations.kt"); } + @Test + @TestMetadata("getterFromLibraryAndSetterFromSources.kt") + public void testGetterFromLibraryAndSetterFromSources() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt"); + } + @Test @TestMetadata("implicitReturnType.kt") public void testImplicitReturnType() throws Exception { @@ -1250,6 +1256,12 @@ public class FirOutOfContentRootLazyDeclarationResolveTestGenerated extends Abst public void testSetterAndExplicitReturnTypeAndAnnotationsAsSetter() throws Exception { runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterAndExplicitReturnTypeAndAnnotationsAsSetter.kt"); } + + @Test + @TestMetadata("setterFromLibraryAndGetterFromSources.kt") + public void testSetterFromLibraryAndGetterFromSources() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt"); + } } @Nested diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java index d0a0d9aa414..478a1b4253e 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java @@ -1203,6 +1203,12 @@ public class FirSourceLazyDeclarationResolveTestGenerated extends AbstractFirSou runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/explicitReturnTypeAndAnnotations.kt"); } + @Test + @TestMetadata("getterFromLibraryAndSetterFromSources.kt") + public void testGetterFromLibraryAndSetterFromSources() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/getterFromLibraryAndSetterFromSources.kt"); + } + @Test @TestMetadata("implicitReturnType.kt") public void testImplicitReturnType() throws Exception { @@ -1250,6 +1256,12 @@ public class FirSourceLazyDeclarationResolveTestGenerated extends AbstractFirSou public void testSetterAndExplicitReturnTypeAndAnnotationsAsSetter() throws Exception { runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterAndExplicitReturnTypeAndAnnotationsAsSetter.kt"); } + + @Test + @TestMetadata("setterFromLibraryAndGetterFromSources.kt") + public void testSetterFromLibraryAndGetterFromSources() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/syntheticProperties/setterFromLibraryAndGetterFromSources.kt"); + } } @Nested diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt index bbc51e7fb92..cf5c6faf83e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirLazyDeclarationResolver.kt @@ -10,6 +10,8 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty +import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol /** @@ -95,7 +97,14 @@ fun FirBasedSymbol<*>.lazyResolveToPhase(toPhase: FirResolvePhase) { * @see lazyResolveToPhase */ fun FirElementWithResolveState.lazyResolveToPhase(toPhase: FirResolvePhase) { - lazyDeclarationResolver.lazyResolveToPhase(this, toPhase) + when (this) { + is FirSyntheticPropertyAccessor -> delegate.lazyResolveToPhase(toPhase) + is FirSyntheticProperty -> { + getter.lazyResolveToPhase(toPhase) + setter?.lazyResolveToPhase(toPhase) + } + else -> lazyDeclarationResolver.lazyResolveToPhase(this, toPhase) + } } /**