Skip to content

Commit bfcdc77

Browse files
authored
Merge pull request #291 from julia-vscode/sp/assorted-fixes
Fix Base parsing
2 parents 666f287 + 3499819 commit bfcdc77

19 files changed

+1297
-307
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1111

1212
[compat]
1313
julia = "1"
14-
Tokenize = "0.5.13"
14+
Tokenize = "0.5.18"
1515

1616
[targets]
1717
test = ["Test"]

src/CSTParser.jl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,15 @@ function parse_expression(ps::ParseState, esc_on_error = false)
5959
if both_symbol_and_op(ps.t)
6060
ret = EXPR(:IDENTIFIER, ps)
6161
else
62-
ret = INSTANCE(ps)
62+
if ps.t.dotop && closer(ps) && !isassignmentop(ps.t)
63+
# Split dotted operator into dot-call
64+
v = val(ps.t, ps)[2:end]
65+
dot = EXPR(:OPERATOR, 1, 1, ".")
66+
op = EXPR(:OPERATOR, ps.nt.startbyte - ps.t.startbyte - 1, ps.t.endbyte - ps.t.startbyte, v)
67+
ret = EXPR(dot, EXPR[op], nothing)
68+
else
69+
ret = INSTANCE(ps)
70+
end
6371
end
6472
if is_colon(ret) && !(iscomma(ps.nt) || kindof(ps.ws) == SemiColonWS)
6573
ret = parse_unary(ps, ret)
@@ -96,8 +104,13 @@ function parse_compound(ps::ParseState, ret::EXPR)
96104
end
97105
ret = parse_operator(ps, ret, EXPR(:OPERATOR, 0, 0, "*"))
98106
elseif issuffixableliteral(ps, ret)
99-
arg = EXPR(:IDENTIFIER, next(ps))
100-
push!(ret, EXPR(:STRING, arg.fullspan, arg.span, val(ps.t, ps)))
107+
if isnumberliteral(ps.nt)
108+
arg = mLITERAL(next(ps))
109+
push!(ret, arg)
110+
else
111+
arg = EXPR(:IDENTIFIER, next(ps))
112+
push!(ret, EXPR(:STRING, arg.fullspan, arg.span, val(ps.t, ps)))
113+
end
101114
elseif (isidentifier(ret) || is_getfield(ret)) && isemptyws(ps.ws) && isprefixableliteral(ps.nt)
102115
ret = parse_prefixed_string_cmd(ps, ret)
103116
elseif kindof(ps.nt) === Tokens.LPAREN

src/components/internals.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ function adjust_iter(x::EXPR)
5050
# Assumes x is a valid iterator
5151
if x.head === :call # isoperator(x.args[1]) && x.args[1].val in ("in", "∈")
5252
EXPR(EXPR(:OPERATOR, 0, 0, "="), EXPR[x.args[2], x.args[3]], EXPR[x.args[1]])
53+
elseif isassignment(x) && length(x.args) == 2 && x.args[1].head == :call && x.args[2].head == :block && length(x.args[2].args) == 1
54+
x.args[2] = setparent!(x.args[2].args[1], x)
55+
x
5356
else
5457
x
5558
end
@@ -63,7 +66,7 @@ Is `x` a valid iterator for use in `for` loops or generators?
6366
is_range(x::EXPR) = isassignment(x) || (x.head === :call && (is_in(x.args[1]) || is_elof(x.args[1])))
6467

6568
function parse_outer(ps)
66-
if kindof(ps.nt) === Tokens.OUTER && kindof(ps.nws) !== EmptyWS && !Tokens.isoperator(kindof(ps.nnt))
69+
if kindof(ps.nt) === Tokens.OUTER && kindof(ps.nws) !== EmptyWS && !(Tokens.isoperator(kindof(ps.nnt)) && isbinaryop(ps.nnt) && kindof(ps.nnws) !== EmptyWS)
6770
EXPR(next(ps))
6871
end
6972
end
@@ -229,7 +232,14 @@ function parse_parameters(ps::ParseState, args::Vector{EXPR}, args1::Vector{EXPR
229232
isfirst = true
230233
end
231234
if !isempty(args1)
232-
insert!(args, insert_params_at, EXPR(:parameters, args1, trivia))
235+
# this happens when multiple semi-colons are used
236+
# Julia will error during lowering, so these shenanigans are just for matching
237+
# kwarg order with Base's parser
238+
if length(args) >= 1 && args[1] isa EXPR && args[1].head == :kw && usekw
239+
insert!(args, max(insert_params_at - 1, 1), EXPR(:parameters, args1, trivia))
240+
else
241+
insert!(args, insert_params_at, EXPR(:parameters, args1, trivia))
242+
end
233243
end
234244
return
235245
end
@@ -291,7 +301,6 @@ function parse_macrocall(ps::ParseState)
291301
next(ps)
292302
return EXPR(:macrocall, EXPR[mname, EXPR(:NOTHING, 0, 0), @default ps parse_array(ps)], nothing)
293303
else
294-
#TODO add special hndling for @doc
295304
args = EXPR[mname, EXPR(:NOTHING, 0, 0)]
296305
insquare = ps.closer.insquare
297306
prevpos = position(ps)
@@ -302,6 +311,13 @@ function parse_macrocall(ps::ParseState)
302311
a = @closer ps :inmacro @closer ps :ws @closer ps :wsop parse_expression(ps)
303312
end
304313
push!(args, a)
314+
315+
if valof(mname) == "@doc" && ps.t.endpos[1] + 1 == ps.nt.startpos[1] && length(args) == 3
316+
a = parse_expression(ps)
317+
push!(args, a)
318+
break
319+
end
320+
305321
if (insquare || ps.closer.paren || ps.closer.square) && kindof(ps.nt) === Tokens.FOR
306322
break
307323
end

src/components/keywords.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,13 @@ function parse_local_global(ps::ParseState, islocal = true)
102102
EXPR(:const, EXPR[EXPR(islocal ? :local : :global, EXPR[arg1.args[1]], nothing)], EXPR[kw, arg1.trivia[1]])
103103
else
104104
args, trivia = EXPR[], EXPR[kw]
105-
@closer ps :comma while !closer(ps)
106-
push!(args, parse_expression(ps))
107-
if iscomma(ps.nt)
108-
accept_comma(ps, trivia)
109-
else
110-
break
111-
end
105+
arg = parse_expression(ps)
106+
if isassignment(unwrapbracket(arg))
107+
push!(args, arg)
108+
elseif arg.head === :tuple
109+
append!(args, arg.args)
110+
else
111+
push!(args, arg)
112112
end
113113
EXPR(islocal ? :local : :global, args, trivia)
114114
end
@@ -172,7 +172,7 @@ function parse_imports(ps::ParseState)
172172
ret = EXPR(kwt, EXPR[arg], EXPR[kw])
173173
elseif iscolon(ps.nt)
174174
ret = EXPR(kwt, EXPR[EXPR(EXPR(:OPERATOR, next(ps)), EXPR[arg])], EXPR[kw])
175-
175+
176176
arg = parse_dot_mod(ps, true, true)
177177
push!(ret.args[1], arg)
178178
prevpos = position(ps)
@@ -301,7 +301,7 @@ end
301301
"""
302302
parse_blockexpr(ps::ParseState, head)
303303
304-
General function for parsing block expressions comprised of a series of statements
304+
General function for parsing block expressions comprised of a series of statements
305305
terminated by an `end`.
306306
"""
307307
function parse_blockexpr(ps::ParseState, head)

0 commit comments

Comments
 (0)