Do not call getInitializer() for variables before it is needed when computing compile time constants

This commit is contained in:
Pavel V. Talanov
2014-04-09 16:36:25 +04:00
parent 9aba5beec7
commit 24ffe3dbb9
@@ -1041,21 +1041,21 @@ public class DescriptorResolver {
private void setConstantForVariableIfNeeded( private void setConstantForVariableIfNeeded(
@NotNull VariableDescriptorImpl variableDescriptor, @NotNull VariableDescriptorImpl variableDescriptor,
@NotNull final JetScope scope, @NotNull final JetScope scope,
@NotNull JetVariableDeclaration variable, @NotNull final JetVariableDeclaration variable,
@NotNull final DataFlowInfo dataFlowInfo, @NotNull final DataFlowInfo dataFlowInfo,
@NotNull final JetType variableType, @NotNull final JetType variableType,
@NotNull final BindingTrace trace @NotNull final BindingTrace trace
) { ) {
if (!shouldRecordInitializerForProperty(variableDescriptor, variableType)) return; if (!shouldRecordInitializerForProperty(variableDescriptor, variableType)) return;
final JetExpression initializer = variable.getInitializer(); if (!variable.hasInitializer()) return;
if (initializer == null) return;
variableDescriptor.setCompileTimeInitializer( variableDescriptor.setCompileTimeInitializer(
storageManager.createRecursionTolerantNullableLazyValue(new Function0<CompileTimeConstant<?>>() { storageManager.createRecursionTolerantNullableLazyValue(new Function0<CompileTimeConstant<?>>() {
@Nullable @Nullable
@Override @Override
public CompileTimeConstant<?> invoke() { public CompileTimeConstant<?> invoke() {
JetExpression initializer = variable.getInitializer();
JetType initializerType = expressionTypingServices.safeGetType(scope, initializer, variableType, dataFlowInfo, trace); JetType initializerType = expressionTypingServices.safeGetType(scope, initializer, variableType, dataFlowInfo, trace);
CompileTimeConstant<?> constant = ConstantExpressionEvaluator.object$.evaluate(initializer, trace, initializerType); CompileTimeConstant<?> constant = ConstantExpressionEvaluator.object$.evaluate(initializer, trace, initializerType);
if (constant instanceof IntegerValueTypeConstant) { if (constant instanceof IntegerValueTypeConstant) {