|
70 | 70 | Expr(:function, :f)
|
71 | 71 | @test parsestmt(Expr, "macro f end") ==
|
72 | 72 | Expr(:macro, :f)
|
| 73 | + |
| 74 | + # weird cases with extra parens |
| 75 | + @test parsestmt(Expr, "function (f() where T) end") == |
| 76 | + Expr(:function, Expr(:where, Expr(:call, :f), :T), |
| 77 | + Expr(:block, LineNumberNode(1), LineNumberNode(1))) |
| 78 | + @test parsestmt(Expr, "function (f()::S) end") == |
| 79 | + Expr(:function, Expr(:(::), Expr(:call, :f), :S), |
| 80 | + Expr(:block, LineNumberNode(1), LineNumberNode(1))) |
73 | 81 | end
|
74 | 82 |
|
75 | 83 | @testset "elseif" begin
|
|
180 | 188 | Expr(:call, :f, Expr(:parameters, Expr(:kw, :b, 2)))
|
181 | 189 | @test parsestmt(Expr, "f(a=1; b=2)") ==
|
182 | 190 | Expr(:call, :f, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1))
|
183 |
| - |
184 |
| - # Infix call = is not :kw |
| 191 | + @test parsestmt(Expr, "f(a; b; c)") == |
| 192 | + Expr(:call, :f, Expr(:parameters, Expr(:parameters, :c), :b), :a) |
| 193 | + @test parsestmt(Expr, "+(a=1,)") == |
| 194 | + Expr(:call, :+, Expr(:kw, :a, 1)) |
| 195 | + @test parsestmt(Expr, "(a=1)()") == |
| 196 | + Expr(:call, Expr(:(=), :a, 1)) |
| 197 | + |
| 198 | + # Operator calls: = is not :kw |
185 | 199 | @test parsestmt(Expr, "(x=1) != 2") ==
|
186 | 200 | Expr(:call, :!=, Expr(:(=), :x, 1), 2)
|
| 201 | + @test parsestmt(Expr, "+(a=1)") == |
| 202 | + Expr(:call, :+, Expr(:(=), :a, 1)) |
| 203 | + @test parsestmt(Expr, "(a=1)'") == |
| 204 | + Expr(Symbol("'"), Expr(:(=), :a, 1)) |
| 205 | + @test parsestmt(Expr, "(a=1)'ᵀ") == |
| 206 | + Expr(:call, Symbol("'ᵀ"), Expr(:(=), :a, 1)) |
187 | 207 |
|
188 | 208 | # Dotcall
|
189 | 209 | @test parsestmt(Expr, "f.(a=1; b=2)") ==
|
|
232 | 252 | Expr(:call, :f, Expr(:.=, :a, 1))
|
233 | 253 |
|
234 | 254 | # = inside parens in calls and tuples
|
235 |
| - # (TODO: we should warn for these cases.) |
236 | 255 | @test parsestmt(Expr, "f(((a = 1)))") ==
|
237 | 256 | Expr(:call, :f, Expr(:kw, :a, 1))
|
238 | 257 | @test parsestmt(Expr, "(((a = 1)),)") ==
|
|
244 | 263 | @testset "dotcall / dotted operators" begin
|
245 | 264 | @test parsestmt(Expr, "f.(x,y)") == Expr(:., :f, Expr(:tuple, :x, :y))
|
246 | 265 | @test parsestmt(Expr, "f.(x=1)") == Expr(:., :f, Expr(:tuple, Expr(:kw, :x, 1)))
|
| 266 | + @test parsestmt(Expr, "f.(a=1; b=2)") == |
| 267 | + Expr(:., :f, Expr(:tuple, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1))) |
| 268 | + @test parsestmt(Expr, "(a=1).()") == Expr(:., Expr(:(=), :a, 1), Expr(:tuple)) |
247 | 269 | @test parsestmt(Expr, "x .+ y") == Expr(:call, Symbol(".+"), :x, :y)
|
248 | 270 | @test parsestmt(Expr, "(x=1) .+ y") == Expr(:call, Symbol(".+"), Expr(:(=), :x, 1), :y)
|
249 | 271 | @test parsestmt(Expr, "a .< b .< c") == Expr(:comparison, :a, Symbol(".<"),
|
|
273 | 295 | @test parsestmt(Expr, "A.:.+") == Expr(:., :A, QuoteNode(Symbol(".+")))
|
274 | 296 | end
|
275 | 297 |
|
| 298 | + @testset "let" begin |
| 299 | + @test parsestmt(Expr, "let x=1\n end") == |
| 300 | + Expr(:let, Expr(:(=), :x, 1), Expr(:block, LineNumberNode(2))) |
| 301 | + @test parsestmt(Expr, "let x=1 ; end") == |
| 302 | + Expr(:let, Expr(:(=), :x, 1), Expr(:block, LineNumberNode(1))) |
| 303 | + @test parsestmt(Expr, "let x ; end") == |
| 304 | + Expr(:let, :x, Expr(:block, LineNumberNode(1))) |
| 305 | + @test parsestmt(Expr, "let x::1 ; end") == |
| 306 | + Expr(:let, Expr(:(::), :x, 1), Expr(:block, LineNumberNode(1))) |
| 307 | + @test parsestmt(Expr, "let x=1,y=2 end") == |
| 308 | + Expr(:let, Expr(:block, Expr(:(=), :x, 1), Expr(:(=), :y, 2)), Expr(:block, LineNumberNode(1))) |
| 309 | + @test parsestmt(Expr, "let x+=1 ; end") == |
| 310 | + Expr(:let, Expr(:block, Expr(:+=, :x, 1)), Expr(:block, LineNumberNode(1))) |
| 311 | + @test parsestmt(Expr, "let ; end") == |
| 312 | + Expr(:let, Expr(:block), Expr(:block, LineNumberNode(1))) |
| 313 | + @test parsestmt(Expr, "let ; body end") == |
| 314 | + Expr(:let, Expr(:block), Expr(:block, LineNumberNode(1), :body)) |
| 315 | + @test parsestmt(Expr, "let\na\nb\nend") == |
| 316 | + Expr(:let, Expr(:block), Expr(:block, LineNumberNode(2), :a, LineNumberNode(3), :b)) |
| 317 | + end |
| 318 | + |
276 | 319 | @testset "where" begin
|
277 | 320 | @test parsestmt(Expr, "A where {X, Y; Z}") == Expr(:where, :A, Expr(:parameters, :Z), :X, :Y)
|
278 | 321 | end
|
|
289 | 332 | # @__dot__
|
290 | 333 | @test parsestmt(Expr, "@.") == Expr(:macrocall, Symbol("@__dot__"), LineNumberNode(1))
|
291 | 334 | @test parsestmt(Expr, "using A: @.") == Expr(:using, Expr(Symbol(":"), Expr(:., :A), Expr(:., Symbol("@__dot__"))))
|
| 335 | + |
| 336 | + # var"" |
| 337 | + @test parsestmt(Expr, "@var\"#\" a") == Expr(:macrocall, Symbol("@#"), LineNumberNode(1), :a) |
| 338 | + @test parsestmt(Expr, "A.@var\"#\" a") == Expr(:macrocall, Expr(:., :A, QuoteNode(Symbol("@#"))), LineNumberNode(1), :a) |
| 339 | + |
| 340 | + # Square brackets |
| 341 | + @test parsestmt(Expr, "@S[a,b]") == |
| 342 | + Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:vect, :a, :b)) |
| 343 | + @test parsestmt(Expr, "@S[a b]") == |
| 344 | + Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:hcat, :a, :b)) |
| 345 | + @test parsestmt(Expr, "@S[a; b]") == |
| 346 | + Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:vcat, :a, :b)) |
| 347 | + @test parsestmt(Expr, "@S[a ;; b]", version=v"1.7") == |
| 348 | + Expr(:macrocall, Symbol("@S"), LineNumberNode(1), Expr(:ncat, 2, :a, :b)) |
| 349 | + end |
| 350 | + |
| 351 | + @testset "vect" begin |
| 352 | + @test parsestmt(Expr, "[x,y ; z]") == Expr(:vect, Expr(:parameters, :z), :x, :y) |
292 | 353 | end
|
293 | 354 |
|
294 | 355 | @testset "try" begin
|
|
360 | 421 | Expr(:struct, false, :A, Expr(:block, LineNumberNode(1)))
|
361 | 422 | @test parsestmt(Expr, "mutable struct A end") ==
|
362 | 423 | Expr(:struct, true, :A, Expr(:block, LineNumberNode(1)))
|
| 424 | + |
| 425 | + @test parsestmt(Expr, "struct A <: B \n a::X \n end") == |
| 426 | + Expr(:struct, false, Expr(:<:, :A, :B), |
| 427 | + Expr(:block, LineNumberNode(2), Expr(:(::), :a, :X))) |
| 428 | + @test parsestmt(Expr, "struct A \n a \n b \n end") == |
| 429 | + Expr(:struct, false, :A, |
| 430 | + Expr(:block, LineNumberNode(2), :a, LineNumberNode(3), :b)) |
| 431 | + @test parsestmt(Expr, "struct A const a end", version=v"1.8") == |
| 432 | + Expr(:struct, false, :A, Expr(:block, LineNumberNode(1), Expr(:const, :a))) |
| 433 | + end |
| 434 | + |
| 435 | + @testset "export" begin |
| 436 | + @test parsestmt(Expr, "export a") == Expr(:export, :a) |
| 437 | + @test parsestmt(Expr, "export @a") == Expr(:export, Symbol("@a")) |
| 438 | + @test parsestmt(Expr, "export @var\"'\"") == Expr(:export, Symbol("@'")) |
| 439 | + @test parsestmt(Expr, "export a, \n @b") == Expr(:export, :a, Symbol("@b")) |
| 440 | + @test parsestmt(Expr, "export +, ==") == Expr(:export, :+, :(==)) |
| 441 | + @test parsestmt(Expr, "export \n a") == Expr(:export, :a) |
| 442 | + end |
| 443 | + |
| 444 | + @testset "global/const/local" begin |
| 445 | + @test parsestmt(Expr, "global x") == Expr(:global, :x) |
| 446 | + @test parsestmt(Expr, "local x") == Expr(:local, :x) |
| 447 | + @test parsestmt(Expr, "global x,y") == Expr(:global, :x, :y) |
| 448 | + @test parsestmt(Expr, "global const x = 1") == Expr(:const, Expr(:global, Expr(:(=), :x, 1))) |
| 449 | + @test parsestmt(Expr, "local const x = 1") == Expr(:const, Expr(:local, Expr(:(=), :x, 1))) |
| 450 | + @test parsestmt(Expr, "const global x = 1") == Expr(:const, Expr(:global, Expr(:(=), :x, 1))) |
| 451 | + @test parsestmt(Expr, "const local x = 1") == Expr(:const, Expr(:local, Expr(:(=), :x, 1))) |
| 452 | + @test parsestmt(Expr, "const x,y = 1,2") == Expr(:const, Expr(:(=), Expr(:tuple, :x, :y), Expr(:tuple, 1, 2))) |
| 453 | + @test parsestmt(Expr, "const x = 1") == Expr(:const, Expr(:(=), :x, 1)) |
| 454 | + @test parsestmt(Expr, "global x ~ 1") == Expr(:global, Expr(:call, :~, :x, 1)) |
| 455 | + @test parsestmt(Expr, "global x += 1") == Expr(:global, Expr(:+=, :x, 1)) |
| 456 | + end |
| 457 | + |
| 458 | + @testset "tuples" begin |
| 459 | + @test parsestmt(Expr, "(;)") == Expr(:tuple, Expr(:parameters)) |
| 460 | + @test parsestmt(Expr, "(; a=1)") == Expr(:tuple, Expr(:parameters, Expr(:kw, :a, 1))) |
| 461 | + @test parsestmt(Expr, "(; a=1; b=2)") == |
| 462 | + Expr(:tuple, Expr(:parameters, Expr(:parameters, Expr(:kw, :b, 2)), Expr(:kw, :a, 1))) |
| 463 | + @test parsestmt(Expr, "(a; b; c,d)") == |
| 464 | + Expr(:tuple, Expr(:parameters, Expr(:parameters, :c, :d), :b), :a) |
363 | 465 | end
|
364 | 466 |
|
365 | 467 | @testset "module" begin
|
|
0 commit comments