[FIR] JvmMappedScope: add mutable methods or not depending on a class

This commit is contained in:
Mikhail Glukhikh
2020-10-26 19:17:13 +03:00
parent 5c3269f489
commit 09043fb98d
7 changed files with 12 additions and 13 deletions
@@ -26,7 +26,7 @@ FILE: test.kt
^ String(value) ^ String(value)
} }
) )
lval otherResult: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.getOrDefault: R|ft<kotlin/String, kotlin/String?>!|>|(String(key), String(value)) lval otherResult: R|kotlin/String| = R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.getOrDefault: R|kotlin/String|>|(String(key), String(value))
lval anotherResult: R|kotlin/String?| = R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.replace: R|kotlin/String?|>|(String(key), String(value)) lval anotherResult: R|kotlin/String?| = R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.replace: R|kotlin/String?|>|(String(key), String(value))
R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| { R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|())) R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
@@ -28,12 +28,13 @@ fun wrapScopeWithJvmMapped(
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope { ): FirScope {
val classId = klass.classId val classId = klass.classId
val javaClassId = JavaToKotlinClassMap.mapKotlinToJava(classId.asSingleFqName().toUnsafe()) val kotlinUnsafeFqName = classId.asSingleFqName().toUnsafe()
val javaClassId = JavaToKotlinClassMap.mapKotlinToJava(kotlinUnsafeFqName)
?: return declaredMemberScope ?: return declaredMemberScope
val symbolProvider = useSiteSession.firSymbolProvider val symbolProvider = useSiteSession.firSymbolProvider
val javaClass = symbolProvider.getClassLikeSymbolByFqName(javaClassId)?.fir as? FirRegularClass val javaClass = symbolProvider.getClassLikeSymbolByFqName(javaClassId)?.fir as? FirRegularClass
?: return declaredMemberScope ?: return declaredMemberScope
val preparedSignatures = JvmMappedScope.prepareSignatures(javaClass) val preparedSignatures = JvmMappedScope.prepareSignatures(javaClass, JavaToKotlinClassMap.isMutable(kotlinUnsafeFqName))
return if (preparedSignatures.isNotEmpty()) { return if (preparedSignatures.isNotEmpty()) {
javaClass.unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false).let { javaClassUseSiteScope -> javaClass.unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false).let { javaClassUseSiteScope ->
val jvmMappedScope = JvmMappedScope(declaredMemberScope, javaClassUseSiteScope, preparedSignatures) val jvmMappedScope = JvmMappedScope(declaredMemberScope, javaClassUseSiteScope, preparedSignatures)
@@ -114,12 +114,13 @@ class JvmMappedScope(
).mapTo(this) { arguments -> "java/lang/Throwable.<init>($arguments)V" } ).mapTo(this) { arguments -> "java/lang/Throwable.<init>($arguments)V" }
} }
fun prepareSignatures(klass: FirRegularClass): Signatures { fun prepareSignatures(klass: FirRegularClass, isMutable: Boolean): Signatures {
val signaturePrefix = klass.symbol.classId.toString() val signaturePrefix = klass.symbol.classId.toString()
val visibleMethodsByName = mutableMapOf<Name, MutableSet<String>>() val visibleMethodsByName = mutableMapOf<Name, MutableSet<String>>()
JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES.filter { signature -> JvmBuiltInsSignatures.VISIBLE_METHOD_SIGNATURES.filter { signature ->
signature.startsWith(signaturePrefix) signature in JvmBuiltInsSignatures.MUTABLE_METHOD_SIGNATURES == isMutable &&
signature.startsWith(signaturePrefix)
}.map { signature -> }.map { signature ->
// +1 to delete dot before function name // +1 to delete dot before function name
signature.substring(signaturePrefix.length + 1) signature.substring(signaturePrefix.length + 1)
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// SKIP_JDK6 // SKIP_JDK6
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FULL_JDK // FULL_JDK
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// SKIP_JDK6 // SKIP_JDK6
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FULL_JDK // FULL_JDK
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// SKIP_JDK6 // SKIP_JDK6
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FULL_JDK // FULL_JDK
@@ -80,12 +80,12 @@ FILE fqName:<root> fileName:/AbstractMutableMap.kt
public abstract fun get (key: K of kotlin.collections.Map): V of kotlin.collections.Map? [operator] declared in kotlin.collections.Map public abstract fun get (key: K of kotlin.collections.Map): V of kotlin.collections.Map? [operator] declared in kotlin.collections.Map
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map> $this: VALUE_PARAMETER name:<this> type:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>
VALUE_PARAMETER name:key index:0 type:K of <root>.MyMap VALUE_PARAMETER name:key index:0 type:K of <root>.MyMap
FUN FAKE_OVERRIDE name:getOrDefault visibility:public modality:OPEN <> ($this:java.util.Map<K of java.util.Map, V of java.util.Map>, p0:K of <root>.MyMap?, p1:V of <root>.MyMap?) returnType:V of <root>.MyMap? [fake_override] FUN FAKE_OVERRIDE name:getOrDefault visibility:public modality:OPEN <> ($this:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>, key:K of <root>.MyMap, defaultValue:V of <root>.MyMap) returnType:V of <root>.MyMap [fake_override]
overridden: overridden:
public open fun getOrDefault (p0: K of java.util.Map?, p1: V of java.util.Map?): V of java.util.Map? declared in java.util.Map public open fun getOrDefault (key: K of kotlin.collections.Map, defaultValue: V of kotlin.collections.Map): V of kotlin.collections.Map declared in kotlin.collections.Map
$this: VALUE_PARAMETER name:<this> type:java.util.Map<K of java.util.Map, V of java.util.Map> $this: VALUE_PARAMETER name:<this> type:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap? VALUE_PARAMETER name:key index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:V of <root>.MyMap? VALUE_PARAMETER name:defaultValue index:1 type:V of <root>.MyMap
FUN FAKE_OVERRIDE name:isEmpty visibility:public modality:OPEN <> ($this:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>) returnType:kotlin.Boolean [fake_override] FUN FAKE_OVERRIDE name:isEmpty visibility:public modality:OPEN <> ($this:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>) returnType:kotlin.Boolean [fake_override]
overridden: overridden:
public abstract fun isEmpty (): kotlin.Boolean declared in kotlin.collections.Map public abstract fun isEmpty (): kotlin.Boolean declared in kotlin.collections.Map