diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java index 016c6878eb14..a195785f7092 100644 --- a/python/psi-api/src/com/jetbrains/python/PyNames.java +++ b/python/psi-api/src/com/jetbrains/python/PyNames.java @@ -129,6 +129,8 @@ public class PyNames { public static final String PYCACHE = "__pycache__"; + public static final String NOT_IMPLEMENTED_ERROR = "NotImplementedError"; + /** * Contains all known predefined names of "__foo__" form. diff --git a/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java b/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java index 08a70ef5a84d..f7aae00637ef 100644 --- a/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java @@ -78,12 +78,27 @@ public class PyMethodMayBeStaticInspection extends PyInspection { final boolean[] mayBeStatic = {true}; PyRecursiveElementVisitor visitor = new PyRecursiveElementVisitor() { + @Override + public void visitPyRaiseStatement(PyRaiseStatement node) { + super.visitPyRaiseStatement(node); + final PyExpression[] expressions = node.getExpressions(); + if (expressions.length == 1) { + final PyExpression expression = expressions[0]; + if (expression instanceof PyCallExpression) { + final PyExpression callee = ((PyCallExpression)expression).getCallee(); + if (callee != null && PyNames.NOT_IMPLEMENTED_ERROR.equals(callee.getText())) + mayBeStatic[0] = false; + } + } + } + @Override public void visitPyReferenceExpression(PyReferenceExpression node) { super.visitPyReferenceExpression(node); if (selfName.equals(node.getName())) { mayBeStatic[0] = false; } + } }; diff --git a/python/testData/inspections/PyMethodMayBeStaticInspection/notImplemented.py b/python/testData/inspections/PyMethodMayBeStaticInspection/notImplemented.py new file mode 100644 index 000000000000..a84f89096303 --- /dev/null +++ b/python/testData/inspections/PyMethodMayBeStaticInspection/notImplemented.py @@ -0,0 +1,5 @@ +__author__ = 'ktisha' + +class A: + def pop(self): + raise NotImplementedError() \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java index dcc0892de902..61a2b8106a87 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java @@ -43,6 +43,10 @@ public class PyMethodMayBeStaticInspectionTest extends PyTestCase { doTest(); } + public void testNotImplemented() { + doTest(); + } + private void doTest() { myFixture.configureByFile("inspections/PyMethodMayBeStaticInspection/" + getTestName(true) + ".py"); myFixture.enableInspections(PyMethodMayBeStaticInspection.class);