Skip to content

Commit e56dbb8

Browse files
dzharkovSpace Team
authored andcommitted
FE: Make a definition of what built-in class is independent on environment
The idea is that we can always distinguish them by just using JavaToKotlinClassMap. The flag -Xcompile-builtins-as-part-of-stdlib remains unused but cannot be fully removed until the change is bootstrapped. (see KT-80839) ^KT-80524 Fixed
1 parent 95c67c0 commit e56dbb8

File tree

3 files changed

+17
-25
lines changed

3 files changed

+17
-25
lines changed

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.java.scopes
77

88
import org.jetbrains.kotlin.KtFakeSourceElementKind
99
import org.jetbrains.kotlin.builtins.StandardNames
10-
import org.jetbrains.kotlin.config.JvmAnalysisFlags
1110
import org.jetbrains.kotlin.descriptors.Modality
1211
import org.jetbrains.kotlin.descriptors.Visibilities
1312
import org.jetbrains.kotlin.fakeElement
@@ -32,7 +31,6 @@ import org.jetbrains.kotlin.fir.java.syntheticPropertiesStorage
3231
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
3332
import org.jetbrains.kotlin.fir.resolve.ScopeSession
3433
import org.jetbrains.kotlin.fir.resolve.defaultType
35-
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
3634
import org.jetbrains.kotlin.fir.resolve.toSymbol
3735
import org.jetbrains.kotlin.fir.scopes.*
3836
import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope
@@ -991,16 +989,7 @@ class JavaClassUseSiteMemberScope(
991989
this is FirJavaClass -> superConeTypes.any { type ->
992990
type.toFir(session)?.hasKotlinSuper(session, visited) == true
993991
}
994-
isInterface || origin.isBuiltIns -> false
995-
session.languageVersionSettings.getFlag(JvmAnalysisFlags.expectBuiltinsAsPartOfStdlib) -> {
996-
when (val containingFile = session.firProvider.getFirClassifierContainerFileIfAny(symbol)) {
997-
null ->
998-
// No info about the containing file, so we assume it's a non-built-in Kotlin class
999-
true
1000-
else ->
1001-
!containingFile.symbol.hasAnnotation(StandardClassIds.Annotations.JvmBuiltin, session)
1002-
}
1003-
}
992+
isInterface || symbol.isBuiltinClass() -> false
1004993
else -> true
1005994
}
1006995

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@
77

88
package org.jetbrains.kotlin.fir.java.scopes
99

10-
import org.jetbrains.kotlin.config.JvmAnalysisFlags
10+
import org.jetbrains.kotlin.builtins.StandardNames
11+
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
1112
import org.jetbrains.kotlin.fir.FirSession
12-
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
1313
import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
1414
import org.jetbrains.kotlin.fir.java.scopes.ClassicBuiltinSpecialProperties.getBuiltinSpecialPropertyGetterName
15-
import org.jetbrains.kotlin.fir.languageVersionSettings
16-
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
17-
import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile
1815
import org.jetbrains.kotlin.fir.resolve.toSymbol
1916
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
2017
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
@@ -32,7 +29,6 @@ import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.Companion.ERASED_
3229
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.Companion.REMOVE_AT_NAME_AND_SIGNATURE
3330
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.Companion.SIGNATURE_TO_JVM_REPRESENTATION_NAME
3431
import org.jetbrains.kotlin.name.Name
35-
import org.jetbrains.kotlin.name.StandardClassIds
3632

3733
fun FirCallableSymbol<*>.doesOverrideBuiltinWithDifferentJvmName(containingScope: FirTypeScope, session: FirSession): Boolean {
3834
return getOverriddenBuiltinWithDifferentJvmName(containingScope, session) != null
@@ -146,14 +142,16 @@ object ClassicBuiltinSpecialProperties {
146142
}
147143

148144
private fun FirCallableSymbol<*>.isFromBuiltinClass(session: FirSession): Boolean {
149-
return dispatchReceiverClassLookupTagOrNull()?.toSymbol(session)?.isBuiltinClass(session) == true
145+
return dispatchReceiverClassLookupTagOrNull()?.toSymbol(session)?.isBuiltinClass() == true
150146
}
151147

152-
fun FirClassLikeSymbol<*>.isBuiltinClass(session: FirSession): Boolean {
148+
fun FirClassLikeSymbol<*>.isBuiltinClass(): Boolean {
153149
if (fir.origin.isBuiltIns) return true
154-
if (!session.languageVersionSettings.getFlag(JvmAnalysisFlags.expectBuiltinsAsPartOfStdlib)) return false
155-
val containingFile = session.firProvider.getContainingFile(this) ?: return false
156-
return containingFile.symbol.hasAnnotation(StandardClassIds.Annotations.JvmBuiltin, session)
150+
// Generally the condition above should be enough, but in some environments built-in classes
151+
// might be loaded without the correct expected origin, e.g., when building stdlib artifact itself or for K2CL.
152+
// See KT-68154 and KT-80524 for details.
153+
// Having this branch, we may actually remove the line above, but leaving it as a fast-path.
154+
return classId.packageFqName.startsWith(StandardNames.BUILT_INS_PACKAGE_NAME) && JavaToKotlinClassMap.isMappedKotlinClass(classId)
157155
}
158156

159157
private fun FirNamedFunctionSymbol.firstOverriddenFunction(

core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ object JavaToKotlinClassMap {
3939
private val mutableToReadOnlyClassId = HashMap<ClassId, ClassId>()
4040
private val readOnlyToMutableClassId = HashMap<ClassId, ClassId>()
4141

42+
private val mappedKotlinClassFqNames = mutableSetOf<FqName>()
43+
4244
// describes mapping for a java class that has separate readOnly and mutable equivalents in Kotlin
4345
data class PlatformMutabilityMapping(
4446
val javaClass: ClassId,
@@ -198,10 +200,13 @@ object JavaToKotlinClassMap {
198200
javaToKotlin[javaClassId.asSingleFqName().toUnsafe()] = kotlinClassId
199201
}
200202

201-
private fun addKotlinToJava(kotlinFqNameUnsafe: FqName, javaClassId: ClassId) {
202-
kotlinToJava[kotlinFqNameUnsafe.toUnsafe()] = javaClassId
203+
private fun addKotlinToJava(kotlinFqName: FqName, javaClassId: ClassId) {
204+
mappedKotlinClassFqNames.add(kotlinFqName)
205+
kotlinToJava[kotlinFqName.toUnsafe()] = javaClassId
203206
}
204207

208+
fun isMappedKotlinClass(kotlinClassId: ClassId): Boolean = mappedKotlinClassFqNames.contains(kotlinClassId.asSingleFqName())
209+
205210
fun isJavaPlatformClass(fqName: FqName): Boolean = mapJavaToKotlin(fqName) != null
206211

207212
fun mutableToReadOnly(fqNameUnsafe: FqNameUnsafe?): FqName? = mutableToReadOnly[fqNameUnsafe]

0 commit comments

Comments
 (0)