Simplified API of JetNamespaceHeader and its usages.

This commit is contained in:
Evgeny Gerashchenko
2013-12-02 20:49:43 +04:00
parent df1e92959e
commit 5c22787c15
5 changed files with 33 additions and 64 deletions
@@ -35,16 +35,8 @@ public class JetNamespaceHeader extends JetReferenceExpression {
} }
@NotNull @NotNull
public List<JetSimpleNameExpression> getParentNamespaceNames() { public List<JetSimpleNameExpression> getNamespaceNames() {
List<JetSimpleNameExpression> parentParts = findChildrenByType(JetNodeTypes.REFERENCE_EXPRESSION); return 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);
} }
@Nullable @Nullable
@@ -81,32 +73,31 @@ public class JetNamespaceHeader extends JetReferenceExpression {
} }
@NotNull @NotNull
public FqName getParentFqName(JetSimpleNameExpression nameExpression) { public FqName getFqName(JetSimpleNameExpression nameExpression) {
String parentQualifiedName = getQualifiedNameParentOf(nameExpression); return new FqName(getQualifiedNameOf(nameExpression));
return parentQualifiedName.isEmpty() ? FqName.ROOT : new FqName(parentQualifiedName);
} }
@NotNull @NotNull
public String getQualifiedName() { public String getQualifiedName() {
if (qualifiedNameCache == null) { if (qualifiedNameCache == null) {
qualifiedNameCache = getQualifiedNameParentOf(null); qualifiedNameCache = getQualifiedNameOf(null);
} }
return qualifiedNameCache; return qualifiedNameCache;
} }
@NotNull @NotNull
private String getQualifiedNameParentOf(@Nullable JetSimpleNameExpression nameExpression) { private String getQualifiedNameOf(@Nullable JetSimpleNameExpression nameExpression) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) { for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) {
if (e == nameExpression) {
break;
}
if (builder.length() > 0) { if (builder.length() > 0) {
builder.append("."); builder.append(".");
} }
builder.append(e.getReferencedName()); builder.append(e.getReferencedName());
if (e == nameExpression) {
break;
}
} }
return builder.toString(); return builder.toString();
} }
@@ -903,12 +903,12 @@ public class JetPsiUtil {
throw new IllegalArgumentException("Should be called only for files with namespace: " + file); throw new IllegalArgumentException("Should be called only for files with namespace: " + file);
} }
List<JetSimpleNameExpression> names = header.getParentNamespaceNames(); List<JetSimpleNameExpression> names = header.getNamespaceNames();
if (!(0 <= partIndex && partIndex < names.size() + 1)) { 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())); 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 // Delete given element and all the elements separating it from the neighboring elements of the same class
@@ -17,22 +17,18 @@
package org.jetbrains.jet.lang.resolve; package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; 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.descriptors.impl.MutablePackageFragmentDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader; 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.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.BindingContext.*;
@@ -61,18 +57,22 @@ public class NamespaceFactoryImpl implements NamespaceFactory {
public MutablePackageFragmentDescriptor createPackageFragmentIfNeeded(@NotNull JetFile file) { public MutablePackageFragmentDescriptor createPackageFragmentIfNeeded(@NotNull JetFile file) {
JetNamespaceHeader namespaceHeader = file.getNamespaceHeader(); JetNamespaceHeader namespaceHeader = file.getNamespaceHeader();
// TODO 2 make this code neater assert namespaceHeader != null : "scripts are not supported";
List<JetSimpleNameExpression> allNamespaceNames = new ArrayList<JetSimpleNameExpression>(namespaceHeader.getParentNamespaceNames());
ContainerUtil.addIfNotNull(allNamespaceNames, namespaceHeader.getLastPartExpression());
for (JetSimpleNameExpression nameExpression : allNamespaceNames) {
FqName parentFqName = namespaceHeader.getParentFqName(nameExpression);
getOrCreatePackageFragment(parentFqName, nameExpression);
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); storeBindingForFile(file, fragment);
return fragment; return fragment;
} }
@@ -83,19 +83,6 @@ public class NamespaceFactoryImpl implements NamespaceFactory {
return packageFragmentProvider.getOrCreateFragment(fqName); 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) { private void storeBindingForFile(@NotNull JetFile file, @NotNull PackageFragmentDescriptor fragment) {
trace.record(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file, fragment); trace.record(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file, fragment);
@@ -32,13 +32,13 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader; 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.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.name.SpecialNames;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -48,14 +48,6 @@ public class LazyResolveTestUtil {
private 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.<AnalyzerScriptParameter>emptyList());
return tdaInjectorForLazy;
}
public static InjectorForTopDownAnalyzer createInjectorForTDA(JetCoreEnvironment environment) { public static InjectorForTopDownAnalyzer createInjectorForTDA(JetCoreEnvironment environment) {
JetTestUtils.newTrace(environment); JetTestUtils.newTrace(environment);
@@ -103,8 +95,8 @@ public class LazyResolveTestUtil {
for (JetFile file : files) { for (JetFile file : files) {
JetNamespaceHeader header = file.getNamespaceHeader(); JetNamespaceHeader header = file.getNamespaceHeader();
if (header != null) { if (header != null) {
List<JetSimpleNameExpression> names = header.getParentNamespaceNames(); List<JetSimpleNameExpression> names = header.getNamespaceNames();
Name name = names.isEmpty() ? header.getNameAsName() : names.get(0).getReferencedNameAsName(); Name name = names.isEmpty() ? SpecialNames.ROOT_NAMESPACE : names.get(0).getReferencedNameAsName();
shortNames.add(name); shortNames.add(name);
} }
else { else {
@@ -185,10 +185,9 @@ public class ResolveElementCache {
} }
} }
Name name = packageNameExpression.getReferencedNameAsName(); if (Name.isValidIdentifier(packageNameExpression.getReferencedName())) {
if (Name.isValidIdentifier(name.asString())) {
if (trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, packageNameExpression) == null) { 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); PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(fqName);
assert packageDescriptor != null: "Package descriptor should be present in session for " + fqName; assert packageDescriptor != null: "Package descriptor should be present in session for " + fqName;
trace.record(BindingContext.REFERENCE_TARGET, packageNameExpression, packageDescriptor); trace.record(BindingContext.REFERENCE_TARGET, packageNameExpression, packageDescriptor);
@@ -405,7 +404,7 @@ public class ResolveElementCache {
JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(expression, JetNamespaceHeader.class, false); JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(expression, JetNamespaceHeader.class, false);
if (namespaceHeader != null) { if (namespaceHeader != null) {
PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage( PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(
namespaceHeader.getParentFqName((JetSimpleNameExpression) expression)); namespaceHeader.getFqName((JetSimpleNameExpression) expression).parent());
if (packageDescriptor != null) { if (packageDescriptor != null) {
return packageDescriptor.getMemberScope(); return packageDescriptor.getMemberScope();
} }