Skip to content

Commit 92994ea

Browse files
committed
Tests + fix trivia attachment + allow interpolation
1 parent cc897a0 commit 92994ea

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/parser.jl

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -823,26 +823,33 @@ function parse_pipe_gt(ps::ParseState)
823823
parse_LtoR(ps, parse_curry_chain, is_prec_pipe_gt)
824824
end
825825

826-
# x /> f(y) /> g(z) ==> (chain x (/> f y) (/> g z))
827-
# x /> A.f(y) ==> (chain x (/> (. A (quote f)) y))
828826
function parse_curry_chain(ps::ParseState)
829827
mark = position(ps)
830828
nterms = 0
831829
if (k = peek(ps); k != K"/>" && k != K"\>")
830+
# x /> f(a) ==> (chain x (/> (call f a)))
832831
parse_range(ps)
833832
nterms += 1
833+
else
834+
# /> f(a) ==> (/> (call f a))
834835
end
835836
while (k = peek(ps); k == K"/>" || k == K"\>")
836-
bump(ps, TRIVIA_FLAG)
837837
m = position(ps)
838+
bump(ps, TRIVIA_FLAG)
838839
parse_range(ps)
839840
nterms += 1
840-
if peek_behind(ps).kind != K"call"
841+
if (kb = peek_behind(ps).kind; kb != K"call" && kb != K"$")
841842
emit(ps, m, K"error", error="Expected call to the right of />")
842843
end
843844
emit(ps, m, k)
844845
end
845846
if nterms > 1
847+
# x /> f(a) /> g(b) ==> (chain x (/> (call f a)) (/> (call g b)))
848+
# x /> A.f(a,b) ==> (chain x (/> (call (. A (quote f)) a b)))
849+
# /> f(a) /> g(b) ==> (chain (/> (call f a)) (/> (call g b)))
850+
# x /> f() \> g() ==> (chain x (/> (call f)) (\> (call g)))
851+
# x /> $call ==> (chain x (/> ($ call)))
852+
# x /> notcall[] ==> (chain x (/> (error (ref notcall))))
846853
emit(ps, mark, K"chain")
847854
end
848855
end

test/parser.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ tests = [
131131
"x |> y |> z" => "(call-i (call-i x |> y) |> z)"
132132
"x .|> y" => "(dotcall-i x |> y)"
133133
],
134+
JuliaSyntax.parse_curry_chain => [
135+
"x /> f(a)" => "(chain x (/> (call f a)))"
136+
"/> f(a)" => "(/> (call f a))"
137+
"x /> f(a) /> g(b)" => "(chain x (/> (call f a)) (/> (call g b)))"
138+
"x /> A.f(a,b)" => "(chain x (/> (call (. A (quote f)) a b)))"
139+
"/> f(a) /> g(b)" => "(chain (/> (call f a)) (/> (call g b)))"
140+
"x /> f() \\> g()" => "(chain x (/> (call f)) (\\> (call g)))"
141+
"x /> \$call" => "(chain x (/> (\$ call)))"
142+
"x /> notcall[]" => "(chain x (/> (error (ref notcall))))"
143+
],
134144
JuliaSyntax.parse_range => [
135145
"1:2" => "(call-i 1 : 2)"
136146
"1:2:3" => "(call-i 1 : 2 3)"

0 commit comments

Comments
 (0)