From d95e733fb211b3c375b8bc2c08a33728b1755e09 Mon Sep 17 00:00:00 2001 From: Laura M?dioni Date: Tue, 24 Nov 2015 10:57:37 +0100 Subject: Use a stack of dictionaries instead of 3 dicts - This way it works with embedded classes and functions - Update the tests accordingly related to issue #674 --- pylint/checkers/base.py | 32 ++++++---------------- pylint/test/functional/redefined_variable_type.py | 12 +++++++- pylint/test/functional/redefined_variable_type.txt | 11 ++++---- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/pylint/checkers/base.py b/pylint/checkers/base.py index 12e4e17..12fc32a 100644 --- a/pylint/checkers/base.py +++ b/pylint/checkers/base.py @@ -1898,27 +1898,20 @@ class MultipleTypesChecker(BaseChecker): } def visit_classdef(self, _): - self._class_assigns = {} + self._assigns.append({}) @check_messages('redefined-variable-type') def leave_classdef(self, _): - self._check_and_add_messages(self._class_assigns) + self._check_and_add_messages() - def visit_functiondef(self, _): - self._func_assigns = {} - - @check_messages('redefined-variable-type') - def leave_functiondef(self, _): - self._check_and_add_messages(self._func_assigns) + visit_functiondef = visit_classdef + leave_functiondef = leave_module = leave_classdef def visit_module(self, _): - self._module_assigns = {} - - @check_messages('redefined-variable-type') - def leave_module(self, _): - self._check_and_add_messages(self._module_assigns) + self._assigns = [{}] - def _check_and_add_messages(self, assigns): + def _check_and_add_messages(self): + assigns = self._assigns.pop() for name, args in assigns.iteritems(): if len(args) <= 1: continue @@ -1934,15 +1927,6 @@ class MultipleTypesChecker(BaseChecker): break def visit_assign(self, node): - scope = node.scope() - if isinstance(scope, astroid.FunctionDef): - msgs = self._func_assigns - elif isinstance(scope, astroid.Module): - msgs = self._module_assigns - elif isinstance(scope, astroid.ClassDef): - msgs = self._class_assigns - else: - return # we don't handle multiple assignment nor slice assignment target = node.targets[0] if isinstance(target, (astroid.Tuple, astroid.Subscript)): @@ -1966,7 +1950,7 @@ class MultipleTypesChecker(BaseChecker): except InferenceError: return if types: - msgs.setdefault(target.as_string(), []).append((node, types.pop())) + self._assigns[-1].setdefault(target.as_string(), []).append((node, types.pop())) def register(linter): diff --git a/pylint/test/functional/redefined_variable_type.py b/pylint/test/functional/redefined_variable_type.py index 2fdf4ad..d88a9e9 100644 --- a/pylint/test/functional/redefined_variable_type.py +++ b/pylint/test/functional/redefined_variable_type.py @@ -5,6 +5,11 @@ _OK = True class MyClass(object): + + class Klass(object): + def __init__(self): + self.var2 = 'var' + def __init__(self): self.var = True self.var1 = 2 @@ -22,6 +27,10 @@ class MyClass(object): var2 = property(_getter, _setter) def some_method(self): + def func(): + var = 1 + test = 'bar' + var = 'baz' # [redefined-variable-type] self.var = 1 test = 'foo' myint = 2 @@ -29,7 +38,8 @@ class MyClass(object): _OK = "This is OK" # [redefined-variable-type] -SOME_FLOAT = 1. +if _OK: + SOME_FLOAT = 1. def dummy_function(): return 2 diff --git a/pylint/test/functional/redefined_variable_type.txt b/pylint/test/functional/redefined_variable_type.txt index ff2c487..3646aeb 100644 --- a/pylint/test/functional/redefined_variable_type.txt +++ b/pylint/test/functional/redefined_variable_type.txt @@ -1,5 +1,6 @@ -redefined-variable-type:12:MyClass.__init__:Redefinition of self.var1 type from int to float -redefined-variable-type:28:MyClass.some_method:Redefinition of myint type from int to bool -redefined-variable-type:30::Redefinition of _OK type from bool to str -redefined-variable-type:39:other_function:Redefinition of instance type from functional.redefined_variable_type.MyClass to bool -redefined-variable-type:41::Redefinition of SOME_FLOAT type from float to int +redefined-variable-type:17:MyClass.__init__:Redefinition of self.var1 type from int to float +redefined-variable-type:33:MyClass.some_method.func:Redefinition of var type from int to str +redefined-variable-type:37:MyClass.some_method:Redefinition of myint type from int to bool +redefined-variable-type:39::Redefinition of _OK type from bool to str +redefined-variable-type:49:other_function:Redefinition of instance type from functional.redefined_variable_type.MyClass to bool +redefined-variable-type:51::Redefinition of SOME_FLOAT type from float to int -- cgit v1.2.1