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");