From 5f2630859cbb90b2bf2ae120aa6fdd0942506e49 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Tue, 18 Jun 2019 00:16:08 +0300 Subject: [PATCH] Fix highlighting method that overrides final method without qualified name (PEP 591) (PY-34945) GitOrigin-RevId: c7f0b0fdb0472850bfdd6d768fbad3a935cc3e6a --- .../python/inspections/PyFinalInspection.kt | 7 +++++-- .../python/inspections/PyFinalInspectionTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/PyFinalInspection.kt b/python/src/com/jetbrains/python/inspections/PyFinalInspection.kt index 1f2ca378a91a..02188c86ae8e 100644 --- a/python/src/com/jetbrains/python/inspections/PyFinalInspection.kt +++ b/python/src/com/jetbrains/python/inspections/PyFinalInspection.kt @@ -67,9 +67,12 @@ class PyFinalInspection : PyInspection() { if (cls != null) { PySuperMethodsSearch .search(node, myTypeEvalContext) - .firstOrNull { it is PyFunction && isFinal(it) } + .asSequence() + .filterIsInstance() + .firstOrNull { isFinal(it) } ?.let { - registerProblem(node.nameIdentifier, "'${(it as PyFunction).qualifiedName}' is marked as '@final' and should not be overridden") + val qualifiedName = it.qualifiedName ?: it.containingClass?.name + "." + it.name + registerProblem(node.nameIdentifier, "'$qualifiedName' is marked as '@final' and should not be overridden") } if (!PyiUtil.isInsideStub(node)) { diff --git a/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java index 505d8fccbc67..f2eca28b6835 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyFinalInspectionTest.java @@ -59,6 +59,21 @@ public class PyFinalInspectionTest extends PyInspectionTestCase { " pass"); } + // PY-34945 + public void testOverridingFinalMethodWithoutQualifiedName() { + doTestByText("from typing_extensions import final\n" + + "def output():\n" + + " class Output:\n" + + " @final\n" + + " def foo(self):\n" + + " pass\n" + + " return Output\n" + + "r = output()\n" + + "class SubClass(r):\n" + + " def foo(self):\n" + + " pass"); + } + // PY-34945 public void testOverridingOverloadedFinalMethod() { doMultiFileTest();