WIP: Resolution of container in array get and inc
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt
index a89705d..e1e4945 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt
@@ -179,6 +179,12 @@
         return if (constructorCalleeExpression.parent is KtSuperTypeCallEntry) constructorCalleeExpression else expression
     }
 
+    fun postResolutionAdjustFir(fir: FirElement?): FirElement? {
+        when (fir) {
+            is FirProperty -> return fir.initializer
+            else -> return fir
+        }
+    }
 
     internal fun resolveSimpleNameReference(
         ref: KtFirSimpleNameReference,
@@ -188,7 +194,8 @@
         if (expression.isSyntheticOperatorReference()) return emptyList()
         val symbolBuilder = analysisSession.firSymbolBuilder
         val adjustedResolutionExpression = adjustResolutionExpression(expression)
-        val fir = adjustedResolutionExpression.getOrBuildFir(analysisSession.firResolveSession)
+        val fir2 = adjustedResolutionExpression.getOrBuildFir(analysisSession.firResolveSession)
+        val fir = postResolutionAdjustFir(fir2)
         val session = analysisSession.firResolveSession.useSiteFirSession
         return when (fir) {
             is FirResolvedTypeRef -> getSymbolsForResolvedTypeRef(fir, expression, session, symbolBuilder)
@@ -210,10 +217,21 @@
                 getSymbolByDelegatedConstructorCall(expression, adjustedResolutionExpression, fir, session, symbolBuilder)
             is FirResolvable -> getSymbolsByResolvable(fir, expression, session, symbolBuilder)
             is FirNamedArgumentExpression -> getSymbolsByNameArgumentExpression(expression, analysisSession, symbolBuilder)
+            is FirProperty -> getSymbolsByProperty(fir, expression, analysisSession, symbolBuilder)
             else -> handleUnknownFirElement(expression, analysisSession, session, symbolBuilder)
         }
     }
 
+    private fun getSymbolsByProperty(
+        fir: FirProperty,
+        expression: KtSimpleNameExpression,
+        sessions: KtFirAnalysisSession,
+        symbolBuilder: KtSymbolByFirBuilder
+    ): Collection<KtSymbol> {
+        println("$fir $expression $sessions $symbolBuilder")
+        return listOf()
+    }
+
     private fun getSymbolByDelegatedConstructorCall(
         expression: KtSimpleNameExpression,
         adjustedResolutionExpression: KtElement,
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.kt
new file mode 100644
index 0000000..4ec5c83
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.kt
@@ -0,0 +1,11 @@
+interface A {
+    operator fun plusAssign(i: Int)
+}
+
+interface MyMap<K, V> {
+    operator fun get(k: K): V
+}
+
+fun test(m: MyMap<String, A>) {
+    <expr>m</expr>["a"] += 1
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.txt
new file mode 100644
index 0000000..4129bba
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.txt
@@ -0,0 +1,6 @@
+KT element: KtNameReferenceExpression
+FIR element: FirPropertyAccessExpressionImpl
+FIR source kind: KtRealSourceElementKind
+
+FIR element rendered:
+R|<local>/m|
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.kt
new file mode 100644
index 0000000..be8f643
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.kt
@@ -0,0 +1,12 @@
+interface A {
+    operator fun inc(): A
+}
+
+interface MyMap<K, V> {
+    operator fun get(k: K): V
+    operator fun set(k: K, v: V): Unit
+}
+
+fun test(m: MyMap<String, A>) {
+    <expr>m["a"]++</expr>
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.txt
new file mode 100644
index 0000000..6cf851c
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.txt
@@ -0,0 +1,6 @@
+KT element: KtPostfixExpression
+FIR element: FirFunctionCallImpl
+FIR source kind: DesugaredIncrementOrDecrement
+
+FIR element rendered:
+R|<local>/<array>|.R|SubstitutionOverride</MyMap.set: R|kotlin/Unit|>|(R|<local>/<index0>|, R|<local>/<unary>|.R|/A.inc|())
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.kt
new file mode 100644
index 0000000..3f28c67
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.kt
@@ -0,0 +1,12 @@
+interface A {
+    operator fun inc(): A
+}
+
+interface MyMap<K, V> {
+    operator fun get(k: K): V
+    operator fun set(k: K, v: V): Unit
+}
+
+fun test(m: MyMap<String, A>) {
+    <expr>m</expr>["a"]++
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.txt
new file mode 100644
index 0000000..7869585
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.txt
@@ -0,0 +1,6 @@
+KT element: KtNameReferenceExpression
+FIR element: FirPropertyImpl
+FIR source kind: KtRealSourceElementKind
+
+FIR element rendered:
+lval <array>: R|MyMap<kotlin/String, A>| = R|<local>/m|
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.kt
new file mode 100644
index 0000000..9e03f0e
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.kt
@@ -0,0 +1,12 @@
+interface A {
+    operator fun inc(): A
+}
+
+interface MyMap<K, V> {
+    operator fun get(k: K): V
+    operator fun set(k: K, v: V): Unit
+}
+
+fun test(m: MyMap<String, A>) {
+    <expr>m["a"]</expr>++
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.txt
new file mode 100644
index 0000000..85c2e0a
--- /dev/null
+++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.txt
@@ -0,0 +1,6 @@
+KT element: KtArrayAccessExpression
+FIR element: FirResolvedNamedReferenceImpl
+FIR source kind: KtRealSourceElementKind
+
+FIR element rendered:
+R|SubstitutionOverride</MyMap.get: R|A|>|
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
index 2efe178..5b03290 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java
@@ -146,6 +146,12 @@
         }
 
         @Test
+        @TestMetadata("compoundAssignWithArrayGetConvention_propertyAccess.kt")
+        public void testCompoundAssignWithArrayGetConvention_propertyAccess() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignWithArrayGetConvention_propertyAccess.kt");
+        }
+
+        @Test
         @TestMetadata("constructorDelegationSuperCall.kt")
         public void testConstructorDelegationSuperCall() throws Exception {
             runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/constructorDelegationSuperCall.kt");
@@ -164,6 +170,24 @@
         }
 
         @Test
+        @TestMetadata("incWithArrayAccessConvention.kt")
+        public void testIncWithArrayAccessConvention() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention.kt");
+        }
+
+        @Test
+        @TestMetadata("incWithArrayAccessConvention_propertyAccess.kt")
+        public void testIncWithArrayAccessConvention_propertyAccess() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_propertyAccess.kt");
+        }
+
+        @Test
+        @TestMetadata("incWithArrayAccessConvention_set.kt")
+        public void testIncWithArrayAccessConvention_set() throws Exception {
+            runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/incWithArrayAccessConvention_set.kt");
+        }
+
+        @Test
         @TestMetadata("invokeCallArgumentList.kt")
         public void testInvokeCallArgumentList() throws Exception {
             runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/calls/invokeCallArgumentList.kt");