Give receiver for chained scope in constructor

This commit is contained in:
Nikolay Krasko
2012-08-13 21:58:51 +04:00
parent 5440738ce4
commit a47257c9c5
2 changed files with 9 additions and 8 deletions
@@ -148,7 +148,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
scope.addLabeledDeclaration(this); scope.addLabeledDeclaration(this);
scope.changeLockLevel(WritableScope.LockLevel.READING); scope.changeLockLevel(WritableScope.LockLevel.READING);
scopeForMemberDeclarationResolution = new ChainedScope(this, scope, getScopeForMemberLookup(), getScopeForClassHeaderResolution()); scopeForMemberDeclarationResolution = new ChainedScope(this, getScopeForMemberLookup().getImplicitReceiver(),
scope, getScopeForMemberLookup(), getScopeForClassHeaderResolution());
} }
return scopeForMemberDeclarationResolution; return scopeForMemberDeclarationResolution;
} }
@@ -33,11 +33,17 @@ import java.util.Set;
*/ */
public class ChainedScope implements JetScope { public class ChainedScope implements JetScope {
private final DeclarationDescriptor containingDeclaration; private final DeclarationDescriptor containingDeclaration;
private final ReceiverDescriptor implicitReceiver;
private final JetScope[] scopeChain; private final JetScope[] scopeChain;
private Collection<DeclarationDescriptor> allDescriptors; private Collection<DeclarationDescriptor> allDescriptors;
public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) { public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) {
this(containingDeclaration, ReceiverDescriptor.NO_RECEIVER, scopes);
}
public ChainedScope(DeclarationDescriptor containingDeclaration, ReceiverDescriptor implicitReceiver, JetScope... scopes) {
this.containingDeclaration = containingDeclaration; this.containingDeclaration = containingDeclaration;
this.implicitReceiver = implicitReceiver;
scopeChain = scopes.clone(); scopeChain = scopes.clone();
} }
@@ -118,13 +124,7 @@ public class ChainedScope implements JetScope {
@NotNull @NotNull
@Override @Override
public ReceiverDescriptor getImplicitReceiver() { public ReceiverDescriptor getImplicitReceiver() {
for (JetScope scope : scopeChain) { return implicitReceiver;
if (scope.getImplicitReceiver() != ReceiverDescriptor.NO_RECEIVER) {
return scope.getImplicitReceiver();
}
}
return ReceiverDescriptor.NO_RECEIVER;
} }
@Override @Override