diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java index 0cbe2525ebe8..0b01f080a86c 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java +++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java @@ -15,6 +15,7 @@ */ package com.jetbrains.python.inspections; +import com.google.common.collect.ImmutableMap; import com.intellij.codeInsight.controlflow.ControlFlowUtil; import com.intellij.codeInsight.controlflow.Instruction; import com.intellij.codeInspection.*; @@ -193,9 +194,11 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor { final PyFunction function = (PyFunction)owner; final String functionName = function.getName(); - return !PyNames.INIT.equals(functionName) && - function.getContainingClass() != null && - PyNames.getBuiltinMethods(LanguageLevel.forElement(function)).containsKey(functionName); + final LanguageLevel level = LanguageLevel.forElement(function); + final ImmutableMap builtinMethods = + function.getContainingClass() != null ? PyNames.getBuiltinMethods(level) : PyNames.getModuleBuiltinMethods(level); + + return !PyNames.INIT.equals(functionName) && builtinMethods.containsKey(functionName); } return false; diff --git a/python/testData/inspections/PyUnusedLocalInspection/moduleGetAttr.py b/python/testData/inspections/PyUnusedLocalInspection/moduleGetAttr.py new file mode 100644 index 000000000000..e39b71a83aee --- /dev/null +++ b/python/testData/inspections/PyUnusedLocalInspection/moduleGetAttr.py @@ -0,0 +1,2 @@ +def __getattr__(name): + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnusedLocalInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnusedLocalInspectionTest.java index 6a56d4e6ddfd..87ff84883744 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnusedLocalInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnusedLocalInspectionTest.java @@ -96,6 +96,11 @@ public class PyUnusedLocalInspectionTest extends PyInspectionTestCase { doTest(); } + // PY-28017 + public void testModuleGetAttr() { + runWithLanguageLevel(LanguageLevel.PYTHON37, this::doTest); + } + @NotNull @Override protected Class getInspectionClass() {