OILS / frontend / syntax_abbrev.py View on Github | oilshell.org

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