K2: introduce platform-dependent filtering for non-JVM platforms

This commit fixes a false negative in testData/cli/metadata/getOrDefault
Related to KT-57268
This commit is contained in:
Mikhail Glukhikh
2024-01-30 11:08:06 +01:00
committed by Space Team
parent 7599ff0ef1
commit ed246d372b
4 changed files with 62 additions and 13 deletions
@@ -5,20 +5,14 @@
package org.jetbrains.kotlin.fir.scopes.jvm
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
import org.jetbrains.kotlin.fir.scopes.FirPlatformDeclarationFilter
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.name.Name
internal object FirJvmPlatformDeclarationFilter {
fun isFunctionAvailable(function: FirSimpleFunction, javaClassScope: FirTypeScope, 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 !in namesToCheck) return true
if (!function.hasAnnotation(StandardNames.FqNames.platformDependentClassId, session)) return true
if (FirPlatformDeclarationFilter.isFunctionAvailable(function, session)) return true
var isFunctionPresentInJavaAnalogue = false
val jvmDescriptorOfKotlinFunction = function.computeJvmDescriptor()
@@ -29,6 +23,4 @@ internal object FirJvmPlatformDeclarationFilter {
}
return isFunctionPresentInJavaAnalogue
}
private val namesToCheck = listOf("getOrDefault", "remove").map(Name::identifier)
}