From 358edc489f79801800a0742bfc5785e5de02a550 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Tue, 3 Jul 2018 15:38:28 +0300 Subject: [PATCH] While inferring parameter type from usages, check if it is compared with `None` (PY-27231) --- .../python/psi/impl/PyNamedParameterImpl.java | 38 ++++++++++--- .../PyTypeCheckerInspectionTest.java | 55 +++++++++++++++++++ 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java index 5c38699137c7..32e52a3eb175 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java @@ -304,9 +304,9 @@ public class PyNamedParameterImpl extends PyBaseElementImpl attributes = collectUsedAttributes(context); - if (!attributes.isEmpty()) { - return new PyStructuralType(attributes, true); + final PyType typeFromUsages = getTypeFromUsages(context); + if (typeFromUsages != null) { + return typeFromUsages; } } } @@ -319,12 +319,15 @@ public class PyNamedParameterImpl extends PyBaseElementImpl collectUsedAttributes(@NotNull final TypeEvalContext context) { - final Set result = new LinkedHashSet<>(); + @Nullable + private PyType getTypeFromUsages(@NotNull TypeEvalContext context) { + final Set usedAttributes = new LinkedHashSet<>(); + final ScopeOwner owner = ScopeUtil.getScopeOwner(this); final String name = getName(); + final Ref parameterWasReassigned = Ref.create(false); + final Ref noneComparison = Ref.create(false); if (owner != null && name != null) { owner.accept(new PyRecursiveElementVisitor() { @@ -411,6 +414,21 @@ public class PyNamedParameterImpl extends PyBaseElementImpl false") private boolean isReferenceToParameter(@Nullable PsiElement element) { if (element == null) return false; @@ -419,7 +437,13 @@ public class PyNamedParameterImpl extends PyBaseElementImplNone)\n" + + "func32(None)\n" + + "func33(None)\n" + + "func34(None)"); + } + // PY-29704 public void testPassingAbstractMethodResult() { doTestByText("import abc\n" +