diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2010-12-09 11:01:07 +0100 | 
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2010-12-09 11:01:07 +0100 | 
| commit | 76e39f215f21177860c987ee2a09c7e3e91e585b (patch) | |
| tree | 97cb94bcb5b563f3446c3f9a7c6a1eecabac52eb /utils.py | |
| parent | 85f5e8ed50c444a311c0d79dbe4c525ad636cefe (diff) | |
| download | pylint-git-76e39f215f21177860c987ee2a09c7e3e91e585b.tar.gz | |
messages: add "check_messages" decorator to store messages
refactor PyLintASTWalker.add_checker to check the stored method's messages;
in PyLintASTWalker.add_checker, we only disable methods
that has been decorated and have no activated message.
Diffstat (limited to 'utils.py')
| -rw-r--r-- | utils.py | 23 | 
1 files changed, 19 insertions, 4 deletions
@@ -32,6 +32,7 @@ from logilab.astng import nodes, Module  from pylint.checkers import EmptyReport +  class UnknownMessage(Exception):      """raised when a unregistered message id is encountered""" @@ -462,27 +463,41 @@ def expand_modules(files_or_modules, black_list):  class PyLintASTWalker(object): -    def __init__(self): + +    def __init__(self, linter):          # callbacks per node types          self.nbstatements = 1          self.visit_events = {}          self.leave_events = {} +        self.linter = linter      def add_checker(self, checker):          """walk to the checker's dir and collect visit and leave methods""" +        # XXX : should be possible to merge needed_checkers and add_checker          vcids = set()          lcids = set()          visits = self.visit_events          leaves = self.leave_events +        msgs = self.linter._msgs_state          for member in dir(checker):              cid = member[6:]              if cid == 'default':                  continue              if member.startswith('visit_'): -                visits.setdefault(cid, []).append(getattr(checker, member)) +                v_meth = getattr(checker, member) +                # don't use visit_methods with no activated message: +                if hasattr(v_meth, 'checks_msgs'): +                    if not any(msgs.get(m, True) for m in v_meth.checks_msgs): +                        continue +                visits.setdefault(cid, []).append(v_meth)                  vcids.add(cid)              elif member.startswith('leave_'): -                leaves.setdefault(cid, []).append(getattr(checker, member)) +                l_meth = getattr(checker, member) +                # don't use leave_methods with no activated message: +                if hasattr(l_meth, 'checks_msgs'): +                    if not any(msgs.get(m, True) for m in l_meth.checks_msgs): +                        continue +                leaves.setdefault(cid, []).append(l_meth)                  lcids.add(cid)          visit_default = getattr(checker, 'visit_default', None)          if visit_default: @@ -492,7 +507,6 @@ class PyLintASTWalker(object):                      visits.setdefault(cid, []).append(visit_default)          # for now we have no "leave_default" method in Pylint -      def walk(self, astng):          """call visit events of astng checkers for the given node, recurse on          its children, then leave events. @@ -508,3 +522,4 @@ class PyLintASTWalker(object):              self.walk(child)          for cb in self.leave_events.get(cid, ()):              cb(astng) +  | 
