FIR: Add java.io.Serializable as supertypes to built-in classes

This commit is contained in:
Denis Zharkov
2020-04-06 18:16:23 +03:00
parent 168c7f306f
commit 81d9cf76f2
10 changed files with 106 additions and 71 deletions
+21 -21
View File
@@ -42,7 +42,7 @@ public open class Any {
}
public final class Array<T> : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class Array<T> : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|T|
public final operator fun iterator(): R|kotlin/collections/Iterator<T>|
@@ -58,7 +58,7 @@ public final class Array<T> : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public final class Boolean : R|kotlin/Comparable<kotlin/Boolean>| {
public final class Boolean : R|kotlin/Comparable<kotlin/Boolean>|, R|java/io/Serializable| {
public final infix fun and(other: R|kotlin/Boolean|): R|kotlin/Boolean|
public open operator fun compareTo(other: R|kotlin/Boolean|): R|kotlin/Int|
@@ -78,7 +78,7 @@ public final class Boolean : R|kotlin/Comparable<kotlin/Boolean>| {
}
public final class BooleanArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class BooleanArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Boolean|
public final operator fun iterator(): R|kotlin/collections/BooleanIterator|
@@ -96,7 +96,7 @@ public final class BooleanArray : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public final class Byte : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Byte>| {
public final class Byte : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Byte>|, R|java/io/Serializable| {
public open operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
public final operator fun compareTo(other: R|kotlin/Double|): R|kotlin/Int|
@@ -220,7 +220,7 @@ public final class Byte : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Byte>| {
}
public final class ByteArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class ByteArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Byte|
public final operator fun iterator(): R|kotlin/collections/ByteIterator|
@@ -238,7 +238,7 @@ public final class ByteArray : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public final class Char : R|kotlin/Comparable<kotlin/Char>| {
public final class Char : R|kotlin/Comparable<kotlin/Char>|, R|java/io/Serializable| {
public open operator fun compareTo(other: R|kotlin/Char|): R|kotlin/Int|
public final operator fun dec(): R|kotlin/Char|
@@ -306,7 +306,7 @@ public final class Char : R|kotlin/Comparable<kotlin/Char>| {
}
public final class CharArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class CharArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Char|
public final operator fun iterator(): R|kotlin/collections/CharIterator|
@@ -372,7 +372,7 @@ public final enum class DeprecationLevel : R|kotlin/Enum<kotlin/DeprecationLevel
}
public final class Double : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Double>| {
public final class Double : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Double>|, R|java/io/Serializable| {
public final operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
public open operator fun compareTo(other: R|kotlin/Double|): R|kotlin/Int|
@@ -497,7 +497,7 @@ public final class Double : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Double>
}
public final class DoubleArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class DoubleArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Double|
public final operator fun iterator(): R|kotlin/collections/DoubleIterator|
@@ -520,7 +520,7 @@ public final class DoubleArray : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public abstract class Enum<E> : R|kotlin/Comparable<E>| {
public abstract class Enum<E> : R|kotlin/Comparable<E>|, R|java/io/Serializable| {
protected final fun clone(): R|kotlin/Any|
public final operator fun compareTo(other: R|E|): R|kotlin/Int|
@@ -551,7 +551,7 @@ public abstract class Enum<E> : R|kotlin/Comparable<E>| {
}
public final class Float : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Float>| {
public final class Float : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Float>|, R|java/io/Serializable| {
public final operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
public final operator fun compareTo(other: R|kotlin/Double|): R|kotlin/Int|
@@ -676,7 +676,7 @@ public final class Float : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Float>|
}
public final class FloatArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class FloatArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Float|
public final operator fun iterator(): R|kotlin/collections/FloatIterator|
@@ -697,7 +697,7 @@ public final class FloatArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public abstract interface Function<out R> : R|kotlin/Any| {
}
public final class Int : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Int>| {
public final class Int : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Int>|, R|java/io/Serializable| {
public final infix fun and(other: R|kotlin/Int|): R|kotlin/Int|
public final operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
@@ -835,7 +835,7 @@ public final class Int : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Int>| {
}
public final class IntArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class IntArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Int|
public final operator fun iterator(): R|kotlin/collections/IntIterator|
@@ -853,7 +853,7 @@ public final class IntArray : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public final class Long : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Long>| {
public final class Long : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Long>|, R|java/io/Serializable| {
public final infix fun and(other: R|kotlin/Long|): R|kotlin/Long|
public final operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
@@ -991,7 +991,7 @@ public final class Long : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Long>| {
}
public final class LongArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class LongArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Long|
public final operator fun iterator(): R|kotlin/collections/LongIterator|
@@ -1014,7 +1014,7 @@ public final class Nothing {
}
public abstract class Number : R|kotlin/Any| {
public abstract class Number : R|kotlin/Any|, R|java/io/Serializable| {
public abstract fun toByte(): R|kotlin/Byte|
public abstract fun toChar(): R|kotlin/Char|
@@ -1057,7 +1057,7 @@ public abstract class Number : R|kotlin/Any| {
}
public final class Short : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Short>| {
public final class Short : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Short>|, R|java/io/Serializable| {
public final operator fun compareTo(other: R|kotlin/Byte|): R|kotlin/Int|
public final operator fun compareTo(other: R|kotlin/Double|): R|kotlin/Int|
@@ -1181,7 +1181,7 @@ public final class Short : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Short>|
}
public final class ShortArray : R|kotlin/Any|, R|kotlin/Cloneable| {
public final class ShortArray : R|kotlin/Any|, R|kotlin/Cloneable|, R|java/io/Serializable| {
public final operator fun get(index: R|kotlin/Int|): R|kotlin/Short|
public final operator fun iterator(): R|kotlin/collections/ShortIterator|
@@ -1207,7 +1207,7 @@ public final class ShortArray : R|kotlin/Any|, R|kotlin/Cloneable| {
}
public final class String : R|kotlin/Comparable<kotlin/String>|, R|kotlin/CharSequence| {
public final class String : R|kotlin/Comparable<kotlin/String>|, R|kotlin/CharSequence|, R|java/io/Serializable| {
public open operator fun compareTo(other: R|kotlin/String|): R|kotlin/Int|
public open operator fun get(index: R|kotlin/Int|): R|kotlin/Char|
@@ -1236,7 +1236,7 @@ public final class String : R|kotlin/Comparable<kotlin/String>|, R|kotlin/CharSe
}
public open class Throwable : R|kotlin/Any| {
public open class Throwable : R|kotlin/Any|, R|java/io/Serializable| {
public open val cause: R|kotlin/Throwable?|
public get(): R|kotlin/Throwable?|
+1 -1
View File
@@ -28,7 +28,7 @@ FILE: whenElse.kt
public get(): R|B|
}
public final fun get(f: R|kotlin/Boolean|): R|kotlin/Comparable<it(A & kotlin/String)>| {
public final fun get(f: R|kotlin/Boolean|): R|it(kotlin/Comparable<it(A & kotlin/String)> & java/io/Serializable)| {
^get when () {
R|<local>/f| -> {
Q|A|.R|/A.A1|
@@ -0,0 +1,6 @@
// FULL_JDK
fun foo(x: java.io.Serializable) {}
fun main() {
foo("")
}
@@ -0,0 +1,6 @@
FILE: serializableString.kt
public final fun foo(x: R|java/io/Serializable|): R|kotlin/Unit| {
}
public final fun main(): R|kotlin/Unit| {
R|/foo|(String())
}
@@ -13,8 +13,8 @@ FILE: withInInitializer.kt
super<R|kotlin/Any|>()
}
public final val list: R|kotlin/collections/List<kotlin/Comparable<it(kotlin/String & kotlin/Int)>>| = R|kotlin/collections/listOf|<R|kotlin/Comparable<it(kotlin/String & kotlin/Int)>|>(vararg(Int(1), Int(2), Int(3), String()))
public get(): R|kotlin/collections/List<kotlin/Comparable<it(kotlin/String & kotlin/Int)>>|
public final val list: R|kotlin/collections/List<it(kotlin/Comparable<it(kotlin/String & kotlin/Int)> & java/io/Serializable)>| = R|kotlin/collections/listOf|<R|it(kotlin/Comparable<it(kotlin/String & kotlin/Int)> & java/io/Serializable)|>(vararg(Int(1), Int(2), Int(3), String()))
public get(): R|kotlin/collections/List<it(kotlin/Comparable<it(kotlin/String & kotlin/Int)> & java/io/Serializable)>|
public final val data: R|First| = R|/First.First|(Int(42))
public get(): R|First|
@@ -690,6 +690,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/RawType.kt");
}
@TestMetadata("serializableString.kt")
public void testSerializableString() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/serializableString.kt");
}
@TestMetadata("smartSet.kt")
public void testSmartSet() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/smartSet.kt");
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
@@ -17,12 +18,15 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.generateValueOfFunction
import org.jetbrains.kotlin.fir.generateValuesFunction
import org.jetbrains.kotlin.fir.resolve.impl.FirClonableSymbolProvider.Companion.CLONE
import org.jetbrains.kotlin.fir.resolve.impl.FirClonableSymbolProvider.Companion.CLONABLE_CLASS_ID
import org.jetbrains.kotlin.fir.resolve.impl.FirClonableSymbolProvider.Companion.CLONE
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
@@ -32,6 +36,7 @@ import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
import org.jetbrains.kotlin.metadata.deserialization.supertypes
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
@@ -147,6 +152,7 @@ fun deserializeClassToSymbol(
}
}
addCloneForArrayIfNeeded(classId)
addSerializableIfNeeded(classId)
}.build().also {
(it.annotations as MutableList<FirAnnotationCall>) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
}
@@ -165,6 +171,19 @@ private val ARRAY_CLASSES: Set<Name> = setOf(
Name.identifier("BooleanArray"),
)
private val JAVA_IO_SERIALIZABLE = ClassId.topLevel(FqName("java.io.Serializable"))
private fun AbstractFirRegularClassBuilder.addSerializableIfNeeded(classId: ClassId) {
if (!JvmBuiltInsSettings.isSerializableInJava(classId.asSingleFqName().toUnsafe())) return
superTypeRefs += buildResolvedTypeRef {
type = ConeClassLikeTypeImpl(
ConeClassLikeLookupTagImpl(JAVA_IO_SERIALIZABLE),
typeArguments = emptyArray(),
isNullable = false
)
}
}
private fun AbstractFirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId) {
if (classId.packageFqName != KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) return
if (classId.shortClassName !in ARRAY_CLASSES) return
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
import java.io.Serializable
+22 -22
View File
@@ -7,32 +7,32 @@ fun useList(s: List<java.io.Serializable>) {
}
fun testPrimitives(b: Byte, ss: Short, i: Int, l: Long, d: Double, s: String, f: Float, bool: Boolean) {
<!INAPPLICABLE_CANDIDATE!>use<!>(b)
<!INAPPLICABLE_CANDIDATE!>use<!>(ss)
<!INAPPLICABLE_CANDIDATE!>use<!>(i)
<!INAPPLICABLE_CANDIDATE!>use<!>(l)
<!INAPPLICABLE_CANDIDATE!>use<!>(s)
<!INAPPLICABLE_CANDIDATE!>use<!>(f)
<!INAPPLICABLE_CANDIDATE!>use<!>(d)
<!INAPPLICABLE_CANDIDATE!>use<!>(bool)
use(b)
use(ss)
use(i)
use(l)
use(s)
use(f)
use(d)
use(bool)
}
class N
class S: java.io.Serializable
fun testArrays(ia: IntArray, ai: Array<Int>, an: Array<N>, a: Array<S>) {
<!INAPPLICABLE_CANDIDATE!>use<!>(ia)
<!INAPPLICABLE_CANDIDATE!>use<!>(ai)
<!INAPPLICABLE_CANDIDATE!>use<!>(an)
<!INAPPLICABLE_CANDIDATE!>use<!>(a)
use(ia)
use(ai)
use(an)
use(a)
}
fun testLiterals() {
<!INAPPLICABLE_CANDIDATE!>use<!>(1)
<!INAPPLICABLE_CANDIDATE!>use<!>(1.0)
<!INAPPLICABLE_CANDIDATE!>use<!>(11111111111111)
<!INAPPLICABLE_CANDIDATE!>use<!>("Asdsd")
<!INAPPLICABLE_CANDIDATE!>use<!>(true)
use(1)
use(1.0)
use(11111111111111)
use("Asdsd")
use(true)
}
fun testNotSerializable(l: List<Int>) {
@@ -45,11 +45,11 @@ enum class C {
}
fun testEnums(a: Enum<*>) {
<!INAPPLICABLE_CANDIDATE!>use<!>(C.E)
<!INAPPLICABLE_CANDIDATE!>use<!>(C.E2)
<!INAPPLICABLE_CANDIDATE!>use<!>(a)
use(C.E)
use(C.E2)
use(a)
}
fun testLists(a: List<Int>) {
<!INAPPLICABLE_CANDIDATE!>useList<!>(a)
}
useList(a)
}
+22 -22
View File
@@ -4,32 +4,32 @@ import aa.A.use
import aa.A.useList
fun testPrimitives(b: Byte, ss: Short, i: Int, l: Long, d: Double, s: String, f: Float, bool: Boolean) {
<!INAPPLICABLE_CANDIDATE!>use<!>(b)
<!INAPPLICABLE_CANDIDATE!>use<!>(ss)
<!INAPPLICABLE_CANDIDATE!>use<!>(i)
<!INAPPLICABLE_CANDIDATE!>use<!>(l)
<!INAPPLICABLE_CANDIDATE!>use<!>(s)
<!INAPPLICABLE_CANDIDATE!>use<!>(f)
<!INAPPLICABLE_CANDIDATE!>use<!>(d)
<!INAPPLICABLE_CANDIDATE!>use<!>(bool)
use(b)
use(ss)
use(i)
use(l)
use(s)
use(f)
use(d)
use(bool)
}
class N
class S: java.io.Serializable
fun testArrays(ia: IntArray, ai: Array<Int>, an: Array<N>, a: Array<S>) {
<!INAPPLICABLE_CANDIDATE!>use<!>(ia)
<!INAPPLICABLE_CANDIDATE!>use<!>(ai)
<!INAPPLICABLE_CANDIDATE!>use<!>(an)
<!INAPPLICABLE_CANDIDATE!>use<!>(a)
use(ia)
use(ai)
use(an)
use(a)
}
fun testLiterals() {
<!INAPPLICABLE_CANDIDATE!>use<!>(1)
<!INAPPLICABLE_CANDIDATE!>use<!>(1.0)
<!INAPPLICABLE_CANDIDATE!>use<!>(11111111111111)
<!INAPPLICABLE_CANDIDATE!>use<!>("Asdsd")
<!INAPPLICABLE_CANDIDATE!>use<!>(true)
use(1)
use(1.0)
use(11111111111111)
use("Asdsd")
use(true)
}
fun testNotSerializable(l: List<Int>) {
@@ -42,13 +42,13 @@ enum class C {
}
fun testEnums(a: Enum<*>) {
<!INAPPLICABLE_CANDIDATE!>use<!>(C.E)
<!INAPPLICABLE_CANDIDATE!>use<!>(C.E2)
<!INAPPLICABLE_CANDIDATE!>use<!>(a)
use(C.E)
use(C.E2)
use(a)
}
fun testLists(a: List<Int>) {
<!INAPPLICABLE_CANDIDATE!>useList<!>(a)
useList(a)
}
// FILE: aa/A.java
@@ -57,4 +57,4 @@ package aa;
public class A {
public static void use(java.io.Serializable s) { }
public static void useList(java.util.List<? extends java.io.Serializable> s) { }
}
}