diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index cfc8007af8fc..35cb9f644eaa 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -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 result; + final Map 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> CTX_VISITED = Key.create("PyClassType.Visited"); diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 11fc43b06d99..56695988e66a 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -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 getInspectionClass() {