A module can look up a namespace (package view) by FqName

This commit is contained in:
Andrey Breslav
2013-04-17 13:36:17 +04:00
parent e88875eb20
commit 12cd0675bc
9 changed files with 33 additions and 19 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorParent; import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorParent;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.List; import java.util.List;
@@ -31,7 +32,8 @@ public interface ModuleDescriptor extends DeclarationDescriptor, NamespaceDescri
@Nullable @Nullable
DeclarationDescriptor getContainingDeclaration(); DeclarationDescriptor getContainingDeclaration();
NamespaceDescriptor getRootNamespace(); @Nullable
NamespaceDescriptor getNamespace(@NotNull FqName fqName);
@NotNull @NotNull
ModuleConfiguration getModuleConfiguration(); ModuleConfiguration getModuleConfiguration();
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.TypeSubstitutor;
@@ -63,9 +64,16 @@ public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements C
return null; return null;
} }
@Nullable
@Override @Override
public NamespaceDescriptor getRootNamespace() { public NamespaceDescriptor getNamespace(@NotNull FqName fqName) {
return rootNamepsace; if (fqName.isRoot()) return rootNamepsace;
NamespaceDescriptor current = rootNamepsace;
for (Name simpleName : fqName.pathSegments()) {
current = current.getMemberScope().getNamespace(simpleName);
if (current == null) return null;
}
return current;
} }
@NotNull @NotNull
@@ -35,7 +35,9 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
@@ -44,7 +46,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.plugin.JetFileType; import org.jetbrains.jet.plugin.JetFileType;
@@ -282,8 +283,8 @@ public class KotlinBuiltIns {
@NotNull @NotNull
public NamespaceDescriptor getBuiltInsPackage() { public NamespaceDescriptor getBuiltInsPackage() {
NamespaceDescriptor namespace = getBuiltInsModule().getRootNamespace().getMemberScope().getNamespace(BUILT_INS_PACKAGE_NAME); NamespaceDescriptor namespace = getBuiltInsModule().getNamespace(BUILT_INS_PACKAGE_FQ_NAME);
assert namespace != null : "Built ins namespace not found: " + BUILT_INS_PACKAGE_NAME; assert namespace != null : "Built ins namespace not found: " + BUILT_INS_PACKAGE_FQ_NAME;
return namespace; return namespace;
} }
@@ -23,6 +23,7 @@ import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTest;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -43,8 +44,8 @@ public abstract class AbstractLazyResolveDiagnosticsTest extends AbstractJetDiag
ModuleDescriptor eagerModule = LazyResolveTestUtil.resolveEagerly(jetFiles, getEnvironment()); ModuleDescriptor eagerModule = LazyResolveTestUtil.resolveEagerly(jetFiles, getEnvironment());
String path = JetTestUtils.getFilePath(new File(FileUtil.getRelativePath(TEST_DATA_DIR, testDataFile))); String path = JetTestUtils.getFilePath(new File(FileUtil.getRelativePath(TEST_DATA_DIR, testDataFile)));
NamespaceDescriptor expected = eagerModule.getRootNamespace(); NamespaceDescriptor expected = eagerModule.getNamespace(FqName.ROOT);
NamespaceDescriptor actual = lazyModule.getRootNamespace(); NamespaceDescriptor actual = lazyModule.getNamespace(FqName.ROOT);
String txtFileRelativePath = path.replaceAll("\\.kt$|\\.ktscript", ".txt"); String txtFileRelativePath = path.replaceAll("\\.kt$|\\.ktscript", ".txt");
File txtFile = new File("compiler/testData/lazyResolve/diagnostics/" + txtFileRelativePath); File txtFile = new File("compiler/testData/lazyResolve/diagnostics/" + txtFileRelativePath);
@@ -25,8 +25,8 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.test.util.NamespaceComparator; import org.jetbrains.jet.test.util.NamespaceComparator;
@@ -66,9 +66,9 @@ public abstract class AbstractLazyResolveNamespaceComparingTest extends KotlinTe
ModuleDescriptor eagerModule = LazyResolveTestUtil.resolveEagerly(files, getEnvironment()); ModuleDescriptor eagerModule = LazyResolveTestUtil.resolveEagerly(files, getEnvironment());
ModuleDescriptor lazyModule = LazyResolveTestUtil.resolveLazily(files, getEnvironment()); ModuleDescriptor lazyModule = LazyResolveTestUtil.resolveLazily(files, getEnvironment());
Name test = Name.identifier("test"); FqName test = new FqName("test");
NamespaceDescriptor actual = lazyModule.getRootNamespace().getMemberScope().getNamespace(test); NamespaceDescriptor actual = lazyModule.getNamespace(test);
NamespaceDescriptor expected = eagerModule.getRootNamespace().getMemberScope().getNamespace(test); NamespaceDescriptor expected = eagerModule.getNamespace(test);
File serializeResultsTo = new File(FileUtil.getNameWithoutExtension(testFileName) + ".txt"); File serializeResultsTo = new File(FileUtil.getNameWithoutExtension(testFileName) + ".txt");
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.test.util.NamespaceComparator; import org.jetbrains.jet.test.util.NamespaceComparator;
@@ -56,8 +57,8 @@ public class LazyResolveStdlibLoadingTest extends KotlinTestWithEnvironmentManag
ModuleDescriptor lazyModule = LazyResolveTestUtil.resolveLazily(files, stdlibEnvironment); ModuleDescriptor lazyModule = LazyResolveTestUtil.resolveLazily(files, stdlibEnvironment);
for (Name name : namespaceShortNames) { for (Name name : namespaceShortNames) {
NamespaceDescriptor eager = module.getRootNamespace().getMemberScope().getNamespace(name); NamespaceDescriptor eager = module.getNamespace(FqName.topLevel(name));
NamespaceDescriptor lazy = lazyModule.getRootNamespace().getMemberScope().getNamespace(name); NamespaceDescriptor lazy = lazyModule.getNamespace(FqName.topLevel(name));
NamespaceComparator.compareNamespaces(eager, lazy, NamespaceComparator.RECURSIVE, null); NamespaceComparator.compareNamespaces(eager, lazy, NamespaceComparator.RECURSIVE, null);
} }
} }
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment; import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil; import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
@@ -71,7 +72,7 @@ public class BoundsSubstitutorTest extends KotlinTestWithEnvironment {
private void doTest(String text, String expected) { private void doTest(String text, String expected) {
JetFile jetFile = JetPsiFactory.createFile(getProject(), "fun.kt", text); JetFile jetFile = JetPsiFactory.createFile(getProject(), "fun.kt", text);
ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment()); ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment());
Collection<FunctionDescriptor> functions = module.getRootNamespace().getMemberScope().getFunctions(Name.identifier("f")); Collection<FunctionDescriptor> functions = module.getNamespace(FqName.ROOT).getMemberScope().getFunctions(Name.identifier("f"));
assert functions.size() == 1 : "Many functions defined"; assert functions.size() == 1 : "Many functions defined";
FunctionDescriptor function = ContainerUtil.getFirstItem(functions); FunctionDescriptor function = ContainerUtil.getFirstItem(functions);
@@ -40,7 +40,6 @@ import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil; import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.jet.lang.types.CommonSupertypes; import org.jetbrains.jet.lang.types.CommonSupertypes;
@@ -580,7 +579,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
getEnvironment() getEnvironment()
); );
NamespaceDescriptor testData = moduleDescriptor.getRootNamespace().getMemberScope().getNamespace(Name.identifier("testData")); NamespaceDescriptor testData = moduleDescriptor.getNamespace(new FqName("testData"));
return addImports(testData.getMemberScope()); return addImports(testData.getMemberScope());
} }
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment; import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment;
import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil; import org.jetbrains.jet.lang.resolve.lazy.LazyResolveTestUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
@@ -82,7 +83,7 @@ public class TypeSubstitutorTest extends KotlinTestWithEnvironment {
String text = FileUtil.loadFile(new File("compiler/testData/type-substitutor.kt")); String text = FileUtil.loadFile(new File("compiler/testData/type-substitutor.kt"));
JetFile jetFile = JetPsiFactory.createFile(getProject(), text); JetFile jetFile = JetPsiFactory.createFile(getProject(), text);
ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment()); ModuleDescriptor module = LazyResolveTestUtil.resolveLazily(Collections.singletonList(jetFile), getEnvironment());
JetScope topLevelDeclarations = module.getRootNamespace().getMemberScope(); JetScope topLevelDeclarations = module.getNamespace(FqName.ROOT).getMemberScope();
ClassifierDescriptor contextClass = topLevelDeclarations.getClassifier(Name.identifier("___Context")); ClassifierDescriptor contextClass = topLevelDeclarations.getClassifier(Name.identifier("___Context"));
assert contextClass instanceof ClassDescriptor; assert contextClass instanceof ClassDescriptor;
WritableScopeImpl typeParameters = new WritableScopeImpl(JetScope.EMPTY, module, RedeclarationHandler.THROW_EXCEPTION, WritableScopeImpl typeParameters = new WritableScopeImpl(JetScope.EMPTY, module, RedeclarationHandler.THROW_EXCEPTION,