Chain scope for merging in lazy package descriptor

This commit is contained in:
Nikolay Krasko
2012-08-08 15:22:27 +04:00
parent 8d6b16eb23
commit 0faea1ed0b
7 changed files with 56 additions and 16 deletions
@@ -24,10 +24,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
import org.jetbrains.jet.lang.resolve.scopes.*;
import java.util.Collections;
@@ -44,12 +41,14 @@ public class LazyPackageDescriptor extends AbstractNamespaceDescriptorImpl imple
@NotNull PackageMemberDeclarationProvider declarationProvider
) {
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), name);
WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, this, RedeclarationHandler.DO_NOTHING, "Package scope");
resolveSession.getModuleConfiguration().extendNamespaceScope(resolveSession.getTrace(), this, scope);
LazyPackageMemberScope lazyPackageMemberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this);
scope.importScope(lazyPackageMemberScope);
scope.changeLockLevel(WritableScope.LockLevel.READING);
this.memberScope = scope;
LazyPackageMemberScope lazyPackageMemberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this);
this.memberScope = new ChainedScope(containingDeclaration, lazyPackageMemberScope, scope);
}
@NotNull
@@ -118,7 +118,7 @@ public class ChainedScope implements JetScope {
@NotNull
@Override
public ReceiverDescriptor getImplicitReceiver() {
throw new UnsupportedOperationException(); // TODO
return ReceiverDescriptor.NO_RECEIVER;
}
@Override
@@ -0,0 +1,7 @@
package test
object SomeObject {
fun test(a: Int) : Int {
return 0
}
}
@@ -0,0 +1,7 @@
namespace test
internal final object test.SomeObject : jet.Any {
internal final /*constructor*/ fun <init>(): test.SomeObject
internal final fun test(/*0*/ a: jet.Int): jet.Int
}
internal final val SomeObject: test.SomeObject
@@ -1,3 +1,6 @@
namespace test
internal final object test.Bar : jet.Any {
internal final /*constructor*/ fun <init>(): test.Bar
}
internal final val Bar: test.Bar
@@ -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.AbstractLazyResolveNamespaceComparingTest}. DO NOT MODIFY MANUALLY */
public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest {
@@ -1272,7 +1269,9 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
@TestMetadata("compiler/testData/lazyResolve/namespaceComparator")
public static class NamespaceComparator extends AbstractLazyResolveNamespaceComparingTest {
public void testAllFilesPresentInNamespaceComparator() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/lazyResolve/namespaceComparator"), "kt", false);
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(),
"org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest",
new File("compiler/testData/lazyResolve/namespaceComparator"), "kt", false);
}
@TestMetadata("enum.kt")
@@ -1295,6 +1294,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/innerObject.kt");
}
@TestMetadata("objectMembers.kt")
public void testObjectMembers() throws Exception {
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/objectMembers.kt");
}
@TestMetadata("OverrideWithErrors.kt")
public void testOverrideWithErrors() throws Exception {
doTestSinglePackage("compiler/testData/lazyResolve/namespaceComparator/OverrideWithErrors.kt");
@@ -20,6 +20,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.codegen.PropertyCodegen;
@@ -125,9 +126,10 @@ public class NamespaceComparator {
//deferred.assertTrue("namespace " + nsa.getName() + " is empty", !nsa.getMemberScope().getAllDescriptors().isEmpty());
Set<Name> classifierNames = new HashSet<Name>();
Set<Name> propertyNames = new HashSet<Name>();
Set<Name> functionNames = new HashSet<Name>();
Set<Name> classifierNames = Sets.newHashSet();
Set<Name> propertyNames = Sets.newHashSet();
Set<Name> functionNames = Sets.newHashSet();
Set<Name> objectNames = Sets.newHashSet();
for (DeclarationDescriptor ad : nsa.getMemberScope().getAllDescriptors()) {
if (ad instanceof ClassifierDescriptor) {
@@ -162,6 +164,10 @@ public class NamespaceComparator {
}
}
for (ClassDescriptor objectDescriptor : nsa.getMemberScope().getObjectDescriptors()) {
objectNames.add(objectDescriptor.getName());
}
for (Name name : sorted(classifierNames)) {
ClassifierDescriptor ca = nsa.getMemberScope().getClassifier(name);
ClassifierDescriptor cb = nsb.getMemberScope().getClassifier(name);
@@ -170,6 +176,14 @@ public class NamespaceComparator {
compareClassifiers(ca, cb, sb);
}
for (Name name : sorted(objectNames)) {
ClassifierDescriptor ca = nsa.getMemberScope().getObjectDescriptor(name);
ClassifierDescriptor cb = nsb.getMemberScope().getObjectDescriptor(name);
deferred.assertTrue("Object not found in " + nsa + ": " + name, ca != null);
deferred.assertTrue("Object not found in " + nsb + ": " + name, cb != null);
compareClassifiers(ca, cb, sb);
}
for (Name name : sorted(propertyNames)) {
Collection<VariableDescriptor> pa = nsa.getMemberScope().getProperties(name);
Collection<VariableDescriptor> pb = nsb.getMemberScope().getProperties(name);
@@ -729,6 +743,12 @@ public class NamespaceComparator {
memberStrings.add(memberSb.toString());
}
//for (DeclarationDescriptor object : memberScope.getObjectDescriptors()) {
// StringBuilder objectSb = new StringBuilder();
// new FullContentSerialier(objectSb).serialize(object);
// memberStrings.add(objectSb.toString());
//}
Collections.sort(memberStrings, new MemberComparator());
for (String memberString : memberStrings) {