OLD | NEW |
| (Empty) |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 # pylint: disable=wildcard-import | |
6 from catapult_base.refactor.annotated_symbol.class_definition import * | |
7 from catapult_base.refactor.annotated_symbol.function_definition import * | |
8 from catapult_base.refactor.annotated_symbol.import_statement import * | |
9 from catapult_base.refactor.annotated_symbol.reference import * | |
10 from catapult_base.refactor import snippet | |
11 | |
12 | |
13 __all__ = [ | |
14 'Annotate', | |
15 | |
16 'Class', | |
17 'Function', | |
18 'Import', | |
19 'Reference', | |
20 ] | |
21 | |
22 | |
23 # Specific symbol types with extra methods for manipulating them. | |
24 # Python's full grammar is here: | |
25 # https://docs.python.org/2/reference/grammar.html | |
26 | |
27 # Annotated Symbols have an Annotate classmethod that takes a symbol type and | |
28 # list of children, and returns an instance of that annotated Symbol. | |
29 | |
30 ANNOTATED_SYMBOLS = ( | |
31 AsName, | |
32 Class, | |
33 DottedName, | |
34 ImportFrom, | |
35 ImportName, | |
36 Function, | |
37 ) | |
38 | |
39 | |
40 # Unfortunately, some logical groupings are not represented by a node in the | |
41 # parse tree. To work around this, some annotated Symbols have an Annotate | |
42 # classmethod that takes and returns a list of Snippets instead. | |
43 | |
44 ANNOTATED_GROUPINGS = ( | |
45 Reference, | |
46 ) | |
47 | |
48 | |
49 def Annotate(f): | |
50 """Return the syntax tree of the given file.""" | |
51 return _AnnotateNode(snippet.Snippetize(f)) | |
52 | |
53 | |
54 def _AnnotateNode(node): | |
55 if not isinstance(node, snippet.Symbol): | |
56 return node | |
57 | |
58 children = map(_AnnotateNode, node.children) | |
59 | |
60 for symbol_type in ANNOTATED_GROUPINGS: | |
61 annotated_grouping = symbol_type.Annotate(children) | |
62 if annotated_grouping: | |
63 children = annotated_grouping | |
64 break | |
65 | |
66 for symbol_type in ANNOTATED_SYMBOLS: | |
67 annotated_symbol = symbol_type.Annotate(node.type, children) | |
68 if annotated_symbol: | |
69 return annotated_symbol | |
70 | |
71 return snippet.Symbol(node.type, children) | |
OLD | NEW |