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();
}
@@ -0,0 +1,3 @@
class CompositeIterator<T>(vararg iterators: java.util.Iterator<T>){
val iteratorsIter = iterators.iterator()
}
@@ -0,0 +1,6 @@
namespace <root>
internal final class CompositeIterator</*0*/ T : jet.Any?> : jet.Any {
public final /*constructor*/ fun </*0*/ T : jet.Any?><init>(/*0*/ vararg iterators: java.util.Iterator<T> /*jet.Array<java.util.Iterator<T>>*/): CompositeIterator<T>
internal final val iteratorsIter: jet.Iterator<java.util.Iterator<T>>
}
@@ -15,15 +15,12 @@
*/
package org.jetbrains.jet.lang.resolve.lazy;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.io.File;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.TestMetadata;
import org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest;
import java.io.File;
/** This class is generated by {@link org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestGenerator}. DO NOT MODIFY MANUALLY */
public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest {
@@ -1275,11 +1272,6 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTest("compiler/testData/lazyResolve/namespaceComparator/genericFunction.kt");
}
@TestMetadata("iterator.kt")
public void testIterator() throws Exception {
doTest("compiler/testData/lazyResolve/namespaceComparator/iterator.kt");
}
@TestMetadata("packageLevelObject.kt")
public void testPackageLevelObject() throws Exception {
doTest("compiler/testData/lazyResolve/namespaceComparator/packageLevelObject.kt");
@@ -1290,6 +1282,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTest("compiler/testData/lazyResolve/namespaceComparator/simpleClass.kt");
}
@TestMetadata("varargIterator.kt")
public void testVarargIterator() throws Exception {
doTest("compiler/testData/lazyResolve/namespaceComparator/varargIterator.kt");
}
}
public static Test suite() {