mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Don't forget about imported name definers while resolving name in class (PY-20197)
This commit is contained in:
@@ -24,12 +24,10 @@ import com.jetbrains.python.psi.impl.PyBuiltinCache;
|
||||
import com.jetbrains.python.psi.impl.PyResolveResultRater;
|
||||
import com.jetbrains.python.psi.impl.ResolveResultList;
|
||||
import com.jetbrains.python.psi.impl.references.PyReferenceImpl;
|
||||
import com.jetbrains.python.psi.resolve.CompletionVariantsProcessor;
|
||||
import com.jetbrains.python.psi.resolve.PyResolveContext;
|
||||
import com.jetbrains.python.psi.resolve.PyResolveProcessor;
|
||||
import com.jetbrains.python.psi.resolve.RatedResolveResult;
|
||||
import com.jetbrains.python.psi.resolve.*;
|
||||
import com.jetbrains.python.pyi.PyiUtil;
|
||||
import com.jetbrains.python.toolbox.Maybe;
|
||||
import one.util.streamex.EntryStream;
|
||||
import one.util.streamex.StreamEx;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -522,17 +520,25 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
|
||||
@Nullable PyExpression location,
|
||||
@NotNull TypeEvalContext context) {
|
||||
final PyResolveProcessor processor = new PyResolveProcessor(name);
|
||||
final Collection<PsiElement> result;
|
||||
final Map<PsiElement, PyImportedNameDefiner> results;
|
||||
|
||||
if (!isDefinition && !cls.processInstanceLevelDeclarations(processor, location)) {
|
||||
result = processor.getElements();
|
||||
results = processor.getResults();
|
||||
}
|
||||
else {
|
||||
cls.processClassLevelDeclarations(processor);
|
||||
result = processor.getElements();
|
||||
results = processor.getResults();
|
||||
}
|
||||
|
||||
return ContainerUtil.map(result, element -> new RatedResolveResult(PyReferenceImpl.getRate(element, context), element));
|
||||
return EntryStream
|
||||
.of(results)
|
||||
.mapKeyValue(
|
||||
(element, definer) -> {
|
||||
final int rate = PyReferenceImpl.getRate(element, context);
|
||||
return definer != null ? new ImportedResolveResult(element, rate, definer) : new RatedResolveResult(rate, element);
|
||||
}
|
||||
)
|
||||
.toList();
|
||||
}
|
||||
|
||||
private static final Key<Set<PyClassType>> CTX_VISITED = Key.create("PyClassType.Visited");
|
||||
|
||||
+8
@@ -706,6 +706,14 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
|
||||
doMultiFileTest();
|
||||
}
|
||||
|
||||
// PY-20197
|
||||
public void testClassLevelImportUsedInsideMethod() {
|
||||
doTestByText("class DateParser:\n" +
|
||||
" from datetime import datetime\n" +
|
||||
" def __init__(self):\n" +
|
||||
" self.value = self.datetime(2016, 1, 1)");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected Class<? extends PyInspection> getInspectionClass() {
|
||||
|
||||
Reference in New Issue
Block a user