mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-01 09:03:31 +07:00
don't show import popup if something is imported from module via unresolved import (PY-956)
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user