| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # Copyright 2022 Bill Wendling, All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """PyParser-related utilities.
- This module collects various utilities related to the parse trees produced by
- the pyparser.
- GetLogicalLine: produces a list of tokens from the logical lines within a
- range.
- GetTokensInSubRange: produces a sublist of tokens from a current token list
- within a range.
- GetTokenIndex: Get the index of a token.
- GetNextTokenIndex: Get the index of the next token after a given position.
- GetPrevTokenIndex: Get the index of the previous token before a given
- position.
- TokenStart: Convenience function to return the token's start as a tuple.
- TokenEnd: Convenience function to return the token's end as a tuple.
- """
- def GetLogicalLine(logical_lines, node):
- """Get a list of tokens within the node's range from the logical lines."""
- start = TokenStart(node)
- end = TokenEnd(node)
- tokens = []
- for line in logical_lines:
- if line.start > end:
- break
- if line.start <= start or line.end >= end:
- tokens.extend(GetTokensInSubRange(line.tokens, node))
- return tokens
- def GetTokensInSubRange(tokens, node):
- """Get a subset of tokens representing the node."""
- start = TokenStart(node)
- end = TokenEnd(node)
- tokens_in_range = []
- for tok in tokens:
- tok_range = (tok.lineno, tok.column)
- if tok_range >= start and tok_range < end:
- tokens_in_range.append(tok)
- return tokens_in_range
- def GetTokenIndex(tokens, pos):
- """Get the index of the token at pos."""
- for index, token in enumerate(tokens):
- if (token.lineno, token.column) == pos:
- return index
- return None
- def GetNextTokenIndex(tokens, pos):
- """Get the index of the next token after pos."""
- for index, token in enumerate(tokens):
- if (token.lineno, token.column) >= pos:
- return index
- return None
- def GetPrevTokenIndex(tokens, pos):
- """Get the index of the previous token before pos."""
- for index, token in enumerate(tokens):
- if index > 0 and (token.lineno, token.column) >= pos:
- return index - 1
- return None
- def TokenStart(node):
- return (node.lineno, node.col_offset)
- def TokenEnd(node):
- return (node.end_lineno, node.end_col_offset)
- #############################################################################
- # Code for debugging #
- #############################################################################
- def AstDump(node):
- import ast
- print(ast.dump(node, include_attributes=True, indent=4))
|