Lazy resolve: Proper scope when inferring types of member properties

This commit is contained in:
Andrey Breslav
2012-07-10 21:59:01 +04:00
parent 20860cb40b
commit 3266c2bdde
5 changed files with 38 additions and 9 deletions
@@ -76,6 +76,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private JetScope scopeForClassHeaderResolution;
private JetScope scopeForMemberDeclarationResolution;
private JetScope scopeForPropertyInitializerResolution;
public LazyClassDescriptor(
@@ -140,6 +141,25 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
return scopeForMemberDeclarationResolution;
}
public JetScope getScopeForPropertyInitializerResolution() {
ConstructorDescriptor primaryConstructor = getUnsubstitutedPrimaryConstructor();
if (primaryConstructor == null) return getScopeForMemberDeclarationResolution();
if (scopeForPropertyInitializerResolution == null) {
WritableScopeImpl scope = new WritableScopeImpl(
getScopeForMemberDeclarationResolution(), this, RedeclarationHandler.DO_NOTHING, "Property Initializer Resolution");
List<ValueParameterDescriptor> parameters = primaryConstructor.getValueParameters();
for (ValueParameterDescriptor valueParameterDescriptor : parameters) {
scope.addVariableDescriptor(valueParameterDescriptor);
}
scope.changeLockLevel(WritableScope.LockLevel.READING);
scopeForPropertyInitializerResolution = scope;
}
return scopeForPropertyInitializerResolution;
}
@NotNull
@Override
public Collection<ConstructorDescriptor> getConstructors() {
@@ -56,6 +56,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@NotNull
@Override
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
if (declaration instanceof JetProperty) {
return thisDescriptor.getScopeForPropertyInitializerResolution();
}
return thisDescriptor.getScopeForMemberDeclarationResolution();
}