#= none:1 =# Core.@doc " JLFunction(ex::Expr)\n\nCreate a `JLFunction` object from a Julia function `Expr`.\n\n# Example\n\n```julia\njulia> JLFunction(:(f(x) = 2))\nf(x) = begin\n #= REPL[37]:1 =# \n 2 \nend\n```\n" function JLFunction(ex::Expr; source = nothing) (line, doc, expr) = split_doc(ex) if !(isnothing(doc)) source = line end (generated, expr) = let begin var"##cache#444" = nothing end var"##return#441" = nothing var"##443" = expr if var"##443" isa Expr if begin if var"##cache#444" === nothing var"##cache#444" = Some(((var"##443").head, (var"##443").args)) end var"##445" = (var"##cache#444").value var"##445" isa (Tuple{Symbol, var2} where var2 <: AbstractArray) end && (var"##445"[1] == :macrocall && (begin var"##446" = var"##445"[2] var"##446" isa AbstractArray end && (length(var"##446") === 3 && (begin var"##447" = var"##446"[1] var"##447" == GlobalRef(Base, Symbol("@generated")) end && begin var"##448" = var"##446"[2] var"##449" = var"##446"[3] true end)))) var"##return#441" = let line = var"##448", expr = var"##449" (true, expr) end $(Expr(:symbolicgoto, Symbol("####final#442#464"))) end if begin var"##450" = (var"##cache#444").value var"##450" isa (Tuple{Symbol, var2} where var2 <: AbstractArray) end && (var"##450"[1] == :macrocall && (begin var"##451" = var"##450"[2] var"##451" isa AbstractArray end && (length(var"##451") === 3 && (begin var"##452" = var"##451"[1] var"##452" == Symbol("@generated") end && begin var"##453" = var"##451"[2] var"##454" = var"##451"[3] true end)))) var"##return#441" = let line = var"##453", expr = var"##454" (true, expr) end $(Expr(:symbolicgoto, Symbol("####final#442#464"))) end if begin var"##455" = (var"##cache#444").value var"##455" isa (Tuple{Symbol, var2} where var2 <: AbstractArray) end && (var"##455"[1] == :macrocall && (begin var"##456" = var"##455"[2] var"##456" isa AbstractArray end && (length(var"##456") === 3 && (begin begin var"##cache#458" = nothing end var"##457" = var"##456"[1] var"##457" isa Expr end && (begin if var"##cache#458" === nothing var"##cache#458" = Some(((var"##457").head, (var"##457").args)) end var"##459" = (var"##cache#458").value var"##459" isa (Tuple{Symbol, var2} where var2 <: AbstractArray) end && (var"##459"[1] == :. && (begin var"##460" = var"##459"[2] var"##460" isa AbstractArray end && (length(var"##460") === 2 && (var"##460"[1] == :Base && (begin var"##461" = var"##460"[2] var"##461" == QuoteNode(Symbol("@generated")) end && begin var"##462" = var"##456"[2] var"##463" = var"##456"[3] true end)))))))))) var"##return#441" = let line = var"##462", expr = var"##463" (true, expr) end $(Expr(:symbolicgoto, Symbol("####final#442#464"))) end end begin var"##return#441" = let (false, expr) end $(Expr(:symbolicgoto, Symbol("####final#442#464"))) end error("matching non-exhaustive, at #= none:22 =#") $(Expr(:symboliclabel, Symbol("####final#442#464"))) var"##return#441" end (head, call, body) = split_function(expr; source) (name, args, kw, whereparams, rettype) = let true var"##return#465" = nothing var"##467" = head if var"##467" == :-> var"##return#465" = let split_anonymous_function_head(call; source) end $(Expr(:symbolicgoto, Symbol("####final#466#468"))) end begin var"##return#465" = let h = var"##467" split_function_head(call; source) end $(Expr(:symbolicgoto, Symbol("####final#466#468"))) end error("matching non-exhaustive, at #= none:30 =#") $(Expr(:symboliclabel, Symbol("####final#466#468"))) var"##return#465" end JLFunction(head, name, args, kw, rettype, generated, whereparams, body, line, doc) end #= none:37 =# Core.@doc " JLStruct(ex::Expr)\n\nCreate a `JLStruct` object from a Julia struct `Expr`.\n\n# Example\n\n```julia\njulia> JLStruct(:(struct Foo\n x::Int\n end))\nstruct Foo\n #= REPL[38]:2 =#\n x::Int\nend\n```\n" function JLStruct(ex::Expr; source = nothing) (line, doc, expr) = split_doc(ex) if !(isnothing(doc)) source = line end (ismutable, typename, typevars, supertype, body) = split_struct(expr; source) (fields, constructors, misc) = (JLField[], JLFunction[], []) (field_doc, field_source) = (nothing, source) body = flatten_blocks(body) for each = body.args m = split_field_if_match(typename, each; source = field_source) if m isa String field_doc = m elseif m isa LineNumberNode field_source = m elseif m isa NamedTuple push!(fields, JLField(; m..., doc = field_doc, line = field_source)) (field_doc, field_source) = (nothing, nothing) elseif m isa JLFunction push!(constructors, m) else push!(misc, m) end end JLStruct(typename, ismutable, typevars, supertype, fields, constructors, line, doc, misc) end #= none:84 =# Core.@doc " JLKwStruct(ex::Expr, typealias=nothing)\n\nCreate a `JLKwStruct` from given Julia struct `Expr`, with an option to attach\nan alias to this type name.\n\n# Example\n\n```julia\njulia> JLKwStruct(:(struct Foo\n x::Int = 1\n end))\n#= kw =# struct Foo\n #= REPL[39]:2 =#\n x::Int = 1\nend\n```\n" function JLKwStruct(ex::Expr, typealias = nothing; source = nothing) (line, doc, expr) = split_doc(ex) if !(isnothing(doc)) source = line end (ismutable, typename, typevars, supertype, body) = split_struct(expr; source) (fields, constructors, misc) = (JLKwField[], JLFunction[], []) (field_doc, field_source) = (nothing, source) body = flatten_blocks(body) for each = body.args m = split_field_if_match(typename, each, true; source = field_source) if m isa String field_doc = m elseif m isa LineNumberNode field_source = m elseif m isa NamedTuple field = JLKwField(; m..., doc = field_doc, line = field_source) push!(fields, field) (field_doc, field_source) = (nothing, nothing) elseif m isa JLFunction push!(constructors, m) else push!(misc, m) end end JLKwStruct(typename, typealias, ismutable, typevars, supertype, fields, constructors, line, doc, misc) end #= none:131 =# Core.@doc " JLIfElse(ex::Expr)\n\nCreate a `JLIfElse` from given Julia ifelse `Expr`.\n\n# Example\n\n```julia\njulia> ex = :(if foo(x)\n x = 1 + 1\n elseif goo(x)\n y = 1 + 2\n else\n error(\"abc\")\n end)\n:(if foo(x)\n #= REPL[41]:2 =#\n x = 1 + 1\n elseif #= REPL[41]:3 =# goo(x)\n #= REPL[41]:4 =#\n y = 1 + 2\n else\n #= REPL[41]:6 =#\n error(\"abc\")\n end)\n\njulia> JLIfElse(ex)\nif foo(x)\n begin\n #= REPL[41]:2 =# \n x = 1 + 1 \n end\nelseif begin\n #= REPL[41]:3 =# \n goo(x) \nend\n begin\n #= REPL[41]:4 =# \n y = 1 + 2 \n end\nelse\n begin\n #= REPL[41]:6 =# \n error(\"abc\") \n end\nend\n```\n" function JLIfElse(ex::Expr; source = nothing) ex.head === :if || throw(SyntaxError("expect an if ... elseif ... else ... end expression", source)) (conds, stmts, otherwise) = split_ifelse(ex) return JLIfElse(conds, stmts, otherwise) end #= none:187 =# Core.@doc " JLFor(ex::Expr)\n\nCreate a `JLFor` from given Julia for loop expression.\n\n# Example\n\n```julia\njulia> ex = @expr for i in 1:10, j in 1:j\n M[i, j] += 1\n end\n:(for i = 1:10, j = 1:j\n #= REPL[3]:2 =#\n M[i, j] += 1\n end)\n\njulia> jl = JLFor(ex)\nfor i in 1 : 10,\n j in 1 : j\n #= loop body =#\n begin\n #= REPL[3]:2 =# \n M[i, j] += 1 \n end\nend\n\njulia> jl.vars\n2-element Vector{Any}:\n :i\n :j\n\njulia> jl.iterators\n2-element Vector{Any}:\n :(1:10)\n :(1:j)\n```\n" function JLFor(ex::Expr) (vars, itrs, body) = split_forloop(ex) return JLFor(vars, itrs, body) end