4444
4545Base. show (io:: IO , :: ErrorVal ) = printstyled (io, " ✘" , color= :light_red )
4646
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 )
4854 if ! haschildren (raw) && ! (is_syntax_kind (raw) || is_keyword (raw))
4955 # Here we parse the values eagerly rather than representing them as
5056 # strings. Maybe this is good. Maybe not.
@@ -56,10 +62,13 @@ function SyntaxNode(source::SourceFile, raw::GreenNode{SyntaxHead}, position::In
5662 for (i,rawchild) in enumerate (children (raw))
5763 # FIXME : Allowing trivia is_error nodes here corrupts the tree layout.
5864 if ! is_trivia (rawchild) || is_error (rawchild)
59- push! (cs, SyntaxNode (source, rawchild, pos))
65+ push! (cs, _to_SyntaxNode (source, rawchild, pos, keep_parens ))
6066 end
6167 pos += rawchild. span
6268 end
69+ if ! keep_parens && kind (raw) == K " parens" && length (cs) == 1
70+ return cs[1 ]
71+ end
6372 node = SyntaxNode (nothing , cs, SyntaxData (source, raw, position, nothing ))
6473 for c in cs
6574 c. parent = node
@@ -182,10 +191,11 @@ end
182191# shallow-copy the data
183192Base. copy (data:: SyntaxData ) = SyntaxData (data. source, data. raw, data. position, data. val)
184193
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... )
186196 green_tree = build_tree (GreenNode, stream; kws... )
187197 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 )
189199end
190200
191201# -------------------------------------------------------------------------------
0 commit comments