From 2a91bce4370e0a3c13a6c8864b4e54f28d5cfddd Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 12 Mar 2014 13:49:03 +0400 Subject: [PATCH] highlight both incompatible signatures --- .../PyInitNewSignatureInspection.java | 28 +++++++++---------- .../PyInitNewSignatureInspection/expected.xml | 5 ++++ .../PyInitNewSignatureInspection/src/test.py | 8 +++--- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/PyInitNewSignatureInspection.java b/python/src/com/jetbrains/python/inspections/PyInitNewSignatureInspection.java index 28d1acfac914..514438769d17 100644 --- a/python/src/com/jetbrains/python/inspections/PyInitNewSignatureInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyInitNewSignatureInspection.java @@ -54,22 +54,22 @@ public class PyInitNewSignatureInspection extends PyInspection { } @Override - public void visitPyClass(PyClass cls) { - if (!cls.isNewStyleClass()) return; // old-style classes don't know about __new__ - PyFunction initOrNew = cls.findInitOrNew(false); // only local + public void visitPyFunction(PyFunction node) { + final String functionName = node.getName(); + if (!PyNames.NEW.equals(functionName) && !PyNames.INIT.equals(functionName)) return; + final PyClass cls = node.getContainingClass(); + if (cls == null) return; + if (!cls.isNewStyleClass()) return; final PyBuiltinCache builtins = PyBuiltinCache.getInstance(cls); - if (initOrNew == null || builtins.isBuiltin(initOrNew.getContainingClass())) return; // nothing is overridden - String the_other_name = PyNames.NEW.equals(initOrNew.getName()) ? PyNames.INIT : PyNames.NEW; - PyFunction the_other = cls.findMethodByName(the_other_name, true); - if (the_other == null || builtins.getClass("object") == the_other.getContainingClass()) return; - if (!PyUtil.isSignatureCompatibleTo(the_other, initOrNew, myTypeEvalContext) && - !PyUtil.isSignatureCompatibleTo(initOrNew, the_other, myTypeEvalContext) && - initOrNew.getContainingFile() == cls.getContainingFile() - ) { - registerProblem(initOrNew.getParameterList(), PyNames.NEW.equals(initOrNew.getName()) ? + final String complementaryName = PyNames.NEW.equals(functionName) ? PyNames.INIT : PyNames.NEW; + final PyFunction complementaryMethod = cls.findMethodByName(complementaryName, true); + if (complementaryMethod == null || builtins.getClass("object") == complementaryMethod.getContainingClass()) return; + if (!PyUtil.isSignatureCompatibleTo(complementaryMethod, node, myTypeEvalContext) && + !PyUtil.isSignatureCompatibleTo(node, complementaryMethod, myTypeEvalContext) && + node.getContainingFile() == cls.getContainingFile()) { + registerProblem(node.getParameterList(), PyNames.NEW.equals(node.getName()) ? PyBundle.message("INSP.new.incompatible.to.init") : - PyBundle.message("INSP.init.incompatible.to.new") - ); + PyBundle.message("INSP.init.incompatible.to.new")); } } } diff --git a/python/testData/inspections/PyInitNewSignatureInspection/expected.xml b/python/testData/inspections/PyInitNewSignatureInspection/expected.xml index a0d40b98624b..2326a36cfc78 100644 --- a/python/testData/inspections/PyInitNewSignatureInspection/expected.xml +++ b/python/testData/inspections/PyInitNewSignatureInspection/expected.xml @@ -6,6 +6,11 @@ Signature is not compatible to __new__ + + test.py + 5 + Signature is not compatible to __init__ + test.py 12 diff --git a/python/testData/inspections/PyInitNewSignatureInspection/src/test.py b/python/testData/inspections/PyInitNewSignatureInspection/src/test.py index 18f631349720..a0ebd20b9084 100644 --- a/python/testData/inspections/PyInitNewSignatureInspection/src/test.py +++ b/python/testData/inspections/PyInitNewSignatureInspection/src/test.py @@ -1,9 +1,9 @@ class B(object): - def __init__(self): # ierror only once - pass + def __init__(self): # error + pass - def __new__(cls, x, y): - pass + def __new__(cls, x, y): # error + pass class A1(B): pass