diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClass.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClass.java index 76305bd1cf1..6699eb29bef 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClass.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClass.java @@ -158,7 +158,7 @@ public class VirtualFileKotlinClass implements KotlinJvmBinaryClass { new ClassReader(file.contentsToByteArray()).accept(new ClassVisitor(ASM4) { @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - final AnnotationVisitor v = memberVisitor.visitField(Name.guess(name), desc); + final AnnotationVisitor v = memberVisitor.visitField(Name.guess(name), desc, value); if (v == null) return null; return new FieldVisitor(ASM4) { @@ -234,4 +234,4 @@ public class VirtualFileKotlinClass implements KotlinJvmBinaryClass { e ); } -} \ No newline at end of file +} diff --git a/compiler/frontend/serialization/src/descriptors.proto b/compiler/frontend/serialization/src/descriptors.proto index ed1633ba6a8..ae214e9b7f0 100644 --- a/compiler/frontend/serialization/src/descriptors.proto +++ b/compiler/frontend/serialization/src/descriptors.proto @@ -170,6 +170,7 @@ message Callable { MemberKind hasGetter hasSetter + hasConstant */ optional int32 flags = 1; optional string extra_visibility = 2; // for things like java-specific visibilities diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index 5cf8d0c85ad..d97d1a7584b 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -18,15 +18,13 @@ package org.jetbrains.jet.descriptors.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer; -import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor; -import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor; -import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers; +import org.jetbrains.jet.descriptors.serialization.descriptors.*; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.resolve.DescriptorFactory; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.storage.StorageManager; @@ -195,6 +193,11 @@ public class DescriptorDeserializer { } } + property.setCompileTimeInitializer( + getPropertyConstant(containingDeclaration, proto, flags, AnnotatedCallableKind.PROPERTY, + deserializers.getConstantDeserializer(), nameResolver) + ); + property.initialize(getter, setter); return property; @@ -269,6 +272,23 @@ public class DescriptorDeserializer { : Annotations.EMPTY; } + @Nullable + public static CompileTimeConstant getPropertyConstant( + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull Callable proto, + int flags, + @NotNull AnnotatedCallableKind kind, + @NotNull ConstantDeserializer constantDeserializer, + @NotNull NameResolver nameResolver + ) { + assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor + : "Only members in classes or package fragments should be serialized: " + containingDeclaration; + return Flags.HAS_CONSTANT.get(flags) + ? constantDeserializer + .loadPropertyConstant((ClassOrPackageFragmentDescriptor) containingDeclaration, proto, nameResolver, kind) + : null; + } + public static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) { switch (memberKind) { case DECLARATION: diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java index 4b937398c67..7f39c02a7ed 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java @@ -161,6 +161,7 @@ public class DescriptorSerializer { boolean hasGetter = false; boolean hasSetter = false; + boolean hasConstant = false; if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; @@ -194,6 +195,8 @@ public class DescriptorSerializer { } } } + + hasConstant = propertyDescriptor.getCompileTimeInitializer() != null; } builder.setFlags(Flags.getCallableFlags( @@ -203,7 +206,8 @@ public class DescriptorSerializer { descriptor.getKind(), callableKind(descriptor), hasGetter, - hasSetter + hasSetter, + hasConstant )); //TODO builder.setExtraVisibility() diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/Flags.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/Flags.java index be40b68cb6a..9af7aa9a19d 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/Flags.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/Flags.java @@ -30,6 +30,7 @@ public class Flags { ProtoBuf.Callable.MemberKind.values()); public static final FlagField HAS_GETTER = FlagField.booleanAfter(MEMBER_KIND); public static final FlagField HAS_SETTER = FlagField.booleanAfter(HAS_GETTER); + public static final FlagField HAS_CONSTANT = FlagField.booleanAfter(HAS_SETTER); // Parameters @@ -93,7 +94,8 @@ public class Flags { @NotNull CallableMemberDescriptor.Kind memberKind, @NotNull ProtoBuf.Callable.CallableKind callableKind, boolean hasGetter, - boolean hasSetter + boolean hasSetter, + boolean hasConstant ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | MODALITY.toFlags(modality(modality)) @@ -102,6 +104,7 @@ public class Flags { | CALLABLE_KIND.toFlags(callableKind) | HAS_GETTER.toFlags(hasGetter) | HAS_SETTER.toFlags(hasSetter) + | HAS_CONSTANT.toFlags(hasConstant) ; } diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassObjectInStaticNestedClass.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassObjectInStaticNestedClass.txt index b44305123a8..a2087b9d40f 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassObjectInStaticNestedClass.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassObjectInStaticNestedClass.txt @@ -8,7 +8,7 @@ internal final class A { internal class object { /*primary*/ private constructor () - internal final val TEST: kotlin.Int + internal final val TEST: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int } } diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.txt b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.txt index 05fcb0ac582..8618a65ea17 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/packageMembers/EnumArgument.txt @@ -1,6 +1,6 @@ package test -test.Anno(t = ElementType.FIELD: java.lang.annotation.ElementType) internal val bar: kotlin.Int +test.Anno(t = ElementType.FIELD: java.lang.annotation.ElementType) internal val bar: kotlin.Int = 42.toInt() internal fun (): kotlin.Int test.Anno(t = ElementType.METHOD: java.lang.annotation.ElementType) internal fun foo(): kotlin.Unit diff --git a/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.txt b/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.txt index 05ec00fb225..2b8f780bd99 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.txt @@ -2,12 +2,12 @@ package test internal final class ConstructorTypeParamClassObjectConflict { /*primary*/ public constructor ConstructorTypeParamClassObjectConflict() - internal final val some: kotlin.Int + internal final val some: kotlin.Int = 12.toInt() internal final fun (): kotlin.Int internal class object { /*primary*/ private constructor () - internal final val test: kotlin.Int + internal final val test: kotlin.Int = 12.toInt() internal final fun (): kotlin.Int } } @@ -27,14 +27,14 @@ internal final class ConstructorTypeParamClassObjectTypeConflict { internal final class TestClassObjectAndClassConflict { /*primary*/ public constructor TestClassObjectAndClassConflict() - internal final val bla: kotlin.String + internal final val bla: kotlin.String = "More" internal final fun (): kotlin.String - internal final val some: kotlin.String + internal final val some: kotlin.String = "More" internal final fun (): kotlin.String internal class object { /*primary*/ private constructor () - internal final val bla: kotlin.Int + internal final val bla: kotlin.Int = 12.toInt() internal final fun (): kotlin.Int } } @@ -46,7 +46,7 @@ internal final class TestConstructorParamClassObjectConflict { internal class object { /*primary*/ private constructor () - internal final val test: kotlin.Int + internal final val test: kotlin.Int = 12.toInt() internal final fun (): kotlin.Int } } @@ -60,7 +60,7 @@ internal final class TestConstructorValClassObjectConflict { internal class object { /*primary*/ private constructor () - internal final val test: kotlin.Int + internal final val test: kotlin.Int = 12.toInt() internal final fun (): kotlin.Int } } diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt index 73fcd1c9e3e..cb7bc155792 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt @@ -1,6 +1,6 @@ package test -internal val x: kotlin.Int +internal val x: kotlin.Int = 5.toInt() internal fun (): kotlin.Int public object Obj { diff --git a/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectDeclaresVal.txt b/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectDeclaresVal.txt index 004675b93fa..22dc6622d7a 100644 --- a/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectDeclaresVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectDeclaresVal.txt @@ -5,7 +5,7 @@ internal final class ClassObjectDeclaresProperty { internal class object { /*primary*/ private constructor () - internal final val i: kotlin.Int + internal final val i: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int } } diff --git a/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectPropertyInClass.txt b/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectPropertyInClass.txt index 28cd37823fb..5723a01432b 100644 --- a/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectPropertyInClass.txt +++ b/compiler/testData/loadJava/compiledKotlin/classObject/ClassObjectPropertyInClass.txt @@ -2,12 +2,12 @@ package test internal final class A { /*primary*/ public constructor A() - internal final val other: kotlin.Int + internal final val other: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int internal class object { /*primary*/ private constructor () - internal final val some: kotlin.Int + internal final val some: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int } } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/ClassVal.txt b/compiler/testData/loadJava/compiledKotlin/prop/ClassVal.txt index 3c3e19d1303..ebb87412103 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/ClassVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/ClassVal.txt @@ -2,6 +2,6 @@ package test internal final class ClassVal { /*primary*/ public constructor ClassVal() - internal final val aa: kotlin.Int + internal final val aa: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/NsVal.txt b/compiler/testData/loadJava/compiledKotlin/prop/NsVal.txt index 9717afe5944..f7793e0ca7c 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/NsVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/NsVal.txt @@ -1,4 +1,4 @@ package test -internal val nsVal: kotlin.Int +internal val nsVal: kotlin.Int = 1.toInt() internal fun (): kotlin.Int diff --git a/compiler/testData/loadJava/compiledKotlin/prop/OverrideClassVal.txt b/compiler/testData/loadJava/compiledKotlin/prop/OverrideClassVal.txt index caa411189c5..8f890de66fd 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/OverrideClassVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/OverrideClassVal.txt @@ -2,12 +2,12 @@ package test internal open class BaseClass { /*primary*/ public constructor BaseClass() - internal open val shape: kotlin.String + internal open val shape: kotlin.String = "square" internal open fun (): kotlin.String } internal open class Subclass : test.BaseClass { /*primary*/ public constructor Subclass() - internal open override /*1*/ val shape: kotlin.String + internal open override /*1*/ val shape: kotlin.String = "circle" internal open override /*1*/ fun (): kotlin.String } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/OverrideTraitVal.txt b/compiler/testData/loadJava/compiledKotlin/prop/OverrideTraitVal.txt index f4135441e93..efff9a0b32b 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/OverrideTraitVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/OverrideTraitVal.txt @@ -2,7 +2,7 @@ package test internal open class Subclass : test.Trait { /*primary*/ public constructor Subclass() - internal open override /*1*/ val shape: kotlin.String + internal open override /*1*/ val shape: kotlin.String = "circle" internal open override /*1*/ fun (): kotlin.String } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/PropFromSuperclass.txt b/compiler/testData/loadJava/compiledKotlin/prop/PropFromSuperclass.txt index c013493f956..a6cd4beba1c 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/PropFromSuperclass.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/PropFromSuperclass.txt @@ -2,7 +2,7 @@ package test internal open class BaseClass { /*primary*/ public constructor BaseClass() - internal final val exactly: kotlin.Int + internal final val exactly: kotlin.Int = 17.toInt() internal final fun (): kotlin.Int } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt index 8b5644b368b..455ce188cdc 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt @@ -2,9 +2,9 @@ package test internal final class ClassVal { /*primary*/ public constructor ClassVal() - internal final val property1: kotlin.Int + internal final val property1: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int - internal final val property2: kotlin.Int + internal final val property2: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int private final val property3: java.lang.Object private final fun (): java.lang.Object diff --git a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt index 8b5644b368b..455ce188cdc 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt @@ -2,9 +2,9 @@ package test internal final class ClassVal { /*primary*/ public constructor ClassVal() - internal final val property1: kotlin.Int + internal final val property1: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int - internal final val property2: kotlin.Int + internal final val property2: kotlin.Int = 1.toInt() internal final fun (): kotlin.Int private final val property3: java.lang.Object private final fun (): java.lang.Object diff --git a/compiler/testData/loadJava/compiledKotlin/visibility/InternalTopLevelMembers.txt b/compiler/testData/loadJava/compiledKotlin/visibility/InternalTopLevelMembers.txt index 493adf2147b..99af16e9b67 100644 --- a/compiler/testData/loadJava/compiledKotlin/visibility/InternalTopLevelMembers.txt +++ b/compiler/testData/loadJava/compiledKotlin/visibility/InternalTopLevelMembers.txt @@ -1,5 +1,5 @@ package test -internal val x: kotlin.Int +internal val x: kotlin.Int = 0.toInt() internal fun (): kotlin.Int internal fun f(): kotlin.Int diff --git a/compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelVal.txt b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelVal.txt index 548acd79c1f..929aa09440b 100644 --- a/compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelVal.txt @@ -1,4 +1,4 @@ package test -private val topLevelVal: kotlin.Int +private val topLevelVal: kotlin.Int = 0.toInt() private fun (): kotlin.Int diff --git a/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java b/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java index 253f9ea25d5..34193ad66db 100644 --- a/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java +++ b/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java @@ -56,6 +56,16 @@ public class RecursiveDescriptorComparator { public static final Configuration RECURSIVE = new Configuration(false, false, true, Predicates.alwaysTrue(), FORBID_ERROR_TYPES, DEFAULT_RENDERER); + public static final Configuration WITHOUT_COMPILE_TIME_CONSTANTS = new Configuration(false, false, true, + Predicates.alwaysTrue(), + FORBID_ERROR_TYPES, + new DescriptorRendererBuilder() + .setWithDefinedIn(false) + .setExcludedAnnotationClasses(Arrays.asList(new FqName(ExpectedLoadErrorsUtil.ANNOTATION_CLASS_NAME))) + .setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OPEN_OVERRIDE) + .setVerbose(true) + .setIncludePropertyConstant(false) + .build()); public static final Configuration RECURSIVE_ALL = new Configuration(true, true, true, Predicates.alwaysTrue(), diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java index d5fd1890df4..147d3e0a5d9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java @@ -20,11 +20,10 @@ import kotlin.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter; -import org.jetbrains.jet.lang.resolve.java.resolver.ResolverPackage; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; import org.jetbrains.jet.storage.MemoizedFunctionToNotNull; @@ -87,8 +86,13 @@ public class DescriptorDeserializersStorage { @Nullable @Override - public KotlinJvmBinaryClass.AnnotationVisitor visitField(@NotNull Name name, @NotNull String desc) { - return new MemberAnnotationVisitor(MemberSignature.fromFieldNameAndDesc(name, desc)); + public KotlinJvmBinaryClass.AnnotationVisitor visitField(@NotNull Name name, @NotNull String desc, @Nullable Object initializer) { + MemberSignature signature = MemberSignature.fromFieldNameAndDesc(name, desc); + if (initializer != null) { + propertyConstants.put(signature, ConstantUtils.createCompileTimeConstant( + initializer, /* canBeUsedInAnnotation */ true, /* isPureIntConstant */ true, /* expectedType */ null)); + } + return new MemberAnnotationVisitor(signature); } class AnnotationVisitorForMethod extends MemberAnnotationVisitor implements KotlinJvmBinaryClass.MethodAnnotationVisitor { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinJvmBinaryClass.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinJvmBinaryClass.java index 8a581965057..a008a4d1923 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinJvmBinaryClass.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinJvmBinaryClass.java @@ -40,7 +40,7 @@ public interface KotlinJvmBinaryClass { MethodAnnotationVisitor visitMethod(@NotNull Name name, @NotNull String desc); @Nullable - AnnotationVisitor visitField(@NotNull Name name, @NotNull String desc); + AnnotationVisitor visitField(@NotNull Name name, @NotNull String desc, @Nullable Object initializer); } interface AnnotationVisitor {