diff --git a/python/src/com/jetbrains/python/psi/impl/PyParameterListImpl.java b/python/src/com/jetbrains/python/psi/impl/PyParameterListImpl.java index 11f2687145d7..841b7f5344c3 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyParameterListImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyParameterListImpl.java @@ -66,9 +66,12 @@ public class PyParameterListImpl extends PyBaseElementImpl public boolean isCompatibleTo(@NotNull PyParameterList other) { PyParameter[] params = getParameters(); final PyParameter[] otherParams = other.getParameters(); + final int optionalCount = optionalParametersCount(params); + final int otherOptionalCount = optionalParametersCount(otherParams); + final int requiredCount = params.length - optionalCount; + final int otherRequiredCount = otherParams.length - otherOptionalCount; if (hasPositionalContainer() || hasKeywordContainer()) { - // TODO: Check required arguments count of the current parameters list - return true; + return requiredCount <= otherRequiredCount; } final PyFunction otherFunction = other.getContainingFunction(); final boolean otherHasArgs = other.hasPositionalContainer(); @@ -86,11 +89,7 @@ public class PyParameterListImpl extends PyBaseElementImpl } return otherParams.length == specialParamsCount; } - final int optionalCount = optionalParametersCount(params); - final int otherOptionalCount = optionalParametersCount(otherParams); - final int requiredCount = params.length - optionalCount; - final int otherRequiredCount = otherParams.length - otherOptionalCount; - return requiredCount <= otherRequiredCount && params.length >= otherRequiredCount && optionalCount >= otherOptionalCount; + return requiredCount <= otherRequiredCount && params.length >= otherParams.length && optionalCount >= otherOptionalCount; } private static int optionalParametersCount(@NotNull PyParameter[] parameters) { diff --git a/python/src/com/jetbrains/python/refactoring/introduce/constant/PyIntroduceConstantHandler.java b/python/src/com/jetbrains/python/refactoring/introduce/constant/PyIntroduceConstantHandler.java index 11fa090ef719..54358b4f87c8 100644 --- a/python/src/com/jetbrains/python/refactoring/introduce/constant/PyIntroduceConstantHandler.java +++ b/python/src/com/jetbrains/python/refactoring/introduce/constant/PyIntroduceConstantHandler.java @@ -1,6 +1,6 @@ package com.jetbrains.python.refactoring.introduce.constant; -import com.intellij.openapi.util.text.StringUtilRt; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.containers.HashSet; @@ -45,7 +45,7 @@ public class PyIntroduceConstantHandler extends IntroduceHandler { protected Collection generateSuggestedNames(@NotNull final PyExpression expression) { Collection names = new HashSet(); for (String name : super.generateSuggestedNames(expression)) { - names.add(StringUtilRt.toUpperCase(name)); + names.add(StringUtil.toUpperCase(name)); } return names; } diff --git a/python/testData/inspections/PyMethodOverridingInspection/test.py b/python/testData/inspections/PyMethodOverridingInspection/test.py index dac942b2e6e9..23dfc147cecd 100644 --- a/python/testData/inspections/PyMethodOverridingInspection/test.py +++ b/python/testData/inspections/PyMethodOverridingInspection/test.py @@ -113,3 +113,23 @@ class c24: class c25(c24): def foo(self, arg1, arg2=None): #pass pass + + +# PY-7162 +class c26: + def foo(self, arg1, arg2=None): + pass + +class c27(c26): + def foo(self, arg1=None): #fail + pass + + +# PY-7159 +class c28: + def foo(self): + pass + +class c29(c28): + def foo(self, p1, **kwargs): #fail + pass