Skip to content

Commit 09a5926

Browse files
udalovSpace Team
authored andcommitted
FIR: allow to resolve some Java classes with @kotlin.Metadata
Namely, Java classes coming from sources, as well as any Java classes annotated with `@kotlin.Metadata` without the "kind" (JVM name "k") argument. This is needed to fix the "unresolved reference" problem in kapt when generated stubs are used as a dependency when generating stubs for another module. Note that there's still a K1/K2 difference in the differentModulesWithKind.kt test, however it's not a part of the issue, so K2 behavior there is not changed. #KT-79138 Fixed (cherry picked from commit ca6a695)
1 parent 4bf855d commit 09a5926

File tree

19 files changed

+421
-2
lines changed

19 files changed

+421
-2
lines changed

analysis/low-level-api-fir/tests-gen/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLPartialDiagnosticsFe10TestGenerated.java

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLDiagnosticsFe10TestGenerated.java

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLReversedDiagnosticsFe10TestGenerated.java

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ abstract class FirJavaFacade(session: FirSession, private val classFinder: JavaC
7171
private val knownClassNamesInPackage = session.firCachesFactory.createCache(classFinder::knownClassNamesInPackage)
7272

7373
fun findClass(classId: ClassId, knownContent: ByteArray? = null): JavaClass? =
74-
classFinder.findClass(JavaClassFinder.Request(classId, knownContent))?.takeUnless(JavaClass::hasMetadataAnnotation)
74+
classFinder.findClass(JavaClassFinder.Request(classId, knownContent))?.takeIf { klass ->
75+
klass.isFromSource || !klass.hasMetadataAnnotation()
76+
}
7577

7678
fun hasPackage(fqName: FqName): Boolean =
7779
packageCache.getValue(fqName) != null

compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package org.jetbrains.kotlin.fir.java
77

8+
import com.intellij.util.asSafely
89
import org.jetbrains.kotlin.builtins.StandardNames
910
import org.jetbrains.kotlin.descriptors.ClassKind
1011
import org.jetbrains.kotlin.descriptors.Modality
@@ -58,7 +59,12 @@ val JavaClass.classKind: ClassKind
5859
}
5960

6061
fun JavaClass.hasMetadataAnnotation(): Boolean =
61-
annotations.any { it.isResolvedTo(JvmAnnotationNames.METADATA_FQ_NAME) }
62+
annotations.any { annotation ->
63+
// `@kotlin.Metadata` is recognized as an annotation that contains Kotlin metadata only if it has the "kind" argument.
64+
annotation.isResolvedTo(JvmAnnotationNames.METADATA_FQ_NAME) && annotation.arguments.any { argument ->
65+
argument.name?.asString() == JvmAnnotationNames.KIND_FIELD_NAME
66+
}
67+
}
6268

6369
internal fun Any?.createConstantOrError(session: FirSession, expectedConeType: ConeKotlinType? = null): FirExpression {
6470
val value = if (this is Int && expectedConeType != null) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// FIR_IDENTICAL
2+
// RUN_PIPELINE_TILL: BACKEND
3+
// WITH_STDLIB
4+
// MODULE: lib
5+
// FILE: E.java
6+
import kotlin.Metadata;
7+
8+
@Metadata()
9+
public enum E {
10+
OK;
11+
}
12+
13+
// MODULE: main(lib)
14+
// FILE: box.kt
15+
fun box(): String = E.OK.name
16+
17+
/* GENERATED_FIR_TAGS: functionDeclaration */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// LATEST_LV_DIFFERENCE
2+
// RUN_PIPELINE_TILL: FRONTEND
3+
// WITH_STDLIB
4+
// MODULE: lib
5+
// FILE: E.java
6+
import kotlin.Metadata;
7+
8+
@Metadata(k = 1)
9+
public enum E {
10+
OK;
11+
}
12+
13+
// MODULE: main(lib)
14+
// FILE: box.kt
15+
fun box(): String = <!UNRESOLVED_REFERENCE!>E<!>.OK.name
16+
17+
/* GENERATED_FIR_TAGS: functionDeclaration */

0 commit comments

Comments
 (0)