Get rid of dependency of class descriptors on BindingTrace

This commit is contained in:
Alexander Udalov
2013-08-21 18:18:26 +04:00
parent 9351369052
commit f5faf8acb2
4 changed files with 33 additions and 29 deletions
@@ -24,7 +24,9 @@ import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.TraceUtil;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue;
import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValue; import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValue;
@@ -36,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.*; import java.util.*;
@@ -282,14 +285,14 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
classObject.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList()); classObject.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
classObject.createTypeConstructor(); classObject.createTypeConstructor();
// TODO: do something if trace has errors?
BindingTrace trace = new BindingTraceContext();
ConstructorDescriptorImpl primaryConstructor = DescriptorResolver.createPrimaryConstructorForObject(classObject); ConstructorDescriptorImpl primaryConstructor = DescriptorResolver.createPrimaryConstructorForObject(classObject);
primaryConstructor.setReturnType(classObject.getDefaultType()); primaryConstructor.setReturnType(classObject.getDefaultType());
classObject.setPrimaryConstructor(primaryConstructor, trace); classObject.setPrimaryConstructor(primaryConstructor);
classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValuesMethod(classObject, trace)); JetType defaultType = getDefaultType();
classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValueOfMethod(classObject, trace)); JetType defaultTypeArray = KotlinBuiltIns.getInstance().getArrayType(defaultType);
classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValuesMethod(classObject, defaultTypeArray));
classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValueOfMethod(classObject, defaultType));
return classObject; return classObject;
} }
@@ -20,12 +20,10 @@ import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -65,32 +63,26 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void addConstructor(@NotNull ConstructorDescriptor constructorDescriptor, @NotNull BindingTrace trace) { public void setPrimaryConstructor(@NotNull ConstructorDescriptor constructorDescriptor) {
if (constructorDescriptor.getContainingDeclaration() != this) { assert primaryConstructor == null : "Primary constructor assigned twice " + this;
throw new IllegalStateException("invalid containing declaration of constructor"); primaryConstructor = constructorDescriptor;
}
constructors.add(constructorDescriptor); constructors.add(constructorDescriptor);
if (defaultType != null) { if (defaultType != null) {
((ConstructorDescriptorImpl) constructorDescriptor).setReturnType(getDefaultType()); ((ConstructorDescriptorImpl) constructorDescriptor).setReturnType(getDefaultType());
} }
boolean primary = constructorDescriptor.isPrimary(); if (constructorDescriptor.isPrimary()) {
if (primary) {
setUpScopeForInitializers(constructorDescriptor); setUpScopeForInitializers(constructorDescriptor);
for (ValueParameterDescriptor valueParameterDescriptor : constructorDescriptor.getValueParameters()) {
JetParameter parameter = (JetParameter) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), valueParameterDescriptor);
assert parameter != null;
if (parameter.getValOrVarNode() == null) {
getWritableScopeForInitializers().addVariableDescriptor(valueParameterDescriptor);
}
}
} }
} }
public void setPrimaryConstructor(@NotNull ConstructorDescriptor constructorDescriptor, BindingTrace trace) { public void addConstructorParametersToInitializersScope(@NotNull Collection<? extends VariableDescriptor> variables) {
assert this.primaryConstructor == null : "Primary constructor assigned twice " + this; WritableScope scope = getWritableScopeForInitializers();
this.primaryConstructor = constructorDescriptor; for (VariableDescriptor variable : variables) {
addConstructor(constructorDescriptor, trace); scope.addVariableDescriptor(variable);
}
} }
@NotNull @NotNull
@@ -298,6 +298,7 @@ public class DeclarationResolver {
List<ValueParameterDescriptor> valueParameterDescriptors = constructorDescriptor.getValueParameters(); List<ValueParameterDescriptor> valueParameterDescriptors = constructorDescriptor.getValueParameters();
List<JetParameter> primaryConstructorParameters = klass.getPrimaryConstructorParameters(); List<JetParameter> primaryConstructorParameters = klass.getPrimaryConstructorParameters();
assert valueParameterDescriptors.size() == primaryConstructorParameters.size(); assert valueParameterDescriptors.size() == primaryConstructorParameters.size();
List<ValueParameterDescriptor> notProperties = new ArrayList<ValueParameterDescriptor>();
for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) { for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) {
JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex());
if (parameter.getValOrVarNode() != null) { if (parameter.getValOrVarNode() != null) {
@@ -310,9 +311,14 @@ public class DeclarationResolver {
classDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); classDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor);
context.getPrimaryConstructorParameterProperties().put(parameter, propertyDescriptor); context.getPrimaryConstructorParameterProperties().put(parameter, propertyDescriptor);
} }
else {
notProperties.add(valueParameterDescriptor);
}
} }
if (classDescriptor.getKind() != ClassKind.TRAIT) { if (classDescriptor.getKind() != ClassKind.TRAIT) {
classDescriptor.setPrimaryConstructor(constructorDescriptor, trace); classDescriptor.setPrimaryConstructor(constructorDescriptor);
classDescriptor.addConstructorParametersToInitializersScope(notProperties);
} }
} }
} }
@@ -28,7 +28,10 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.WriteThroughScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.SubstitutionUtils; import org.jetbrains.jet.lang.types.SubstitutionUtils;
import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.TypeConstructor;
@@ -612,7 +615,7 @@ public class TypeHierarchyResolver {
) { ) {
ConstructorDescriptorImpl constructorDescriptor = DescriptorResolver ConstructorDescriptorImpl constructorDescriptor = DescriptorResolver
.createAndRecordPrimaryConstructorForObject(object, mutableClassDescriptor, trace); .createAndRecordPrimaryConstructorForObject(object, mutableClassDescriptor, trace);
mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, trace); mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor);
return constructorDescriptor; return constructorDescriptor;
} }