44
44
45
45
Base. show (io:: IO , :: ErrorVal ) = printstyled (io, " ✘" , color= :light_red )
46
46
47
- function SyntaxNode (source:: SourceFile , raw:: GreenNode{SyntaxHead} , position:: Integer = 1 )
47
+ function SyntaxNode (source:: SourceFile , raw:: GreenNode{SyntaxHead} ;
48
+ keep_parens= false , position:: Integer = 1 )
49
+ _to_SyntaxNode (source, raw, convert (Int, position), keep_parens)
50
+ end
51
+
52
+ function _to_SyntaxNode (source:: SourceFile , raw:: GreenNode{SyntaxHead} ,
53
+ position:: Int , keep_parens:: Bool )
48
54
if ! haschildren (raw) && ! (is_syntax_kind (raw) || is_keyword (raw))
49
55
# Here we parse the values eagerly rather than representing them as
50
56
# strings. Maybe this is good. Maybe not.
@@ -56,10 +62,13 @@ function SyntaxNode(source::SourceFile, raw::GreenNode{SyntaxHead}, position::In
56
62
for (i,rawchild) in enumerate (children (raw))
57
63
# FIXME : Allowing trivia is_error nodes here corrupts the tree layout.
58
64
if ! is_trivia (rawchild) || is_error (rawchild)
59
- push! (cs, SyntaxNode (source, rawchild, pos))
65
+ push! (cs, _to_SyntaxNode (source, rawchild, pos, keep_parens ))
60
66
end
61
67
pos += rawchild. span
62
68
end
69
+ if ! keep_parens && kind (raw) == K " parens" && length (cs) == 1
70
+ return cs[1 ]
71
+ end
63
72
node = SyntaxNode (nothing , cs, SyntaxData (source, raw, position, nothing ))
64
73
for c in cs
65
74
c. parent = node
@@ -182,10 +191,11 @@ end
182
191
# shallow-copy the data
183
192
Base. copy (data:: SyntaxData ) = SyntaxData (data. source, data. raw, data. position, data. val)
184
193
185
- function build_tree (:: Type{SyntaxNode} , stream:: ParseStream ; filename= nothing , first_line= 1 , kws... )
194
+ function build_tree (:: Type{SyntaxNode} , stream:: ParseStream ;
195
+ filename= nothing , first_line= 1 , keep_parens= false , kws... )
186
196
green_tree = build_tree (GreenNode, stream; kws... )
187
197
source = SourceFile (sourcetext (stream), filename= filename, first_line= first_line)
188
- SyntaxNode (source, green_tree, first_byte (stream))
198
+ SyntaxNode (source, green_tree, position = first_byte (stream), keep_parens = keep_parens )
189
199
end
190
200
191
201
# -------------------------------------------------------------------------------
0 commit comments