Introduce BLACK_LIST_CONSTRUCTOR_SIGNATURES

To prevent loading senseless constructors to built-in classes from JDK
This commit is contained in:
Denis Zharkov
2016-04-21 11:48:32 +03:00
parent 1efed64014
commit 2819c69bc1
3 changed files with 23 additions and 41 deletions
-19
View File
@@ -33,7 +33,6 @@ public final class Array</*0*/ T> : kotlin.Cloneable, java.io.Serializable {
public final class Boolean : kotlin.Comparable<kotlin.Boolean>, java.io.Serializable {
/*primary*/ private constructor Boolean()
public constructor Boolean(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Boolean): kotlin.Int
public final operator fun not(): kotlin.Boolean
@@ -54,7 +53,6 @@ public final class BooleanArray : kotlin.Cloneable, java.io.Serializable {
public final class Byte : kotlin.Number, kotlin.Comparable<kotlin.Byte>, java.io.Serializable {
/*primary*/ private constructor Byte()
public constructor Byte(/*0*/ p0: kotlin.String!)
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -221,7 +219,6 @@ public final enum class DeprecationLevel : kotlin.Enum<kotlin.DeprecationLevel>
public final class Double : kotlin.Number, kotlin.Comparable<kotlin.Double>, java.io.Serializable {
/*primary*/ private constructor Double()
public constructor Double(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -318,8 +315,6 @@ public abstract class Enum</*0*/ E : kotlin.Enum<E>> : kotlin.Comparable<E>, jav
public final class Float : kotlin.Number, kotlin.Comparable<kotlin.Float>, java.io.Serializable {
/*primary*/ private constructor Float()
public constructor Float(/*0*/ p0: kotlin.Double)
public constructor Float(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -399,7 +394,6 @@ public interface Function</*0*/ out R> {
public final class Int : kotlin.Number, kotlin.Comparable<kotlin.Int>, java.io.Serializable {
/*primary*/ private constructor Int()
public constructor Int(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Int): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
@@ -481,7 +475,6 @@ public final class IntArray : kotlin.Cloneable, java.io.Serializable {
public final class Long : kotlin.Number, kotlin.Comparable<kotlin.Long>, java.io.Serializable {
/*primary*/ private constructor Long()
public constructor Long(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Long): kotlin.Long
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
@@ -586,7 +579,6 @@ public abstract class Number : kotlin.Any, java.io.Serializable {
public final class Short : kotlin.Number, kotlin.Comparable<kotlin.Short>, java.io.Serializable {
/*primary*/ private constructor Short()
public constructor Short(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -661,17 +653,6 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable {
public final class String : kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable {
/*primary*/ public constructor String()
public constructor String(/*0*/ p0: java.lang.StringBuffer!)
public constructor String(/*0*/ p0: java.lang.StringBuilder!)
public constructor String(/*0*/ p0: kotlin.ByteArray!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: java.nio.charset.Charset!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: java.nio.charset.Charset!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: kotlin.String!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.String!)
public constructor String(/*0*/ p0: kotlin.CharArray!)
public constructor String(/*0*/ p0: kotlin.CharArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public constructor String(/*0*/ p0: kotlin.IntArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public open override /*1*/ val length: kotlin.Int
public open override /*1*/ fun <get-length>(): kotlin.Int
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.String): kotlin.Int
-19
View File
@@ -33,7 +33,6 @@ public final class Array</*0*/ T> : kotlin.Cloneable, java.io.Serializable {
public final class Boolean : kotlin.Comparable<kotlin.Boolean>, java.io.Serializable {
/*primary*/ private constructor Boolean()
public constructor Boolean(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Boolean): kotlin.Int
public final operator fun not(): kotlin.Boolean
@@ -54,7 +53,6 @@ public final class BooleanArray : kotlin.Cloneable, java.io.Serializable {
public final class Byte : kotlin.Number, kotlin.Comparable<kotlin.Byte>, java.io.Serializable {
/*primary*/ private constructor Byte()
public constructor Byte(/*0*/ p0: kotlin.String!)
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -223,7 +221,6 @@ public final enum class DeprecationLevel : kotlin.Enum<kotlin.DeprecationLevel>
public final class Double : kotlin.Number, kotlin.Comparable<kotlin.Double>, java.io.Serializable {
/*primary*/ private constructor Double()
public constructor Double(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -320,8 +317,6 @@ public abstract class Enum</*0*/ E : kotlin.Enum<E>> : kotlin.Comparable<E>, jav
public final class Float : kotlin.Number, kotlin.Comparable<kotlin.Float>, java.io.Serializable {
/*primary*/ private constructor Float()
public constructor Float(/*0*/ p0: kotlin.Double)
public constructor Float(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public open override /*1*/ fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -401,7 +396,6 @@ public interface Function</*0*/ out R> {
public final class Int : kotlin.Number, kotlin.Comparable<kotlin.Int>, java.io.Serializable {
/*primary*/ private constructor Int()
public constructor Int(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Int): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
@@ -483,7 +477,6 @@ public final class IntArray : kotlin.Cloneable, java.io.Serializable {
public final class Long : kotlin.Number, kotlin.Comparable<kotlin.Long>, java.io.Serializable {
/*primary*/ private constructor Long()
public constructor Long(/*0*/ p0: kotlin.String!)
public final infix fun and(/*0*/ other: kotlin.Long): kotlin.Long
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
@@ -588,7 +581,6 @@ public abstract class Number : kotlin.Any, java.io.Serializable {
public final class Short : kotlin.Number, kotlin.Comparable<kotlin.Short>, java.io.Serializable {
/*primary*/ private constructor Short()
public constructor Short(/*0*/ p0: kotlin.String!)
public final operator fun compareTo(/*0*/ other: kotlin.Byte): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Double): kotlin.Int
public final operator fun compareTo(/*0*/ other: kotlin.Float): kotlin.Int
@@ -663,17 +655,6 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable {
public final class String : kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable {
/*primary*/ public constructor String()
public constructor String(/*0*/ p0: java.lang.StringBuffer!)
public constructor String(/*0*/ p0: java.lang.StringBuilder!)
public constructor String(/*0*/ p0: kotlin.ByteArray!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: java.nio.charset.Charset!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: java.nio.charset.Charset!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: kotlin.String!)
public constructor String(/*0*/ p0: kotlin.ByteArray!, /*1*/ p1: kotlin.String!)
public constructor String(/*0*/ p0: kotlin.CharArray!)
public constructor String(/*0*/ p0: kotlin.CharArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public constructor String(/*0*/ p0: kotlin.IntArray!, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int)
public open override /*1*/ val length: kotlin.Int
public open override /*1*/ fun <get-length>(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun chars(): java.util.stream.IntStream!
@@ -196,7 +196,8 @@ open class BuiltInClassesAreSerializableOnJvm(
javaConstructor.visibility.isPublicAPI &&
defaultKotlinVersion.constructors.none { it.isEffectivelyTheSameAs(javaConstructor) } &&
!javaConstructor.isTrivialCopyConstructorFor(classDescriptor) &&
!KotlinBuiltIns.isDeprecated(javaConstructor)
!KotlinBuiltIns.isDeprecated(javaConstructor) &&
signature(javaAnalogueDescriptor, javaConstructor.computeJvmDescriptor()) !in BLACK_LIST_CONSTRUCTOR_SIGNATURES
}.map {
javaConstructor ->
javaConstructor.newCopyBuilder().apply {
@@ -261,6 +262,10 @@ open class BuiltInClassesAreSerializableOnJvm(
inJavaUtil("Collection", "toArray([$objectType)[$objectType", "toArray()[$objectType")
private fun buildPrimitiveValueMethodsSet(): Set<String> =
JvmPrimitiveType.values().flatMapTo(LinkedHashSet()) {
inJavaLang(it.wrapperFqName.shortName().asString(), "${it.javaKeywordName}Value()${it.desc}")
}
private val MUTABLE_METHOD_SIGNATURES: Set<String> =
inJavaUtil("Collection", "removeIf(Ljava/util/function/Predicate;)Z") +
@@ -278,9 +283,22 @@ open class BuiltInClassesAreSerializableOnJvm(
"replace($objectType$objectType)$objectType",
"replace($objectType$objectType$objectType)Z")
private fun buildPrimitiveValueMethodsSet(): Set<String> =
private val BLACK_LIST_CONSTRUCTOR_SIGNATURES: Set<String> =
buildPrimitiveStringConstructorsSet() +
inJavaLang("Float", *constructors("D")) +
inJavaLang("String", *constructors(
"[C", "[CII", "[III", "[BIILjava/lang/String;",
"[BIILjava/nio/charset/Charset;",
"[BLjava/lang/String;",
"[BLjava/nio/charset/Charset;",
"[BII", "[B",
"Ljava/lang/StringBuffer;",
"Ljava/lang/StringBuilder;"
))
private fun buildPrimitiveStringConstructorsSet(): Set<String> =
JvmPrimitiveType.values().flatMapTo(LinkedHashSet()) {
inJavaLang(it.wrapperFqName.shortName().asString(), "${it.javaKeywordName}Value()${it.desc}")
inJavaLang(it.wrapperFqName.shortName().asString(), *constructors(stringType))
}
}
}
@@ -296,6 +314,8 @@ private val objectType = javaLang("Object").t
private fun javaLang(name: String) = "java/lang/$name"
private fun javaUtil(name: String) = "java/util/$name"
private fun constructors(vararg signatures: String) = signatures.map { "<init>($it)V" }.toTypedArray()
private fun inJavaLang(name: String, vararg signatures: String) = inClass(javaLang(name), *signatures)
private fun inJavaUtil(name: String, vararg signatures: String) = inClass(javaUtil(name), *signatures)