Skip to content

Commit ae245f9

Browse files
authored
Merge pull request #347 from julia-vscode/sp/fix-generator-for-parsing
Fix generator for parsing
2 parents 4309ba7 + 7d47522 commit ae245f9

File tree

4 files changed

+10
-7
lines changed

4 files changed

+10
-7
lines changed

src/CSTParser.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ function parse_expression(ps::ParseState, esc_on_error = false; allow_const_fiel
5252
elseif kindof(ps.t) === Tokens.LPAREN
5353
ret = parse_paren(ps)
5454
elseif kindof(ps.t) === Tokens.LSQUARE
55-
ret = @default ps parse_array(ps)
55+
ret = @closer ps :for_generator @default ps parse_array(ps)
5656
elseif kindof(ps.t) === Tokens.LBRACE
5757
ret = @default ps @closebrace ps parse_braces(ps)
5858
elseif isinstance(ps.t) || isoperator(ps.t)
@@ -120,7 +120,7 @@ function parse_compound(ps::ParseState, ret::EXPR)
120120
ret = parse_prefixed_string_cmd(ps, ret)
121121
elseif kindof(ps.nt) === Tokens.LPAREN
122122
no_ws = !isemptyws(ps.ws)
123-
ret = @closeparen ps parse_call(ps, ret)
123+
ret = @closer ps :for_generator @closeparen ps parse_call(ps, ret)
124124
if no_ws && !isunarycall(ret)
125125
ret = mErrorToken(ps, ret, UnexpectedWhiteSpace)
126126
end
@@ -131,7 +131,7 @@ function parse_compound(ps::ParseState, ret::EXPR)
131131
ret = mErrorToken(ps, (@default ps @nocloser ps :inwhere @closebrace ps parse_curly(ps, ret)), UnexpectedWhiteSpace)
132132
end
133133
elseif kindof(ps.nt) === Tokens.LSQUARE && isemptyws(ps.ws) && !isoperator(ret)
134-
ret = @default ps @nocloser ps :block parse_ref(ps, ret)
134+
ret = @closer ps :for_generator @default ps @nocloser ps :block parse_ref(ps, ret)
135135
elseif iscomma(ps.nt)
136136
ret = parse_tuple(ps, ret)
137137
elseif isunaryop(ret) && kindof(ps.nt) != Tokens.EQ

src/components/internals.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,7 @@ function parse_macrocall(ps::ParseState)
310310
push!(args, a)
311311
break
312312
end
313-
314-
if (insquare || ps.closer.paren || ps.closer.square) && kindof(ps.nt) === Tokens.FOR
313+
if ps.closer.for_generator && kindof(ps.nt) === Tokens.FOR
315314
break
316315
end
317316
prevpos = loop_check(ps, prevpos)

src/lexer.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ mutable struct Closer
2424
ws::Bool
2525
wsop::Bool
2626
unary::Bool
27+
for_generator::Bool
2728
precedence::Int
2829
end
29-
Closer() = Closer(true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, -1)
30+
Closer() = Closer(true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, -1)
3031

3132
mutable struct ParseState
3233
l::Lexer{Base.GenericIOBuffer{Array{UInt8,1}},RawToken}

test/parser.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,10 @@ end
452452
@test "@inline get_chunks_id(i::Integer) = _div64(Int(i)-1)+1, _mod64(Int(i) -1)" |> test_expr
453453
@test "@inline f() = (), ()" |> test_expr
454454
@test "@sprintf(\"%08d\", id)" |> test_expr
455-
@test "[@m @n a for a in A]" |> test_expr # ensure closer.insquare propogates
455+
@test "[@m @n a for a in A]" |> test_expr
456+
@test ":(@foo bar baz bat)" |> test_expr
457+
@test ":(@foo bar for i in j end)" |> test_expr
458+
@test "(@foo bar for i in j end)" |> test_expr
456459
@test CSTParser.parse("@__DIR__\n\nx", true)[1].span == 8
457460

458461
if VERSION >= v"1.8.0-"

0 commit comments

Comments
 (0)