From 7d584e0eb4caab94f49f7c02a6e5da8361b2560d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 6 Nov 2023 13:17:14 +0100 Subject: [PATCH] K2/Java: add initial version of FirJvmPlatformDeclarationFilter #KT-57268 In Progress --- .../jvm/FirJvmPlatformDeclarationFilter.kt | 40 +++++++++++++++++++ .../kotlin/builtins/StandardNames.kt | 2 + .../PlatformDependentDeclarationFilter.kt | 3 +- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmPlatformDeclarationFilter.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmPlatformDeclarationFilter.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmPlatformDeclarationFilter.kt new file mode 100644 index 00000000000..a9fe9e234e0 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmPlatformDeclarationFilter.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.scopes.jvm + +import org.jetbrains.kotlin.builtins.StandardNames +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.containingClassLookupTag +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.hasAnnotation +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider +import org.jetbrains.kotlin.fir.scopes.platformClassMapper +import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol + +internal object FirJvmPlatformDeclarationFilter { + fun isFunctionAvailable(function: FirSimpleFunction, session: FirSession): Boolean { + // Optimization: only run the below logic for functions named "getOrDefault" and "remove", since only two functions with these names + // in kotlin.collections.Map are currently annotated with @PlatformDependent. + if (function.name.asString() != "getOrDefault" && function.name.asString() != "remove") return true + + val javaAnalogueClassId = + session.platformClassMapper.getCorrespondingPlatformClass(function.containingClassLookupTag()?.classId) ?: return true + + if (!function.hasAnnotation(StandardNames.FqNames.platformDependentClassId, session)) return true + + val javaAnalogue = session.symbolProvider.getClassLikeSymbolByClassId(javaAnalogueClassId) as? FirClassSymbol<*> ?: return true + val scope = javaAnalogue.unsubstitutedScope(session, ScopeSession(), withForcedTypeCalculator = false, null) + var isFunctionPresentInJavaAnalogue = false + scope.processFunctionsByName(function.name) { + if (it.fir.computeJvmDescriptor() == function.computeJvmDescriptor()) { + isFunctionPresentInJavaAnalogue = true + } + } + return isFunctionPresentInJavaAnalogue + } +} diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt index 11cadc7bb76..1e1630a3bfb 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt @@ -151,6 +151,8 @@ object StandardNames { @JvmField val unsafeVariance: FqName = fqName("UnsafeVariance") @JvmField val publishedApi: FqName = fqName("PublishedApi") @JvmField val accessibleLateinitPropertyLiteral: FqName = internalName("AccessibleLateinitPropertyLiteral") + @JvmField val platformDependent: FqName = FqName("kotlin.internal.PlatformDependent") + @JvmField val platformDependentClassId: ClassId = ClassId.topLevel(platformDependent) @JvmField val iterator: FqName = collectionsFqName("Iterator") @JvmField val iterable: FqName = collectionsFqName("Iterable") diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter.kt index 4d08410ad4b..ab802d88123 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.descriptors.deserialization +import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.name.FqName @@ -34,4 +35,4 @@ interface PlatformDependentDeclarationFilter { } } -val PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME = FqName("kotlin.internal.PlatformDependent") +val PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME: FqName = StandardNames.FqNames.platformDependent