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("""