Don't forget about imported name definers while resolving name in class (PY-20197)

This commit is contained in:
Semyon Proshev
2018-03-12 20:17:00 +03:00
parent 992d9d9113
commit 496bce0133
2 changed files with 22 additions and 8 deletions
@@ -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");
@@ -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() {