Lazy resolve: Proper scope when inferring types of member properties
This commit is contained in:
@@ -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>>
|
||||
}
|
||||
+6
-9
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user