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 28a21273377..61df151c942 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 @@ -194,17 +194,22 @@ public class DescriptorDeserializer { } } - property.setCompileTimeInitializer( - storageManager.createNullableLazyValue(new Function0>() { - @Nullable - @Override - public CompileTimeConstant invoke() { - return getPropertyConstant( - containingDeclaration, proto, flags, AnnotatedCallableKind.PROPERTY, - deserializers.getConstantDeserializer(), nameResolver); - } - }) - ); + if (Flags.HAS_CONSTANT.get(flags)) { + property.setCompileTimeInitializer( + storageManager.createNullableLazyValue(new Function0>() { + @Nullable + @Override + public CompileTimeConstant invoke() { + assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor + : "Only members in classes or package fragments should be serialized: " + containingDeclaration; + return deserializers.getConstantDeserializer().loadPropertyConstant( + (ClassOrPackageFragmentDescriptor) containingDeclaration, + proto, nameResolver, + AnnotatedCallableKind.PROPERTY); + } + }) + ); + } property.initialize(getter, setter); @@ -280,23 +285,6 @@ 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 7f39c02a7ed..ea477901277 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 @@ -196,7 +196,7 @@ public class DescriptorSerializer { } } - hasConstant = propertyDescriptor.getCompileTimeInitializer() != null; + hasConstant = !propertyDescriptor.isVar() && propertyDescriptor.getCompileTimeInitializer() != null; } builder.setFlags(Flags.getCallableFlags( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index c4dbfbebb24..0eff4c6f007 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -959,7 +959,7 @@ public class DescriptorResolver { @Override public JetType invoke() { JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace); - setConstantForVariable(variableDescriptor, initializer, initializerType, trace); + setConstantForVariableIfNeeded(variableDescriptor, initializer, initializerType, trace); return transformAnonymousTypeIfNeeded(variableDescriptor, variable, initializerType, trace); } } @@ -967,7 +967,7 @@ public class DescriptorResolver { } else { JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace); - setConstantForVariable(variableDescriptor, initializer, initializerType, trace); + setConstantForVariableIfNeeded(variableDescriptor, initializer, initializerType, trace); return initializerType; } } @@ -976,18 +976,20 @@ public class DescriptorResolver { JetType type = typeResolver.resolveType(scope, propertyTypeRef, trace, true); JetExpression initializer = variable.getInitializer(); if (initializer != null) { - setConstantForVariable(variableDescriptor, initializer, type, trace); + setConstantForVariableIfNeeded(variableDescriptor, initializer, type, trace); } return type; } } - private void setConstantForVariable( + private void setConstantForVariableIfNeeded( @NotNull VariableDescriptorImpl variableDescriptor, @NotNull final JetExpression initializer, @NotNull final JetType initializerType, @NotNull final BindingTrace trace ) { + if (variableDescriptor.isVar()) return; + variableDescriptor.setCompileTimeInitializer(storageManager.createRecursionTolerantNullableLazyValue(new Function0>() { @Nullable @Override diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/VariableDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/VariableDescriptorImpl.java index c079d939c17..725ffd6a873 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/VariableDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/VariableDescriptorImpl.java @@ -73,9 +73,8 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRoo } public void setCompileTimeInitializer(@NotNull NullableLazyValue> compileTimeInitializer) { - if (!isVar()) { - this.compileTimeInitializer = compileTimeInitializer; - } + assert !isVar() : "Compile-time value for property initializer should be recorded only for final variables " + getName(); + this.compileTimeInitializer = compileTimeInitializer; } @Override