K2/Java: add initial version of FirJvmPlatformDeclarationFilter
#KT-57268 In Progress
This commit is contained in:
committed by
Space Team
parent
76b9ba05fd
commit
7d584e0eb4
+40
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user