Simplified API of JetNamespaceHeader and its usages.
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user