diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java index 011d1d8042b..1b63fcf8092 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java @@ -35,16 +35,8 @@ public class JetNamespaceHeader extends JetReferenceExpression { } @NotNull - public List getParentNamespaceNames() { - List parentParts = findChildrenByType(JetNodeTypes.REFERENCE_EXPRESSION); - JetSimpleNameExpression lastPart = (JetSimpleNameExpression)findLastChildByType(JetNodeTypes.REFERENCE_EXPRESSION); - parentParts.remove(lastPart); - return parentParts; - } - - @Nullable - public JetSimpleNameExpression getLastPartExpression() { - return (JetSimpleNameExpression)findLastChildByType(JetNodeTypes.REFERENCE_EXPRESSION); + public List getNamespaceNames() { + return findChildrenByType(JetNodeTypes.REFERENCE_EXPRESSION); } @Nullable @@ -81,32 +73,31 @@ public class JetNamespaceHeader extends JetReferenceExpression { } @NotNull - public FqName getParentFqName(JetSimpleNameExpression nameExpression) { - String parentQualifiedName = getQualifiedNameParentOf(nameExpression); - return parentQualifiedName.isEmpty() ? FqName.ROOT : new FqName(parentQualifiedName); + public FqName getFqName(JetSimpleNameExpression nameExpression) { + return new FqName(getQualifiedNameOf(nameExpression)); } @NotNull public String getQualifiedName() { if (qualifiedNameCache == null) { - qualifiedNameCache = getQualifiedNameParentOf(null); + qualifiedNameCache = getQualifiedNameOf(null); } return qualifiedNameCache; } @NotNull - private String getQualifiedNameParentOf(@Nullable JetSimpleNameExpression nameExpression) { + private String getQualifiedNameOf(@Nullable JetSimpleNameExpression nameExpression) { StringBuilder builder = new StringBuilder(); for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) { - if (e == nameExpression) { - break; - } - if (builder.length() > 0) { builder.append("."); } builder.append(e.getReferencedName()); + + if (e == nameExpression) { + break; + } } return builder.toString(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 84457d9fbd8..6299628cde0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -903,12 +903,12 @@ public class JetPsiUtil { throw new IllegalArgumentException("Should be called only for files with namespace: " + file); } - List names = header.getParentNamespaceNames(); - if (!(0 <= partIndex && partIndex < names.size() + 1)) { + List names = header.getNamespaceNames(); + if (!(0 <= partIndex && partIndex < names.size())) { throw new IndexOutOfBoundsException(String.format("%s index for file with header %s is out of range", partIndex, header.getText())); } - return (names.size() > partIndex) ? names.get(partIndex) : header.getLastPartExpression(); + return names.get(partIndex); } // Delete given element and all the elements separating it from the neighboring elements of the same class diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java index 7f55500c19f..3ee3f5b6813 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java @@ -17,22 +17,18 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Sets; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; +import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; -import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.resolve.name.FqName; import javax.inject.Inject; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import static org.jetbrains.jet.lang.resolve.BindingContext.*; @@ -61,18 +57,22 @@ public class NamespaceFactoryImpl implements NamespaceFactory { public MutablePackageFragmentDescriptor createPackageFragmentIfNeeded(@NotNull JetFile file) { JetNamespaceHeader namespaceHeader = file.getNamespaceHeader(); - // TODO 2 make this code neater - List allNamespaceNames = new ArrayList(namespaceHeader.getParentNamespaceNames()); - ContainerUtil.addIfNotNull(allNamespaceNames, namespaceHeader.getLastPartExpression()); - for (JetSimpleNameExpression nameExpression : allNamespaceNames) { - FqName parentFqName = namespaceHeader.getParentFqName(nameExpression); - getOrCreatePackageFragment(parentFqName, nameExpression); + assert namespaceHeader != null : "scripts are not supported"; - trace.record(RESOLUTION_SCOPE, nameExpression, module.getPackage(parentFqName).getMemberScope()); + MutablePackageFragmentDescriptor fragment = packageFragmentProvider.getOrCreateFragment(namespaceHeader.getFqName()); + + for (JetSimpleNameExpression nameExpression : namespaceHeader.getNamespaceNames()) { + FqName fqName = namespaceHeader.getFqName(nameExpression); + + PackageViewDescriptor packageView = module.getPackage(fqName); + assert packageView != null : "package not found: " + fqName; + trace.record(REFERENCE_TARGET, nameExpression, packageView); + + PackageViewDescriptor parentPackageView = packageView.getContainingDeclaration(); + assert parentPackageView != null : "package has no parent: " + packageView; + trace.record(RESOLUTION_SCOPE, nameExpression, parentPackageView.getMemberScope()); } - MutablePackageFragmentDescriptor fragment = getOrCreatePackageFragment( - namespaceHeader.getFqName(), namespaceHeader.getLastPartExpression()); storeBindingForFile(file, fragment); return fragment; } @@ -83,19 +83,6 @@ public class NamespaceFactoryImpl implements NamespaceFactory { return packageFragmentProvider.getOrCreateFragment(fqName); } - @NotNull - private MutablePackageFragmentDescriptor getOrCreatePackageFragment( - @NotNull FqName fqName, - @Nullable JetReferenceExpression expression - ) { - MutablePackageFragmentDescriptor fragment = packageFragmentProvider.getOrCreateFragment(fqName); - if (expression != null) { - trace.record(REFERENCE_TARGET, expression, packageFragmentProvider.getModule().getPackage(fqName)); - } - - return fragment; - } - private void storeBindingForFile(@NotNull JetFile file, @NotNull PackageFragmentDescriptor fragment) { trace.record(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file, fragment); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java index 69548151360..095440bf917 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java @@ -32,13 +32,13 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; -import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.resolve.name.SpecialNames; import java.util.Collections; import java.util.List; @@ -48,14 +48,6 @@ public class LazyResolveTestUtil { private LazyResolveTestUtil() { } - public static InjectorForTopDownAnalyzer getEagerInjectorForTopDownAnalyzer(JetCoreEnvironment environment) { - InjectorForTopDownAnalyzer tdaInjectorForLazy = createInjectorForTDA(environment); - // This line is required fro the 'jet' namespace to be filled in with functions - tdaInjectorForLazy.getTopDownAnalyzer().analyzeFiles( - Collections.singletonList(JetPsiFactory.createFile(environment.getProject(), "")), Collections.emptyList()); - return tdaInjectorForLazy; - } - public static InjectorForTopDownAnalyzer createInjectorForTDA(JetCoreEnvironment environment) { JetTestUtils.newTrace(environment); @@ -103,8 +95,8 @@ public class LazyResolveTestUtil { for (JetFile file : files) { JetNamespaceHeader header = file.getNamespaceHeader(); if (header != null) { - List names = header.getParentNamespaceNames(); - Name name = names.isEmpty() ? header.getNameAsName() : names.get(0).getReferencedNameAsName(); + List names = header.getNamespaceNames(); + Name name = names.isEmpty() ? SpecialNames.ROOT_NAMESPACE : names.get(0).getReferencedNameAsName(); shortNames.add(name); } else { diff --git a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java index 6e82654c412..775afe5fb9b 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java @@ -185,10 +185,9 @@ public class ResolveElementCache { } } - Name name = packageNameExpression.getReferencedNameAsName(); - if (Name.isValidIdentifier(name.asString())) { + if (Name.isValidIdentifier(packageNameExpression.getReferencedName())) { if (trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, packageNameExpression) == null) { - FqName fqName = header.getParentFqName(packageNameExpression).child(name); + FqName fqName = header.getFqName(packageNameExpression); PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(fqName); assert packageDescriptor != null: "Package descriptor should be present in session for " + fqName; trace.record(BindingContext.REFERENCE_TARGET, packageNameExpression, packageDescriptor); @@ -405,7 +404,7 @@ public class ResolveElementCache { JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(expression, JetNamespaceHeader.class, false); if (namespaceHeader != null) { PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage( - namespaceHeader.getParentFqName((JetSimpleNameExpression) expression)); + namespaceHeader.getFqName((JetSimpleNameExpression) expression).parent()); if (packageDescriptor != null) { return packageDescriptor.getMemberScope(); }