add support for compile time constant serialization
This commit is contained in:
@@ -41,6 +41,8 @@ import org.jetbrains.kotlin.load.kotlin.DeserializedResolverUtils
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.JVMConfigurationKeys
|
||||
import org.jetbrains.kotlin.resolve.constants.NullValue
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
|
||||
private object BuiltInsSerializerExtension : SerializerExtension() {
|
||||
override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) {
|
||||
@@ -71,6 +73,11 @@ private object BuiltInsSerializerExtension : SerializerExtension() {
|
||||
for (annotation in callable.getAnnotations()) {
|
||||
proto.addExtension(BuiltInsProtoBuf.callableAnnotation, AnnotationSerializer.serializeAnnotation(annotation, stringTable))
|
||||
}
|
||||
val compileTimeConstant = (callable as? PropertyDescriptor)?.getCompileTimeInitializer()
|
||||
if (compileTimeConstant != null && compileTimeConstant !is NullValue) {
|
||||
val type = compileTimeConstant.getType(KotlinBuiltIns.getInstance())
|
||||
proto.setExtension(BuiltInsProtoBuf.compileTimeValue, AnnotationSerializer.valueProto(compileTimeConstant, type, stringTable).build())
|
||||
}
|
||||
}
|
||||
|
||||
override fun serializeValueParameter(
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package test
|
||||
|
||||
enum class Weapon {
|
||||
ROCK
|
||||
PAPER
|
||||
SCISSORS
|
||||
}
|
||||
|
||||
val byteConst: Byte = 10
|
||||
val shortConst: Short = 20
|
||||
val intConst: Int = 30
|
||||
val longConst: Long = 40
|
||||
val charConst: Char = 'A'
|
||||
val stringConst: String = "abcd"
|
||||
val booleanConst: Boolean = true
|
||||
val floatConst: Float = 2.0f
|
||||
val doubleConst: Double = 3.0
|
||||
val enumConst: Weapon? = Weapon.ROCK
|
||||
val arrayConst: Any = byteArray(1,2)
|
||||
|
||||
class Class {
|
||||
val byteConst: Byte = 10
|
||||
val shortConst: Short = 20
|
||||
val intConst: Int = 30
|
||||
val longConst: Long = 40
|
||||
val charConst: Char = 'A'
|
||||
val stringConst: String = "abcd"
|
||||
val booleanConst: Boolean = true
|
||||
val floatConst: Float = 2.0f
|
||||
val doubleConst: Double = 3.0
|
||||
val enumConst: Weapon? = Weapon.ROCK
|
||||
val arrayConst: Any = byteArray(1,2)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
package test
|
||||
|
||||
internal val arrayConst: kotlin.Any = {1.toByte(), 2.toByte()}
|
||||
internal val booleanConst: kotlin.Boolean = true
|
||||
internal val byteConst: kotlin.Byte = 10.toByte()
|
||||
internal val charConst: kotlin.Char = \u0041 ('A')
|
||||
internal val doubleConst: kotlin.Double = 3.0.toDouble()
|
||||
internal val enumConst: test.Weapon? = Weapon.ROCK
|
||||
internal val floatConst: kotlin.Float = 2.0.toFloat()
|
||||
internal val intConst: kotlin.Int = 30
|
||||
internal val longConst: kotlin.Long = 40.toLong()
|
||||
internal val shortConst: kotlin.Short = 20.toShort()
|
||||
internal val stringConst: kotlin.String = "abcd"
|
||||
|
||||
internal final class Class {
|
||||
public constructor Class()
|
||||
internal final val arrayConst: kotlin.Any = {1.toByte(), 2.toByte()}
|
||||
internal final val booleanConst: kotlin.Boolean = true
|
||||
internal final val byteConst: kotlin.Byte = 10.toByte()
|
||||
internal final val charConst: kotlin.Char = \u0041 ('A')
|
||||
internal final val doubleConst: kotlin.Double = 3.0.toDouble()
|
||||
internal final val enumConst: test.Weapon? = Weapon.ROCK
|
||||
internal final val floatConst: kotlin.Float = 2.0.toFloat()
|
||||
internal final val intConst: kotlin.Int = 30
|
||||
internal final val longConst: kotlin.Long = 40.toLong()
|
||||
internal final val shortConst: kotlin.Short = 20.toShort()
|
||||
internal final val stringConst: kotlin.String = "abcd"
|
||||
}
|
||||
|
||||
internal final enum class Weapon : kotlin.Enum<test.Weapon> {
|
||||
public enum entry ROCK : test.Weapon {
|
||||
private constructor ROCK()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
|
||||
public class object <class-object-for-ROCK> : test.Weapon.ROCK {
|
||||
private constructor <class-object-for-ROCK>()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
}
|
||||
}
|
||||
|
||||
public enum entry PAPER : test.Weapon {
|
||||
private constructor PAPER()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
|
||||
public class object <class-object-for-PAPER> : test.Weapon.PAPER {
|
||||
private constructor <class-object-for-PAPER>()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
}
|
||||
}
|
||||
|
||||
public enum entry SCISSORS : test.Weapon {
|
||||
private constructor SCISSORS()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
|
||||
public class object <class-object-for-SCISSORS> : test.Weapon.SCISSORS {
|
||||
private constructor <class-object-for-SCISSORS>()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
}
|
||||
}
|
||||
|
||||
private constructor Weapon()
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: test.Weapon): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun name(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): test.Weapon
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<test.Weapon>
|
||||
}
|
||||
@@ -61,6 +61,10 @@ public class BuiltInsSerializerTest : TestCaseWithTmpdir() {
|
||||
doTest("simple.kt")
|
||||
}
|
||||
|
||||
fun testCompileTimeConstants() {
|
||||
doTest("compileTimeConstants.kt")
|
||||
}
|
||||
|
||||
fun testAnnotationTargets() {
|
||||
doTest("annotationTargets.kt")
|
||||
}
|
||||
|
||||
+22
-6
@@ -10,6 +10,7 @@ public final class DebugBuiltInsProtoBuf {
|
||||
registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.className);
|
||||
registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.classAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.callableAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.compileTimeValue);
|
||||
registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.parameterAnnotation);
|
||||
}
|
||||
public static final int CLASS_NAME_FIELD_NUMBER = 150;
|
||||
@@ -45,6 +46,17 @@ public final class DebugBuiltInsProtoBuf {
|
||||
.newFileScopedGeneratedExtension(
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class,
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance());
|
||||
public static final int COMPILE_TIME_VALUE_FIELD_NUMBER = 151;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.serialization.Callable { ... }</code>
|
||||
*/
|
||||
public static final
|
||||
com.google.protobuf.GeneratedMessage.GeneratedExtension<
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Callable,
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.Argument.Value> compileTimeValue = com.google.protobuf.GeneratedMessage
|
||||
.newFileScopedGeneratedExtension(
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.Argument.Value.class,
|
||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.Argument.Value.getDefaultInstance());
|
||||
public static final int PARAMETER_ANNOTATION_FIELD_NUMBER = 150;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.serialization.Callable.ValueParameter { ... }</code>
|
||||
@@ -76,11 +88,14 @@ public final class DebugBuiltInsProtoBuf {
|
||||
"tation:z\n\023callable_annotation\022,.org.jetb" +
|
||||
"rains.kotlin.serialization.Callable\030\226\001 \003",
|
||||
"(\0132..org.jetbrains.kotlin.serialization." +
|
||||
"Annotation:\212\001\n\024parameter_annotation\022;.or" +
|
||||
"g.jetbrains.kotlin.serialization.Callabl" +
|
||||
"e.ValueParameter\030\226\001 \003(\0132..org.jetbrains." +
|
||||
"kotlin.serialization.AnnotationB\027B\025Debug" +
|
||||
"BuiltInsProtoBuf"
|
||||
"Annotation:\210\001\n\022compile_time_value\022,.org." +
|
||||
"jetbrains.kotlin.serialization.Callable\030" +
|
||||
"\227\001 \001(\0132=.org.jetbrains.kotlin.serializat" +
|
||||
"ion.Annotation.Argument.Value:\212\001\n\024parame" +
|
||||
"ter_annotation\022;.org.jetbrains.kotlin.se" +
|
||||
"rialization.Callable.ValueParameter\030\226\001 \003" +
|
||||
"(\0132..org.jetbrains.kotlin.serialization." +
|
||||
"AnnotationB\027B\025DebugBuiltInsProtoBuf"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
@@ -90,7 +105,8 @@ public final class DebugBuiltInsProtoBuf {
|
||||
className.internalInit(descriptor.getExtensions().get(0));
|
||||
classAnnotation.internalInit(descriptor.getExtensions().get(1));
|
||||
callableAnnotation.internalInit(descriptor.getExtensions().get(2));
|
||||
parameterAnnotation.internalInit(descriptor.getExtensions().get(3));
|
||||
compileTimeValue.internalInit(descriptor.getExtensions().get(3));
|
||||
parameterAnnotation.internalInit(descriptor.getExtensions().get(4));
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user