Skip to content

Commit 596e63d

Browse files
authored
Fix handling of ;init kwarg and test it is actually rewritten (#360)
1 parent 11a3c45 commit 596e63d

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

src/rewrite_generic.jl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,17 @@ This most commonly happens in situations like `x^2`.
3939
"""
4040
_rewrite_generic(::Expr, x::Number) = x, true
4141

42-
function _is_generator(expr)
43-
return Meta.isexpr(expr, :call, 2) && Meta.isexpr(expr.args[2], :generator)
44-
end
45-
46-
function _is_flatten(expr)
47-
return Meta.isexpr(expr, :call, 2) && Meta.isexpr(expr.args[2], :flatten)
42+
function _is_generic_generator_call(expr)
43+
if Meta.isexpr(expr, :call, 2)
44+
return _is_generator_or_flatten(expr.args[2])
45+
end
46+
return Meta.isexpr(expr, :call, 3) &&
47+
Meta.isexpr(expr.args[2], :parameters) &&
48+
_is_generator_or_flatten(expr.args[3])
4849
end
4950

50-
_is_generator_or_flatten(expr) = _is_generator(expr) || _is_flatten(expr)
51-
52-
function _is_parameters(expr)
53-
return Meta.isexpr(expr, :call, 3) && Meta.isexpr(expr.args[2], :parameters)
51+
function _is_generator_or_flatten(expr)
52+
return Meta.isexpr(expr, :generator) || Meta.isexpr(expr, :flatten)
5453
end
5554

5655
function _is_kwarg(expr, kwarg::Symbol)
@@ -113,7 +112,7 @@ function _rewrite_generic(stack::Expr, expr::Expr)
113112
elseif Meta.isexpr(expr.args[2], :(...))
114113
# If the first argument is a splat.
115114
return esc(expr), false
116-
elseif _is_generator_or_flatten(expr) || _is_parameters(expr)
115+
elseif _is_generic_generator_call(expr)
117116
if !(expr.args[1] in (:sum, , :∑))
118117
# We don't know what this is. Return the expression and don't let
119118
# future callers mutate.

test/test_rewrite_generic.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,22 @@ function test_issue_76_trailing_dimensions()
675675
return
676676
end
677677

678+
function test_issue_359()
679+
for (expr, has_zero) in Pair{Expr,Bool}[
680+
:(sum(i for i in I))=>true,
681+
:(sum(i for i in I; init = 0))=>false,
682+
:(sum(i for i in I, init in 0))=>false,
683+
]
684+
stack = quote end
685+
root, is_mutable = MA._rewrite_generic(stack, expr)
686+
@test root isa Symbol
687+
@test is_mutable
688+
@test length(stack.args) == 3
689+
@test occursin(".Zero()", string(stack.args[2])) == has_zero
690+
end
691+
return
692+
end
693+
678694
end # module
679695

680696
TestRewriteGeneric.runtests()

0 commit comments

Comments
 (0)