[Analysis API] Resolve JVM counterpart callables on STATUS
Certain kotlin-stdlib classes are mapped to classes from the JDK,
such as, 'kotlin.collections.Collection' maps to 'java.util.Collection'.
Use-site scope of mapped classes provides 'JvmMappedScope' as a declared
member scope. On iteration over supertype callables performed during
the STATUS phase ('FirStatusResolver.getOverriddenFunctions'),
'JvmMappedScope' processes callables across both Kotlin and Java
hierarchies.
While STATUS in the LL FIR force-resolves callables of Kotlin supertypes
('LLFirStatusTargetResolver.resolveClass'), callables back-mapped from
Java supertypes stay intact. E.g.:
```
kotlin.collections.Collection: kotlin.collections.Iterable // handled
// is mapped to
java.util.Collection: kotlin.collections.MutableIterable // not handled!
```
The fix performs additional resolution for mapped stdlib classes,
analyzing callables from both Kotlin and Java type hierarchy.
The problem is specific to the Kotlin compiler project where stdlib
classes come in sources. In other projects, the kotlin-stdlib is already
compiled, so no JVM-mapped require analysis.
^KT-74740 Fixed
(cherry picked from commit 0a7ba1a5760794d606d27d317095cc42fb39c5b6)
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt
index 8fae462..2042096 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirStatusLazyResolver.kt
@@ -12,9 +12,11 @@
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkDeclarationStatusIsResolved
+import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
+import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer
@@ -24,7 +26,10 @@
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.resolve.toSymbol
+import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.visitors.transformSingle
+import org.jetbrains.kotlin.name.StandardClassIds
+import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.utils.SmartSet
internal object LLFirStatusLazyResolver : LLFirLazyResolver(FirResolvePhase.STATUS) {
@@ -247,5 +252,24 @@
resolver.resolveDesignation()
return true
}
+
+ override fun additionalSuperTypes(regularClass: FirClass): List<FirTypeRef> {
+ // Stdlib classes may be mapped to Java classes which may have a different supertype set.
+ // E.g., a 'kotlin.collections.Collection' is immutable, while 'java.util.Collection' is mutable (it implements 'MutableIterable').
+ // The logic here is only applicable to the Kotlin project where stdlib comes in sources.
+ val shouldResolveJavaSupertypeCallables = regularClass is FirRegularClass
+ && regularClass.origin.isLazyResolvable
+ && regularClass.classId.packageFqName.startsWith(StandardClassIds.BASE_KOTLIN_PACKAGE)
+ && regularClass.moduleData.platform.isJvm()
+
+ if (!shouldResolveJavaSupertypeCallables) {
+ return emptyList()
+ }
+
+ val fqName = regularClass.classId.asSingleFqName().toUnsafe()
+ val javaClassFqName = JavaToKotlinClassMap.mapKotlinToJava(fqName) ?: return emptyList()
+ val javaSymbol = javaClassFqName.toSymbol(resolveTargetSession) as? FirClassSymbol ?: return emptyList()
+ return javaSymbol.resolvedSuperTypeRefs
+ }
}
}
diff --git a/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.kt b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.kt
new file mode 100644
index 0000000..1b034e6
--- /dev/null
+++ b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.kt
@@ -0,0 +1,24 @@
+// SKIP_WHEN_OUT_OF_CONTENT_ROOT
+// ALLOW_KOTLIN_PACKAGE
+package kotlin.collections
+
+interface Iterator<out T> {
+ operator fun next(): T
+ operator fun hasNext(): Boolean
+}
+
+interface MutableIterator<out T> : Iterator<T> {
+ fun remove(): Unit
+}
+
+interface Iterable<out T> {
+ operator fun iterator(): Iterator<T>
+}
+
+interface MutableIterable<out T> : kotlin.collections.Iterable<T> {
+ fun iterator(): MutableIterator<T>
+}
+
+interface Collection<out E> : Iterable<E> {
+ override fun iterato<caret>r(): Iterator<E>
+}
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.txt b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.txt
new file mode 100644
index 0000000..6ede90d
--- /dev/null
+++ b/analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.txt
@@ -0,0 +1,349 @@
+RAW_FIR:
+FILE: [ResolvedTo(RAW_FIR)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Iterable<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Collection<[ResolvedTo(RAW_FIR)] out E> : Iterable<E> {
+ public? open? override [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<E>
+
+ }
+
+IMPORTS:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Iterable<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Collection<[ResolvedTo(RAW_FIR)] out E> : Iterable<E> {
+ public? open? override [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<E>
+
+ }
+
+COMPILER_REQUIRED_ANNOTATIONS:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Iterable<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Collection<[ResolvedTo(RAW_FIR)] out E> : Iterable<E> {
+ public? open? override [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] fun iterator(): Iterator<E>
+
+ }
+
+COMPANION_GENERATION:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Iterable<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface Collection<[ResolvedTo(RAW_FIR)] out E> : Iterable<E> {
+ public? open? override [ResolvedTo(COMPANION_GENERATION)] fun iterator(): Iterator<E>
+
+ }
+
+SUPER_TYPES:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(SUPER_TYPES)] interface Iterable<[ResolvedTo(SUPER_TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(SUPER_TYPES)] interface Collection<[ResolvedTo(SUPER_TYPES)] out E> : R|kotlin/collections/Iterable<E>| {
+ public? open? override [ResolvedTo(SUPER_TYPES)] fun iterator(): Iterator<E>
+
+ }
+
+TYPES:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(RAW_FIR)] interface Iterator<[ResolvedTo(RAW_FIR)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterator<[ResolvedTo(RAW_FIR)] out T> : Iterator<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public final? [ResolvedTo(SUPER_TYPES)] interface Iterable<[ResolvedTo(SUPER_TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun iterator(): Iterator<T>
+
+ }
+ public final? [ResolvedTo(RAW_FIR)] interface MutableIterable<[ResolvedTo(RAW_FIR)] out T> : kotlin.collections.Iterable<T> {
+ public? final? [ResolvedTo(RAW_FIR)] fun iterator(): MutableIterator<T>
+
+ }
+ public final? [ResolvedTo(TYPES)] interface Collection<[ResolvedTo(TYPES)] out E> : R|kotlin/collections/Iterable<E>| {
+ public? open? override [ResolvedTo(TYPES)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+STATUS:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+EXPECT_ACTUAL_MATCHING:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+CONTRACTS:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(CONTRACTS)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+IMPLICIT_TYPES_BODY_RESOLVE:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+CONSTANT_EVALUATION:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(CONSTANT_EVALUATION)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+ANNOTATION_ARGUMENTS:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(ANNOTATION_ARGUMENTS)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+BODY_RESOLVE:
+FILE: [ResolvedTo(IMPORTS)] mappedTypeResolution.kt
+ public final? [ResolvedTo(TYPES)] interface Iterator<[ResolvedTo(TYPES)] out T> : R|kotlin/Any| {
+ public? final? operator [ResolvedTo(RAW_FIR)] fun next(): T
+
+ public? final? operator [ResolvedTo(RAW_FIR)] fun hasNext(): Boolean
+
+ }
+ public final? [ResolvedTo(TYPES)] interface MutableIterator<[ResolvedTo(TYPES)] out T> : R|kotlin/collections/Iterator<T>| {
+ public? final? [ResolvedTo(RAW_FIR)] fun remove(): Unit
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Iterable<[ResolvedTo(STATUS)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface MutableIterable<[ResolvedTo(STATUS)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(STATUS)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(STATUS)] interface Collection<[ResolvedTo(STATUS)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(BODY_RESOLVE)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
+
+FILE RAW TO BODY:
+FILE: [ResolvedTo(BODY_RESOLVE)] mappedTypeResolution.kt
+ public abstract [ResolvedTo(BODY_RESOLVE)] interface Iterator<[ResolvedTo(BODY_RESOLVE)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(BODY_RESOLVE)] fun next(): R|T|
+
+ public abstract operator [ResolvedTo(BODY_RESOLVE)] fun hasNext(): R|java/lang/Boolean|
+
+ }
+ public abstract [ResolvedTo(BODY_RESOLVE)] interface MutableIterator<[ResolvedTo(BODY_RESOLVE)] out T> : R|kotlin/collections/Iterator<T>| {
+ public abstract override [ResolvedTo(BODY_RESOLVE)] fun remove(): <ERROR TYPE REF: Symbol not found for Unit>
+
+ }
+ public abstract [ResolvedTo(BODY_RESOLVE)] interface Iterable<[ResolvedTo(BODY_RESOLVE)] out T> : R|kotlin/Any| {
+ public abstract operator [ResolvedTo(BODY_RESOLVE)] fun iterator(): R|kotlin/collections/Iterator<T>|
+
+ }
+ public abstract [ResolvedTo(BODY_RESOLVE)] interface MutableIterable<[ResolvedTo(BODY_RESOLVE)] out T> : R|kotlin/collections/Iterable<T>| {
+ public abstract override operator [ResolvedTo(BODY_RESOLVE)] fun iterator(): R|kotlin/collections/MutableIterator<T>|
+
+ }
+ public abstract [ResolvedTo(BODY_RESOLVE)] interface Collection<[ResolvedTo(BODY_RESOLVE)] out E> : R|kotlin/collections/Iterable<E>| {
+ public abstract override operator [ResolvedTo(BODY_RESOLVE)] fun iterator(): R|kotlin/collections/Iterator<E>|
+
+ }
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 14eaf77..90099ba 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
@@ -1326,6 +1326,12 @@
public void testIntegerLiteralCall() {
runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerLiteralCall.kt");
}
+
+ @Test
+ @TestMetadata("mappedTypeResolution.kt")
+ public void testMappedTypeResolution() {
+ runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.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 797ae6e..e1082df 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
@@ -1326,6 +1326,12 @@
public void testIntegerLiteralCall() {
runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/integerLiteralCall.kt");
}
+
+ @Test
+ @TestMetadata("mappedTypeResolution.kt")
+ public void testMappedTypeResolution() {
+ runTest("analysis/low-level-api-fir/testData/lazyResolve/noRuntime/mappedTypeResolution.kt");
+ }
}
@Nested
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt
index 5236203..7dabf96 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt
@@ -327,13 +327,15 @@
}
open fun forceResolveStatusesOfSupertypes(regularClass: FirClass) {
- for (superTypeRef in regularClass.superTypeRefs) {
+ for (superTypeRef in regularClass.superTypeRefs + additionalSuperTypes(regularClass)) {
for (classifierSymbol in superTypeToSymbols(superTypeRef)) {
forceResolveStatusOfCorrespondingClass(classifierSymbol)
}
}
}
+ open fun additionalSuperTypes(regularClass: FirClass): List<FirTypeRef> = emptyList()
+
/**
* @return symbols which should be resolved to [FirResolvePhase.STATUS] phase
*/