Plugins/CheckerPlugins/SyntaxChecker/pyflakes/checker.py

Wed, 13 Feb 2019 22:12:58 +0100

author
T.Rzepka <Tobias.Rzepka@gmail.com>
date
Wed, 13 Feb 2019 22:12:58 +0100
changeset 6742
7cb30f7f94f6
parent 6645
ad476851d7e0
permissions
-rw-r--r--

Upgraded pyflakes to 2.1.0

2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
2
6645
ad476851d7e0 Updated copyright for 2019.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6353
diff changeset
3 # Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
4 #
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
5 # Original (c) 2005-2010 Divmod, Inc.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
6 #
3670
f0cb7579c0b4 Finished renaming eric5 for PyQt5 to eric6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 3544
diff changeset
7 # This module is based on pyflakes but was modified to work with eric6
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
8 """
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
9 Main module.
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
10
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
11 Implement the central Checker class.
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
12 Also, it models the Bindings and Scopes.
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
13 """
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
14 import __future__
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
15 import ast
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
16 import bisect
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
17 import collections
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
18 import doctest
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
19 import functools
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
20 import os
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
21 import re
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
22 import sys
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
23 import tokenize
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
24
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
25 from . import messages
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
26
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
27 PY2 = sys.version_info < (3, 0)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
28 PY35_PLUS = sys.version_info >= (3, 5) # Python 3.5 and above
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
29 PY36_PLUS = sys.version_info >= (3, 6) # Python 3.6 and above
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
30 PY38_PLUS = sys.version_info >= (3, 8)
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
31 try:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
32 sys.pypy_version_info
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
33 PYPY = True
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
34 except AttributeError:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
35 PYPY = False
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
36
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
37 builtin_vars = dir(__import__('__builtin__' if PY2 else 'builtins'))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
38
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
39 if PY2:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
40 tokenize_tokenize = tokenize.generate_tokens
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
41 else:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
42 tokenize_tokenize = tokenize.tokenize
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
43
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
44 if PY2:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
45 def getNodeType(node_class):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
46 # workaround str.upper() which is locale-dependent
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
47 return str(unicode(node_class.__name__).upper()) # __IGNORE_WARNING__
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
48
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
49 def get_raise_argument(node):
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
50 return node.type
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
51
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
52 else:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
53 def getNodeType(node_class):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
54 return node_class.__name__.upper()
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
55
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
56 def get_raise_argument(node):
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
57 return node.exc
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
58
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
59 # Silence `pyflakes` from reporting `undefined name 'unicode'` in Python 3.
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
60 unicode = str
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
61
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
62 # Python >= 3.3 uses ast.Try instead of (ast.TryExcept + ast.TryFinally)
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
63 if PY2:
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
64 def getAlternatives(n):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
65 if isinstance(n, (ast.If, ast.TryFinally)):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
66 return [n.body]
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
67 if isinstance(n, ast.TryExcept):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
68 return [n.body + n.orelse] + [[hdl] for hdl in n.handlers]
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
69 else:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
70 def getAlternatives(n):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
71 if isinstance(n, ast.If):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
72 return [n.body]
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
73 if isinstance(n, ast.Try):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
74 return [n.body + n.orelse] + [[hdl] for hdl in n.handlers]
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
75
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
76 if PY35_PLUS:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
77 FOR_TYPES = (ast.For, ast.AsyncFor)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
78 LOOP_TYPES = (ast.While, ast.For, ast.AsyncFor)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
79 else:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
80 FOR_TYPES = (ast.For,)
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
81 LOOP_TYPES = (ast.While, ast.For)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
82
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
83 # https://github.com/python/typed_ast/blob/55420396/ast27/Parser/tokenizer.c#L102-L104
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
84 TYPE_COMMENT_RE = re.compile(r'^#\s*type:\s*')
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
85 # https://github.com/python/typed_ast/blob/55420396/ast27/Parser/tokenizer.c#L1400
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
86 TYPE_IGNORE_RE = re.compile(TYPE_COMMENT_RE.pattern + r'ignore\s*(#|$)')
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
87 # https://github.com/python/typed_ast/blob/55420396/ast27/Grammar/Grammar#L147
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
88 TYPE_FUNC_RE = re.compile(r'^(\(.*?\))\s*->\s*(.*)$')
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
89
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
90
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
91 class _FieldsOrder(dict):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
92 """Fix order of AST node fields."""
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
93
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
94 def _get_fields(self, node_class):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
95 # handle iter before target, and generators before element
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
96 fields = node_class._fields
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
97 if 'iter' in fields:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
98 key_first = 'iter'.find
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
99 elif 'generators' in fields:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
100 key_first = 'generators'.find
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
101 else:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
102 key_first = 'value'.find
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
103 return tuple(sorted(fields, key=key_first, reverse=True))
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
104
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
105 def __missing__(self, node_class):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
106 self[node_class] = fields = self._get_fields(node_class)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
107 return fields
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
108
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
109
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
110 def counter(items):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
111 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
112 Simplest required implementation of collections.Counter. Required as 2.6
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
113 does not have Counter in collections.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
114 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
115 results = {}
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
116 for item in items:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
117 results[item] = results.get(item, 0) + 1
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
118 return results
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
119
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
120
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
121 def iter_child_nodes(node, omit=None, _fields_order=_FieldsOrder()):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
122 """
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
123 Yield all direct child nodes of *node*, that is, all fields that
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
124 are nodes and all items of fields that are lists of nodes.
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
125
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
126 :param node: AST node to be iterated upon
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
127 :param omit: String or tuple of strings denoting the
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
128 attributes of the node to be omitted from
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
129 further parsing
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
130 :param _fields_order: Order of AST node fields
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
131 """
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
132 for name in _fields_order[node.__class__]:
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
133 if omit and name in omit:
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
134 continue
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
135 field = getattr(node, name, None)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
136 if isinstance(field, ast.AST):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
137 yield field
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
138 elif isinstance(field, list):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
139 for item in field:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
140 yield item
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
141
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
142
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
143 def convert_to_value(item):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
144 if isinstance(item, ast.Str):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
145 return item.s
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
146 elif hasattr(ast, 'Bytes') and isinstance(item, ast.Bytes):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
147 return item.s
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
148 elif isinstance(item, ast.Tuple):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
149 return tuple(convert_to_value(i) for i in item.elts)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
150 elif isinstance(item, ast.Num):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
151 return item.n
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
152 elif isinstance(item, ast.Name):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
153 result = VariableKey(item=item)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
154 constants_lookup = {
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
155 'True': True,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
156 'False': False,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
157 'None': None,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
158 }
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
159 return constants_lookup.get(
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
160 result.name,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
161 result,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
162 )
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
163 elif (not PY2) and isinstance(item, ast.NameConstant):
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
164 # None, True, False are nameconstants in python3, but names in 2
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
165 return item.value
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
166 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
167 return UnhandledKeyType()
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
168
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
169
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
170 def is_notimplemented_name_node(node):
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
171 return isinstance(node, ast.Name) and getNodeName(node) == 'NotImplemented'
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
172
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
173
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
174 class Binding(object):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
175 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
176 Represents the binding of a value to a name.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
177
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
178 The checker uses this to keep track of which names have been bound and
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
179 which names have not. See L{Assignment} for a special type of binding that
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
180 is checked with stricter rules.
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
181
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
182 @ivar used: pair of (L{Scope}, node) indicating the scope and
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
183 the node that this binding was last used.
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
184 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
185
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
186 def __init__(self, name, source):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
187 self.name = name
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
188 self.source = source
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
189 self.used = False
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
190
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
191 def __str__(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
192 return self.name
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
193
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
194 def __repr__(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
195 return '<%s object %r from line %r at 0x%x>' % (self.__class__.__name__,
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
196 self.name,
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
197 self.source.lineno,
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
198 id(self))
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
199
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
200 def redefines(self, other):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
201 return isinstance(other, Definition) and self.name == other.name
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
202
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
203
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
204 class Definition(Binding):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
205 """
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
206 A binding that defines a function or a class.
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
207 """
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
208
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
209
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
210 class Builtin(Definition):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
211 """A definition created for all Python builtins."""
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
212
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
213 def __init__(self, name):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
214 super(Builtin, self).__init__(name, None)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
215
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
216 def __repr__(self):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
217 return '<%s object %r at 0x%x>' % (self.__class__.__name__,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
218 self.name,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
219 id(self))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
220
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
221
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
222 class UnhandledKeyType(object):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
223 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
224 A dictionary key of a type that we cannot or do not check for duplicates.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
225 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
226
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
227
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
228 class VariableKey(object):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
229 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
230 A dictionary key which is a variable.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
231
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
232 @ivar item: The variable AST object.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
233 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
234 def __init__(self, item):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
235 self.name = item.id
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
236
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
237 def __eq__(self, compare):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
238 return (
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
239 compare.__class__ == self.__class__ and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
240 compare.name == self.name
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
241 )
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
242
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
243 def __hash__(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
244 return hash(self.name)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
245
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
246
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
247 class Importation(Definition):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
248 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
249 A binding created by an import statement.
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
250
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
251 @ivar fullName: The complete name given to the import statement,
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
252 possibly including multiple dotted components.
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
253 @type fullName: C{str}
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
254 """
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
255
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
256 def __init__(self, name, source, full_name=None):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
257 self.fullName = full_name or name
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
258 self.redefined = []
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
259 super(Importation, self).__init__(name, source)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
260
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
261 def redefines(self, other):
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
262 if isinstance(other, SubmoduleImportation):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
263 # See note in SubmoduleImportation about RedefinedWhileUnused
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
264 return self.fullName == other.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
265 return isinstance(other, Definition) and self.name == other.name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
266
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
267 def _has_alias(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
268 """Return whether importation needs an as clause."""
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
269 return not self.fullName.split('.')[-1] == self.name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
270
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
271 @property
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
272 def source_statement(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
273 """Generate a source statement equivalent to the import."""
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
274 if self._has_alias():
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
275 return 'import %s as %s' % (self.fullName, self.name)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
276 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
277 return 'import %s' % self.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
278
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
279 def __str__(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
280 """Return import full name with alias."""
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
281 if self._has_alias():
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
282 return self.fullName + ' as ' + self.name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
283 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
284 return self.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
285
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
286
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
287 class SubmoduleImportation(Importation):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
288 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
289 A binding created by a submodule import statement.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
290
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
291 A submodule import is a special case where the root module is implicitly
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
292 imported, without an 'as' clause, and the submodule is also imported.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
293 Python does not restrict which attributes of the root module may be used.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
294
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
295 This class is only used when the submodule import is without an 'as' clause.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
296
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
297 pyflakes handles this case by registering the root module name in the scope,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
298 allowing any attribute of the root module to be accessed.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
299
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
300 RedefinedWhileUnused is suppressed in `redefines` unless the submodule
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
301 name is also the same, to avoid false positives.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
302 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
303
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
304 def __init__(self, name, source):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
305 # A dot should only appear in the name when it is a submodule import
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
306 assert '.' in name and (not source or isinstance(source, ast.Import))
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
307 package_name = name.split('.')[0]
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
308 super(SubmoduleImportation, self).__init__(package_name, source)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
309 self.fullName = name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
310
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
311 def redefines(self, other):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
312 if isinstance(other, Importation):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
313 return self.fullName == other.fullName
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
314 return super(SubmoduleImportation, self).redefines(other)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
315
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
316 def __str__(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
317 return self.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
318
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
319 @property
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
320 def source_statement(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
321 return 'import ' + self.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
322
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
323
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
324 class ImportationFrom(Importation):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
325
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
326 def __init__(self, name, source, module, real_name=None):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
327 self.module = module
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
328 self.real_name = real_name or name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
329
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
330 if module.endswith('.'):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
331 full_name = module + self.real_name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
332 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
333 full_name = module + '.' + self.real_name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
334
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
335 super(ImportationFrom, self).__init__(name, source, full_name)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
336
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
337 def __str__(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
338 """Return import full name with alias."""
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
339 if self.real_name != self.name:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
340 return self.fullName + ' as ' + self.name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
341 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
342 return self.fullName
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
343
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
344 @property
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
345 def source_statement(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
346 if self.real_name != self.name:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
347 return 'from %s import %s as %s' % (self.module,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
348 self.real_name,
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
349 self.name)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
350 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
351 return 'from %s import %s' % (self.module, self.name)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
352
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
353
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
354 class StarImportation(Importation):
5510
cdcd0cd34e79 Upgraded pyflakes to version 1.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5389
diff changeset
355 """A binding created by a 'from x import *' statement."""
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
356
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
357 def __init__(self, name, source):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
358 super(StarImportation, self).__init__('*', source)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
359 # Each star importation needs a unique name, and
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
360 # may not be the module name otherwise it will be deemed imported
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
361 self.name = name + '.*'
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
362 self.fullName = name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
363
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
364 @property
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
365 def source_statement(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
366 return 'from ' + self.fullName + ' import *'
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
367
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
368 def __str__(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
369 # When the module ends with a ., avoid the ambiguous '..*'
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
370 if self.fullName.endswith('.'):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
371 return self.source_statement
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
372 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
373 return self.name
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
374
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
375
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
376 class FutureImportation(ImportationFrom):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
377 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
378 A binding created by a from `__future__` import statement.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
379
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
380 `__future__` imports are implicitly used.
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
381 """
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
382
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
383 def __init__(self, name, source, scope):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
384 super(FutureImportation, self).__init__(name, source, '__future__')
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
385 self.used = (scope, source)
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
386
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
387
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
388 class Argument(Binding):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
389 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
390 Represents binding a name as an argument.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
391 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
392
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
393
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
394 class Assignment(Binding):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
395 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
396 Represents binding a name with an explicit assignment.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
397
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
398 The checker will raise warnings for any Assignment that isn't used. Also,
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
399 the checker does not consider assignments in tuple/list unpacking to be
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
400 Assignments, rather it treats them as simple Bindings.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
401 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
402
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
403
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
404 class FunctionDefinition(Definition):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
405 pass
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
406
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
407
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
408 class ClassDefinition(Definition):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
409 pass
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
410
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
411
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
412 class ExportBinding(Binding):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
413 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
414 A binding created by an C{__all__} assignment. If the names in the list
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
415 can be determined statically, they will be treated as names for export and
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
416 additional checking applied to them.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
417
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
418 The only recognized C{__all__} assignment via list concatenation is in the
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
419 following format:
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
420
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
421 __all__ = ['a'] + ['b'] + ['c']
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
422
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
423 Names which are imported and not otherwise used but appear in the value of
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
424 C{__all__} will not have an unused import warning reported for them.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
425 """
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
426
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
427 def __init__(self, name, source, scope):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
428 if '__all__' in scope and isinstance(source, ast.AugAssign):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
429 self.names = list(scope['__all__'].names)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
430 else:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
431 self.names = []
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
432
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
433 def _add_to_names(container):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
434 for node in container.elts:
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
435 if isinstance(node, ast.Str):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
436 self.names.append(node.s)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
437
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
438 if isinstance(source.value, (ast.List, ast.Tuple)):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
439 _add_to_names(source.value)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
440 # If concatenating lists
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
441 elif isinstance(source.value, ast.BinOp):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
442 currentValue = source.value
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
443 while isinstance(currentValue.right, ast.List):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
444 left = currentValue.left
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
445 right = currentValue.right
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
446 _add_to_names(right)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
447 # If more lists are being added
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
448 if isinstance(left, ast.BinOp):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
449 currentValue = left
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
450 # If just two lists are being added
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
451 elif isinstance(left, ast.List):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
452 _add_to_names(left)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
453 # All lists accounted for - done
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
454 break
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
455 # If not list concatenation
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
456 else:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
457 break
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
458 super(ExportBinding, self).__init__(name, source)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
459
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
460
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
461 class Scope(dict):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
462 importStarred = False # set to True when import * is found
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
463
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
464 def __repr__(self):
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
465 scope_cls = self.__class__.__name__
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
466 return '<%s at 0x%x %s>' % (scope_cls, id(self), dict.__repr__(self))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
467
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
468
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
469 class ClassScope(Scope):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
470 pass
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
471
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
472
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
473 class FunctionScope(Scope):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
474 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
475 I represent a name scope for a function.
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
476
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
477 @ivar globals: Names declared 'global' in this function.
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
478 """
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
479 usesLocals = False
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
480 alwaysUsed = {'__tracebackhide__', '__traceback_info__',
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
481 '__traceback_supplement__'}
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
482
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
483 def __init__(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
484 super(FunctionScope, self).__init__()
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
485 # Simplify: manage the special locals as globals
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
486 self.globals = self.alwaysUsed.copy()
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
487 self.returnValue = None # First non-empty return
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
488 self.isGenerator = False # Detect a generator
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
489
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
490 def unusedAssignments(self):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
491 """
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
492 Return a generator for the assignments which have not been used.
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
493 """
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
494 for name, binding in self.items():
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
495 if (not binding.used and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
496 name != '_' and # see issue #202
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
497 name not in self.globals and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
498 not self.usesLocals and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
499 isinstance(binding, Assignment)):
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
500 yield name, binding
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
501
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
502
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
503 class GeneratorScope(Scope):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
504 pass
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
505
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
506
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
507 class ModuleScope(Scope):
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
508 """Scope for a module."""
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
509 _futures_allowed = True
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
510 _annotations_future_enabled = False
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
511
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
512
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
513 class DoctestScope(ModuleScope):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
514 """Scope for a doctest."""
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
515
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
516
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
517 # Globally defined names which are not attributes of the builtins module, or
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
518 # are only present on some platforms.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
519 _MAGIC_GLOBALS = ['__file__', '__builtins__', 'WindowsError']
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
520 # module scope annotation will store in `__annotations__`, see also PEP 526.
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
521 if PY36_PLUS:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
522 _MAGIC_GLOBALS.append('__annotations__')
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
523
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
524
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
525 def getNodeName(node):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
526 # Returns node.id, or node.name, or None
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
527 if hasattr(node, 'id'): # One of the many nodes with an id
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
528 return node.id
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
529 if hasattr(node, 'name'): # an ExceptHandler node
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
530 return node.name
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
531
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
532
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
533 def is_typing_overload(value, scope):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
534 def is_typing_overload_decorator(node):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
535 return (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
536 (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
537 isinstance(node, ast.Name) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
538 node.id in scope and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
539 scope[node.id].fullName == 'typing.overload'
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
540 ) or (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
541 isinstance(node, ast.Attribute) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
542 isinstance(node.value, ast.Name) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
543 node.value.id == 'typing' and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
544 node.attr == 'overload'
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
545 )
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
546 )
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
547
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
548 return (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
549 isinstance(value.source, ast.FunctionDef) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
550 len(value.source.decorator_list) == 1 and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
551 is_typing_overload_decorator(value.source.decorator_list[0])
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
552 )
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
553
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
554
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
555 def make_tokens(code):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
556 # PY3: tokenize.tokenize requires readline of bytes
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
557 if not isinstance(code, bytes):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
558 code = code.encode('UTF-8')
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
559 lines = iter(code.splitlines(True))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
560 # next(lines, b'') is to prevent an error in pypy3
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
561 return tuple(tokenize_tokenize(lambda: next(lines, b'')))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
562
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
563
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
564 class _TypeableVisitor(ast.NodeVisitor):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
565 """Collect the line number and nodes which are deemed typeable by
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
566 PEP 484
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
567
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
568 https://www.python.org/dev/peps/pep-0484/#type-comments
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
569 """
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
570 def __init__(self):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
571 self.typeable_lines = [] # type: List[int]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
572 self.typeable_nodes = {} # type: Dict[int, ast.AST]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
573
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
574 def _typeable(self, node):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
575 # if there is more than one typeable thing on a line last one wins
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
576 self.typeable_lines.append(node.lineno)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
577 self.typeable_nodes[node.lineno] = node
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
578
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
579 self.generic_visit(node)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
580
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
581 visit_Assign = visit_For = visit_FunctionDef = visit_With = _typeable
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
582 visit_AsyncFor = visit_AsyncFunctionDef = visit_AsyncWith = _typeable
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
583
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
584
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
585 def _collect_type_comments(tree, tokens):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
586 visitor = _TypeableVisitor()
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
587 visitor.visit(tree)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
588
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
589 type_comments = collections.defaultdict(list)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
590 for tp, text, start, _, _ in tokens:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
591 if (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
592 tp != tokenize.COMMENT or # skip non comments
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
593 not TYPE_COMMENT_RE.match(text) or # skip non-type comments
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
594 TYPE_IGNORE_RE.match(text) # skip ignores
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
595 ):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
596 continue
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
597
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
598 # search for the typeable node at or before the line number of the
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
599 # type comment.
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
600 # if the bisection insertion point is before any nodes this is an
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
601 # invalid type comment which is ignored.
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
602 lineno, _ = start
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
603 idx = bisect.bisect_right(visitor.typeable_lines, lineno)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
604 if idx == 0:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
605 continue
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
606 node = visitor.typeable_nodes[visitor.typeable_lines[idx - 1]]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
607 type_comments[node].append((start, text))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
608
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
609 return type_comments
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
610
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
611
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
612 class Checker(object):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
613 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
614 I check the cleanliness and sanity of Python code.
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
615
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
616 @ivar _deferredFunctions: Tracking list used by L{deferFunction}. Elements
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
617 of the list are two-tuples. The first element is the callable passed
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
618 to L{deferFunction}. The second element is a copy of the scope stack
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
619 at the time L{deferFunction} was called.
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
620
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
621 @ivar _deferredAssignments: Similar to C{_deferredFunctions}, but for
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
622 callables which are deferred assignment checks.
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
623 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
624
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
625 _ast_node_scope = {
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
626 ast.Module: ModuleScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
627 ast.ClassDef: ClassScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
628 ast.FunctionDef: FunctionScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
629 ast.Lambda: FunctionScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
630 ast.ListComp: GeneratorScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
631 ast.SetComp: GeneratorScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
632 ast.GeneratorExp: GeneratorScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
633 ast.DictComp: GeneratorScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
634 }
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
635 if PY35_PLUS:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
636 _ast_node_scope[ast.AsyncFunctionDef] = FunctionScope,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
637
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
638 nodeDepth = 0
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
639 offset = None
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
640 traceTree = False
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
641
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
642 builtIns = set(builtin_vars).union(_MAGIC_GLOBALS)
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
643 _customBuiltIns = os.environ.get('PYFLAKES_BUILTINS')
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
644 if _customBuiltIns:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
645 builtIns.update(_customBuiltIns.split(','))
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
646 del _customBuiltIns
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
647
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
648 # TODO: file_tokens= is required to perform checks on type comments,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
649 # eventually make this a required positional argument. For now it
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
650 # is defaulted to `()` for api compatibility.
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
651 def __init__(self, tree, filename='(none)', builtins=None,
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
652 withDoctest='PYFLAKES_DOCTEST' in os.environ, file_tokens=()):
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
653 self._nodeHandlers = {}
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
654 self._deferredFunctions = []
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
655 self._deferredAssignments = []
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
656 self.deadScopes = []
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
657 self.messages = []
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
658 self.filename = filename
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
659 if builtins:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
660 self.builtIns = self.builtIns.union(builtins)
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
661 self.withDoctest = withDoctest
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
662 try:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
663 self.scopeStack = [Checker._ast_node_scope[type(tree)]()]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
664 except KeyError:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
665 raise RuntimeError('No scope implemented for the node %r' % tree)
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
666 self.exceptHandlers = [()]
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
667 self.root = tree
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
668 self._type_comments = _collect_type_comments(tree, file_tokens)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
669 for builtin in self.builtIns:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
670 self.addBinding(None, Builtin(builtin))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
671 self.handleChildren(tree)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
672 self.runDeferred(self._deferredFunctions)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
673 # Set _deferredFunctions to None so that deferFunction will fail
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
674 # noisily if called after we've run through the deferred functions.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
675 self._deferredFunctions = None
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
676 self.runDeferred(self._deferredAssignments)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
677 # Set _deferredAssignments to None so that deferAssignment will fail
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
678 # noisily if called after we've run through the deferred assignments.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
679 self._deferredAssignments = None
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
680 del self.scopeStack[1:]
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
681 self.popScope()
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
682 self.checkDeadScopes()
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
683
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
684 def deferFunction(self, callable):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
685 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
686 Schedule a function handler to be called just before completion.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
687
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
688 This is used for handling function bodies, which must be deferred
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
689 because code later in the file might modify the global scope. When
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
690 `callable` is called, the scope at the time this is called will be
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
691 restored, however it will contain any new bindings added to it.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
692 """
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
693 self._deferredFunctions.append((callable, self.scopeStack[:], self.offset))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
694
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
695 def deferAssignment(self, callable):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
696 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
697 Schedule an assignment handler to be called just after deferred
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
698 function handlers.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
699 """
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
700 self._deferredAssignments.append((callable, self.scopeStack[:], self.offset))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
701
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
702 def runDeferred(self, deferred):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
703 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
704 Run the callables in C{deferred} using their associated scope stack.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
705 """
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
706 for handler, scope, offset in deferred:
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
707 self.scopeStack = scope
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
708 self.offset = offset
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
709 handler()
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
710
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
711 def _in_doctest(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
712 return (len(self.scopeStack) >= 2 and
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
713 isinstance(self.scopeStack[1], DoctestScope))
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
714
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
715 @property
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
716 def futuresAllowed(self):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
717 if not all(isinstance(scope, ModuleScope)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
718 for scope in self.scopeStack):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
719 return False
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
720
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
721 return self.scope._futures_allowed
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
722
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
723 @futuresAllowed.setter
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
724 def futuresAllowed(self, value):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
725 assert value is False
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
726 if isinstance(self.scope, ModuleScope):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
727 self.scope._futures_allowed = False
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
728
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
729 @property
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
730 def annotationsFutureEnabled(self):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
731 scope = self.scopeStack[0]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
732 if not isinstance(scope, ModuleScope):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
733 return False
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
734 return scope._annotations_future_enabled
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
735
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
736 @annotationsFutureEnabled.setter
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
737 def annotationsFutureEnabled(self, value):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
738 assert value is True
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
739 assert isinstance(self.scope, ModuleScope)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
740 self.scope._annotations_future_enabled = True
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
741
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
742 @property
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
743 def scope(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
744 return self.scopeStack[-1]
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
745
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
746 def popScope(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
747 self.deadScopes.append(self.scopeStack.pop())
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
748
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
749 def checkDeadScopes(self):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
750 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
751 Look at scopes which have been fully examined and report names in them
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
752 which were imported but unused.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
753 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
754 for scope in self.deadScopes:
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
755 # imports in classes are public members
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
756 if isinstance(scope, ClassScope):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
757 continue
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
758
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
759 all_binding = scope.get('__all__')
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
760 if all_binding and not isinstance(all_binding, ExportBinding):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
761 all_binding = None
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
762
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
763 if all_binding:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
764 all_names = set(all_binding.names)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
765 undefined = all_names.difference(scope)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
766 else:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
767 all_names = undefined = []
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
768
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
769 if undefined:
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
770 if not scope.importStarred and \
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
771 os.path.basename(self.filename) != '__init__.py':
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
772 # Look for possible mistakes in the export list
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
773 for name in undefined:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
774 self.report(messages.UndefinedExport,
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
775 scope['__all__'].source, name)
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
776
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
777 # mark all import '*' as used by the undefined in __all__
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
778 if scope.importStarred:
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
779 from_list = []
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
780 for binding in scope.values():
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
781 if isinstance(binding, StarImportation):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
782 binding.used = all_binding
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
783 from_list.append(binding.fullName)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
784 # report * usage, with a list of possible sources
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
785 from_list = ', '.join(sorted(from_list))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
786 for name in undefined:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
787 self.report(messages.ImportStarUsage,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
788 scope['__all__'].source, name, from_list)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
789
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
790 # Look for imported names that aren't used.
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
791 for value in scope.values():
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
792 if isinstance(value, Importation):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
793 used = value.used or value.name in all_names
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
794 if not used:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
795 messg = messages.UnusedImport
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
796 self.report(messg, value.source, str(value))
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
797 for node in value.redefined:
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
798 if isinstance(self.getParent(node), FOR_TYPES):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
799 messg = messages.ImportShadowedByLoopVar
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
800 elif used:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
801 continue
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
802 else:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
803 messg = messages.RedefinedWhileUnused
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
804 self.report(messg, node, value.name, value.source)
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
805
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
806 def pushScope(self, scopeClass=FunctionScope):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
807 self.scopeStack.append(scopeClass())
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
808
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
809 def report(self, messageClass, *args, **kwargs):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
810 self.messages.append(messageClass(self.filename, *args, **kwargs))
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
811
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
812 def getParent(self, node):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
813 # Lookup the first parent which is not Tuple, List or Starred
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
814 while True:
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
815 node = node.parent
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
816 if not hasattr(node, 'elts') and not hasattr(node, 'ctx'):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
817 return node
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
818
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
819 def getCommonAncestor(self, lnode, rnode, stop):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
820 if stop in (lnode, rnode) or not (hasattr(lnode, 'parent') and
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
821 hasattr(rnode, 'parent')):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
822 return None
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
823 if lnode is rnode:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
824 return lnode
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
825
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
826 if (lnode.depth > rnode.depth):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
827 return self.getCommonAncestor(lnode.parent, rnode, stop)
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
828 if (lnode.depth < rnode.depth):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
829 return self.getCommonAncestor(lnode, rnode.parent, stop)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
830 return self.getCommonAncestor(lnode.parent, rnode.parent, stop)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
831
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
832 def descendantOf(self, node, ancestors, stop):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
833 for a in ancestors:
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
834 if self.getCommonAncestor(node, a, stop):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
835 return True
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
836 return False
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
837
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
838 def _getAncestor(self, node, ancestor_type):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
839 parent = node
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
840 while True:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
841 if parent is self.root:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
842 return None
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
843 parent = self.getParent(parent)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
844 if isinstance(parent, ancestor_type):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
845 return parent
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
846
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
847 def getScopeNode(self, node):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
848 return self._getAncestor(node, tuple(Checker._ast_node_scope.keys()))
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
849
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
850 def differentForks(self, lnode, rnode):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
851 """True, if lnode and rnode are located on different forks of IF/TRY"""
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
852 ancestor = self.getCommonAncestor(lnode, rnode, self.root)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
853 parts = getAlternatives(ancestor)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
854 if parts:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
855 for items in parts:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
856 if self.descendantOf(lnode, items, ancestor) ^ \
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
857 self.descendantOf(rnode, items, ancestor):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
858 return True
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
859 return False
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
860
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
861 def addBinding(self, node, value):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
862 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
863 Called when a binding is altered.
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
864
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
865 - `node` is the statement responsible for the change
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
866 - `value` is the new value, a Binding instance
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
867 """
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
868 # assert value.source in (node, node.parent):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
869 for scope in self.scopeStack[::-1]:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
870 if value.name in scope:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
871 break
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
872 existing = scope.get(value.name)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
873
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
874 if (existing and not isinstance(existing, Builtin) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
875 not self.differentForks(node, existing.source)):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
876
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
877 parent_stmt = self.getParent(value.source)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
878 if isinstance(existing, Importation) and isinstance(parent_stmt, FOR_TYPES):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
879 self.report(messages.ImportShadowedByLoopVar,
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
880 node, value.name, existing.source)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
881
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
882 elif scope is self.scope:
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
883 if (isinstance(parent_stmt, ast.comprehension) and
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
884 not isinstance(self.getParent(existing.source),
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
885 (FOR_TYPES, ast.comprehension))):
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
886 self.report(messages.RedefinedInListComp,
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
887 node, value.name, existing.source)
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
888 elif not existing.used and value.redefines(existing):
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
889 if value.name != '_' or isinstance(existing, Importation):
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
890 if not is_typing_overload(existing, self.scope):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
891 self.report(messages.RedefinedWhileUnused,
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
892 node, value.name, existing.source)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
893
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
894 elif isinstance(existing, Importation) and value.redefines(existing):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
895 existing.redefined.append(node)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
896
4502
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
897 if value.name in self.scope:
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
898 # then assume the rebound name is used as a global or within a loop
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
899 value.used = self.scope[value.name].used
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
900
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
901 self.scope[value.name] = value
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
902
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
903 def getNodeHandler(self, node_class):
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
904 try:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
905 return self._nodeHandlers[node_class]
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
906 except KeyError:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
907 nodeType = getNodeType(node_class)
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
908 self._nodeHandlers[node_class] = handler = getattr(self, nodeType)
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
909 return handler
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
910
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
911 def handleNodeLoad(self, node):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
912 name = getNodeName(node)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
913 if not name:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
914 return
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
915
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
916 in_generators = None
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
917 importStarred = None
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
918
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
919 # try enclosing function scopes and global scope
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
920 for scope in self.scopeStack[-1::-1]:
6353
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
921 if isinstance(scope, ClassScope):
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
922 if not PY2 and name == '__class__':
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
923 return
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
924 elif in_generators is False:
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
925 # only generators used in a class scope can access the
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
926 # names of the class. this is skipped during the first
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
927 # iteration
6a0f3abd6878 upgraded pyflakes to version 2.0.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
928 continue
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
929
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
930 if (name == 'print' and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
931 isinstance(scope.get(name, None), Builtin)):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
932 parent = self.getParent(node)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
933 if (isinstance(parent, ast.BinOp) and
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
934 isinstance(parent.op, ast.RShift)):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
935 self.report(messages.InvalidPrintSyntax, node)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
936
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
937 try:
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
938 scope[name].used = (self.scope, node)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
939
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
940 # if the name of SubImportation is same as
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
941 # alias of other Importation and the alias
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
942 # is used, SubImportation also should be marked as used.
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
943 n = scope[name]
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
944 if isinstance(n, Importation) and n._has_alias():
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
945 try:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
946 scope[n.fullName].used = (self.scope, node)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
947 except KeyError:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
948 pass
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
949 except KeyError:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
950 pass
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
951 else:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
952 return
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
953
5067
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
954 importStarred = importStarred or scope.importStarred
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
955
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
956 if in_generators is not False:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
957 in_generators = isinstance(scope, GeneratorScope)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
958
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
959 if importStarred:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
960 from_list = []
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
961
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
962 for scope in self.scopeStack[-1::-1]:
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
963 for binding in scope.values():
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
964 if isinstance(binding, StarImportation):
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
965 # mark '*' imports as used for each scope
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
966 binding.used = (self.scope, node)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
967 from_list.append(binding.fullName)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
968
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
969 # report * usage, with a list of possible sources
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
970 from_list = ', '.join(sorted(from_list))
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
971 self.report(messages.ImportStarUsage, node, name, from_list)
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
972 return
e2f171f08af8 Updated pyflakes to 1.2.3+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5065
diff changeset
973
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
974 if name == '__path__' and os.path.basename(self.filename) == '__init__.py':
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
975 # the special name __path__ is valid only in packages
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
976 return
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
977
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
978 if name == '__module__' and isinstance(self.scope, ClassScope):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
979 return
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
980
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
981 # protected with a NameError handler?
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
982 if 'NameError' not in self.exceptHandlers[-1]:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
983 self.report(messages.UndefinedName, node, name)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
984
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
985 def handleNodeStore(self, node):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
986 name = getNodeName(node)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
987 if not name:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
988 return
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
989 # if the name hasn't already been defined in the current scope
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
990 if isinstance(self.scope, FunctionScope) and name not in self.scope:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
991 # for each function or module scope above us
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
992 for scope in self.scopeStack[:-1]:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
993 if not isinstance(scope, (FunctionScope, ModuleScope)):
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
994 continue
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
995 # if the name was defined in that scope, and the name has
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
996 # been accessed already in the current scope, and hasn't
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
997 # been declared global
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
998 used = name in scope and scope[name].used
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
999 if used and used[0] is self.scope and name not in self.scope.globals:
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1000 # then it's probably a mistake
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1001 self.report(messages.UndefinedLocal,
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1002 scope[name].used[1], name, scope[name].source)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1003 break
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1004
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
1005 parent_stmt = self.getParent(node)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1006 if isinstance(parent_stmt, (FOR_TYPES, ast.comprehension)) or (
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
1007 parent_stmt != node.parent and
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
1008 not self.isLiteralTupleUnpacking(parent_stmt)):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1009 binding = Binding(name, node)
3544
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
1010 elif name == '__all__' and isinstance(self.scope, ModuleScope):
431c842fd09a updated pyflakes to version 0.8.1 (Python 3.4.0 compatible)
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3456
diff changeset
1011 binding = ExportBinding(name, node.parent, self.scope)
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1012 elif isinstance(getattr(node, 'ctx', None), ast.Param):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1013 binding = Argument(name, self.getScopeNode(node))
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1014 else:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1015 binding = Assignment(name, node)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1016 self.addBinding(node, binding)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1017
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1018 def handleNodeDelete(self, node):
4502
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1019
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1020 def on_conditional_branch():
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1021 """
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1022 Return `True` if node is part of a conditional body.
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1023 """
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1024 current = getattr(node, 'parent', None)
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1025 while current:
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1026 if isinstance(current, (ast.If, ast.While, ast.IfExp)):
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1027 return True
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1028 current = getattr(current, 'parent', None)
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1029 return False
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1030
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1031 name = getNodeName(node)
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1032 if not name:
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1033 return
4502
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1034
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1035 if on_conditional_branch():
5510
cdcd0cd34e79 Upgraded pyflakes to version 1.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5389
diff changeset
1036 # We cannot predict if this conditional branch is going to
4502
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1037 # be executed.
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1038 return
76f2b46437a6 Updated to pyflakes 1.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4465
diff changeset
1039
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1040 if isinstance(self.scope, FunctionScope) and name in self.scope.globals:
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1041 self.scope.globals.remove(name)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1042 else:
3177
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1043 try:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1044 del self.scope[name]
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1045 except KeyError:
5af61402d74d Update pyflakes to 0.7.3
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
1046 self.report(messages.UndefinedName, node, name)
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1047
6742
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1048 def _handle_type_comments(self, node):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1049 for (lineno, col_offset), comment in self._type_comments.get(node, ()):
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1050 comment = comment.split(':', 1)[1].strip()
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1051 func_match = TYPE_FUNC_RE.match(comment)
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1052 if func_match:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1053 parts = (
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1054 func_match.group(1).replace('*', ''),
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1055 func_match.group(2).strip(),
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1056 )
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1057 else:
7cb30f7f94f6 Upgraded pyflakes to 2.1.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645