Skip to content

Commit 25e4aba

Browse files
committed
Tests + fix trivia attachment + allow interpolation
1 parent 83cbed6 commit 25e4aba

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
@@ -796,26 +796,33 @@ function parse_pipe_gt(ps::ParseState)
796796
parse_LtoR(ps, parse_curry_chain, is_prec_pipe_gt)
797797
end
798798

799-
# x /> f(y) /> g(z) ==> (chain x (/> f y) (/> g z))
800-
# x /> A.f(y) ==> (chain x (/> (. A (quote f)) y))
801799
function parse_curry_chain(ps::ParseState)
802800
mark = position(ps)
803801
nterms = 0
804802
if (k = peek(ps); k != K"/>" && k != K"\>")
803+
# x /> f(a) ==> (chain x (/> (call f a)))
805804
parse_range(ps)
806805
nterms += 1
806+
else
807+
# /> f(a) ==> (/> (call f a))
807808
end
808809
while (k = peek(ps); k == K"/>" || k == K"\>")
809-
bump(ps, TRIVIA_FLAG)
810810
m = position(ps)
811+
bump(ps, TRIVIA_FLAG)
811812
parse_range(ps)
812813
nterms += 1
813-
if peek_behind(ps).kind != K"call"
814+
if (kb = peek_behind(ps).kind; kb != K"call" && kb != K"$")
814815
emit(ps, m, K"error", error="Expected call to the right of />")
815816
end
816817
emit(ps, m, k)
817818
end
818819
if nterms > 1
820+
# x /> f(a) /> g(b) ==> (chain x (/> (call f a)) (/> (call g b)))
821+
# x /> A.f(a,b) ==> (chain x (/> (call (. A (quote f)) a b)))
822+
# /> f(a) /> g(b) ==> (chain (/> (call f a)) (/> (call g b)))
823+
# x /> f() \> g() ==> (chain x (/> (call f)) (\> (call g)))
824+
# x /> $call ==> (chain x (/> ($ call)))
825+
# x /> notcall[] ==> (chain x (/> (error (ref notcall))))
819826
emit(ps, mark, K"chain")
820827
end
821828
end

test/parser.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ tests = [
102102
JuliaSyntax.parse_pipe_gt => [
103103
"x |> y |> z" => "(call-i (call-i x |> y) |> z)"
104104
],
105+
JuliaSyntax.parse_curry_chain => [
106+
"x /> f(a)" => "(chain x (/> (call f a)))"
107+
"/> f(a)" => "(/> (call f a))"
108+
"x /> f(a) /> g(b)" => "(chain x (/> (call f a)) (/> (call g b)))"
109+
"x /> A.f(a,b)" => "(chain x (/> (call (. A (quote f)) a b)))"
110+
"/> f(a) /> g(b)" => "(chain (/> (call f a)) (/> (call g b)))"
111+
"x /> f() \\> g()" => "(chain x (/> (call f)) (\\> (call g)))"
112+
"x /> \$call" => "(chain x (/> (\$ call)))"
113+
"x /> notcall[]" => "(chain x (/> (error (ref notcall))))"
114+
],
105115
JuliaSyntax.parse_range => [
106116
"1:2" => "(call-i 1 : 2)"
107117
"1:2:3" => "(call-i 1 : 2 3)"

0 commit comments

Comments
 (0)