From aea9e8688f1116680c29d4e17986215ce0d2f0b2 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Wed, 22 Oct 2025 17:20:30 +0300 Subject: [PATCH] [python] PY-85031 Use PyAstNamedParameter.isSelf when reporting legacy positional-only parameters It correctly takes into account the first argument of `__new__` that is also implicit, and thus should be excluded when reporting positional-only parameters following non-positional-only ones. GitOrigin-RevId: abf09c6be5e49c21c12264d22bf63a51018fdcd6 --- .../com/jetbrains/python/psi/impl/PyFunctionImpl.java | 9 --------- .../validation/PyParameterListAnnotatorVisitor.java | 4 +--- .../highlighting/historicalPositionalOnlyParameters.py | 3 ++- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java index 2215d2a8c6aa..ddbefd0d82dc 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java @@ -790,15 +790,6 @@ public class PyFunctionImpl extends PyBaseElementImpl implements return getStubOrPsiChild(PyStubElementTypes.ANNOTATION); } - /** - * is `function` a method or a classmethod - */ - public static boolean isMethod(PyFunction function) { - final var isMethod = ScopeUtil.getScopeOwner(function) instanceof PyClass; - final var modifier = function.getModifier(); - return (isMethod && modifier == null) || modifier == CLASSMETHOD; - } - /** * @param self should be this */ diff --git a/python/python-psi-impl/src/com/jetbrains/python/validation/PyParameterListAnnotatorVisitor.java b/python/python-psi-impl/src/com/jetbrains/python/validation/PyParameterListAnnotatorVisitor.java index 617fd0ee286b..b65d43f96179 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/validation/PyParameterListAnnotatorVisitor.java +++ b/python/python-psi-impl/src/com/jetbrains/python/validation/PyParameterListAnnotatorVisitor.java @@ -19,7 +19,6 @@ import com.intellij.lang.annotation.HighlightSeverity; import com.jetbrains.python.PyPsiBundle; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.ParamHelper; -import com.jetbrains.python.psi.impl.PyFunctionImpl; import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -38,7 +37,6 @@ public class PyParameterListAnnotatorVisitor extends PyElementVisitor { @Override public void visitPyParameterList(final @NotNull PyParameterList paramlist) { final LanguageLevel languageLevel = LanguageLevel.forElement(paramlist); - final var hasImplicit = paramlist.getParent() instanceof PyFunction function && PyFunctionImpl.isMethod(function); ParamHelper.walkDownParamArray( paramlist.getParameters(), @@ -55,7 +53,7 @@ public class PyParameterListAnnotatorVisitor extends PyElementVisitor { @Override public void visitNamedParameter(PyNamedParameter parameter, boolean first, boolean last) { final var name = parameter.getName(); - if (!hadKeyword && name != null && !(hasImplicit && first) && !isPrivate(name)) { + if (!hadKeyword && name != null && !parameter.isSelf() && !isPrivate(name)) { hadKeyword = true; } else if (hadKeyword && !hadPositionalContainer && !hadSingleStar && name != null && !hadSlash && isPrivate(name)) { diff --git a/python/testData/highlighting/historicalPositionalOnlyParameters.py b/python/testData/highlighting/historicalPositionalOnlyParameters.py index d16df2b8969a..f023489d9e09 100644 --- a/python/testData/highlighting/historicalPositionalOnlyParameters.py +++ b/python/testData/highlighting/historicalPositionalOnlyParameters.py @@ -15,4 +15,5 @@ class A: @staticmethod def s1(__b): pass @staticmethod - def s1(a, __b): pass \ No newline at end of file + def s1(a, __b): pass + def __new__(cls, __b): pass \ No newline at end of file