diff --git a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyFinalInspection.kt b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyFinalInspection.kt index 1b7b64ff768d..a78c5706826e 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/inspections/PyFinalInspection.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/inspections/PyFinalInspection.kt @@ -76,7 +76,10 @@ class PyFinalInspection : PyInspection() { val cls = node.containingClass if (cls != null) { - if (!PyiUtil.isOverload(node, myTypeEvalContext)) { + val isOverload = PyiUtil.isOverload(node, myTypeEvalContext) + if (!isOverload || + PyiUtil.getImplementation(node, myTypeEvalContext) == null && + PyiUtil.getOverloads(node, myTypeEvalContext).firstOrNull() === node) { PySuperMethodsSearch .search(node, myTypeEvalContext) .asIterable() diff --git a/python/testData/typing/ignored.txt b/python/testData/typing/ignored.txt index 32ac8d1715c1..0b47cf40f7d5 100644 --- a/python/testData/typing/ignored.txt +++ b/python/testData/typing/ignored.txt @@ -51,7 +51,6 @@ namedtuples_type_compat.py namedtuples_usage.py narrowing_typeis.py overloads_consistency.py -overloads_definitions_stub.pyi overloads_evaluation.py protocols_class_objects.py protocols_definition.py diff --git a/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java index 66081fe1b3f0..957798a567e6 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java @@ -4,6 +4,7 @@ package com.jetbrains.python.inspections; import com.intellij.psi.PsiFile; import com.jetbrains.python.fixtures.PyInspectionTestCase; import com.jetbrains.python.psi.LanguageLevel; +import com.jetbrains.python.pyi.PyiFileType; import org.jetbrains.annotations.NotNull; public class PyFinalInspectionTest extends PyInspectionTestCase { @@ -111,6 +112,55 @@ public class PyFinalInspectionTest extends PyInspectionTestCase { ); } + public void testOverridingOverloadedFinalMethod2() { + doTestByText(""" + from typing import final, overload + + class Base: + @overload + def foo(self, x: int) -> int: ... + + @overload + def foo(self, x: str) -> str: ... + + @final + def foo(self, x: int | str) -> int | str: + pass + + class Derived(Base): + @overload + def foo(self, x: int) -> int: ... + + @overload + def foo(self, x: str) -> str: ... + + def foo(self, x: int | str) -> int | str: + pass"""); + } + + public void testOverridingOverloadedFinalMethodNoImplementation() { + final PsiFile currentFile = myFixture.configureByText(PyiFileType.INSTANCE, """ + from typing import final, overload + + class Base: + @overload + @final + def foo(self, x: int) -> int: ... + + @overload + def foo(self, x: str) -> str: ... + + class Derived(Base): + @overload + def foo(self, x: int) -> int: ... + + @overload + def foo(self, x: str) -> str: ...""" + ); + configureInspection(); + assertSdkRootsNotParsed(currentFile); + } + // PY-34945 public void testFinalNonMethodFunction() { doTestByText("""