summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaura M?dioni <laura.medioni@logilab.fr>2015-11-24 10:57:37 +0100
committerLaura M?dioni <laura.medioni@logilab.fr>2015-11-24 10:57:37 +0100
commitd95e733fb211b3c375b8bc2c08a33728b1755e09 (patch)
tree43358714b37edc81d5716311b324df9c1fa91dd7
parente80fb34cd7a99d11c22408142962b86778325857 (diff)
downloadpylint-d95e733fb211b3c375b8bc2c08a33728b1755e09.tar.gz
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
-rw-r--r--pylint/checkers/base.py32
-rw-r--r--pylint/test/functional/redefined_variable_type.py12
-rw-r--r--pylint/test/functional/redefined_variable_type.txt11
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