OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # | |
3 # Copyright 2008 The Closure Linter Authors. All Rights Reserved. | |
4 # | |
5 # Licensed under the Apache License, Version 2.0 (the "License"); | |
6 # you may not use this file except in compliance with the License. | |
7 # You may obtain a copy of the License at | |
8 # | |
9 # http://www.apache.org/licenses/LICENSE-2.0 | |
10 # | |
11 # Unless required by applicable law or agreed to in writing, software | |
12 # distributed under the License is distributed on an "AS-IS" BASIS, | |
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 # See the License for the specific language governing permissions and | |
15 # limitations under the License. | |
16 | |
17 """Classes to represent tokens and positions within them.""" | |
18 | |
19 __author__ = ('robbyw@google.com (Robert Walker)', | |
20 'ajp@google.com (Andy Perelson)') | |
21 | |
22 | |
23 class TokenType(object): | |
24 """Token types common to all languages.""" | |
25 NORMAL = 'normal' | |
26 WHITESPACE = 'whitespace' | |
27 BLANK_LINE = 'blank line' | |
28 | |
29 | |
30 class Token(object): | |
31 """Token class for intelligent text splitting. | |
32 | |
33 The token class represents a string of characters and an identifying type. | |
34 | |
35 Attributes: | |
36 type: The type of token. | |
37 string: The characters the token comprises. | |
38 length: The length of the token. | |
39 line: The text of the line the token is found in. | |
40 line_number: The number of the line the token is found in. | |
41 values: Dictionary of values returned from the tokens regex match. | |
42 previous: The token before this one. | |
43 next: The token after this one. | |
44 start_index: The character index in the line where this token starts. | |
45 attached_object: Object containing more information about this token. | |
46 metadata: Object containing metadata about this token. Must be added by | |
47 a separate metadata pass. | |
48 """ | |
49 | |
50 def __init__(self, string, token_type, line, line_number, values=None, | |
51 orig_line_number=None): | |
52 """Creates a new Token object. | |
53 | |
54 Args: | |
55 string: The string of input the token contains. | |
56 token_type: The type of token. | |
57 line: The text of the line this token is in. | |
58 line_number: The line number of the token. | |
59 values: A dict of named values within the token. For instance, a | |
60 function declaration may have a value called 'name' which captures the | |
61 name of the function. | |
62 orig_line_number: The line number of the original file this token comes | |
63 from. This should be only set during the tokenization process. For newly | |
64 created error fix tokens after that, it should be None. | |
65 """ | |
66 self.type = token_type | |
67 self.string = string | |
68 self.length = len(string) | |
69 self.line = line | |
70 self.line_number = line_number | |
71 self.orig_line_number = orig_line_number | |
72 self.values = values | |
73 self.is_deleted = False | |
74 | |
75 # These parts can only be computed when the file is fully tokenized | |
76 self.previous = None | |
77 self.next = None | |
78 self.start_index = None | |
79 | |
80 # This part is set in statetracker.py | |
81 # TODO(robbyw): Wrap this in to metadata | |
82 self.attached_object = None | |
83 | |
84 # This part is set in *metadatapass.py | |
85 self.metadata = None | |
86 | |
87 def IsFirstInLine(self): | |
88 """Tests if this token is the first token in its line. | |
89 | |
90 Returns: | |
91 Whether the token is the first token in its line. | |
92 """ | |
93 return not self.previous or self.previous.line_number != self.line_number | |
94 | |
95 def IsLastInLine(self): | |
96 """Tests if this token is the last token in its line. | |
97 | |
98 Returns: | |
99 Whether the token is the last token in its line. | |
100 """ | |
101 return not self.next or self.next.line_number != self.line_number | |
102 | |
103 def IsType(self, token_type): | |
104 """Tests if this token is of the given type. | |
105 | |
106 Args: | |
107 token_type: The type to test for. | |
108 | |
109 Returns: | |
110 True if the type of this token matches the type passed in. | |
111 """ | |
112 return self.type == token_type | |
113 | |
114 def IsAnyType(self, *token_types): | |
115 """Tests if this token is any of the given types. | |
116 | |
117 Args: | |
118 token_types: The types to check. Also accepts a single array. | |
119 | |
120 Returns: | |
121 True if the type of this token is any of the types passed in. | |
122 """ | |
123 if not isinstance(token_types[0], basestring): | |
124 return self.type in token_types[0] | |
125 else: | |
126 return self.type in token_types | |
127 | |
128 def __repr__(self): | |
129 return '<Token: %s, "%s", %r, %d, %r>' % (self.type, self.string, | |
130 self.values, self.line_number, | |
131 self.metadata) | |
132 | |
133 def __iter__(self): | |
134 """Returns a token iterator.""" | |
135 node = self | |
136 while node: | |
137 yield node | |
138 node = node.next | |
139 | |
140 def __reversed__(self): | |
141 """Returns a reverse-direction token iterator.""" | |
142 node = self | |
143 while node: | |
144 yield node | |
145 node = node.previous | |
OLD | NEW |