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 19ff65681ca..5590bcda559 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -10,11 +10,7 @@ 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.TraceBasedRedeclarationHandler; -import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; -import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; -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; import org.jetbrains.jet.lang.types.*; @@ -37,15 +33,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private Modality modality; private Visibility visibility; private TypeConstructor typeConstructor; - private final RedeclarationHandler redeclarationHandler; private final WritableScope scopeForMemberResolution; private final WritableScope scopeForMemberLookup; // This scope contains type parameters but does not contain inner classes private final WritableScope scopeForSupertypeResolution; - private final WritableScope scopeForAnyConstructor; - private final Map scopesForConstructors; - // for primary constructor and property initializers - private final WritableScope scopeForPrimaryConstructor; + private final WritableScope scopeForInitializers; //contains members + primary constructor value parameters + map for backing fields private MutableClassDescriptor classObjectDescriptor; private JetType classObjectType; @@ -57,18 +49,10 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme public MutableClassDescriptor(@NotNull BindingTrace trace, @NotNull DeclarationDescriptor containingDeclaration, @NotNull JetScope outerScope, ClassKind kind) { super(containingDeclaration); TraceBasedRedeclarationHandler redeclarationHandler = new TraceBasedRedeclarationHandler(trace); - this.redeclarationHandler = redeclarationHandler; - this.scopeForMemberLookup = new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler).setDebugName("MemberLookup"); - this.scopeForMemberLookup.changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler).setDebugName("SupertypeResolution"); - this.scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler).setDebugName("MemberResolution"); - this.scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForAnyConstructor = new WritableScopeImpl(scopeForMemberResolution, this, redeclarationHandler).setDebugName("AnyConstrutor"); - this.scopeForAnyConstructor.changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopeForPrimaryConstructor = new WritableScopeImpl(scopeForAnyConstructor, this, redeclarationHandler).setDebugName("PrimaryConstructor"); - this.scopeForPrimaryConstructor.changeLockLevel(WritableScope.LockLevel.BOTH); - this.scopesForConstructors = new HashMap(); + this.scopeForMemberLookup = 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("PropertyInitializers").changeLockLevel(WritableScope.LockLevel.BOTH); this.kind = kind; } @@ -132,32 +116,19 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme public void addConstructor(@NotNull ConstructorDescriptor constructorDescriptor, BindingTrace trace) { assert constructorDescriptor.getContainingDeclaration() == this; -// assert constructorDescriptor.getTypeParameters().size() == getTypeConstructor().getValueParameters().size(); constructors.add(constructorDescriptor); if (defaultType != null) { -// constructorDescriptor.getTypeParameters().addAll(typeParameters); ((ConstructorDescriptorImpl) constructorDescriptor).setReturnType(getDefaultType()); } - - WritableScope scope = constructorDescriptor.isPrimary() ? - scopeForPrimaryConstructor : - new WritableScopeImpl(scopeForAnyConstructor, this, redeclarationHandler).setDebugName("SecondaryConstructor"); - - WritableScope old = scopesForConstructors.put(constructorDescriptor, scope); - if (old != null) { - throw new IllegalStateException(); - } - - for (ValueParameterDescriptor valueParameterDescriptor : constructorDescriptor.getValueParameters()) { - JetParameter parameter = (JetParameter) trace.getBindingContext().get(BindingContext.DESCRIPTOR_TO_DECLARATION, valueParameterDescriptor); - if (parameter.getValOrVarNode() == null || !constructorDescriptor.isPrimary()) { - scope.addVariableDescriptor(valueParameterDescriptor); + if (constructorDescriptor.isPrimary()) { + 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); + } } } - - scope.addLabeledDeclaration(constructorDescriptor); // TODO : Labels for constructors?! - - scope.changeLockLevel(WritableScope.LockLevel.READING); } @Override @@ -166,7 +137,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme callableMembers.add(propertyDescriptor); scopeForMemberLookup.addVariableDescriptor(propertyDescriptor); scopeForMemberResolution.addVariableDescriptor(propertyDescriptor); - scopeForAnyConstructor.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor); + scopeForInitializers.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor); } @Override @@ -299,13 +270,8 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme } @NotNull - public JetScope getScopeForConstructor(@NotNull ConstructorDescriptor constructorDescriptor) { - return scopesForConstructors.get(constructorDescriptor); - } - - @NotNull - public JetScope getScopeForPropertyIntiailizer() { - return scopeForPrimaryConstructor; + public JetScope getScopeForInitializers() { + return scopeForInitializers; } @NotNull @@ -399,12 +365,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme scopeForSupertypeResolution.changeLockLevel(WritableScope.LockLevel.READING); scopeForMemberLookup.changeLockLevel(WritableScope.LockLevel.READING); scopeForMemberResolution.changeLockLevel(WritableScope.LockLevel.READING); - scopeForAnyConstructor.changeLockLevel(WritableScope.LockLevel.READING); - scopeForPrimaryConstructor.changeLockLevel(WritableScope.LockLevel.READING); - for (WritableScope scope : scopesForConstructors.values()) { - scope.changeLockLevel(WritableScope.LockLevel.READING); - } - + scopeForInitializers.changeLockLevel(WritableScope.LockLevel.READING); if (classObjectDescriptor != null) { classObjectDescriptor.lockScopes(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java index 30f49dbfd31..11cf22db63f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java @@ -27,7 +27,6 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab private final boolean isVar; private final ReceiverDescriptor expectedThisObject; private final Set overriddenProperties = Sets.newLinkedHashSet(); - private final Set overridingProperties = Sets.newLinkedHashSet(); private final PropertyDescriptor original; private ReceiverDescriptor receiver; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index d6c8a64c8df..db12d3887a8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -100,7 +100,7 @@ public class BodyResolver { final ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor(); final JetScope scopeForConstructor = primaryConstructor == null ? null - : getInnerScopeForConstructor(primaryConstructor); + : FunctionDescriptorUtil.getFunctionInnerScope(descriptor.getScopeForSupertypeResolution(), primaryConstructor, traceForConstructors); final ExpressionTypingServices typeInferrer = context.getSemanticServices().getTypeInferrerServices(traceForConstructors); // TODO : flow final Map supertypes = Maps.newLinkedHashMap(); @@ -267,10 +267,10 @@ public class BodyResolver { if (jetClassOrObject.hasPrimaryConstructor()) { ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); assert primaryConstructor != null; - final JetScope scopeForConstructor = getInnerScopeForConstructor(primaryConstructor); + final JetScope scopeForInitializers = classDescriptor.getScopeForInitializers(); ExpressionTypingServices typeInferrer = context.getSemanticServices().getTypeInferrerServices(traceForConstructors); for (JetClassInitializer anonymousInitializer : anonymousInitializers) { - typeInferrer.getType(scopeForConstructor, anonymousInitializer.getBody(), NO_EXPECTED_TYPE); + typeInferrer.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE); } } else { @@ -285,15 +285,19 @@ public class BodyResolver { JetSecondaryConstructor constructor = entry.getKey(); ConstructorDescriptor descriptor = entry.getValue(); - resolveSecondaryConstructorBody(constructor, descriptor, ((MutableClassDescriptor) descriptor.getContainingDeclaration()).getScopeForMemberResolution()); + resolveSecondaryConstructorBody(constructor, descriptor); assert descriptor.getReturnType() != null; } } - private void resolveSecondaryConstructorBody(JetSecondaryConstructor declaration, final ConstructorDescriptor descriptor, final JetScope declaringScope) { + private void resolveSecondaryConstructorBody(JetSecondaryConstructor declaration, final ConstructorDescriptor descriptor) { if (!context.completeAnalysisNeeded(declaration)) return; - final JetScope functionInnerScope = getInnerScopeForConstructor(descriptor); + MutableClassDescriptor classDescriptor = (MutableClassDescriptor) descriptor.getContainingDeclaration(); + final JetScope scopeForSupertypeInitializers = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForSupertypeResolution(), descriptor, traceForConstructors); + //contains only constructor parameters + final JetScope scopeForConstructorBody = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForInitializers(), descriptor, traceForConstructors); + //contains members & backing fields final CallResolver callResolver = new CallResolver(context.getSemanticServices(), DataFlowInfo.EMPTY); // TODO: dataFlowInfo @@ -313,8 +317,7 @@ public class BodyResolver { public void visitDelegationToSuperCallSpecifier(JetDelegatorToSuperCall call) { JetTypeReference typeReference = call.getTypeReference(); if (typeReference != null) { - callResolver.resolveCall(context.getTrace(), functionInnerScope, - CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE); + callResolver.resolveCall(context.getTrace(), scopeForSupertypeInitializers, CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE); } } @@ -325,7 +328,7 @@ public class BodyResolver { ClassDescriptor classDescriptor = descriptor.getContainingDeclaration(); callResolver.resolveCall(context.getTrace(), - functionInnerScope, + scopeForSupertypeInitializers, CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE); // call.getThisReference(), // classDescriptor, @@ -357,20 +360,12 @@ public class BodyResolver { } JetExpression bodyExpression = declaration.getBodyExpression(); if (bodyExpression != null) { - //context.getDescriptorResolver().computeFlowData(declaration, bodyExpression); - //JetFlowInformationProvider flowInformationProvider = context.getDescriptorResolver().computeFlowData(declaration, bodyExpression); ExpressionTypingServices typeInferrer = context.getSemanticServices().getTypeInferrerServices(traceForConstructors); - typeInferrer.checkFunctionReturnType(functionInnerScope, declaration, JetStandardClasses.getUnitType()); + typeInferrer.checkFunctionReturnType(scopeForConstructorBody, declaration, JetStandardClasses.getUnitType()); } } - @NotNull - private JetScope getInnerScopeForConstructor(@NotNull ConstructorDescriptor descriptor) { - MutableClassDescriptor mutableClassDescriptor = (MutableClassDescriptor) descriptor.getContainingDeclaration(); - return mutableClassDescriptor.getScopeForConstructor(descriptor); - } - private void resolvePropertyDeclarationBodies() { // Member properties 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 66de67baa15..bea45569b2c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -74,7 +74,7 @@ public class DeclarationResolver { MutableClassDescriptor classDescriptor = entry.getValue(); resolveFunctionAndPropertyHeaders(jetClass.getDeclarations(), classDescriptor.getScopeForMemberResolution(), - classDescriptor.getScopeForPropertyIntiailizer(), classDescriptor.getScopeForMemberResolution(), + classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(), classDescriptor); // processPrimaryConstructor(classDescriptor, jetClass); // for (JetSecondaryConstructor jetConstructor : jetClass.getSecondaryConstructors()) { @@ -86,7 +86,7 @@ public class DeclarationResolver { MutableClassDescriptor classDescriptor = entry.getValue(); resolveFunctionAndPropertyHeaders(object.getDeclarations(), classDescriptor.getScopeForMemberResolution(), - classDescriptor.getScopeForPropertyIntiailizer(), classDescriptor.getScopeForMemberResolution(), + classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(), classDescriptor); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 8a5bf13be62..a896a2bf4e5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -161,6 +161,9 @@ public class CallResolver { else if (calleeExpression instanceof JetThisReferenceExpression) { functionReference = (JetThisReferenceExpression) calleeExpression; DeclarationDescriptor containingDeclaration = scope.getContainingDeclaration(); + if (containingDeclaration instanceof ConstructorDescriptor) { + containingDeclaration = containingDeclaration.getContainingDeclaration(); + } assert containingDeclaration instanceof ClassDescriptor; ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java index 4716d808cc0..e9002d3cc64 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java @@ -15,7 +15,7 @@ public interface WritableScope extends JetScope { READING, } - void changeLockLevel(LockLevel lockLevel); + WritableScope changeLockLevel(LockLevel lockLevel); void addLabeledDeclaration(@NotNull DeclarationDescriptor descriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java index ecca869bd2c..540d5a456de 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java @@ -36,11 +36,12 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement private LockLevel lockLevel = LockLevel.WRITING; @Override - public void changeLockLevel(LockLevel lockLevel) { + public WritableScope changeLockLevel(LockLevel lockLevel) { if (lockLevel.ordinal() < this.lockLevel.ordinal()) { throw new IllegalStateException("cannot lower lock level from " + this.lockLevel + " to " + lockLevel); } this.lockLevel = lockLevel; + return this; } protected void checkMayRead() { diff --git a/compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt510.jet b/compiler/testData/diagnostics/tests/control-flow-analysis/kt510.jet similarity index 100% rename from compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt510.jet rename to compiler/testData/diagnostics/tests/control-flow-analysis/kt510.jet diff --git a/compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt607.jet b/compiler/testData/diagnostics/tests/control-flow-analysis/kt607.jet similarity index 100% rename from compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt607.jet rename to compiler/testData/diagnostics/tests/control-flow-analysis/kt607.jet diff --git a/compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt609.jet b/compiler/testData/diagnostics/tests/control-flow-analysis/kt609.jet similarity index 100% rename from compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt609.jet rename to compiler/testData/diagnostics/tests/control-flow-analysis/kt609.jet diff --git a/compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt610.jet b/compiler/testData/diagnostics/tests/control-flow-analysis/kt610.jet similarity index 100% rename from compiler/testData/diagnostics/tests/regressions/control-flow-analysis/kt610.jet rename to compiler/testData/diagnostics/tests/control-flow-analysis/kt610.jet diff --git a/compiler/testData/diagnostics/tests/scopes/kt250.617.10.jet b/compiler/testData/diagnostics/tests/scopes/kt250.617.10.jet new file mode 100644 index 00000000000..1b0a3c71177 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/kt250.617.10.jet @@ -0,0 +1,52 @@ +// +JDK + +namespace kt_250_617_10 + +import java.util.ArrayList +import java.util.HashMap + +//KT-250 Incorrect variable resolve in constructor arguments of superclass +open class A(val x: Int) +class B(y: Int) : A(x) //x is resolved as a property in a, so no error is generated + +//KT-617 Prohibit dollars in call to superclass constructors +open class M(p: Int) +class N(val p: Int) : A($p) + +//KT-10 Don't allow to use properties in supertype initializers +open class Element() +class TextElement(name: String) : Element() + +abstract class Tag(val name : String) { + val children = ArrayList() + val attributes = HashMap() +} + +abstract class TagWithText(name : String) : Tag(name) { + fun String.plus() { + children.add(TextElement(this)) + } +} + +open class BodyTag(name : String) : TagWithText(name) { +} + +class Body() : BodyTag(name) { // Must be an error! +} +class Body1() : BodyTag(this.name) { // Must be an error! +} + +//more tests + +open class X(p: Int, r: Int) { + val s = "s" +} + +class Y(i: Int) : X(i, rrr) { + val rrr = 3 + this(s: Int, r: Int) : this(s, rrr) +} + +class Z(val i: Int) : X(s, x) { + val x = 2 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt421Scopes.jet b/compiler/testData/diagnostics/tests/scopes/kt421Scopes.jet similarity index 100% rename from compiler/testData/diagnostics/tests/regressions/kt421Scopes.jet rename to compiler/testData/diagnostics/tests/scopes/kt421Scopes.jet