don't show import popup if something is imported from module via unresolved import (PY-956)

This commit is contained in:
Dmitry Jemerov
2010-06-24 13:30:38 +04:00
parent 3ed586115c
commit 97e0d414bb
8 changed files with 39 additions and 8 deletions
@@ -9,6 +9,7 @@ import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
@@ -23,7 +24,7 @@ public class PyJavaTypeProvider implements PyTypeProvider {
}
@Nullable
public PyType getReferenceType(final PsiElement referenceTarget, TypeEvalContext context) {
public PyType getReferenceType(@NotNull final PsiElement referenceTarget, TypeEvalContext context) {
if (referenceTarget instanceof PsiClass) {
return new PyJavaClassType((PsiClass) referenceTarget);
}
@@ -198,9 +198,9 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
ResolveResult[] targets = getReference(PyResolveContext.noImplicits()).multiResolve(false);
if (targets.length == 0) return null;
for (int i = 0; i < targets.length; i++) {
PsiElement target = targets[i].getElement();
if (target == this) {
for (ResolveResult resolveResult : targets) {
PsiElement target = resolveResult.getElement();
if (target == this || target == null) {
continue;
}
PyType type = getTypeFromTarget(target, context, this);
@@ -232,7 +232,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
}
@Nullable
public static PyType getTypeFromTarget(final PsiElement target, final TypeEvalContext context, @Nullable PyReferenceExpression anchor) {
public static PyType getTypeFromTarget(@NotNull final PsiElement target, final TypeEvalContext context, @Nullable PyReferenceExpression anchor) {
final PyType pyType = getReferenceTypeFromProviders(target, context);
if (pyType != null) {
return pyType;
@@ -291,7 +291,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
}
@Nullable
public static PyType getReferenceTypeFromProviders(final PsiElement target, TypeEvalContext context) {
public static PyType getReferenceTypeFromProviders(@NotNull final PsiElement target, TypeEvalContext context) {
for (PyTypeProvider provider : Extensions.getExtensions(PyTypeProvider.EP_NAME)) {
final PyType result = provider.getReferenceType(target, context);
if (result != null) return result;
@@ -213,6 +213,9 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference
ret.poke(hit, getRate(hit));
}
}
else if (!processor.getDefiners().isEmpty()) {
ret.add(new ImportedResolveResult(null, RatedResolveResult.RATE_LOW-1, processor.getDefiners()));
}
if (uexpr == null) {
// ...as a part of current module
PyType otype = PyBuiltinCache.getInstance(realContext).getObjectType(); // "object" as a closest kin to "module"
@@ -7,6 +7,7 @@ import com.jetbrains.python.psi.PyNamedParameter;
import com.jetbrains.python.psi.PyReferenceExpression;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -19,7 +20,7 @@ public interface PyTypeProvider {
PyType getReferenceExpressionType(PyReferenceExpression referenceExpression, TypeEvalContext context);
@Nullable
PyType getReferenceType(PsiElement referenceTarget, TypeEvalContext context);
PyType getReferenceType(@NotNull PsiElement referenceTarget, TypeEvalContext context);
@Nullable
PyType getParameterType(PyNamedParameter param, final PyFunction func, TypeEvalContext context);
@@ -24,7 +24,7 @@ public class RatedResolveResult implements ResolveResult {
}
public boolean isValidResult() {
return true;
return myWhat != null;
}
/**
@@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyImportedModule;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -87,6 +88,20 @@ public class ResolveProcessor implements PyAsScopeProcessor {
return false;
}
}
else if (element instanceof PyImportElement) {
// name is resolved to unresolved import (PY-956)
final PyImportElement importElement = (PyImportElement) element;
String definedName = importElement.getAsName();
if (definedName == null) {
final PyQualifiedName qName = importElement.getImportedQName();
if (qName != null && qName.getComponentCount() == 1) {
definedName = qName.getComponents().get(0);
}
}
if (myName.equals(definedName)) {
addNameDefiner(importElement);
}
}
}
return true;
@@ -0,0 +1,2 @@
import NonExistingModule
N<ref>onExistingModule.foo()
@@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.fixtures.PyResolveTestCase;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.resolve.ImportedResolveResult;
public class PyResolveTest extends PyResolveTestCase {
private PsiElement resolve() {
@@ -300,4 +301,12 @@ public class PyResolveTest extends PyResolveTestCase {
PsiElement targetElement = resolve();
assertInstanceOf(targetElement, PyFunction.class);
}
public void testUnresolvedImport() {
final ResolveResult[] results = multiResolve();
assertEquals(1, results.length);
assertTrue(results [0] instanceof ImportedResolveResult);
ImportedResolveResult result = (ImportedResolveResult) results [0];
assertNull(result.getElement());
}
}