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(
storageManager.createNullableLazyValue(new Function0<CompileTimeConstant<?>>() {
@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<CompileTimeConstant<?>>() {
@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:
@@ -196,7 +196,7 @@ public class DescriptorSerializer {
}
}
hasConstant = propertyDescriptor.getCompileTimeInitializer() != null;
hasConstant = !propertyDescriptor.isVar() && propertyDescriptor.getCompileTimeInitializer() != null;
}
builder.setFlags(Flags.getCallableFlags(
@@ -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<CompileTimeConstant<?>>() {
@Nullable
@Override
@@ -73,9 +73,8 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRoo
}
public void setCompileTimeInitializer(@NotNull NullableLazyValue<CompileTimeConstant<?>> 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