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
public List<JetSimpleNameExpression> getParentNamespaceNames() {
List<JetSimpleNameExpression> 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<JetSimpleNameExpression> 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();
}
@@ -903,12 +903,12 @@ public class JetPsiUtil {
throw new IllegalArgumentException("Should be called only for files with namespace: " + file);
}
List<JetSimpleNameExpression> names = header.getParentNamespaceNames();
if (!(0 <= partIndex && partIndex < names.size() + 1)) {
List<JetSimpleNameExpression> 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
@@ -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<JetSimpleNameExpression> allNamespaceNames = new ArrayList<JetSimpleNameExpression>(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);
@@ -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.<AnalyzerScriptParameter>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<JetSimpleNameExpression> names = header.getParentNamespaceNames();
Name name = names.isEmpty() ? header.getNameAsName() : names.get(0).getReferencedNameAsName();
List<JetSimpleNameExpression> names = header.getNamespaceNames();
Name name = names.isEmpty() ? SpecialNames.ROOT_NAMESPACE : names.get(0).getReferencedNameAsName();
shortNames.add(name);
}
else {
@@ -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();
}