Move isVar check for compile time initializer out of the setter

This commit is contained in:
Natalia Ukhorskaya
2014-02-19 12:14:05 +04:00
parent 000dd4478a
commit 201af666a9
4 changed files with 25 additions and 36 deletions
@@ -194,17 +194,22 @@ public class DescriptorDeserializer {
} }
} }
property.setCompileTimeInitializer( if (Flags.HAS_CONSTANT.get(flags)) {
storageManager.createNullableLazyValue(new Function0<CompileTimeConstant<?>>() { property.setCompileTimeInitializer(
@Nullable storageManager.createNullableLazyValue(new Function0<CompileTimeConstant<?>>() {
@Override @Nullable
public CompileTimeConstant<?> invoke() { @Override
return getPropertyConstant( public CompileTimeConstant<?> invoke() {
containingDeclaration, proto, flags, AnnotatedCallableKind.PROPERTY, assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor
deserializers.getConstantDeserializer(), nameResolver); : "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); property.initialize(getter, setter);
@@ -280,23 +285,6 @@ public class DescriptorDeserializer {
: Annotations.EMPTY; : 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) { public static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) {
switch (memberKind) { switch (memberKind) {
case DECLARATION: case DECLARATION:
@@ -196,7 +196,7 @@ public class DescriptorSerializer {
} }
} }
hasConstant = propertyDescriptor.getCompileTimeInitializer() != null; hasConstant = !propertyDescriptor.isVar() && propertyDescriptor.getCompileTimeInitializer() != null;
} }
builder.setFlags(Flags.getCallableFlags( builder.setFlags(Flags.getCallableFlags(
@@ -959,7 +959,7 @@ public class DescriptorResolver {
@Override @Override
public JetType invoke() { public JetType invoke() {
JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace); JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace);
setConstantForVariable(variableDescriptor, initializer, initializerType, trace); setConstantForVariableIfNeeded(variableDescriptor, initializer, initializerType, trace);
return transformAnonymousTypeIfNeeded(variableDescriptor, variable, initializerType, trace); return transformAnonymousTypeIfNeeded(variableDescriptor, variable, initializerType, trace);
} }
} }
@@ -967,7 +967,7 @@ public class DescriptorResolver {
} }
else { else {
JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace); JetType initializerType = resolveInitializerType(scope, initializer, dataFlowInfo, trace);
setConstantForVariable(variableDescriptor, initializer, initializerType, trace); setConstantForVariableIfNeeded(variableDescriptor, initializer, initializerType, trace);
return initializerType; return initializerType;
} }
} }
@@ -976,18 +976,20 @@ public class DescriptorResolver {
JetType type = typeResolver.resolveType(scope, propertyTypeRef, trace, true); JetType type = typeResolver.resolveType(scope, propertyTypeRef, trace, true);
JetExpression initializer = variable.getInitializer(); JetExpression initializer = variable.getInitializer();
if (initializer != null) { if (initializer != null) {
setConstantForVariable(variableDescriptor, initializer, type, trace); setConstantForVariableIfNeeded(variableDescriptor, initializer, type, trace);
} }
return type; return type;
} }
} }
private void setConstantForVariable( private void setConstantForVariableIfNeeded(
@NotNull VariableDescriptorImpl variableDescriptor, @NotNull VariableDescriptorImpl variableDescriptor,
@NotNull final JetExpression initializer, @NotNull final JetExpression initializer,
@NotNull final JetType initializerType, @NotNull final JetType initializerType,
@NotNull final BindingTrace trace @NotNull final BindingTrace trace
) { ) {
if (variableDescriptor.isVar()) return;
variableDescriptor.setCompileTimeInitializer(storageManager.createRecursionTolerantNullableLazyValue(new Function0<CompileTimeConstant<?>>() { variableDescriptor.setCompileTimeInitializer(storageManager.createRecursionTolerantNullableLazyValue(new Function0<CompileTimeConstant<?>>() {
@Nullable @Nullable
@Override @Override
@@ -73,9 +73,8 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRoo
} }
public void setCompileTimeInitializer(@NotNull NullableLazyValue<CompileTimeConstant<?>> compileTimeInitializer) { public void setCompileTimeInitializer(@NotNull NullableLazyValue<CompileTimeConstant<?>> compileTimeInitializer) {
if (!isVar()) { assert !isVar() : "Compile-time value for property initializer should be recorded only for final variables " + getName();
this.compileTimeInitializer = compileTimeInitializer; this.compileTimeInitializer = compileTimeInitializer;
}
} }
@Override @Override