diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 6e0fbd36740..ed4ee1a36af 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1731,12 +1731,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JetExpression initializer = property.getDelegateExpressionOrInitializer(); if (initializer == null) return false; - CompileTimeConstant compileTimeValue = ExpressionCodegen.getCompileTimeConstant(initializer, typeMapper.getBindingContext()); - if (compileTimeValue == null) return true; - PropertyDescriptor propertyDescriptor = (PropertyDescriptor) typeMapper.getBindingContext().get(BindingContext.VARIABLE, property); assert propertyDescriptor != null; + CompileTimeConstant compileTimeValue = propertyDescriptor.getCompileTimeInitializer(); + if (compileTimeValue == null) return true; + //TODO: OPTIMIZATION: don't initialize static final fields Object value = compileTimeValue.getValue(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 338d3961f01..622c0fbeb14 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -235,10 +235,9 @@ public class PropertyCodegen extends GenerationStateAware { Object value = null; if (ImplementationBodyCodegen.shouldWriteFieldInitializer(propertyDescriptor, typeMapper)) { - JetExpression initializer = p instanceof JetProperty ? ((JetProperty) p).getInitializer() : null; + CompileTimeConstant initializer = propertyDescriptor.getCompileTimeInitializer(); if (initializer != null) { - CompileTimeConstant compileTimeValue = ExpressionCodegen.getCompileTimeConstant(initializer, bindingContext); - value = compileTimeValue != null ? compileTimeValue.getValue() : null; + value = initializer.getValue(); } } 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 d97d1a7584b..28a21273377 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 @@ -16,6 +16,7 @@ package org.jetbrains.jet.descriptors.serialization; +import kotlin.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.descriptors.*; @@ -132,8 +133,8 @@ public class DescriptorDeserializer { } @NotNull - private PropertyDescriptor loadProperty(@NotNull Callable proto) { - int flags = proto.getFlags(); + private PropertyDescriptor loadProperty(@NotNull final Callable proto) { + final int flags = proto.getFlags(); PropertyDescriptorImpl property = new PropertyDescriptorImpl( containingDeclaration, @@ -194,8 +195,15 @@ public class DescriptorDeserializer { } property.setCompileTimeInitializer( - getPropertyConstant(containingDeclaration, proto, flags, AnnotatedCallableKind.PROPERTY, - deserializers.getConstantDeserializer(), nameResolver) + storageManager.createNullableLazyValue(new Function0>() { + @Nullable + @Override + public CompileTimeConstant invoke() { + return getPropertyConstant( + containingDeclaration, proto, flags, AnnotatedCallableKind.PROPERTY, + deserializers.getConstantDeserializer(), nameResolver); + } + }) ); property.initialize(getter, setter); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt index 752f2b28bc8..f847845bf8e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/evaluate/ConstantExpressionEvaluator.kt @@ -28,7 +28,6 @@ import org.jetbrains.jet.lang.types.JetType import org.jetbrains.jet.lang.types.expressions.OperatorConventions import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lexer.JetTokens -import org.jetbrains.jet.lang.resolve.BindingContext.COMPILE_TIME_INITIALIZER import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.jet.lang.types.TypeUtils import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument @@ -299,7 +298,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet if (resolvedCall != null) { val callableDescriptor = resolvedCall.getResultingDescriptor() if (callableDescriptor is VariableDescriptor) { - val compileTimeConstant = callableDescriptor.getCompileTimeInitializer() ?: trace.getBindingContext().get(COMPILE_TIME_INITIALIZER, callableDescriptor) + val compileTimeConstant = callableDescriptor.getCompileTimeInitializer() if (compileTimeConstant == null) return null val value: Any? = @@ -433,27 +432,6 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet } } -public fun recordCompileTimeValueForInitializerIfNeeded( - variableDescriptor: VariableDescriptor, - initializer: JetExpression, - variableType: JetType, - trace: BindingTrace -) { - if (!variableDescriptor.isVar()) { - if (variableDescriptor.getCompileTimeInitializer() == null && trace.get(BindingContext.COMPILE_TIME_INITIALIZER, variableDescriptor) == null) { - val constant = ConstantExpressionEvaluator.evaluate(initializer, trace, variableType) - if (constant != null) { - if (constant is IntegerValueTypeConstant) { - trace.record(BindingContext.COMPILE_TIME_INITIALIZER, variableDescriptor, constant.createCompileTimeConstantWithType(variableType)) - } - else { - trace.record(BindingContext.COMPILE_TIME_INITIALIZER, variableDescriptor, constant) - } - } - } - } -} - public fun IntegerValueTypeConstant.createCompileTimeConstantWithType(expectedType: JetType): CompileTimeConstant<*>? = createCompileTimeConstant(this.getValue(expectedType), EvaluatorContext(this.canBeUsedInAnnotations(), true)) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index df4661c7579..8ccf5bdd842 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -77,7 +77,6 @@ public interface BindingContext { Slices.sliceBuilder().setOpposite(ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT).build(); WritableSlice> COMPILE_TIME_VALUE = Slices.createSimpleSlice(); - WritableSlice> COMPILE_TIME_INITIALIZER = Slices.createSimpleSlice(); WritableSlice TYPE = Slices.createSimpleSlice(); WritableSlice EXPRESSION_TYPE = new BasicWritableSlice(DO_NOTHING); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index e10307038dd..3d708528038 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -566,8 +566,6 @@ public class BodyResolver { scope, propertyDescriptor.getTypeParameters(), NO_RECEIVER_PARAMETER, trace); JetType expectedTypeForInitializer = property.getTypeRef() != null ? propertyDescriptor.getType() : NO_EXPECTED_TYPE; expressionTypingServices.getType(propertyDeclarationInnerScope, initializer, expectedTypeForInitializer, c.getOuterDataFlowInfo(), trace); - - EvaluatePackage.recordCompileTimeValueForInitializerIfNeeded(propertyDescriptor, initializer, expectedTypeForInitializer, trace); } @NotNull 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 c95ea182507..c4dbfbebb24 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -973,21 +973,32 @@ public class DescriptorResolver { } } else { - return typeResolver.resolveType(scope, propertyTypeRef, trace, true); + JetType type = typeResolver.resolveType(scope, propertyTypeRef, trace, true); + JetExpression initializer = variable.getInitializer(); + if (initializer != null) { + setConstantForVariable(variableDescriptor, initializer, type, trace); + } + return type; } } - private static void setConstantForVariable( + private void setConstantForVariable( @NotNull VariableDescriptorImpl variableDescriptor, - @NotNull JetExpression initializer, - @NotNull JetType initializerType, - @NotNull BindingTrace trace + @NotNull final JetExpression initializer, + @NotNull final JetType initializerType, + @NotNull final BindingTrace trace ) { - CompileTimeConstant constant = ConstantExpressionEvaluator.object$.evaluate(initializer, trace, initializerType); - if (constant instanceof IntegerValueTypeConstant){ - constant = EvaluatePackage.createCompileTimeConstantWithType((IntegerValueTypeConstant) constant, initializerType); - } - variableDescriptor.setCompileTimeInitializer(constant); + variableDescriptor.setCompileTimeInitializer(storageManager.createRecursionTolerantNullableLazyValue(new Function0>() { + @Nullable + @Override + public CompileTimeConstant invoke() { + CompileTimeConstant constant = ConstantExpressionEvaluator.object$.evaluate(initializer, trace, initializerType); + if ((constant instanceof IntegerValueTypeConstant)) { + return EvaluatePackage.createCompileTimeConstantWithType((IntegerValueTypeConstant) constant, initializerType); + } + return constant; + } + }, null)); } @NotNull @@ -1390,4 +1401,4 @@ public class DescriptorResolver { } } } -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 3953860affa..9ad3022dec2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -130,8 +130,6 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito JetType outType = propertyDescriptor.getType(); JetTypeInfo typeInfo = facade.getTypeInfo(initializer, context.replaceExpectedType(outType)); dataFlowInfo = typeInfo.getDataFlowInfo(); - - EvaluatePackage.recordCompileTimeValueForInitializerIfNeeded(propertyDescriptor, initializer, outType, context.trace); } { diff --git a/compiler/testData/evaluate/constant/integers.kt b/compiler/testData/evaluate/constant/integers.kt index 43012dcaa5b..be7d466d8e6 100644 --- a/compiler/testData/evaluate/constant/integers.kt +++ b/compiler/testData/evaluate/constant/integers.kt @@ -6,5 +6,5 @@ val prop1: Int = 0x7777777777 // val prop2: 513105426295.toLong() val prop2: Long = 0x7777777777 -// val prop3: IntegerValueType(513105426295) +// val prop3: 513105426295.toLong() val prop3 = 0x7777777777 diff --git a/compiler/testData/evaluate/constant/unaryMinusIndepWoExpType.kt b/compiler/testData/evaluate/constant/unaryMinusIndepWoExpType.kt index 5b6752b789c..64858fce468 100644 --- a/compiler/testData/evaluate/constant/unaryMinusIndepWoExpType.kt +++ b/compiler/testData/evaluate/constant/unaryMinusIndepWoExpType.kt @@ -1,6 +1,6 @@ package test -// val p1: IntegerValueType(-1) +// val p1: -1.toInt() val p1 = -1 // val p2: -1.toLong() diff --git a/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.kt b/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.kt index 184779201f6..d4302a476a5 100644 --- a/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.kt +++ b/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.kt @@ -12,4 +12,4 @@ package testOther import test.normal val some: Int = 1 -val fromImported: Int = normal +val fromImported: Int = normal \ No newline at end of file diff --git a/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.txt b/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.txt index 68834b4b33d..bb3b8c8f9a2 100644 --- a/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.txt +++ b/compiler/testData/lazyResolve/recursiveComparator/fileDependencyRecursion.txt @@ -1,4 +1,4 @@ package test -internal val fromImported: kotlin.Int -internal val normal: kotlin.Int +internal val fromImported: kotlin.Int = 1 +internal val normal: kotlin.Int = 1 diff --git a/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.kt b/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.kt index b69b0fd9e0e..87872700220 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.kt +++ b/compiler/testData/loadJava/compiledKotlin/class/ClassMemberConflict.kt @@ -5,7 +5,7 @@ class ConstructorTypeParamClassObjectTypeConflict { trait test } - val some: test? = null + val some: test? = throw Exception() } class ConstructorTypeParamClassObjectConflict { diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObject.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObject.txt index d6ee44c76fa..4ed0e5909cf 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObject.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObject.txt @@ -2,7 +2,7 @@ package test public object Obj { /*primary*/ private constructor Obj() - public final val v: kotlin.String + public final val v: kotlin.String = "val" public final fun (): kotlin.String public final fun f(): kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClass.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClass.txt index 8a0bf6b9da5..0c1623b4ada 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClass.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClass.txt @@ -5,7 +5,7 @@ public final class Outer { public object Obj { /*primary*/ private constructor Obj() - public final val v: kotlin.String + public final val v: kotlin.String = "val" public final fun (): kotlin.String public final fun f(): kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClassObject.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClassObject.txt index 11d498af5b0..5a1703ef7d4 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClassObject.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInClassObject.txt @@ -8,7 +8,7 @@ public final class Outer { public object Obj { /*primary*/ private constructor Obj() - public final val v: kotlin.String + public final val v: kotlin.String = "val" public final fun (): kotlin.String public final fun f(): kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInNamedObject.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInNamedObject.txt index 14a06ab2cf9..e9eec1f6d6e 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInNamedObject.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectInNamedObject.txt @@ -9,7 +9,7 @@ public object Outer { public object Obj { /*primary*/ private constructor Obj() - public final val v: kotlin.String + public final val v: kotlin.String = "val" public final fun (): kotlin.String public final fun f(): kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt index cb7bc155792..ceaef047f40 100644 --- a/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt +++ b/compiler/testData/loadJava/compiledKotlin/class/NamedObjectWithAnotherTopLevelProperty.txt @@ -5,7 +5,7 @@ internal val x: kotlin.Int = 5.toInt() public object Obj { /*primary*/ private constructor Obj() - public final val v: kotlin.String + public final val v: kotlin.String = "val" public final fun (): kotlin.String public final fun f(): kotlin.String diff --git a/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInClassStaticFields.txt b/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInClassStaticFields.txt index 5a7e3545e1a..c2f68ca8e9f 100644 --- a/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInClassStaticFields.txt +++ b/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInClassStaticFields.txt @@ -5,12 +5,12 @@ internal final class Test { internal class object { /*primary*/ private constructor () - public final val prop1: kotlin.Int + public final val prop1: kotlin.Int = 10.toInt() public final fun (): kotlin.Int public final var prop2: kotlin.Int public final fun (): kotlin.Int protected final fun (/*0*/ : kotlin.Int): kotlin.Unit - public final val prop3: kotlin.Int + public final val prop3: kotlin.Int = 12.toInt() public final fun (): kotlin.Int internal final var prop4: kotlin.Int internal final fun (): kotlin.Int diff --git a/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInTraitStaticFields.txt b/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInTraitStaticFields.txt index 696b7d31590..4a1c26def71 100644 --- a/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInTraitStaticFields.txt +++ b/compiler/testData/loadJava/compiledKotlin/classObject/classObjectInTraitStaticFields.txt @@ -4,12 +4,12 @@ internal trait Test { internal class object { /*primary*/ private constructor () - public final val prop1: kotlin.Int + public final val prop1: kotlin.Int = 10.toInt() public final fun (): kotlin.Int public final var prop2: kotlin.Int public final fun (): kotlin.Int protected final fun (/*0*/ : kotlin.Int): kotlin.Unit - public final val prop3: kotlin.Int + public final val prop3: kotlin.Int = 12.toInt() public final fun (): kotlin.Int internal final var prop4: kotlin.Int 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 455ce188cdc..8a6fbf3ef86 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassVal.txt @@ -8,8 +8,8 @@ internal final class ClassVal { internal final fun (): kotlin.Int private final val property3: java.lang.Object private final fun (): java.lang.Object - protected final val property4: kotlin.String + protected final val property4: kotlin.String = "" protected final fun (): kotlin.String - public final val property5: kotlin.Int + public final val property5: kotlin.Int = 1.toInt() public final fun (): kotlin.Int } diff --git a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt index 455ce188cdc..8a6fbf3ef86 100644 --- a/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt +++ b/compiler/testData/loadJava/compiledKotlin/prop/defaultAccessors/ClassValWithGet.txt @@ -8,8 +8,8 @@ internal final class ClassVal { internal final fun (): kotlin.Int private final val property3: java.lang.Object private final fun (): java.lang.Object - protected final val property4: kotlin.String + protected final val property4: kotlin.String = "" protected final fun (): kotlin.String - public final val property5: kotlin.Int + public final val property5: kotlin.Int = 1.toInt() public final fun (): kotlin.Int } diff --git a/compiler/testData/loadJava/compiledKotlin/visibility/InternalAbstractTraitMembersOverridden.txt b/compiler/testData/loadJava/compiledKotlin/visibility/InternalAbstractTraitMembersOverridden.txt index 4bd2ae8478e..fb436435208 100644 --- a/compiler/testData/loadJava/compiledKotlin/visibility/InternalAbstractTraitMembersOverridden.txt +++ b/compiler/testData/loadJava/compiledKotlin/visibility/InternalAbstractTraitMembersOverridden.txt @@ -14,7 +14,7 @@ internal final class B : test.A { public open override /*1*/ var p: kotlin.Int public open override /*1*/ fun (): kotlin.Int public open override /*1*/ fun (/*0*/ : kotlin.Int): kotlin.Unit - internal open override /*1*/ val v: kotlin.Int + internal open override /*1*/ val v: kotlin.Int = 0.toInt() internal open override /*1*/ fun (): kotlin.Int internal open override /*1*/ fun f(): kotlin.Int } diff --git a/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt b/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt index 064e44625f6..08147d345c1 100644 --- a/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt +++ b/compiler/tests/org/jetbrains/jet/evaluate/AbstractEvaluateExpressionTest.kt @@ -41,7 +41,7 @@ abstract class AbstractEvaluateExpressionTest : AbstractAnnotationDescriptorReso fun doConstantTest(path: String) { doTest(path) { property, context -> - val compileTimeConstant = context.get(BindingContext.COMPILE_TIME_VALUE, property.getInitializer()) + val compileTimeConstant = property.getCompileTimeInitializer() if (compileTimeConstant is StringValue) { "\\\"${compileTimeConstant.getValue()}\\\"" } else { @@ -54,7 +54,7 @@ abstract class AbstractEvaluateExpressionTest : AbstractAnnotationDescriptorReso fun doIsPureTest(path: String) { doTest(path) { property, context -> - val compileTimeConstant = context.get(BindingContext.COMPILE_TIME_VALUE, property.getInitializer()) + val compileTimeConstant = property.getCompileTimeInitializer() if (compileTimeConstant is IntegerValueConstant) { compileTimeConstant.isPure().toString() } else { @@ -63,7 +63,7 @@ abstract class AbstractEvaluateExpressionTest : AbstractAnnotationDescriptorReso } } - private fun doTest(path: String, getValueToTest: (JetProperty, BindingContext) -> String) { + private fun doTest(path: String, getValueToTest: (VariableDescriptor, BindingContext) -> String) { val myFile = File(path) val fileText = FileUtil.loadFile(myFile, true) val packageView = getPackage(fileText) @@ -80,9 +80,7 @@ abstract class AbstractEvaluateExpressionTest : AbstractAnnotationDescriptorReso val property = AbstractAnnotationDescriptorResolveTest.getPropertyDescriptor(packageView, propertyName, false) ?: AbstractAnnotationDescriptorResolveTest.getLocalVarDescriptor(context!!, propertyName) - val jetProperty = BindingContextUtils.descriptorToDeclaration(context!!, property) as JetProperty - - val testedObject = getValueToTest(jetProperty, context!!) + val testedObject = getValueToTest(property, context!!) expectedActual.add(expectedPropertyPrefix + expected!! to expectedPropertyPrefix + testedObject) } diff --git a/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java b/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java index 34193ad66db..253f9ea25d5 100644 --- a/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java +++ b/compiler/tests/org/jetbrains/jet/test/util/RecursiveDescriptorComparator.java @@ -56,16 +56,6 @@ 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/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index 3791a8fcc53..9bda99280a8 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -267,7 +267,10 @@ public abstract class LazyJavaMemberScope( propertyDescriptor.setType(effectiveSignature.getReturnType(), Collections.emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(getContainingDeclaration()), null : JetType?) if (!propertyDescriptor.isVar()) { - propertyDescriptor.setCompileTimeInitializer(JavaPropertyInitializerEvaluator.getInstance().getInitializerConstant(field, propertyDescriptor)) + propertyDescriptor.setCompileTimeInitializer( + c.storageManager.createNullableLazyValue { + JavaPropertyInitializerEvaluator.getInstance().getInitializerConstant(field, propertyDescriptor) + }) } c.javaResolverCache.recordField(field, propertyDescriptor); 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 6267ee2b02b..c079d939c17 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 @@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.storage.NullableLazyValue; import java.util.Collections; import java.util.List; @@ -30,7 +31,7 @@ import java.util.Set; public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRootImpl implements VariableDescriptor { private JetType outType; - private CompileTimeConstant compileTimeInitializer; + private NullableLazyValue> compileTimeInitializer; public VariableDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration, @@ -65,10 +66,13 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRoo @Nullable @Override public CompileTimeConstant getCompileTimeInitializer() { - return compileTimeInitializer; + if (compileTimeInitializer != null) { + return compileTimeInitializer.invoke(); + } + return null; } - public void setCompileTimeInitializer(@Nullable CompileTimeConstant compileTimeInitializer) { + public void setCompileTimeInitializer(@NotNull NullableLazyValue> compileTimeInitializer) { if (!isVar()) { this.compileTimeInitializer = compileTimeInitializer; }