From e4a658fbeb66b29cae2e6c568203a5230505600d Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 15 Mar 2012 19:12:14 +0400 Subject: [PATCH] Change to frontend declaration descriptor hierarchy (property initializers belong to constructor instead of a class) --- .../descriptors/MutableClassDescriptor.java | 31 +++++++++++++------ .../jet/lang/resolve/DescriptorResolver.java | 4 +-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 672024b25b0..f71af72b073 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -22,10 +22,7 @@ import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; -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.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; @@ -43,7 +40,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { private final WritableScope scopeForMemberResolution; // This scope contains type parameters but does not contain inner classes private final WritableScope scopeForSupertypeResolution; - private final WritableScope scopeForInitializers; //contains members + primary constructor value parameters + map for backing fields + private WritableScope scopeForInitializers = null; //contains members + primary constructor value parameters + map for backing fields public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, ClassKind kind) { super(containingDeclaration, kind); @@ -53,7 +50,9 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { setScopeForMemberLookup(new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler).setDebugName("MemberLookup").changeLockLevel(WritableScope.LockLevel.BOTH)); this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler).setDebugName("SupertypeResolution").changeLockLevel(WritableScope.LockLevel.BOTH); this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler).setDebugName("MemberResolution").changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForInitializers = new WritableScopeImpl(scopeForMemberResolution, this, redeclarationHandler).setDebugName("Initializers").changeLockLevel(WritableScope.LockLevel.BOTH); + if (getKind() == ClassKind.TRAIT) { + setUpScopeForInitializers(this); + } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -90,11 +89,12 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { public void addConstructor(@NotNull ConstructorDescriptor constructorDescriptor, @NotNull BindingTrace trace) { super.addConstructor(constructorDescriptor, trace); if (constructorDescriptor.isPrimary()) { + setUpScopeForInitializers(constructorDescriptor); for (ValueParameterDescriptor valueParameterDescriptor : constructorDescriptor.getValueParameters()) { JetParameter parameter = (JetParameter) trace.getBindingContext().get(BindingContext.DESCRIPTOR_TO_DECLARATION, valueParameterDescriptor); assert parameter != null; if (parameter.getValOrVarNode() == null || !constructorDescriptor.isPrimary()) { - scopeForInitializers.addVariableDescriptor(valueParameterDescriptor); + getWritableScopeForInitializers().addVariableDescriptor(valueParameterDescriptor); } } } @@ -168,17 +168,28 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite { public JetScope getScopeForMemberResolution() { return scopeForMemberResolution; } - + + private WritableScope getWritableScopeForInitializers() { + if (scopeForInitializers == null) { + throw new IllegalStateException("Scope for initializers queried before the primary constructor is set"); + } + return scopeForInitializers; + } + @NotNull public JetScope getScopeForInitializers() { - return scopeForInitializers; + return getWritableScopeForInitializers(); + } + + private void setUpScopeForInitializers(@NotNull DeclarationDescriptor containingDeclaration) { + this.scopeForInitializers = new WritableScopeImpl(scopeForMemberResolution, containingDeclaration, RedeclarationHandler.DO_NOTHING).setDebugName("Initializers").changeLockLevel(WritableScope.LockLevel.BOTH); } public void lockScopes() { super.lockScopes(); scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING); scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.READING); - scopeForInitializers.changeLockLevel(WritableScope.LockLevel.READING); + getWritableScopeForInitializers().changeLockLevel(WritableScope.LockLevel.READING); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index a31c7ec8511..4cd112a3f44 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -23,7 +23,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.inject.Inject; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -42,6 +41,7 @@ import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.lazy.LazyValue; import org.jetbrains.jet.util.lazy.LazyValueWithDefault; +import javax.inject.Inject; import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -520,7 +520,7 @@ public class DescriptorResolver { public JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope, @NotNull PropertyDescriptor propertyDescriptor, List typeParameters, ReceiverDescriptor receiver, BindingTrace trace) { - WritableScopeImpl result = new WritableScopeImpl(outerScope, propertyDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope"); + WritableScopeImpl result = new WritableScopeImpl(outerScope, outerScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope"); for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) { result.addTypeParameterDescriptor(typeParameterDescriptor); }