|
3 | 3 | using JuliaSyntax |
4 | 4 | using JuliaLowering |
5 | 5 |
|
6 | | -using JuliaLowering: SyntaxGraph, SyntaxTree, ensure_attributes!, ensure_attributes, newnode!, setchildren!, is_leaf, children, child, setattr!, sourceref, makenode, sourcetext, showprov, lookup_binding |
| 6 | +using JuliaLowering: SyntaxGraph, SyntaxTree, ensure_attributes!, ensure_attributes, newnode!, setchildren!, is_leaf, @ast, numchildren, children, child, setattr!, sourceref, makenode, sourcetext, showprov, lookup_binding |
7 | 7 |
|
8 | 8 | using JuliaSyntaxFormatter |
9 | 9 |
|
@@ -32,6 +32,37 @@ function formatsrc(ex; kws...) |
32 | 32 | Text(JuliaSyntaxFormatter.formatsrc(ex; kws...)) |
33 | 33 | end |
34 | 34 |
|
| 35 | +function debug_lower(mod, ex; expr_compat_mode=false, verbose=false, do_eval=false) |
| 36 | + ctx1, ex_macroexpand = JuliaLowering.expand_forms_1(mod, ex, expr_compat_mode) |
| 37 | + |
| 38 | + verbose && @info "Macro expanded" formatsrc(ex_macroexpand, color_by=:scope_layer) |
| 39 | + |
| 40 | + ctx2, ex_desugar = JuliaLowering.expand_forms_2(ctx1, ex_macroexpand) |
| 41 | + verbose && @info "Desugared" formatsrc(ex_desugar, color_by=:scope_layer) |
| 42 | + |
| 43 | + ctx3, ex_scoped = JuliaLowering.resolve_scopes(ctx2, ex_desugar) |
| 44 | + verbose && @info "Resolved scopes" formatsrc(ex_scoped, color_by=e->var_kind(ctx2,e)) |
| 45 | + |
| 46 | + ctx4, ex_converted = JuliaLowering.convert_closures(ctx3, ex_scoped) |
| 47 | + verbose && @info "Closure converted" formatsrc(ex_converted, color_by=:var_id) |
| 48 | + |
| 49 | + ctx5, ex_compiled = JuliaLowering.linearize_ir(ctx4, ex_converted) |
| 50 | + verbose && @info "Linear IR" formatsrc(ex_compiled, color_by=:var_id) Text(sprint(JuliaLowering.print_ir, ex_compiled)) |
| 51 | + |
| 52 | + ex_expr = JuliaLowering.to_lowered_expr(mod, ex_compiled) |
| 53 | + verbose && @info "CodeInfo" ex_expr |
| 54 | + |
| 55 | + if do_eval |
| 56 | + eval_result = Base.eval(mod, ex_expr) |
| 57 | + verbose && @info "Eval" eval_result |
| 58 | + else |
| 59 | + eval_result = nothing |
| 60 | + end |
| 61 | + |
| 62 | + (ctx1, ex_macroexpand, ctx2, ex_desugar, ctx3, ex_scoped, ctx4, ex_converted, ctx5, ex_compiled, ex_expr, eval_result) |
| 63 | +end |
| 64 | + |
| 65 | + |
35 | 66 | # Currently broken - need to push info back onto src |
36 | 67 | # function annotate_scopes(mod, ex) |
37 | 68 | # ex = ensure_attributes(ex, var_id=Int) |
@@ -853,31 +884,28 @@ end |
853 | 884 | """ |
854 | 885 |
|
855 | 886 | ex = parsestmt(SyntaxTree, src, filename="foo.jl") |
856 | | -ex = ensure_attributes(ex, var_id=Int) |
| 887 | +#ex = ensure_attributes(ex, var_id=Int) |
857 | 888 | #ex = softscope_test(ex) |
858 | 889 | @info "Input code" formatsrc(ex) |
859 | 890 |
|
860 | | -in_mod = M |
861 | | -# in_mod=Main |
862 | | -ctx1, ex_macroexpand = JuliaLowering.expand_forms_1(in_mod, ex, false) |
863 | | -@info "Macro expanded" formatsrc(ex_macroexpand, color_by=:scope_layer) |
864 | | -#@info "Macro expanded" formatsrc(ex_macroexpand, color_by=e->JuliaLowering.flattened_provenance(e)[1:end-1]) |
865 | | - |
866 | | -ctx2, ex_desugar = JuliaLowering.expand_forms_2(ctx1, ex_macroexpand) |
867 | | -@info "Desugared" formatsrc(ex_desugar, color_by=:scope_layer) |
868 | | - |
869 | | -ctx3, ex_scoped = JuliaLowering.resolve_scopes(ctx2, ex_desugar) |
870 | | -@info "Resolved scopes" formatsrc(ex_scoped, color_by=e->var_kind(ctx2,e)) |
871 | | - |
872 | | -ctx4, ex_converted = JuliaLowering.convert_closures(ctx3, ex_scoped) |
873 | | -@info "Closure converted" formatsrc(ex_converted, color_by=:var_id) |
874 | | - |
875 | | -ctx5, ex_compiled = JuliaLowering.linearize_ir(ctx4, ex_converted) |
876 | | -@info "Linear IR" formatsrc(ex_compiled, color_by=:var_id) Text(sprint(JuliaLowering.print_ir, ex_compiled)) |
877 | | - |
878 | | -ex_expr = JuliaLowering.to_lowered_expr(in_mod, ex_compiled) |
879 | | -@info "CodeInfo" ex_expr |
| 891 | +(ctx1, ex_macroexpand, |
| 892 | + ctx2, ex_desugar, |
| 893 | + ctx3, ex_scoped, |
| 894 | + ctx4, ex_converted, |
| 895 | + ctx5, ex_compiled, |
| 896 | + ex_expr, eval_result) = debug_lower(M, ex; verbose=true) |
| 897 | + |
| 898 | +# Automatic test reduction |
| 899 | +# bad = reduce_any_failing_toplevel(JuliaLowering, joinpath(@__DIR__, "../src/desugaring.jl")) |
| 900 | +# if !isnothing(bad) |
| 901 | +# @error "Reduced expression as code" formatsrc(bad) |
| 902 | +# write("bad.jl", JuliaSyntaxFormatter.formatsrc(bad)) |
| 903 | +# end |
880 | 904 |
|
881 | | -eval_result = Base.eval(in_mod, ex_expr) |
882 | | -@info "Eval" eval_result |
| 905 | +# Old lowering |
| 906 | +# text = read(joinpath(@__DIR__, "../src/desugaring.jl"), String) |
| 907 | +# ex = parseall(SyntaxTree, text, filename="desugaring.jl") |
| 908 | +# for e in Meta.parseall(text).args |
| 909 | +# Meta.lower(JuliaLowering, e) |
| 910 | +# end |
883 | 911 |
|
0 commit comments