diff --git a/python/intellij.python.community.impl.iml b/python/intellij.python.community.impl.iml
index 666c5ffaa222..6517176db4ba 100644
--- a/python/intellij.python.community.impl.iml
+++ b/python/intellij.python.community.impl.iml
@@ -32,5 +32,6 @@
+
\ No newline at end of file
diff --git a/python/src/META-INF/python-core-common.xml b/python/src/META-INF/python-core-common.xml
index 6f5da3b36df5..fd61de48cc49 100644
--- a/python/src/META-INF/python-core-common.xml
+++ b/python/src/META-INF/python-core-common.xml
@@ -669,6 +669,7 @@
+
diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionSkipper.kt b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionSkipper.kt
new file mode 100644
index 000000000000..df069f1b0875
--- /dev/null
+++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionSkipper.kt
@@ -0,0 +1,16 @@
+// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+package com.jetbrains.python.inspections
+
+import com.intellij.openapi.extensions.ExtensionPointName
+import com.jetbrains.python.psi.PyFunction
+import com.jetbrains.python.psi.types.TypeEvalContext
+
+interface PyUnusedLocalInspectionSkipper {
+ fun skip(element: PyFunction, context: TypeEvalContext): Boolean
+
+ companion object {
+ fun skip(element: PyFunction,
+ context: TypeEvalContext) = EP.extensions.any { it.skip(element, context) }
+ val EP = ExtensionPointName.create("Pythonid.skipUnusedLocal")
+ }
+}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
index 8d3eb43dd369..f0a8b3c4bfa1 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
@@ -67,8 +67,8 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor {
}
@Override
- public void visitPyFunction(final PyFunction node) {
- if (!PyiUtil.isOverload(node, myTypeEvalContext)) {
+ public void visitPyFunction(@NotNull final PyFunction node) {
+ if (!PyiUtil.isOverload(node, myTypeEvalContext) && !PyUnusedLocalInspectionSkipper.Companion.skip(node, myTypeEvalContext)) {
processScope(node);
}
}