From 6b2fa6f9b7aec39465aa2c83b58af328b2e40115 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 13 Aug 2012 20:11:19 +0200 Subject: [PATCH] reducing the scariness of ResolveImportUtil --- .../python/psi/impl/PyImportElementImpl.java | 3 +- .../python/psi/impl/PyImportedModule.java | 2 +- .../references/PyFromImportNameReference.java | 11 ++--- .../impl/references/PyImportReference.java | 5 +-- .../python/psi/resolve/ResolveImportUtil.java | 41 +++++++------------ 5 files changed, 24 insertions(+), 38 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java index afd61ec62f4a..a82c317016ac 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java @@ -217,7 +217,8 @@ public class PyImportElementImpl extends PyBaseElementImpl @Nullable @Override public PsiElement resolve() { - return ResolveImportUtil.resolveImportElement(this, getImportedQName()); + PyQualifiedName qName = getImportedQName(); + return qName == null ? null : ResolveImportUtil.resolveImportElement(this, qName); } public boolean mustResolveOutside() { diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java index 9a98d9664877..1716ce244be2 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java +++ b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java @@ -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)); } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportNameReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportNameReference.java index 7735034fa998..f18a4efe1a9b 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportNameReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportNameReference.java @@ -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 resolveInner() { - return ResolveImportUtil.resolveNameInFromImport(myImportElement, myElement.asQualifiedName(), myStatement); + PyQualifiedName qName = myElement.asQualifiedName(); + return qName == null + ? Collections.emptyList() + : ResolveImportUtil.resolveNameInFromImport(myStatement, qName); } } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java index 84526758d6e4..598960707eaa 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java @@ -63,12 +63,9 @@ public class PyImportReference extends PyReferenceImpl { @NotNull @Override protected List 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.emptyList() : ResolveImportUtil.resolveNameInImportStatement(parent, qname); } @NotNull diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index 9f055f9c712c..1854d04d9ce6 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -81,41 +81,28 @@ public class ResolveImportUtil { } @Nullable - public static PsiElement resolveImportElement(PyImportElement importElement, final PyQualifiedName qName) { - final List resultList = RatedResolveResult.sorted(multiResolveImportElement(importElement, qName)); + public static PsiElement resolveImportElement(PyImportElement importElement, @NotNull final PyQualifiedName qName) { + List targets; + final PyStatement importStatement = importElement.getContainingImportStatement(); + if (importStatement instanceof PyFromImportStatement) { + targets = resolveNameInFromImport((PyFromImportStatement)importStatement, qName); + } + else { // "import foo" + targets = resolveNameInImportStatement(importElement, qName); + } + final List resultList = RatedResolveResult.sorted(targets); return resultList.size() > 0 ? resultList.get(0).getElement() : null; } - @NotNull - private static List 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 resolveNameInImportStatement(PyImportElement importElement, PyQualifiedName qName) { - if (qName == null) { - return Collections.emptyList(); - } + public static List resolveNameInImportStatement(PyImportElement importElement, @NotNull PyQualifiedName qName) { final PsiFile file = importElement.getContainingFile().getOriginalFile(); boolean absoluteImportEnabled = isAbsoluteImportEnabledFor(importElement); final List modules = resolveModule(qName, file, absoluteImportEnabled, 0); - if (modules.size() > 0) { - return rateResults(modules); - } - return Collections.emptyList(); + return rateResults(modules); } - public static List resolveNameInFromImport(PyImportElement importElement, PyQualifiedName qName, - PyFromImportStatement importStatement) { - if (qName == null) { - return Collections.emptyList(); - } - PsiFile file = importElement.getContainingFile().getOriginalFile(); + public static List resolveNameInFromImport(PyFromImportStatement importStatement, @NotNull PyQualifiedName qName) { + PsiFile file = importStatement.getContainingFile().getOriginalFile(); String name = qName.getComponents().get(0); final List candidates = importStatement.resolveImportSourceCandidates();