1 """
2 syntax_abbrev.py - Abbreviations for pretty-printing syntax.asdl.
3
4 This module is not used directly, but is combined with generated code.
5 """
6
7 from _devbuild.gen.id_kind_asdl import Id
8 from _devbuild.gen.hnode_asdl import hnode_t
9 from asdl import runtime
10
11
12 def _AbbreviateToken(tok, out):
13 # type: (Token, List[hnode_t]) -> None
14 if tok.id != Id.Lit_Chars:
15 n1 = runtime.NewLeaf(Id_str(tok.id), color_e.OtherConst)
16 out.append(n1)
17
18 n2 = runtime.NewLeaf(tok.tval, color_e.StringConst)
19 out.append(n2)
20
21
22 def _Token(obj):
23 # type: (Token) -> hnode_t
24 p_node = runtime.NewRecord('') # don't show node type
25 p_node.abbrev = True
26
27 p_node.left = '<'
28 p_node.right = '>'
29 _AbbreviateToken(obj, p_node.unnamed_fields)
30 return p_node
31
32
33 def _CompoundWord(obj):
34 # type: (CompoundWord) -> hnode_t
35 p_node = runtime.NewRecord('') # don't show node type
36 p_node.abbrev = True
37 p_node.left = '{'
38 p_node.right = '}'
39
40 for part in obj.parts:
41 p_node.unnamed_fields.append(part.AbbreviatedTree())
42 return p_node
43
44
45 def _DoubleQuoted(obj):
46 # type: (DoubleQuoted) -> hnode_t
47 if obj.left.id != Id.Left_DoubleQuote:
48 return None # Fall back on obj._AbbreviatedTree()
49
50 p_node = runtime.NewRecord('DQ')
51 p_node.abbrev = True
52
53 for part in obj.parts:
54 p_node.unnamed_fields.append(part.AbbreviatedTree())
55 return p_node
56
57
58 def _SingleQuoted(obj):
59 # type: (SingleQuoted) -> hnode_t
60
61 # Only abbreviate 'foo', not $'foo\n' or r'foo'
62 if obj.left.id != Id.Left_SingleQuote:
63 return None # Fall back on obj._AbbreviatedTree()
64
65 p_node = runtime.NewRecord('SQ')
66 p_node.abbrev = True
67
68 for token in obj.tokens:
69 p_node.unnamed_fields.append(token.AbbreviatedTree())
70 return p_node
71
72
73 def _SimpleVarSub(obj):
74 # type: (SimpleVarSub) -> hnode_t
75 p_node = runtime.NewRecord('$')
76 p_node.abbrev = True
77
78 if obj.left.id != Id.VSub_Name:
79 n1 = runtime.NewLeaf(Id_str(obj.left.id), color_e.OtherConst)
80 p_node.unnamed_fields.append(n1)
81
82 n2 = runtime.NewLeaf(obj.var_name, color_e.StringConst)
83 p_node.unnamed_fields.append(n2)
84
85 return p_node
86
87
88 def _BracedVarSub(obj):
89 # type: (BracedVarSub) -> hnode_t
90 p_node = runtime.NewRecord('${')
91 if obj.prefix_op or obj.bracket_op or obj.suffix_op:
92 return None # we have other fields to display; don't abbreviate
93
94 p_node.abbrev = True
95 _AbbreviateToken(obj.token, p_node.unnamed_fields)
96 return p_node
97
98
99 def _command__Simple(obj):
100 # type: (command.Simple) -> hnode_t
101 p_node = runtime.NewRecord('C')
102 if (obj.redirects or obj.more_env or obj.typed_args or obj.block or
103 obj.do_fork == False):
104 return None # we have other fields to display; don't abbreviate
105
106 p_node.abbrev = True
107
108 for w in obj.words:
109 p_node.unnamed_fields.append(w.AbbreviatedTree())
110 return p_node
111
112
113 def _expr__Var(obj):
114 # type: (expr.Var) -> hnode_t
115 p_node = runtime.NewRecord('Var')
116 p_node.abbrev = True
117
118 assert obj.name.id == Id.Expr_Name, obj.name
119 n1 = runtime.NewLeaf(obj.name.tval, color_e.StringConst)
120 p_node.unnamed_fields.append(n1)
121 return p_node
122
123
124 def _expr__Const(obj):
125 # type: (expr.Const) -> hnode_t
126 p_node = runtime.NewRecord('Const')
127 p_node.abbrev = True
128
129 tok = obj.c
130 out = p_node.unnamed_fields
131
132 n1 = runtime.NewLeaf(Id_str(tok.id), color_e.OtherConst)
133 out.append(n1)
134
135 n2 = runtime.NewLeaf(tok.tval, color_e.StringConst)
136 out.append(n2)
137 return p_node