diff --git a/src/macro_expansion.jl b/src/macro_expansion.jl index d662055..6ea642e 100644 --- a/src/macro_expansion.jl +++ b/src/macro_expansion.jl @@ -75,6 +75,7 @@ struct MacroContext <: AbstractLoweringContext graph::SyntaxGraph macrocall::Union{SyntaxTree,LineNumberNode,SourceRef} scope_layer::ScopeLayer + expr_compat_mode::Bool end function adopt_scope(ex, ctx::MacroContext) @@ -257,7 +258,7 @@ function expand_macro(ctx, ex) @assert kind(ex) == K"macrocall" macname = ex[1] - mctx = MacroContext(ctx.graph, ex, current_layer(ctx)) + mctx = MacroContext(ctx.graph, ex, current_layer(ctx), ctx.expr_compat_mode) macfunc = eval_macro_name(ctx, mctx, macname) raw_args = ex[2:end] macro_loc = let loc = source_location(LineNumberNode, ex) diff --git a/src/runtime.jl b/src/runtime.jl index d5a908a..c98b716 100644 --- a/src/runtime.jl +++ b/src/runtime.jl @@ -330,7 +330,7 @@ function (g::GeneratedFunctionStub)(world::UInt, source::Method, @nospecialize a # Run code generator - this acts like a macro expander and like a macro # expander it gets a MacroContext. - mctx = MacroContext(syntax_graph(ctx1), g.srcref, layer) + mctx = MacroContext(syntax_graph(ctx1), g.srcref, layer, false) ex0 = g.gen(mctx, args...) if ex0 isa SyntaxTree if !is_compatible_graph(ctx1, ex0) diff --git a/src/syntax_macros.jl b/src/syntax_macros.jl index e7e5a1c..a08ddde 100644 --- a/src/syntax_macros.jl +++ b/src/syntax_macros.jl @@ -282,6 +282,12 @@ function _at_eval_code(ctx, srcref, mod, ex) JuliaLowering.eval::K"Value" mod [K"quote" ex] + [K"parameters" + [K"=" + "expr_compat_mode"::K"Identifier" + ctx.expr_compat_mode::K"Bool" + ] + ] ] ] ] diff --git a/test/misc.jl b/test/misc.jl index a0c9dba..6249654 100644 --- a/test/misc.jl +++ b/test/misc.jl @@ -180,4 +180,11 @@ end end +# SyntaxTree @eval should pass along expr_compat_mode +@test JuliaLowering.include_string(test_mod, raw""" + let T = :foo + @eval @doc $"This is a $T" $T = 1 + end +"""; expr_compat_mode=true) === 1 + end diff --git a/test/misc_ir.jl b/test/misc_ir.jl index 775960b..a6941cf 100644 --- a/test/misc_ir.jl +++ b/test/misc_ir.jl @@ -298,26 +298,36 @@ end # @eval without module @eval $f(x, y) #--------------------- -1 TestMod.f -2 (call core.tuple %₁) -3 (call JuliaLowering.interpolate_ast SyntaxTree (inert (call ($ f) x y)) %₂) -4 (= slot₁/eval_result (call JuliaLowering.eval TestMod %₃)) -5 latestworld -6 slot₁/eval_result -7 (return %₆) +1 JuliaLowering.eval +2 (call core.tuple :expr_compat_mode) +3 (call core.apply_type core.NamedTuple %₂) +4 (call core.tuple false) +5 (call %₃ %₄) +6 TestMod.f +7 (call core.tuple %₆) +8 (call JuliaLowering.interpolate_ast SyntaxTree (inert (call ($ f) x y)) %₇) +9 (= slot₁/eval_result (call core.kwcall %₅ %₁ TestMod %₈)) +10 latestworld +11 slot₁/eval_result +12 (return %₁₁) ######################################## # @eval with module @eval mod $f(x, y) #--------------------- -1 TestMod.mod -2 TestMod.f -3 (call core.tuple %₂) -4 (call JuliaLowering.interpolate_ast SyntaxTree (inert (call ($ f) x y)) %₃) -5 (= slot₁/eval_result (call JuliaLowering.eval %₁ %₄)) -6 latestworld -7 slot₁/eval_result -8 (return %₇) +1 JuliaLowering.eval +2 (call core.tuple :expr_compat_mode) +3 (call core.apply_type core.NamedTuple %₂) +4 (call core.tuple false) +5 (call %₃ %₄) +6 TestMod.mod +7 TestMod.f +8 (call core.tuple %₇) +9 (call JuliaLowering.interpolate_ast SyntaxTree (inert (call ($ f) x y)) %₈) +10 (= slot₁/eval_result (call core.kwcall %₅ %₁ %₆ %₉)) +11 latestworld +12 slot₁/eval_result +13 (return %₁₂) ######################################## # Juxtaposition