From f5faf8acb219c962aa2e07a4bd6fe3b07479a21f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 21 Aug 2013 18:18:26 +0400 Subject: [PATCH] Get rid of dependency of class descriptors on BindingTrace --- .../DeserializedClassDescriptor.java | 15 +++++---- .../impl/MutableClassDescriptor.java | 32 +++++++------------ .../jet/lang/resolve/DeclarationResolver.java | 8 ++++- .../lang/resolve/TypeHierarchyResolver.java | 7 ++-- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index 150dc5f5250..b5c6cd36ac9 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -24,7 +24,9 @@ import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; 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.NotNullLazyValue; 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.types.JetType; import org.jetbrains.jet.lang.types.TypeConstructor; +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.*; @@ -282,14 +285,14 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements classObject.setTypeParameterDescriptors(Collections.emptyList()); classObject.createTypeConstructor(); - // TODO: do something if trace has errors? - BindingTrace trace = new BindingTraceContext(); ConstructorDescriptorImpl primaryConstructor = DescriptorResolver.createPrimaryConstructorForObject(classObject); primaryConstructor.setReturnType(classObject.getDefaultType()); - classObject.setPrimaryConstructor(primaryConstructor, trace); + classObject.setPrimaryConstructor(primaryConstructor); - classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValuesMethod(classObject, trace)); - classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValueOfMethod(classObject, trace)); + JetType defaultType = getDefaultType(); + JetType defaultTypeArray = KotlinBuiltIns.getInstance().getArrayType(defaultType); + classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValuesMethod(classObject, defaultTypeArray)); + classObject.getBuilder().addFunctionDescriptor(DescriptorResolver.createEnumClassObjectValueOfMethod(classObject, defaultType)); return classObject; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java index 1a4c0997569..510bfd47750 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java @@ -20,12 +20,10 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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.scopes.*; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -65,32 +63,26 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - public void addConstructor(@NotNull ConstructorDescriptor constructorDescriptor, @NotNull BindingTrace trace) { - if (constructorDescriptor.getContainingDeclaration() != this) { - throw new IllegalStateException("invalid containing declaration of constructor"); - } + public void setPrimaryConstructor(@NotNull ConstructorDescriptor constructorDescriptor) { + assert primaryConstructor == null : "Primary constructor assigned twice " + this; + primaryConstructor = constructorDescriptor; + constructors.add(constructorDescriptor); + if (defaultType != null) { ((ConstructorDescriptorImpl) constructorDescriptor).setReturnType(getDefaultType()); } - boolean primary = constructorDescriptor.isPrimary(); - if (primary) { + if (constructorDescriptor.isPrimary()) { 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) { - assert this.primaryConstructor == null : "Primary constructor assigned twice " + this; - this.primaryConstructor = constructorDescriptor; - addConstructor(constructorDescriptor, trace); + public void addConstructorParametersToInitializersScope(@NotNull Collection variables) { + WritableScope scope = getWritableScopeForInitializers(); + for (VariableDescriptor variable : variables) { + scope.addVariableDescriptor(variable); + } } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 50f3e3ac70f..0d55b8bb8c7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -298,6 +298,7 @@ public class DeclarationResolver { List valueParameterDescriptors = constructorDescriptor.getValueParameters(); List primaryConstructorParameters = klass.getPrimaryConstructorParameters(); assert valueParameterDescriptors.size() == primaryConstructorParameters.size(); + List notProperties = new ArrayList(); for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) { JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); if (parameter.getValOrVarNode() != null) { @@ -310,9 +311,14 @@ public class DeclarationResolver { classDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); context.getPrimaryConstructorParameterProperties().put(parameter, propertyDescriptor); } + else { + notProperties.add(valueParameterDescriptor); + } } + if (classDescriptor.getKind() != ClassKind.TRAIT) { - classDescriptor.setPrimaryConstructor(constructorDescriptor, trace); + classDescriptor.setPrimaryConstructor(constructorDescriptor); + classDescriptor.addConstructorParametersToInitializersScope(notProperties); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 8b7b9ea28aa..2c510cf6488 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -28,7 +28,10 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.psi.*; 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.SubstitutionUtils; import org.jetbrains.jet.lang.types.TypeConstructor; @@ -612,7 +615,7 @@ public class TypeHierarchyResolver { ) { ConstructorDescriptorImpl constructorDescriptor = DescriptorResolver .createAndRecordPrimaryConstructorForObject(object, mutableClassDescriptor, trace); - mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, trace); + mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor); return constructorDescriptor; }