eric6/ThirdParty/asttokens/asttokens/asttokens.py

Tue, 16 Jun 2020 17:44:28 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 16 Jun 2020 17:44:28 +0200
changeset 7621
ffd1f00ca376
parent 6942
2602857055c5
permissions
-rw-r--r--

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]

eric ide

mercurial