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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user