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