Tue, 16 Jun 2020 17:44:28 +0200
Third Party packages: updated asttoken to version 2.0.4.
6929
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3 | # Copyright 2016 Grist Labs, Inc. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | # Licensed under the Apache License, Version 2.0 (the "License"); |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | # you may not use this file except in compliance with the License. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | # You may obtain a copy of the License at |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | # |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | # http://www.apache.org/licenses/LICENSE-2.0 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | # |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | # Unless required by applicable law or agreed to in writing, software |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | # distributed under the License is distributed on an "AS IS" BASIS, |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | # See the License for the specific language governing permissions and |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | # limitations under the License. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | import sys |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | if sys.version_info[0] == 3: |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | xrange = range |
7621
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
20 | binary_type = bytes |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
21 | else: |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
22 | binary_type = str |
6929
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | import ast |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | import bisect |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | import token |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | import tokenize |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | import io |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | from .line_numbers import LineNumbers |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | from .util import Token, match_token, is_non_coding_token |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | from .mark_tokens import MarkTokens |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | class ASTTokens(object): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | ASTTokens maintains the text of Python code in several forms: as a string, as line numbers, and |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | as tokens, and is used to mark and access token and position information. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | ``source_text`` must be a unicode or UTF8-encoded string. If you pass in UTF8 bytes, remember |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | that all offsets you'll get are to the unicode text, which is available as the ``.text`` |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | property. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | If ``parse`` is set, the ``source_text`` will be parsed with ``ast.parse()``, and the resulting |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | tree marked with token info and made available as the ``.tree`` property. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | If ``tree`` is given, it will be marked and made available as the ``.tree`` property. In |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | addition to the trees produced by the ``ast`` module, ASTTokens will also mark trees produced |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | using ``astroid`` library <https://www.astroid.org>. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | If only ``source_text`` is given, you may use ``.mark_tokens(tree)`` to mark the nodes of an AST |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | tree created separately. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | def __init__(self, source_text, parse=False, tree=None, filename='<unknown>'): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | self._filename = filename |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | self._tree = ast.parse(source_text, filename) if parse else tree |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | |
7621
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
57 | # Decode source after parsing to let Python 2 handle coding declarations. |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
58 | # (If the encoding was not utf-8 compatible, then even if it parses correctly, |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
59 | # we'll fail with a unicode error here.) |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
60 | if isinstance(source_text, binary_type): |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
61 | source_text = source_text.decode('utf8') |
ffd1f00ca376
Third Party packages: updated asttoken to version 2.0.4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
62 | |
6929
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | self._text = source_text |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | self._line_numbers = LineNumbers(source_text) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | # Tokenize the code. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | self._tokens = list(self._generate_tokens(source_text)) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | # Extract the start positions of all tokens, so that we can quickly map positions to tokens. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | self._token_offsets = [tok.startpos for tok in self._tokens] |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | if self._tree: |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | self.mark_tokens(self._tree) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | def mark_tokens(self, root_node): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | Given the root of the AST or Astroid tree produced from source_text, visits all nodes marking |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | them with token and position information by adding ``.first_token`` and |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | ``.last_token``attributes. This is done automatically in the constructor when ``parse`` or |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | ``tree`` arguments are set, but may be used manually with a separate AST or Astroid tree. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | # The hard work of this class is done by MarkTokens |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | MarkTokens(self).visit_tree(root_node) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | def _generate_tokens(self, text): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | Generates tokens for the given code. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | # This is technically an undocumented API for Python3, but allows us to use the same API as for |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | # Python2. See http://stackoverflow.com/a/4952291/328565. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | for index, tok in enumerate(tokenize.generate_tokens(io.StringIO(text).readline)): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | tok_type, tok_str, start, end, line = tok |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | yield Token(tok_type, tok_str, start, end, line, index, |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | self._line_numbers.line_to_offset(start[0], start[1]), |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | self._line_numbers.line_to_offset(end[0], end[1])) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | @property |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | def text(self): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | """The source code passed into the constructor.""" |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | return self._text |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | @property |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | def tokens(self): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | """The list of tokens corresponding to the source code from the constructor.""" |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | return self._tokens |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | @property |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | def tree(self): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | """The root of the AST tree passed into the constructor or parsed from the source code.""" |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | return self._tree |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | @property |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | def filename(self): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | """The filename that was parsed""" |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | return self._filename |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | def get_token_from_offset(self, offset): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | Returns the token containing the given character offset (0-based position in source text), |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | or the preceeding token if the position is between tokens. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | return self._tokens[bisect.bisect(self._token_offsets, offset) - 1] |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | def get_token(self, lineno, col_offset): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | Returns the token containing the given (lineno, col_offset) position, or the preceeding token |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | if the position is between tokens. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | # TODO: add test for multibyte unicode. We need to translate offsets from ast module (which |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | # are in utf8) to offsets into the unicode text. tokenize module seems to use unicode offsets |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | # but isn't explicit. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | return self.get_token_from_offset(self._line_numbers.line_to_offset(lineno, col_offset)) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | def get_token_from_utf8(self, lineno, col_offset): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | Same as get_token(), but interprets col_offset as a UTF8 offset, which is what `ast` uses. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | return self.get_token(lineno, self._line_numbers.from_utf8_col(lineno, col_offset)) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | def next_token(self, tok, include_extra=False): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144 | Returns the next token after the given one. If include_extra is True, includes non-coding |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | tokens from the tokenize module, such as NL and COMMENT. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | i = tok.index + 1 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | if not include_extra: |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149 | while is_non_coding_token(self._tokens[i].type): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150 | i += 1 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | return self._tokens[i] |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | def prev_token(self, tok, include_extra=False): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | Returns the previous token before the given one. If include_extra is True, includes non-coding |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | tokens from the tokenize module, such as NL and COMMENT. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | i = tok.index - 1 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | if not include_extra: |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | while is_non_coding_token(self._tokens[i].type): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | i -= 1 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | return self._tokens[i] |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164 | def find_token(self, start_token, tok_type, tok_str=None, reverse=False): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | Looks for the first token, starting at start_token, that matches tok_type and, if given, the |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | token string. Searches backwards if reverse is True. Returns ENDMARKER token if not found (you |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | can check it with `token.ISEOF(t.type)`. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170 | t = start_token |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | advance = self.prev_token if reverse else self.next_token |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | while not match_token(t, tok_type, tok_str) and not token.ISEOF(t.type): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173 | t = advance(t, include_extra=True) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174 | return t |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | def token_range(self, first_token, last_token, include_extra=False): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178 | Yields all tokens in order from first_token through and including last_token. If |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179 | include_extra is True, includes non-coding tokens such as tokenize.NL and .COMMENT. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181 | for i in xrange(first_token.index, last_token.index + 1): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182 | if include_extra or not is_non_coding_token(self._tokens[i].type): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183 | yield self._tokens[i] |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185 | def get_tokens(self, node, include_extra=False): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187 | Yields all tokens making up the given node. If include_extra is True, includes non-coding |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188 | tokens such as tokenize.NL and .COMMENT. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | return self.token_range(node.first_token, node.last_token, include_extra=include_extra) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | def get_text_range(self, node): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194 | After mark_tokens() has been called, returns the (startpos, endpos) positions in source text |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195 | corresponding to the given node. Returns (0, 0) for nodes (like `Load`) that don't correspond |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196 | to any particular text. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198 | if not hasattr(node, 'first_token'): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199 | return (0, 0) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201 | start = node.first_token.startpos |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202 | if any(match_token(t, token.NEWLINE) for t in self.get_tokens(node)): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203 | # Multi-line nodes would be invalid unless we keep the indentation of the first node. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204 | start = self._text.rfind('\n', 0, start) + 1 |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206 | return (start, node.last_token.endpos) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207 | |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | def get_text(self, node): |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | After mark_tokens() has been called, returns the text corresponding to the given node. Returns |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | '' for nodes (like `Load`) that don't correspond to any particular text. |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | """ |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | start, end = self.get_text_range(node) |
0db8a4378ad7
ThirdParty: added the asttoken package with slight modifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214 | return self._text[start : end] |