JVM_IR emulate JVM hack for generic signatures in KT-18189

KT-40307

See also KT-42609
This commit is contained in:
Dmitry Petrov
2020-10-12 17:58:19 +03:00
parent f20a695c0e
commit df64bb3eb7
16 changed files with 392 additions and 8 deletions
@@ -107,6 +107,7 @@ class JvmBackendContext(
internal val collectionStubComputer = CollectionStubComputer(this)
internal val bridgeLoweringCache = BridgeLowering.BridgeLoweringCache(this)
internal val functionsWithSpecialBridges: MutableSet<IrFunction> = HashSet()
override var inVerbosePhase: Boolean = false
@@ -260,7 +260,9 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
val specialSignatureInfo =
with(BuiltinMethodsWithSpecialGenericSignature) { function.toIrBasedDescriptor().getSpecialSignatureInfo() }
if (specialSignatureInfo != null) {
// Old back-end doesn't patch generic signatures if corresponding function had special bridges.
// See org.jetbrains.kotlin.codegen.FunctionCodegen#hasSpecialBridgeMethod and its usage.
if (specialSignatureInfo != null && function !in context.functionsWithSpecialBridges) {
val newGenericSignature = specialSignatureInfo.replaceValueParametersIn(signature.genericsSignature)
return JvmMethodGenericSignature(signature.asmMethod, signature.valueParameters, newGenericSignature)
}
@@ -424,6 +424,8 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
name = Name.identifier(specialBridge.signature.name)
returnType = specialBridge.substitutedReturnType ?: specialBridge.overridden.returnType.eraseTypeParameters()
}.apply {
context.functionsWithSpecialBridges.add(target)
copyParametersWithErasure(this@addSpecialBridge, specialBridge.overridden, specialBridge.substitutedParameterTypes)
body = context.createIrBuilder(symbol, startOffset, endOffset).irBlockBody {
@@ -0,0 +1,21 @@
// WITH_SIGNATURES
// FILE: implementsJavaMap.kt
import java.util.*
abstract class JMapImpl<A, B> : JMap<A, B> {
override fun containsKey(key: A): Boolean = false
}
abstract class JMapNImpl<A : Number, B> : JMapN<A, B> {
override fun containsKey(key: A): Boolean = false
}
// FILE: JMap.java
import java.util.*;
public interface JMap<K, V> extends Map<K, V> {}
// FILE: JMapN.java
import java.util.*;
public interface JMapN<K extends Number, V> extends Map<K, V> {}
@@ -0,0 +1,38 @@
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;LJMap<TA;TB;>;> JMapImpl {
// source: 'implementsJavaMap.kt'
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public <null> method <init>(): void
public <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method containsValue(p0: java.lang.Object): boolean
public abstract <null> method get(p0: java.lang.Object): java.lang.Object
public abstract <null> method getEntries(): java.util.Set
public abstract <null> method getKeys(): java.util.Set
public abstract <null> method getSize(): int
public abstract <null> method getValues(): java.util.Collection
public abstract <null> method remove(p0: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
}
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Number;B:Ljava/lang/Object;>Ljava/lang/Object;LJMapN<TA;TB;>;> JMapNImpl {
// source: 'implementsJavaMap.kt'
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public bridge final <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Number): boolean
public <null> method <init>(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method containsValue(p0: java.lang.Object): boolean
public abstract <null> method get(p0: java.lang.Number): java.lang.Object
public abstract <null> method getEntries(): java.util.Set
public abstract <null> method getKeys(): java.util.Set
public abstract <null> method getSize(): int
public abstract <null> method getValues(): java.util.Collection
public abstract <null> method remove(p0: java.lang.Number): java.lang.Object
public bridge final <null> method size(): int
}
@@ -0,0 +1,34 @@
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;LJMap<TA;TB;>;> JMapImpl {
// source: 'implementsJavaMap.kt'
public abstract <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public abstract <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public abstract <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public <null> method <init>(): void
public <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method getSize(): int
public bridge final <null> method size(): int
}
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Number;B:Ljava/lang/Object;>Ljava/lang/Object;LJMapN<TA;TB;>;> JMapNImpl {
// source: 'implementsJavaMap.kt'
public abstract <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public abstract <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public abstract <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public bridge final <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public abstract <(TA;)TB;> method get(p0: java.lang.Number): java.lang.Object
public abstract <(TA;)TB;> method remove(p0: java.lang.Number): java.lang.Object
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Number): boolean
public <null> method <init>(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method getSize(): int
public bridge final <null> method size(): int
}
@@ -0,0 +1,15 @@
// WITH_SIGNATURES
interface MapN<K : Number, V> : Map<K, V>
abstract class MapImpl<A, B> : Map<A, B> {
override fun containsKey(key: A): Boolean = false
}
abstract class MapSImpl<B> : Map<String, B> {
override fun containsKey(key: String): Boolean = false
}
abstract class MapNImpl<A : Number, B> : MapN<A, B> {
override fun containsKey(key: A): Boolean = false
}
@@ -0,0 +1,73 @@
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TA;TB;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapImpl {
// source: 'implementsMap.kt'
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(p0: java.util.Map): void
public <(TA;TB;)TB;> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public <null> method <init>(): void
public <null> method clear(): void
public <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method containsValue(p0: java.lang.Object): boolean
public abstract <null> method get(p0: java.lang.Object): java.lang.Object
public abstract <null> method getEntries(): java.util.Set
public abstract <null> method getKeys(): java.util.Set
public abstract <null> method getSize(): int
public abstract <null> method getValues(): java.util.Collection
public bridge final <null> method size(): int
}
@kotlin.Metadata
public interface<<K:Ljava/lang/Number;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapN {
// source: 'implementsMap.kt'
}
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Number;B:Ljava/lang/Object;>Ljava/lang/Object;LMapN<TA;TB;>;> MapNImpl {
// source: 'implementsMap.kt'
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(p0: java.util.Map): void
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Number): boolean
public <(TA;TB;)TB;> method put(p0: java.lang.Number, p1: java.lang.Object): java.lang.Object
public <null> method <init>(): void
public <null> method clear(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method containsValue(p0: java.lang.Object): boolean
public abstract <null> method get(p0: java.lang.Number): java.lang.Object
public abstract <null> method getEntries(): java.util.Set
public abstract <null> method getKeys(): java.util.Set
public abstract <null> method getSize(): int
public abstract <null> method getValues(): java.util.Collection
public synthetic <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
}
@kotlin.Metadata
public abstract class<<B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Ljava/lang/String;TB;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapSImpl {
// source: 'implementsMap.kt'
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TB;>;>;> method entrySet(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/lang/String;TB;)TB;> method put(p0: java.lang.String, p1: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+Ljava/lang/String;+TB;>;)V> method putAll(p0: java.util.Map): void
public <null> method <init>(): void
public <null> method clear(): void
public <null> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method containsValue(p0: java.lang.Object): boolean
public abstract <null> method get(p0: java.lang.String): java.lang.Object
public abstract <null> method getEntries(): java.util.Set
public abstract <null> method getKeys(): java.util.Set
public abstract <null> method getSize(): int
public abstract <null> method getValues(): java.util.Collection
public synthetic <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
}
@@ -0,0 +1,69 @@
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TA;TB;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapImpl {
// source: 'implementsMap.kt'
public abstract <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public abstract <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public abstract <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(p0: java.util.Map): void
public <(TA;TB;)TB;> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public <null> method <init>(): void
public <null> method clear(): void
public <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method getSize(): int
public bridge final <null> method size(): int
}
@kotlin.Metadata
public interface<<K:Ljava/lang/Number;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapN {
// source: 'implementsMap.kt'
}
@kotlin.Metadata
public abstract class<<A:Ljava/lang/Number;B:Ljava/lang/Object;>Ljava/lang/Object;LMapN<TA;TB;>;> MapNImpl {
// source: 'implementsMap.kt'
public abstract <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public abstract <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public abstract <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(p0: java.util.Map): void
public abstract <(TA;)TB;> method get(p0: java.lang.Number): java.lang.Object
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Number): boolean
public <(TA;TB;)TB;> method put(p0: java.lang.Number, p1: java.lang.Object): java.lang.Object
public <null> method <init>(): void
public <null> method clear(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method getSize(): int
public synthetic bridge <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
}
@kotlin.Metadata
public abstract class<<B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Ljava/lang/String;TB;>;Lkotlin/jvm/internal/markers/KMappedMarker;> MapSImpl {
// source: 'implementsMap.kt'
public abstract <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public abstract <()Ljava/util/Set<Ljava/lang/String;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TB;>;>;> method entrySet(): java.util.Set
public abstract <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TB;>;>;> method getEntries(): java.util.Set
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public abstract <(Ljava/lang/String;)TB;> method get(p0: java.lang.String): java.lang.Object
public <(Ljava/lang/String;TB;)TB;> method put(p0: java.lang.String, p1: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+Ljava/lang/String;+TB;>;)V> method putAll(p0: java.util.Map): void
public <null> method <init>(): void
public <null> method clear(): void
public <null> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public abstract <null> method getSize(): int
public synthetic bridge <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
}
@@ -0,0 +1,25 @@
// WITH_RUNTIME
// WITH_SIGNATURES
import java.util.*
class SortedMapImpl<A : Comparable<A>, B>(private val map: SortedMap<A, B>) : SortedMap<A, B> {
override fun containsKey(key: A): Boolean = map.containsKey(key)
override fun containsValue(value: B): Boolean = map.containsValue(value)
override fun get(key: A): B? = map.get(key)
override fun isEmpty(): Boolean = map.isEmpty()
override fun clear() = map.clear()
override fun put(key: A, value: B): B? = map.put(key, value)
override fun putAll(from: Map<out A, B>) = map.putAll(from)
override fun remove(key: A): B? = map.remove(key)
override fun comparator(): Comparator<in A> = map.comparator()
override fun subMap(fromKey: A, toKey: A): SortedMap<A, B> = map.subMap(fromKey, toKey)
override fun headMap(toKey: A): SortedMap<A, B> = map.headMap(toKey)
override fun tailMap(fromKey: A): SortedMap<A, B> = map.tailMap(fromKey)
override fun firstKey(): A = map.firstKey()
override fun lastKey(): A = map.lastKey()
override val entries: MutableSet<MutableMap.MutableEntry<A, B>> get() = map.entries
override val keys: MutableSet<A> get() = map.keys
override val values: MutableCollection<B> get() = map.values
override val size: Int get() = map.size
}
@@ -0,0 +1,37 @@
@kotlin.Metadata
public final class<<A::Ljava/lang/Comparable<-TA;>;B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/SortedMap<TA;TB;>;> SortedMapImpl {
// source: 'implementsSortedMap.kt'
public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public @org.jetbrains.annotations.NotNull <()Ljava/util/Comparator<-TA;>;> method comparator(): java.util.Comparator
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()TA;> method firstKey(): java.lang.Comparable
public @org.jetbrains.annotations.NotNull <()TA;> method lastKey(): java.lang.Comparable
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public bridge final <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
public <(Ljava/util/SortedMap<TA;TB;>;)V> method <init>(@org.jetbrains.annotations.NotNull p0: java.util.SortedMap): void
public @org.jetbrains.annotations.NotNull <(TA;)Ljava/util/SortedMap<TA;TB;>;> method headMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.NotNull <(TA;)Ljava/util/SortedMap<TA;TB;>;> method tailMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.Nullable <(TA;)TB;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.lang.Object
public @org.jetbrains.annotations.Nullable <(TA;)TB;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.lang.Object
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): boolean
public @org.jetbrains.annotations.NotNull <(TA;TA;)Ljava/util/SortedMap<TA;TB;>;> method subMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable, @org.jetbrains.annotations.NotNull p1: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.Nullable <(TA;TB;)TB;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable, p1: java.lang.Object): java.lang.Object
public <null> method clear(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public <null> method containsValue(p0: java.lang.Object): boolean
public synthetic bridge <null> method firstKey(): java.lang.Object
public <null> method getSize(): int
public synthetic bridge <null> method headMap(p0: java.lang.Object): java.util.SortedMap
public <null> method isEmpty(): boolean
public synthetic bridge <null> method lastKey(): java.lang.Object
public synthetic bridge <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
public synthetic bridge <null> method subMap(p0: java.lang.Object, p1: java.lang.Object): java.util.SortedMap
public synthetic bridge <null> method tailMap(p0: java.lang.Object): java.util.SortedMap
private final field <Ljava/util/SortedMap<TA;TB;>;> map: java.util.SortedMap
}
@@ -0,0 +1,37 @@
@kotlin.Metadata
public final class<<A::Ljava/lang/Comparable<-TA;>;B:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/SortedMap<TA;TB;>;> SortedMapImpl {
// source: 'implementsSortedMap.kt'
public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection<TB;>;> method getValues(): java.util.Collection
public bridge final <()Ljava/util/Collection<TB;>;> method values(): java.util.Collection
public @org.jetbrains.annotations.NotNull <()Ljava/util/Comparator<-TA;>;> method comparator(): java.util.Comparator
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method entrySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<TA;TB;>;>;> method getEntries(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<TA;>;> method getKeys(): java.util.Set
public bridge final <()Ljava/util/Set<TA;>;> method keySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()TA;> method firstKey(): java.lang.Comparable
public @org.jetbrains.annotations.NotNull <()TA;> method lastKey(): java.lang.Comparable
public bridge final <(Ljava/lang/Object;)TB;> method get(p0: java.lang.Object): java.lang.Object
public bridge final <(Ljava/lang/Object;)TB;> method remove(p0: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+TA;+TB;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
public <(Ljava/util/SortedMap<TA;TB;>;)V> method <init>(@org.jetbrains.annotations.NotNull p0: java.util.SortedMap): void
public @org.jetbrains.annotations.NotNull <(TA;)Ljava/util/SortedMap<TA;TB;>;> method headMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.NotNull <(TA;)Ljava/util/SortedMap<TA;TB;>;> method tailMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.Nullable <(TA;)TB;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.lang.Object
public @org.jetbrains.annotations.Nullable <(TA;)TB;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): java.lang.Object
public <(TA;)Z> method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable): boolean
public @org.jetbrains.annotations.NotNull <(TA;TA;)Ljava/util/SortedMap<TA;TB;>;> method subMap(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable, @org.jetbrains.annotations.NotNull p1: java.lang.Comparable): java.util.SortedMap
public @org.jetbrains.annotations.Nullable <(TA;TB;)TB;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.Comparable, p1: java.lang.Object): java.lang.Object
public <null> method clear(): void
public bridge final <null> method containsKey(p0: java.lang.Object): boolean
public <null> method containsValue(p0: java.lang.Object): boolean
public synthetic bridge <null> method firstKey(): java.lang.Object
public <null> method getSize(): int
public synthetic bridge <null> method headMap(p0: java.lang.Object): java.util.SortedMap
public <null> method isEmpty(): boolean
public synthetic bridge <null> method lastKey(): java.lang.Object
public synthetic bridge <null> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public bridge final <null> method size(): int
public synthetic bridge <null> method subMap(p0: java.lang.Object, p1: java.lang.Object): java.util.SortedMap
public synthetic bridge <null> method tailMap(p0: java.lang.Object): java.util.SortedMap
private final @org.jetbrains.annotations.NotNull field <Ljava/util/SortedMap<TA;TB;>;> map: java.util.SortedMap
}
@@ -7,10 +7,10 @@ public abstract class<<V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Lja
public bridge final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method getEntries(): java.util.Set
public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public bridge final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public bridge final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
public <null> method <init>(): void
@@ -34,10 +34,10 @@ public final class<<V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<Ljava/
public bridge final <()Ljava/util/Set<Ljava/lang/String;>;> method keySet(): java.util.Set
public bridge final <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method entrySet(): java.util.Set
public @org.jetbrains.annotations.NotNull <()Ljava/util/Set<Ljava/util/Map$Entry<Ljava/lang/String;TV;>;>;> method getEntries(): java.util.Set
public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public bridge final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public bridge final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object
public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object
public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void
public <null> method <init>(): void
@@ -1196,6 +1196,21 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt");
}
@TestMetadata("implementsJavaMap.kt")
public void testImplementsJavaMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsJavaMap.kt");
}
@TestMetadata("implementsMap.kt")
public void testImplementsMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsMap.kt");
}
@TestMetadata("implementsSortedMap.kt")
public void testImplementsSortedMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
}
@TestMetadata("nonGenericClass.kt")
public void testNonGenericClass() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
@@ -1166,6 +1166,21 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt");
}
@TestMetadata("implementsJavaMap.kt")
public void testImplementsJavaMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsJavaMap.kt");
}
@TestMetadata("implementsMap.kt")
public void testImplementsMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsMap.kt");
}
@TestMetadata("implementsSortedMap.kt")
public void testImplementsSortedMap() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/implementsSortedMap.kt");
}
@TestMetadata("nonGenericClass.kt")
public void testNonGenericClass() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt");
@@ -126,7 +126,7 @@ object BuiltinMethodsWithSpecialGenericSignature {
}
val Name.sameAsBuiltinMethodWithErasedValueParameters: Boolean
get () = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES
get() = this in ERASED_VALUE_PARAMETERS_SHORT_NAMES
enum class SpecialSignatureInfo(val valueParametersSignature: String?, val isObjectReplacedWithTypeParameter: Boolean) {
ONE_COLLECTION_PARAMETER("Ljava/util/Collection<+Ljava/lang/Object;>;", false),
@@ -150,10 +150,10 @@ object BuiltinMethodsWithSpecialGenericSignature {
val defaultValue = SIGNATURE_TO_DEFAULT_VALUES_MAP.getValue(builtinSignature)
return if (defaultValue == TypeSafeBarrierDescription.NULL)
return if (defaultValue == TypeSafeBarrierDescription.NULL) {
// return type is some generic type as 'Map.get'
SpecialSignatureInfo.OBJECT_PARAMETER_GENERIC
else
} else
SpecialSignatureInfo.OBJECT_PARAMETER_NON_GENERIC
}
}