@ -484,9 +484,9 @@ end
@test format_string ( " try \n error() \n catch $ ( sp ) e \n end " ) == " try \n error() \n catch e \n end "
@test format_string ( " try \n error() \n catch $ ( sp ) e \n end " ) == " try \n error() \n catch e \n end "
@test format_string ( " A $ ( sp ) where $ ( sp ) {T} " ) == " A where {T} "
@test format_string ( " A $ ( sp ) where $ ( sp ) {T} " ) == " A where {T} "
@test format_string ( " A $ ( sp ) where $ ( sp ) {T} $ ( sp ) where $ ( sp ) {S} " ) == " A where {T} where {S} "
@test format_string ( " A $ ( sp ) where $ ( sp ) {T} $ ( sp ) where $ ( sp ) {S} " ) == " A where {T} where {S} "
@test format_string ( " f() $ ( sp ) do $ ( sp ) x \n y \n end " ) == " f() do x \n y \n end "
@test format_string ( " f() $ ( sp ) do $ ( sp ) x \n y \n end " ) == " f() do x \n return y \n end "
@test format_string ( " f() $ ( sp ) do \n y \n end " ) == " f() do \n y \n end "
@test format_string ( " f() $ ( sp ) do \n y \n end " ) == " f() do \n return y \n end "
@test format_string ( " f() $ ( sp ) do; y end " ) == " f() do; \n y \n end "
@test format_string ( " f() $ ( sp ) do; y end " ) == " f() do; \n return y \n end "
# After `where` (anywhere else?) a newline can be used instead of a space
# After `where` (anywhere else?) a newline can be used instead of a space
@test format_string ( " A $ ( sp ) where $ ( sp ) \n {A} " ) == " A where \n {A} "
@test format_string ( " A $ ( sp ) where $ ( sp ) \n {A} " ) == " A where \n {A} "
end
end
@ -549,14 +549,14 @@ end
for sp in ( " " , " " , " " , " " )
for sp in ( " " , " " , " " , " " )
# function-end
# function-end
@test format_string ( " function f() \n $ ( sp ) x \n $ ( sp ) end " ) ==
@test format_string ( " function f() \n $ ( sp ) x \n $ ( sp ) end " ) ==
" function f() \n x \n end "
" function f() \n return x \n end "
@test format_string ( " function f end " ) == " function f end "
@test format_string ( " function f end " ) == " function f end "
@test_broken format_string ( " function f \n end " ) == " function f \n end " # TODO
@test_broken format_string ( " function f \n end " ) == " function f \n end " # TODO
@test format_string ( " function ∉ end " ) == " function ∉ end "
@test format_string ( " function ∉ end " ) == " function ∉ end "
# macro-end
# macro-end
@test format_string ( " macro f() \n $ ( sp ) x \n $ ( sp ) end " ) ==
@test format_string ( " macro f() \n $ ( sp ) x \n $ ( sp ) end " ) ==
" macro f() \n x \n end "
" macro f() \n return x \n end "
@test format_string ( " macro f() x end " ) == " macro f() \n x \n end "
@test format_string ( " macro f() x end " ) == " macro f() \n return x \n end "
# let-end
# let-end
@test format_string ( " let a = 1 \n $ ( sp ) x \n $ ( sp ) end " ) == " let a = 1 \n x \n end "
@test format_string ( " let a = 1 \n $ ( sp ) x \n $ ( sp ) end " ) == " let a = 1 \n x \n end "
@test format_string ( " let \n $ ( sp ) x \n $ ( sp ) end " ) == " let \n x \n end "
@test format_string ( " let \n $ ( sp ) x \n $ ( sp ) end " ) == " let \n x \n end "
@ -644,8 +644,8 @@ end
" try \n $ ( sp ) x \n $ ( sp ) catch err \n $ ( sp ) y \n $ ( sp ) else \n $ ( sp ) z \n $ ( sp ) finally \n $ ( sp ) z \n $ ( sp ) end "
" try \n $ ( sp ) x \n $ ( sp ) catch err \n $ ( sp ) y \n $ ( sp ) else \n $ ( sp ) z \n $ ( sp ) finally \n $ ( sp ) z \n $ ( sp ) end "
) == " try \n x \n catch err \n y \n else \n z \n finally \n z \n end "
) == " try \n x \n catch err \n y \n else \n z \n finally \n z \n end "
# do-end
# do-end
@test format_string ( " open() do \n $ ( sp ) a \n $ ( sp ) end " ) == " open() do \n a \n end "
@test format_string ( " open() do \n $ ( sp ) a \n $ ( sp ) end " ) == " open() do \n return a \n end "
@test format_string ( " open() do io \n $ ( sp ) a \n $ ( sp ) end " ) == " open() do io \n a \n end "
@test format_string ( " open() do io \n $ ( sp ) a \n $ ( sp ) end " ) == " open() do io \n return a \n end "
# module-end, baremodule-end
# module-end, baremodule-end
for b in ( " " , " bare " )
for b in ( " " , " bare " )
# Just a module
# Just a module
@ -742,7 +742,7 @@ end
@test format_string ( " begin \n x end " ) == " begin \n x \n end "
@test format_string ( " begin \n x end " ) == " begin \n x \n end "
# Functors
# Functors
@test format_string ( " function $ ( sp ) (a::A)(b) \n x \n end " ) ==
@test format_string ( " function $ ( sp ) (a::A)(b) \n x \n end " ) ==
" function (a::A)(b) \n x \n end "
" function (a::A)(b) \n return x \n end "
# TODO: Spaces after function keyword isn't removed.
# TODO: Spaces after function keyword isn't removed.
@test format_string ( " function $ ( sp ) (a * b) \n return \n end " ) ==
@test format_string ( " function $ ( sp ) (a * b) \n return \n end " ) ==
" function $ ( sp ) (a * b) \n return \n end "
" function $ ( sp ) (a * b) \n return \n end "
@ -780,7 +780,7 @@ end
# Blocklike RHS
# Blocklike RHS
for thing in (
for thing in (
" if c \n x \n end " , " try \n x \n catch \n y \n end " ,
" if c \n x \n end " , " try \n x \n catch \n y \n end " ,
" let c = 1 \n c \n end " , " function() \n x \n end " ,
" let c = 1 \n c \n end " , " function() \n return x \n end " ,
" \" \" \" \n foo \n \" \" \" " , " r \" \" \" \n foo \n \" \" \" " ,
" \" \" \" \n foo \n \" \" \" " , " r \" \" \" \n foo \n \" \" \" " ,
" ``` \n foo \n ``` " , " r``` \n foo \n ``` " , " ``` \n foo \n ```x " ,
" ``` \n foo \n ``` " , " r``` \n foo \n ``` " , " ``` \n foo \n ```x " ,
)
)
@ -869,8 +869,8 @@ end
@test format_string ( f * nl ^ n * g ) == f * nl ^ m * g
@test format_string ( f * nl ^ n * g ) == f * nl ^ m * g
@test format_string ( " module A " * nl ^ n * " end " ) == " module A " * nl ^ m * " end "
@test format_string ( " module A " * nl ^ n * " end " ) == " module A " * nl ^ m * " end "
@test format_string ( " function f() " * nl ^ n * " end " ) == " function f() " * nl ^ m * " end "
@test format_string ( " function f() " * nl ^ n * " end " ) == " function f() " * nl ^ m * " end "
@test format_string ( " function f() " * nl ^ 2 * " x = 1 " * nl ^ n * " end " ) ==
@test format_string ( " function f() " * nl ^ 2 * " return x " * nl ^ n * " end " ) ==
" function f() " * nl ^ 2 * " x = 1 " * nl ^ m * " end "
" function f() " * nl ^ 2 * " return x " * nl ^ m * " end "
end
end
end
end
@ -1079,22 +1079,22 @@ end
@test format_string ( " try $ ( d ) x $ ( d ) catch err $ ( d ) y $ ( d ) else $ ( d ) z $ ( d ) finally $ ( d ) z $ ( d ) end " ) ==
@test format_string ( " try $ ( d ) x $ ( d ) catch err $ ( d ) y $ ( d ) else $ ( d ) z $ ( d ) finally $ ( d ) z $ ( d ) end " ) ==
" try \n x \n catch err \n y \n else \n z \n finally \n z \n end "
" try \n x \n catch err \n y \n else \n z \n finally \n z \n end "
# do-end
# do-end
@test format_string ( " open() do \n a $ ( d ) end " ) == " open() do \n a \n end "
@test format_string ( " open() do \n a $ ( d ) end " ) == " open() do \n return a \n end "
@test format_string ( " open() do \n end " ) == " open() do \n end "
@test format_string ( " open() do \n end " ) == " open() do \n end "
@test_broken format_string ( " open() do;a $ ( d ) end " ) == " open() do \n a \n end "
@test_broken format_string ( " open() do;a $ ( d ) end " ) == " open() do \n a \n end "
@test_broken format_string ( " open() do ;a $ ( d ) end " ) == " open() do \n a \n end "
@test_broken format_string ( " open() do ;a $ ( d ) end " ) == " open() do \n a \n end "
@test format_string ( " open() do io $ ( d ) a end " ) == " open() do io \n a \n end "
@test format_string ( " open() do io $ ( d ) a end " ) == " open() do io \n return a \n end "
# let-end
# let-end
@test format_string ( " let a = 1 \n x $ ( d ) end " ) == " let a = 1 \n x \n end "
@test format_string ( " let a = 1 \n x $ ( d ) end " ) == " let a = 1 \n x \n end "
@test format_string ( " let \n x $ ( d ) end " ) == " let \n x \n end "
@test format_string ( " let \n x $ ( d ) end " ) == " let \n x \n end "
@test format_string ( " let a = 1 # a \n x $ ( d ) end " ) == " let a = 1 # a \n x \n end "
@test format_string ( " let a = 1 # a \n x $ ( d ) end " ) == " let a = 1 # a \n x \n end "
# function-end
# function-end
@test format_string ( " function f() $ ( d ) x $ ( d ) end " ) == " function f() \n x \n end "
@test format_string ( " function f() $ ( d ) x $ ( d ) end " ) == " function f() \n return x \n end "
@test format_string ( " function() $ ( d ) x $ ( d ) end " ) == " function() \n x \n end "
@test format_string ( " function() $ ( d ) x $ ( d ) end " ) == " function() \n return x \n end "
@test format_string ( " function () $ ( d ) x $ ( d ) end " ) == " function () \n x \n end "
@test format_string ( " function () $ ( d ) x $ ( d ) end " ) == " function () \n return x \n end "
@test format_string ( " function f end " ) == " function f end "
@test format_string ( " function f end " ) == " function f end "
# macro-end
# macro-end
@test format_string ( " macro f() $ ( d ) x $ ( d ) end " ) == " macro f() \n x \n end "
@test format_string ( " macro f() $ ( d ) x $ ( d ) end " ) == " macro f() \n return x \n end "
# quote-end
# quote-end
@test format_string ( " quote $ ( d ) x $ ( d ) end " ) == " quote \n x \n end "
@test format_string ( " quote $ ( d ) x $ ( d ) end " ) == " quote \n x \n end "
# begin-end
# begin-end
@ -1213,7 +1213,8 @@ end
" begin " , " quote " , " for i in I " , " let " , " let x = 1 " , " while cond " ,
" begin " , " quote " , " for i in I " , " let " , " let x = 1 " , " while cond " ,
" if cond " , " macro f() " , " function f() " , " f() do " , " f() do x " ,
" if cond " , " macro f() " , " function f() " , " f() do " , " f() do x " ,
)
)
@test format_string ( " $ ( prefix ) \n $ ( body ) \n end " ) == " $prefix \n $ ( bodyfmt ) \n end "
rx = prefix in ( " function f() " , " macro f() " , " f() do " , " f() do x " ) ? " return x \n " : " "
@test format_string ( " $ ( prefix ) \n $ ( body ) $ ( rx ) \n end " ) == " $prefix \n $ ( bodyfmt ) $ ( rx ) \n end "
end
end
@test format_string (
@test format_string (
" if cond1 \n $ ( body ) \n elseif cond2 \n $ ( body ) \n elseif cond3 \n $ ( body ) \n else \n $ ( body ) \n end "
" if cond1 \n $ ( body ) \n elseif cond2 \n $ ( body ) \n elseif cond3 \n $ ( body ) \n else \n $ ( body ) \n end "
@ -1250,6 +1251,93 @@ end
end
end
end
end
@testset " explicit return " begin
for f in ( " function f() " , " function () " , " f() do " , " macro m() " )
# Simple cases just prepend `return`
for r in (
" x " , " * " , " x, y " , " (x, y) " , " f() " , " [1, 2] " , " Int[1, 2] " , " [1 2] " , " Int[1 2] " ,
" [1 2; 3 4] " , " Int[1 2; 3 4] " , " x ? y : z " , " x && y " , " x || y " , " :x " , " :(x) " ,
" :(x; y) " , " 1 + 2 " , " f.(x) " , " x .+ y " , " x::Int " , " 2x " , " T <: Integer " ,
" T >: Int " , " Int <: T <: Integer " , " x < y > z " , " \" foo \" " , " \" \" \" foo \" \" \" " ,
" a.b " , " a.b.c " , " x -> x^2 " , " [x for x in X] " , " Int[x for x in X] " ,
" A{T} where {T} " , " (@m a, b) " , " A{T} " ,
" r \" foo \" " , " r \" foo \" m " , " `foo` " , " ```foo``` " , " r`foo` " ,
" f() do \n return x \n end " , " f() do x \n return x \n end " ,
" function f() \n return x \n end " ,
" function () \n return x \n end " ,
" quote \n x \n end " , " begin \n x \n end " ,
" let \n x \n end " , " let x = 42 \n x \n end " ,
" x = 1 " , " x += 1 " , " x -= 1 " , " global x = 1 " , " local x = 1 " ,
" @inbounds x[i] " , " @inline f(x) " ,
" if c \n x \n end " ,
" if c \n x \n else \n y \n end " ,
" if c \n x \n elseif d \n z \n else \n y \n end " ,
" try \n x \n catch \n y \n end " ,
" try \n x \n catch e \n y \n end " ,
" try \n x \n catch \n y \n finally \n z \n end " ,
" try \n x \n catch \n y \n else \n z \n finally \n z \n end " ,
)
@test format_string ( " $f \n $r \n end " ) == " $f \n return $r \n end "
@test format_string ( " $f \n x; $r \n end " ) == " $f \n x \n return $r \n end "
@test format_string ( " $f \n x; $r \n end " ) == " $f \n x \n return $r \n end "
# Nesting
@test format_string ( " $f \n $f \n $r \n end \n end " ) ==
format_string ( " $f \n return $f \n return $r \n end \n end " )
end
# If the last expression is a call and the function name contains throw or error
# there should be no return
for r in ( " throw(ArgumentError()) " , " error( \" foo \" ) " , " rethrow() " , " throw_error() " )
@test format_string ( " $f \n $r \n end " ) == " $f \n $r \n end "
end
# If the last expression is a macro call with return inside there should be no
# return on the outside
for r in (
" @inbounds return x[i] " , " @inbounds @inline return x[i] " ,
" @inbounds begin \n return x[i] \n end " ,
)
@test format_string ( " $f \n $r \n end " ) == " $f \n $r \n end "
end
# Safe/known macros
@test format_string ( " @inline $f \n x \n end " ) ==
" @inline $f \n return x \n end "
@test format_string ( " Base.@noinline $f \n x \n end " ) ==
" Base.@noinline $f \n return x \n end "
# Unsafe/unknown macros
@test format_string ( " @kernel $f \n x \n end " ) == " @kernel $f \n x \n end "
# `for` and `while` append `return` to the end
for r in ( " for i in I \n end " , " while i in I \n end " )
@test format_string ( " $f \n $r \n end " ) == " $f \n $r \n return \n end "
@test format_string ( " $f \n $r \n # comment \n end " ) ==
" $f \n $r \n # comment \n return \n end "
end
# If there already is a `return` anywhere (not necessarily the last expression)
# there will be no additional `return` added on the last expression.
# `for` and `while` append `return` to the end
let str = " $f \n return 42 \n 1337 \n end "
@test format_string ( str ) == str
end
# if/let/begin/try with a `return` inside should be left alone
for r in (
" if c \n return x \n end " ,
" if c \n return x \n else \n y \n end " ,
" if c \n x \n else \n return y \n end " ,
" if c \n return x \n elseif d \n y \n else \n y \n end " ,
" if c \n x \n elseif d \n return y \n else \n z \n end " ,
" if c \n x \n elseif d \n y \n else \n return z \n end " ,
" let \n return x \n end " ,
" let x = 1 \n return x \n end " ,
" begin \n return x \n end " ,
" try \n return x \n catch \n y \n end " ,
" try \n x \n catch e \n return y \n end " ,
" try \n x \n catch \n y \n finally \n return z \n end " ,
" try \n x \n catch \n y \n else \n return z \n finally \n z \n end " ,
)
str = " $f \n $r \n end "
@test format_string ( str ) == str
end
end
end
@testset " # runic: (on|off) " begin
@testset " # runic: (on|off) " begin
for exc in ( " " , " ! " ) , word in ( " runic " , " format " )
for exc in ( " " , " ! " ) , word in ( " runic " , " format " )
on = " # $ ( exc ) $ ( word ) : on "
on = " # $ ( exc ) $ ( word ) : on "
@ -1268,6 +1356,7 @@ end
1 + 1
1 + 1
$ on
$ on
1 + 1
1 + 1
return
end
end
"""
"""
) == """
) == """
@ -1276,6 +1365,7 @@ end
1 + 1
1 + 1
$ on
$ on
1 + 1
1 + 1
return
end
end
"""
"""
@test format_string (
@test format_string (
@ -1285,6 +1375,7 @@ end
1 + 1
1 + 1
$ bon
$ bon
1 + 1
1 + 1
return
end
end
"""
"""
) == """
) == """
@ -1293,6 +1384,7 @@ end
1 + 1
1 + 1
$ bon
$ bon
1 + 1
1 + 1
return
end
end
"""
"""
@test format_string (
@test format_string (
@ -1301,6 +1393,7 @@ end
$ off
$ off
1 + 1
1 + 1
1 + 1
1 + 1
return
end
end
"""
"""
) == """
) == """
@ -1308,6 +1401,7 @@ end
$ off
$ off
1 + 1
1 + 1
1 + 1
1 + 1
return
end
end
"""
"""
end
end
@ -1329,7 +1423,7 @@ if Sys.isunix() && isdir(share_julia)
@warn " JuliaSyntax.ParseError for $path " err
@warn " JuliaSyntax.ParseError for $path " err
@test_broken false
@test_broken false
else
else
@error " Error when formatting file $path "
@error " Error when formatting file $path " err
@test false
@test false
end
end
end
end