JVM_IR emulate JVM hack for generic signatures in KT-18189
KT-40307 See also KT-42609
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+3
-1
@@ -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 {
|
||||
|
||||
+21
@@ -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> {}
|
||||
+38
@@ -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
|
||||
}
|
||||
Vendored
+34
@@ -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
|
||||
}
|
||||
+15
@@ -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
|
||||
}
|
||||
+73
@@ -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
|
||||
}
|
||||
+69
@@ -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
|
||||
}
|
||||
+25
@@ -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
|
||||
}
|
||||
Vendored
+37
@@ -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
|
||||
}
|
||||
Vendored
+37
@@ -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
|
||||
}
|
||||
compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass_ir.txt
Vendored
+4
-4
@@ -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
|
||||
|
||||
+15
@@ -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");
|
||||
|
||||
+15
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user