Index: third_party/pylint/checkers/design_analysis.py |
diff --git a/third_party/pylint/checkers/design_analysis.py b/third_party/pylint/checkers/design_analysis.py |
index 0725ccf0c091999511518840f1c4badf6efc19a3..0a7a307cfb2987be43148b8ad658cfef790003a9 100644 |
--- a/third_party/pylint/checkers/design_analysis.py |
+++ b/third_party/pylint/checkers/design_analysis.py |
@@ -15,14 +15,15 @@ |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
"""check for signs of poor design""" |
+import re |
+from collections import defaultdict |
+ |
from astroid import Function, If, InferenceError |
from pylint.interfaces import IAstroidChecker |
from pylint.checkers import BaseChecker |
from pylint.checkers.utils import check_messages |
-import re |
- |
# regexp for ignored argument name |
IGNORED_ARGUMENT_NAMES = re.compile('_.*') |
@@ -174,7 +175,7 @@ class MisdesignChecker(BaseChecker): |
"""initialize visit variables""" |
self.stats = self.linter.add_stats() |
self._returns = [] |
- self._branches = [] |
+ self._branches = defaultdict(int) |
self._used_abstracts = {} |
self._used_ifaces = {} |
self._abstracts = [] |
@@ -200,7 +201,6 @@ class MisdesignChecker(BaseChecker): |
def visit_class(self, node): |
"""check size of inheritance hierarchy and number of instance attributes |
""" |
- self._inc_branch() |
# Is the total inheritance hierarchy is 7 or less? |
nb_parents = len(list(node.ancestors())) |
if nb_parents > self.config.max_parents: |
@@ -241,12 +241,9 @@ class MisdesignChecker(BaseChecker): |
def leave_class(self, node): |
"""check number of public methods""" |
nb_public_methods = 0 |
- special_methods = set() |
- for method in node.methods(): |
+ for method in node.mymethods(): |
if not method.name.startswith('_'): |
nb_public_methods += 1 |
- if method.name.startswith("__"): |
- special_methods.add(method.name) |
# Does the class contain less than 20 public methods ? |
if nb_public_methods > self.config.max_public_methods: |
self.add_message('too-many-public-methods', node=node, |
@@ -257,20 +254,19 @@ class MisdesignChecker(BaseChecker): |
return |
# Does the class contain more than 5 public methods ? |
if nb_public_methods < self.config.min_public_methods: |
- self.add_message('R0903', node=node, |
+ self.add_message('too-few-public-methods', node=node, |
args=(nb_public_methods, |
self.config.min_public_methods)) |
@check_messages('too-many-return-statements', 'too-many-branches', |
- 'too-many-arguments', 'too-many-locals', 'too-many-statements') |
+ 'too-many-arguments', 'too-many-locals', |
+ 'too-many-statements') |
def visit_function(self, node): |
"""check function name, docstring, arguments, redefinition, |
variable names, max locals |
""" |
- self._inc_branch() |
# init branch and returns counters |
self._returns.append(0) |
- self._branches.append(0) |
# check number of arguments |
args = node.args.args |
if args is not None: |
@@ -291,7 +287,9 @@ class MisdesignChecker(BaseChecker): |
# init statements counter |
self._stmts = 1 |
- @check_messages('too-many-return-statements', 'too-many-branches', 'too-many-arguments', 'too-many-locals', 'too-many-statements') |
+ @check_messages('too-many-return-statements', 'too-many-branches', |
+ 'too-many-arguments', 'too-many-locals', |
+ 'too-many-statements') |
def leave_function(self, node): |
"""most of the work is done here on close: |
checks for max returns, branch, return in __init__ |
@@ -300,7 +298,7 @@ class MisdesignChecker(BaseChecker): |
if returns > self.config.max_returns: |
self.add_message('too-many-return-statements', node=node, |
args=(returns, self.config.max_returns)) |
- branches = self._branches.pop() |
+ branches = self._branches[node] |
if branches > self.config.max_branches: |
self.add_message('too-many-branches', node=node, |
args=(branches, self.config.max_branches)) |
@@ -327,12 +325,12 @@ class MisdesignChecker(BaseChecker): |
branches = len(node.handlers) |
if node.orelse: |
branches += 1 |
- self._inc_branch(branches) |
+ self._inc_branch(node, branches) |
self._stmts += branches |
- def visit_tryfinally(self, _): |
+ def visit_tryfinally(self, node): |
"""increments the branches counter""" |
- self._inc_branch(2) |
+ self._inc_branch(node, 2) |
self._stmts += 2 |
def visit_if(self, node): |
@@ -342,7 +340,7 @@ class MisdesignChecker(BaseChecker): |
if node.orelse and (len(node.orelse) > 1 or |
not isinstance(node.orelse[0], If)): |
branches += 1 |
- self._inc_branch(branches) |
+ self._inc_branch(node, branches) |
self._stmts += branches |
def visit_while(self, node): |
@@ -350,15 +348,13 @@ class MisdesignChecker(BaseChecker): |
branches = 1 |
if node.orelse: |
branches += 1 |
- self._inc_branch(branches) |
+ self._inc_branch(node, branches) |
visit_for = visit_while |
- def _inc_branch(self, branchesnum=1): |
+ def _inc_branch(self, node, branchesnum=1): |
"""increments the branches counter""" |
- branches = self._branches |
- for i in xrange(len(branches)): |
- branches[i] += branchesnum |
+ self._branches[node.scope()] += branchesnum |
# FIXME: make a nice report... |