reducing the scariness of ResolveImportUtil

This commit is contained in:
Dmitry Jemerov
2012-08-13 20:11:19 +02:00
parent b19459989f
commit 6b2fa6f9b7
5 changed files with 24 additions and 38 deletions
@@ -217,7 +217,8 @@ public class PyImportElementImpl extends PyBaseElementImpl<PyImportElementStub>
@Nullable
@Override
public PsiElement resolve() {
return ResolveImportUtil.resolveImportElement(this, getImportedQName());
PyQualifiedName qName = getImportedQName();
return qName == null ? null : ResolveImportUtil.resolveImportElement(this, qName);
}
public boolean mustResolveOutside() {
@@ -133,7 +133,7 @@ public class PyImportedModule extends LightElement implements NameDefiner {
}
@Nullable
private static PsiElement resolve(PyImportElement importElement, final PyQualifiedName prefix) {
private static PsiElement resolve(PyImportElement importElement, @NotNull final PyQualifiedName prefix) {
return PyUtil.turnDirIntoInit(ResolveImportUtil.resolveImportElement(importElement, prefix));
}
@@ -2,13 +2,14 @@ package com.jetbrains.python.psi.impl.references;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.psi.PyFromImportStatement;
import com.jetbrains.python.psi.PyImportElement;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
/**
@@ -18,13 +19,10 @@ import java.util.List;
* @author yole
*/
public class PyFromImportNameReference extends PyImportReference {
private final PyImportElement myImportElement;
private final PyFromImportStatement myStatement;
public PyFromImportNameReference(PyReferenceExpressionImpl element, PyResolveContext context) {
super(element, context);
myImportElement = PsiTreeUtil.getParentOfType(element, PyImportElement.class);
assert myImportElement != null;
myStatement = PsiTreeUtil.getParentOfType(element, PyFromImportStatement.class);
assert myStatement != null;
}
@@ -32,6 +30,9 @@ public class PyFromImportNameReference extends PyImportReference {
@NotNull
@Override
protected List<RatedResolveResult> resolveInner() {
return ResolveImportUtil.resolveNameInFromImport(myImportElement, myElement.asQualifiedName(), myStatement);
PyQualifiedName qName = myElement.asQualifiedName();
return qName == null
? Collections.<RatedResolveResult>emptyList()
: ResolveImportUtil.resolveNameInFromImport(myStatement, qName);
}
}
@@ -63,12 +63,9 @@ public class PyImportReference extends PyReferenceImpl {
@NotNull
@Override
protected List<RatedResolveResult> resolveInner() {
final String referencedName = myElement.getReferencedName();
if (referencedName == null) return Collections.emptyList();
final PyImportElement parent = PsiTreeUtil.getParentOfType(myElement, PyImportElement.class); //importRef.getParent();
final PyQualifiedName qname = myElement.asQualifiedName();
return ResolveImportUtil.resolveNameInImportStatement(parent, qname);
return qname == null ? Collections.<RatedResolveResult>emptyList() : ResolveImportUtil.resolveNameInImportStatement(parent, qname);
}
@NotNull
@@ -81,41 +81,28 @@ public class ResolveImportUtil {
}
@Nullable
public static PsiElement resolveImportElement(PyImportElement importElement, final PyQualifiedName qName) {
final List<RatedResolveResult> resultList = RatedResolveResult.sorted(multiResolveImportElement(importElement, qName));
public static PsiElement resolveImportElement(PyImportElement importElement, @NotNull final PyQualifiedName qName) {
List<RatedResolveResult> targets;
final PyStatement importStatement = importElement.getContainingImportStatement();
if (importStatement instanceof PyFromImportStatement) {
targets = resolveNameInFromImport((PyFromImportStatement)importStatement, qName);
}
else { // "import foo"
targets = resolveNameInImportStatement(importElement, qName);
}
final List<RatedResolveResult> resultList = RatedResolveResult.sorted(targets);
return resultList.size() > 0 ? resultList.get(0).getElement() : null;
}
@NotNull
private static List<RatedResolveResult> multiResolveImportElement(PyImportElement importElement, final PyQualifiedName qName) {
final PyStatement importStatement = importElement.getContainingImportStatement();
if (importStatement instanceof PyFromImportStatement) {
return resolveNameInFromImport(importElement, qName, (PyFromImportStatement)importStatement);
}
else { // "import foo"
return resolveNameInImportStatement(importElement, qName);
}
}
public static List<RatedResolveResult> resolveNameInImportStatement(PyImportElement importElement, PyQualifiedName qName) {
if (qName == null) {
return Collections.emptyList();
}
public static List<RatedResolveResult> resolveNameInImportStatement(PyImportElement importElement, @NotNull PyQualifiedName qName) {
final PsiFile file = importElement.getContainingFile().getOriginalFile();
boolean absoluteImportEnabled = isAbsoluteImportEnabledFor(importElement);
final List<PsiElement> modules = resolveModule(qName, file, absoluteImportEnabled, 0);
if (modules.size() > 0) {
return rateResults(modules);
}
return Collections.emptyList();
return rateResults(modules);
}
public static List<RatedResolveResult> resolveNameInFromImport(PyImportElement importElement, PyQualifiedName qName,
PyFromImportStatement importStatement) {
if (qName == null) {
return Collections.emptyList();
}
PsiFile file = importElement.getContainingFile().getOriginalFile();
public static List<RatedResolveResult> resolveNameInFromImport(PyFromImportStatement importStatement, @NotNull PyQualifiedName qName) {
PsiFile file = importStatement.getContainingFile().getOriginalFile();
String name = qName.getComponents().get(0);
final List<PsiElement> candidates = importStatement.resolveImportSourceCandidates();