[FIR] Assign the property source to accessors from delegates

The change in `FirWebCommonExternalPropertyAccessorChecker` is backed by
`compiler/testData/diagnostics/testsWithJsStdLib/native/delegation.kt`.

In `signatureClashVariables.kt`, `CONFLICTING_KLIB_SIGNATURES_ERROR`
moved to the whole property, but `DeduplicatingDiagnosticReporter`
avoids duplicates.

`anonymousDelegate.fir.txt` disappears, because `setDelegate` moves
down a but in `AnonymousDelegateKt`, making the dump identical to
`.txt`.

^KT-72295 Fixed
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
index a76172b..f7cb0eb 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
@@ -42,9 +42,6 @@
     private val declarationToBuild: KtElement,
     private val functionsToRebind: Set<FirFunction>,
 ) : PsiRawFirBuilder(session, baseScopeProvider, bodyBuildingMode = BodyBuildingMode.NORMAL) {
-    override val KtProperty.sourceForDelegatedPropertyAccessors: KtSourceElement?
-        get() = this.toFirSourceElement()
-
     companion object {
         fun buildWithFunctionSymbolRebind(
             session: FirSession,
diff --git a/compiler/fir/checkers/checkers.web.common/src/org/jetbrains/kotlin/fir/analysis/web/common/checkers/declaration/FirWebCommonExternalPropertyAccessorChecker.kt b/compiler/fir/checkers/checkers.web.common/src/org/jetbrains/kotlin/fir/analysis/web/common/checkers/declaration/FirWebCommonExternalPropertyAccessorChecker.kt
index ea068ea..7a2802e 100644
--- a/compiler/fir/checkers/checkers.web.common/src/org/jetbrains/kotlin/fir/analysis/web/common/checkers/declaration/FirWebCommonExternalPropertyAccessorChecker.kt
+++ b/compiler/fir/checkers/checkers.web.common/src/org/jetbrains/kotlin/fir/analysis/web/common/checkers/declaration/FirWebCommonExternalPropertyAccessorChecker.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration
 
+import org.jetbrains.kotlin.KtNodeTypes
 import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
 import org.jetbrains.kotlin.diagnostics.reportOn
 import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
@@ -18,7 +19,11 @@
 
 object FirWebCommonExternalPropertyAccessorChecker : FirPropertyAccessorChecker(MppCheckerKind.Common) {
     override fun check(declaration: FirPropertyAccessor, context: CheckerContext, reporter: DiagnosticReporter) {
-        if (declaration !is FirDefaultPropertyAccessor && declaration.isDirectlyExternal()) {
+        if (
+            declaration !is FirDefaultPropertyAccessor &&
+            declaration.isDirectlyExternal() &&
+            declaration.source?.elementType == KtNodeTypes.PROPERTY_ACCESSOR
+        ) {
             reporter.reportOn(declaration.source, FirWebCommonErrors.WRONG_EXTERNAL_DECLARATION, "property accessor", context)
         }
     }
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt
index e408b4f..cc72483 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt
@@ -22,6 +22,8 @@
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.KtValVarKeywordOwner
 import org.jetbrains.kotlin.util.getChildren
+import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
+import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
 
 // DO
 // - use this to retrieve modifiers on the source and confirm a certain modifier indeed appears
@@ -93,11 +95,12 @@
         is KtPsiSourceElement -> {
             val modifierListOwner = psi as? KtModifierListOwner
 
-            // TODO: drop in the context of KT-72295
             // The check is required in the Analysis API mode as in this case property accessor
             // has the containing property as a source
             if (kind == KtFakeSourceElementKind.DelegatedPropertyAccessor && modifierListOwner is KtProperty) {
-                return null
+                errorWithAttachment("Don't request modifiers on fake PSI of delegated property accessors, it's not the right PSI") {
+                    withPsiEntry("property", modifierListOwner)
+                }
             }
 
             modifierListOwner?.modifierList?.let { FirModifierList.FirPsiModifierList(it) }
@@ -113,9 +116,14 @@
 
 operator fun FirModifierList?.contains(token: KtModifierKeywordToken): Boolean = this?.contains(token) == true
 
-fun FirElement.getModifier(token: KtModifierKeywordToken): FirModifier<*>? = source.getModifierList()?.get(token)
+fun FirElement.getModifierList(): FirModifierList? = when {
+    source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor && source?.elementType != KtNodeTypes.PROPERTY_ACCESSOR -> null
+    else -> source.getModifierList()
+}
 
-fun FirElement.hasModifier(token: KtModifierKeywordToken): Boolean = token in source.getModifierList()
+fun FirElement.getModifier(token: KtModifierKeywordToken): FirModifier<*>? = getModifierList()?.get(token)
+
+fun FirElement.hasModifier(token: KtModifierKeywordToken): Boolean = token in getModifierList()
 
 @OptIn(SymbolInternals::class)
 fun FirBasedSymbol<*>.hasModifier(token: KtModifierKeywordToken): Boolean = fir.hasModifier(token)
diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
index e3d8eac..0ad2f87 100644
--- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
+++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
@@ -1427,7 +1427,8 @@
                         baseModuleData,
                         classWrapper?.classBuilder?.ownerRegularOrAnonymousObjectSymbol,
                         context = context,
-                        isExtension = false
+                        isExtension = false,
+                        explicitDeclarationSource = propertySource,
                     )
                 } else {
                     this.isLocal = false
@@ -1503,6 +1504,7 @@
                             classWrapper?.classBuilder?.ownerRegularOrAnonymousObjectSymbol,
                             context,
                             isExtension = receiverTypeNode != null,
+                            explicitDeclarationSource = propertySource,
                         )
                     }
                 }
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
index b66aa50..12d1893 100644
--- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
+++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
@@ -58,11 +58,6 @@
     val baseScopeProvider: FirScopeProvider,
     bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL,
 ) : AbstractRawFirBuilder<PsiElement>(session) {
-    /**
-     * @see generateAccessorsByDelegate
-     */
-    protected open val KtProperty.sourceForDelegatedPropertyAccessors: KtSourceElement? get() = null
-
     protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) {
         target.bind(function)
     }
@@ -2332,6 +2327,7 @@
                                 ownerRegularOrAnonymousObjectSymbol = null,
                                 context = context,
                                 isExtension = false,
+                                explicitDeclarationSource = propertySource,
                             )
                         }
                     } else {
@@ -2413,7 +2409,7 @@
                                     lazyDelegateExpression = lazyDelegateExpression,
                                     lazyBodyForGeneratedAccessors = lazyBody,
                                     bindFunction = ::bindFunctionTarget,
-                                    explicitDeclarationSource = sourceForDelegatedPropertyAccessors,
+                                    explicitDeclarationSource = propertySource,
                                 )
                             }
                         }
diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt
index 4ac78a6..cdc3f94 100644
--- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt
+++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt
@@ -310,14 +310,6 @@
         is FirRegularClassBuilder -> symbol
     }
 
-/**
- * TODO: KT-72295 – the compiler should provide [explicitDeclarationSource] as well.
- *
- * @param explicitDeclarationSource In the Analysis API mode, this function is called at least twice – during [FirResolvePhase.RAW_FIR] in lazy mode,
- * and the next time to calculate lazy body.
- * This means that `fakeSource` will be different in these two situations after KT-64898.
- * As declarations (such as property accessors and the setter parameter) cannot be changed after creation, so it has to be stable.
- */
 fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
     delegateBuilder: FirWrappedDelegateExpressionBuilder?,
     moduleData: FirModuleData,
diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.diag.txt b/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.diag.txt
index 0aeccaa..8265800 100644
--- a/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.diag.txt
+++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.diag.txt
@@ -10,10 +10,6 @@
     val myDelegated: kotlin.Int defined in com.example.klib.serialization.diagnostics
     val myDelegated: kotlin.Long defined in com.example.klib.serialization.diagnostics
 
-/foo.kt:20:53: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myDelegated.<get-myDelegated>|<get-myDelegated>(){}[0]):
-    fun `<get-myDelegated>`(): kotlin.Int defined in com.example.klib.serialization.diagnostics
-    fun `<get-myDelegated>`(): kotlin.Long defined in com.example.klib.serialization.diagnostics
-
 /foo.kt:22:1: error: Platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/extensionValue|@kotlin.Int{}extensionValue[0]):
     val kotlin.Int.extensionValue: kotlin.Int defined in com.example.klib.serialization.diagnostics
     var kotlin.Int.extensionValue: kotlin.Int defined in com.example.klib.serialization.diagnostics
@@ -50,10 +46,6 @@
     val myDelegated: kotlin.Int defined in com.example.klib.serialization.diagnostics
     val myDelegated: kotlin.Long defined in com.example.klib.serialization.diagnostics
 
-/main.kt:37:52: error: Platform declaration clash: The following functions have the same IR signature (com.example.klib.serialization.diagnostics/myDelegated.<get-myDelegated>|<get-myDelegated>(){}[0]):
-    fun `<get-myDelegated>`(): kotlin.Int defined in com.example.klib.serialization.diagnostics
-    fun `<get-myDelegated>`(): kotlin.Long defined in com.example.klib.serialization.diagnostics
-
 /main.kt:39:1: error: Platform declaration clash: The following properties have the same IR signature (com.example.klib.serialization.diagnostics/extensionValue|@kotlin.Int{}extensionValue[0]):
     val kotlin.Int.extensionValue: kotlin.Int defined in com.example.klib.serialization.diagnostics
     var kotlin.Int.extensionValue: kotlin.Int defined in com.example.klib.serialization.diagnostics
diff --git a/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.kt b/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.kt
index da4f4d6..ae16c5a 100644
--- a/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.kt
+++ b/compiler/testData/diagnostics/klibSerializationTests/signatureClashVariables.kt
@@ -17,7 +17,7 @@
 
 <!CONFLICTING_KLIB_SIGNATURES_ERROR!><!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val valueSeparateFiles<!> = 0<!>
 
-<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val myDelegated: Long by <!CONFLICTING_KLIB_SIGNATURES_ERROR!>lazy { 0L }<!><!>
+<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val myDelegated: Long by lazy { 0L }<!>
 
 <!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION")
 var Int.extensionValue: Int
@@ -34,7 +34,7 @@
 <!CONFLICTING_KLIB_SIGNATURES_ERROR!><!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val valueSingleFile: Int<!> = 0<!>
 <!CONFLICTING_KLIB_SIGNATURES_ERROR!><!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val valueSingleFile: String<!> = ""<!>
 
-<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val myDelegated: Int by <!CONFLICTING_KLIB_SIGNATURES_ERROR!>lazy { 1 }<!><!>
+<!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION") val myDelegated: Int by lazy { 1 }<!>
 
 <!CONFLICTING_KLIB_SIGNATURES_ERROR!>@Suppress("REDECLARATION")
 val Int.extensionValue: Int
diff --git a/compiler/testData/ir/sourceRanges/declarations/delegatedProperties.fir.txt b/compiler/testData/ir/sourceRanges/declarations/delegatedProperties.fir.txt
index b54990a..de46623 100644
--- a/compiler/testData/ir/sourceRanges/declarations/delegatedProperties.fir.txt
+++ b/compiler/testData/ir/sourceRanges/declarations/delegatedProperties.fir.txt
@@ -13,8 +13,8 @@
                 @7:8..9 BLOCK_BODY
                   @7:9..9 RETURN type=kotlin.Nothing from='local final fun <anonymous> (): kotlin.Int declared in <root>.MyClass.lazyProp$delegate'
                     @7:8..9 CONST Int type=kotlin.Int value=5
-      @6:20..8:5 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-lazyProp> visibility:public modality:FINAL <> ($this:<root>.MyClass) returnType:kotlin.Int
-        @6:20..8:5 VALUE_PARAMETER name:<this> type:<root>.MyClass
+      @6:4..8:5 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-lazyProp> visibility:public modality:FINAL <> ($this:<root>.MyClass) returnType:kotlin.Int
+        @6:4..8:5 VALUE_PARAMETER name:<this> type:<root>.MyClass
         @6:20..8:5 BLOCK_BODY
           @6:20..8:5 RETURN type=kotlin.Nothing from='public final fun <get-lazyProp> (): kotlin.Int declared in <root>.MyClass'
             @6:20..8:5 CALL 'public final fun getValue <T> (thisRef: kotlin.Any?, property: kotlin.reflect.KProperty<*>): T of kotlin.getValue [inline,operator] declared in kotlin' type=kotlin.Int origin=null
@@ -40,8 +40,8 @@
                       @11:22..25 GET_VAR 'old: kotlin.String declared in <root>.MyClass.observableProp$delegate.<anonymous>' type=kotlin.String origin=null
                       @11:25..31 CONST String type=kotlin.String value=", now "
                       @11:32..35 GET_VAR 'new: kotlin.String declared in <root>.MyClass.observableProp$delegate.<anonymous>' type=kotlin.String origin=null
-      @10:34..12:5 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-observableProp> visibility:public modality:FINAL <> ($this:<root>.MyClass) returnType:kotlin.String
-        @10:34..12:5 VALUE_PARAMETER name:<this> type:<root>.MyClass
+      @10:4..12:5 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-observableProp> visibility:public modality:FINAL <> ($this:<root>.MyClass) returnType:kotlin.String
+        @10:4..12:5 VALUE_PARAMETER name:<this> type:<root>.MyClass
         @10:34..12:5 BLOCK_BODY
           @10:34..12:5 RETURN type=kotlin.Nothing from='public final fun <get-observableProp> (): kotlin.String declared in <root>.MyClass'
             @10:34..12:5 CALL 'public abstract fun getValue (thisRef: T of kotlin.properties.ReadWriteProperty, property: kotlin.reflect.KProperty<*>): V of kotlin.properties.ReadWriteProperty [operator] declared in kotlin.properties.ReadWriteProperty' type=kotlin.String origin=null
@@ -51,7 +51,7 @@
               @10:34..12:5 PROPERTY_REFERENCE 'public final observableProp: kotlin.String [delegated,var] declared in <root>.MyClass' field=null getter='public final fun <get-observableProp> (): kotlin.String declared in <root>.MyClass' setter='public final fun <set-observableProp> (<set-?>: kotlin.String): kotlin.Unit declared in <root>.MyClass' type=kotlin.reflect.KMutableProperty1<<root>.MyClass, kotlin.String> origin=PROPERTY_REFERENCE_FOR_DELEGATE
       @10:4..12:5 FUN DELEGATED_PROPERTY_ACCESSOR name:<set-observableProp> visibility:public modality:FINAL <> ($this:<root>.MyClass, <set-?>:kotlin.String) returnType:kotlin.Unit
         @10:4..12:5 VALUE_PARAMETER name:<this> type:<root>.MyClass
-        @10:34..12:5 VALUE_PARAMETER name:<set-?> index:0 type:kotlin.String
+        @10:4..12:5 VALUE_PARAMETER name:<set-?> index:0 type:kotlin.String
         @10:34..12:5 BLOCK_BODY
           @10:34..12:5 RETURN type=kotlin.Nothing from='public final fun <set-observableProp> (<set-?>: kotlin.String): kotlin.Unit declared in <root>.MyClass'
             @10:34..12:5 CALL 'public abstract fun setValue (thisRef: T of kotlin.properties.ReadWriteProperty, property: kotlin.reflect.KProperty<*>, value: V of kotlin.properties.ReadWriteProperty): kotlin.Unit [operator] declared in kotlin.properties.ReadWriteProperty' type=kotlin.Unit origin=null
diff --git a/compiler/testData/ir/sourceRanges/kt24258.fir.txt b/compiler/testData/ir/sourceRanges/kt24258.fir.txt
index 8d3e52e..c8d7ed4 100644
--- a/compiler/testData/ir/sourceRanges/kt24258.fir.txt
+++ b/compiler/testData/ir/sourceRanges/kt24258.fir.txt
@@ -8,7 +8,7 @@
               @3:37..51 BLOCK_BODY
                 @3:51..51 RETURN type=kotlin.Nothing from='local final fun <anonymous> (): @[FlexibleNullability] kotlin.String? declared in <root>.lazyNullString$delegate'
                   @3:39..51 CALL 'public open fun nullString (): @[FlexibleNullability] kotlin.String? declared in <root>.J' type=@[FlexibleNullability] kotlin.String? origin=null
-    @3:30..53 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-lazyNullString> visibility:public modality:FINAL <> () returnType:kotlin.String
+    @3:0..53 FUN DELEGATED_PROPERTY_ACCESSOR name:<get-lazyNullString> visibility:public modality:FINAL <> () returnType:kotlin.String
       @3:30..53 BLOCK_BODY
         @3:30..53 RETURN type=kotlin.Nothing from='public final fun <get-lazyNullString> (): kotlin.String declared in <root>'
           @3:30..53 TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String
diff --git a/js/js.translator/testData/lineNumbers/delegateMemberVal.kt b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt
index e4ebda6..e2a78de 100644
--- a/js/js.translator/testData/lineNumbers/delegateMemberVal.kt
+++ b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt
@@ -13,5 +13,5 @@
     }
 }
 
-// LINES(FIR JS_IR):             3 3 3 3 1 1 3 3 3 3 3 3 6 6 7 7 10 10 10 10 10 10 10 11 12 12 3 3 18 * 3
+// LINES(FIR JS_IR):             3 3 3 3 1 1 3 3 3 2 3 3 3 6 6 7 7 10 10 10 10 10 10 10 11 12 12 3 3 18 * 3
 // LINES(ClassicFrontend JS_IR): 3 3 3 3 1 1 3 3 3 2 3 3 3 2 1 2 6 6 7 7 10 10 10 10 10 10 10 11 12 12 2 2 18 * 2
diff --git a/js/js.translator/testData/lineNumbers/delegatedProperty.kt b/js/js.translator/testData/lineNumbers/delegatedProperty.kt
index 5aa9ea8..f928d43 100644
--- a/js/js.translator/testData/lineNumbers/delegatedProperty.kt
+++ b/js/js.translator/testData/lineNumbers/delegatedProperty.kt
@@ -16,4 +16,4 @@
 }
 
 // LINES(ClassicFrontend JS_IR): 3 3 5 5 4 5 5 5 4 1 4 5 4 5 5 5 4 1 4 8 8 9 10 10 13 14 14 4 4 20 * 4 20 * 4 4 20 * 4 20
-// LINES(FIR JS_IR):             3 3 5 5 4 5 5 5 5 5 5 8 8 9 10 10 13 14 14 5 5 20 * 5 20 * 5 5 20 * 5 20
+// LINES(FIR JS_IR):             3 3 5 5 4 5 5 5 4 5 5 5 8 8 9 10 10 13 14 14 5 5 20 * 5 20 * 5 5 20 * 5 20
diff --git a/native/native.tests/testData/klib/cross-compilation/identity/multiModuleSmoke.ir.md5.txt b/native/native.tests/testData/klib/cross-compilation/identity/multiModuleSmoke.ir.md5.txt
index 9daae22..d0ef771 100644
--- a/native/native.tests/testData/klib/cross-compilation/identity/multiModuleSmoke.ir.md5.txt
+++ b/native/native.tests/testData/klib/cross-compilation/identity/multiModuleSmoke.ir.md5.txt
@@ -1,7 +1,7 @@
 // MODULE: lib1
 458e9c7fbfa8d6be07012ceae7966000
 // MODULE: lib2
-271c036445988984cc12d0ec5ff65834
+67b9138ecb341c17c955d4545ee4b941
 // MODULE: lib3
 6e66eb4ff348419f4834cec413ea44bf
 // MODULE: app
diff --git a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
index 966b445..9f1afe4 100644
--- a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
+++ b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
@@ -1443,6 +1443,7 @@
 
     @Test
     fun testComposableValueOperator() {
+        assumeTrue(!useFir)
         check(
             """
             import androidx.compose.runtime.Composable
@@ -1495,6 +1496,61 @@
     }
 
     @Test
+    fun testComposableValueOperatorK2() {
+        // The output is mostly the same except for one diagnostic placement.
+        assumeTrue(useFir)
+        check(
+            """
+            import androidx.compose.runtime.Composable
+            import kotlin.reflect.KProperty
+
+            class Foo
+            class FooDelegate {
+                @Composable
+                operator fun getValue(thisObj: Any?, property: KProperty<*>) {}
+                @Composable
+                operator fun <!COMPOSE_INVALID_DELEGATE!>setValue<!>(thisObj: Any?, property: KProperty<*>, value: Any) {}
+            }
+            @Composable operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>) {}
+            @Composable operator fun Foo.<!COMPOSE_INVALID_DELEGATE!>setValue<!>(thisObj: Any?, property: KProperty<*>, value: Any) {}
+
+            fun <!COMPOSABLE_EXPECTED!>nonComposable<!>() {
+                val fooValue = Foo()
+                val foo by fooValue
+                val fooDelegate by FooDelegate()
+                var <!COMPOSE_INVALID_DELEGATE!>mutableFoo<!> by fooValue
+                val bar = Bar()
+
+                println(<!COMPOSABLE_INVOCATION!>foo<!>)
+                println(<!COMPOSABLE_INVOCATION!>fooDelegate<!>)
+                println(bar.<!COMPOSABLE_INVOCATION!>foo<!>)
+
+                <!COMPOSABLE_INVOCATION!>mutableFoo<!> = Unit
+            }
+
+            @Composable
+            fun TestComposable() {
+                val fooValue = Foo()
+                val foo by fooValue
+                val fooDelegate by FooDelegate()
+                val bar = Bar()
+
+                println(foo)
+                println(fooDelegate)
+                println(bar.foo)
+            }
+
+            class Bar {
+                val <!COMPOSABLE_EXPECTED!>foo<!> by Foo()
+
+                @get:Composable
+                val foo2 by Foo()
+            }
+            """
+        )
+    }
+
+    @Test
     fun testComposableFunInterfaceInNonComposableFunction() {
         check(
             """
diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/anonymousDelegate.fir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousDelegate.fir.txt
deleted file mode 100644
index 72d1b2e..0000000
--- a/plugins/kapt3/kapt3-compiler/testData/converter/anonymousDelegate.fir.txt
+++ /dev/null
@@ -1,140 +0,0 @@
-import kotlin.reflect.KProperty;
-
-/**
- * package {
- *
- *   // field: delegate$delegate:Ljava/lang/Object;
- *   // getter: getDelegate()Ljava/lang/Object;
- *   // setter: setDelegate(Ljava/lang/Object;)V
- *   public final (* delegated *) var delegate: kotlin/Any
- *     public final (* non-default *) get
- *     public final (* non-default *) set(<set-?>: kotlin/Any)
- *
- *   // module name: main
- * }
- */
-@kotlin.Metadata()
-public final class AnonymousDelegateKt {
-    @org.jetbrains.annotations.NotNull()
-    private static final java.lang.Object delegate$delegate = null;
-
-    public static final void setDelegate(@org.jetbrains.annotations.NotNull()
-    java.lang.Object p0) {
-    }
-
-    @org.jetbrains.annotations.NotNull()
-    public static final java.lang.Object getDelegate() {
-        return null;
-    }
-}
-
-////////////////////
-
-
-import kotlin.reflect.KProperty;
-
-/**
- * public final class ConcreteDelegate : kotlin/Any {
- *
- *   // signature: <init>()V
- *   public constructor()
- *
- *   // signature: getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)I
- *   public final operator fun getValue(t: kotlin/Any?, p: kotlin/reflect/KProperty<*>): kotlin/Int
- *
- *   // module name: main
- * }
- */
-@kotlin.Metadata()
-public final class ConcreteDelegate {
-
-    public ConcreteDelegate() {
-        super();
-    }
-
-    public final int getValue(@org.jetbrains.annotations.Nullable()
-    java.lang.Object t, @org.jetbrains.annotations.NotNull()
-    kotlin.reflect.KProperty<?> p) {
-        return 0;
-    }
-}
-
-////////////////////
-
-
-import kotlin.reflect.KProperty;
-
-/**
- * public final class Test : kotlin/Any {
- *
- *   // signature: <init>()V
- *   public constructor()
- *
- *   // field: broken$delegate:Ljava/lang/Object;
- *   // getter: getBroken()Ljava/lang/Object;
- *   // setter: setBroken(Ljava/lang/Object;)V
- *   public final (* delegated *) var broken: kotlin/Any
- *     public final (* non-default *) get
- *     public final (* non-default *) set(<set-?>: kotlin/Any)
- *
- *   // field: concreteDelegate$delegate:LConcreteDelegate;
- *   // getter: getConcreteDelegate()I
- *   public final (* delegated *) val concreteDelegate: kotlin/Int
- *     public final (* non-default *) get
- *
- *   // field: lazyProp$delegate:Lkotlin/Lazy;
- *   // getter: getLazyProp()Ljava/lang/Runnable;
- *   private final (* delegated *) val lazyProp: java/lang/Runnable
- *     private final (* non-default *) get
- *
- *   // field: overridden$delegate:Ljava/io/Serializable;
- *   // getter: getOverridden()Ljava/lang/Object;
- *   // setter: setOverridden(Ljava/lang/Object;)V
- *   public final (* delegated *) var overridden: kotlin/Any
- *     public final (* non-default *) get
- *     public final (* non-default *) set(<set-?>: kotlin/Any)
- *
- *   // module name: main
- * }
- */
-@kotlin.Metadata()
-public final class Test {
-    @org.jetbrains.annotations.NotNull()
-    private final java.lang.Object broken$delegate = null;
-    @org.jetbrains.annotations.NotNull()
-    private final java.io.Serializable overridden$delegate = null;
-    @org.jetbrains.annotations.NotNull()
-    private final kotlin.Lazy lazyProp$delegate = null;
-    @org.jetbrains.annotations.NotNull()
-    private final ConcreteDelegate concreteDelegate$delegate = null;
-
-    public Test() {
-        super();
-    }
-
-    public final void setBroken(@org.jetbrains.annotations.NotNull()
-    java.lang.Object p0) {
-    }
-
-    @org.jetbrains.annotations.NotNull()
-    public final java.lang.Object getBroken() {
-        return null;
-    }
-
-    public final void setOverridden(@org.jetbrains.annotations.NotNull()
-    java.lang.Object p0) {
-    }
-
-    @org.jetbrains.annotations.NotNull()
-    public final java.lang.Object getOverridden() {
-        return null;
-    }
-
-    private final java.lang.Runnable getLazyProp() {
-        return null;
-    }
-
-    public final int getConcreteDelegate() {
-        return 0;
-    }
-}