Skip to content

Re-factor expression handling #230

@pdeffebach

Description

@pdeffebach

Some of the expression handling code is very old and kind of confusing.

It may also be less performant. This stuff:

onearg(e, f) = e.head == :call && length(e.args) == 2 && e.args[1] == f

mapexpr(f, e) = Expr(e.head, map(f, e.args)...)

replace_syms!(x, membernames) = x
replace_syms!(q::QuoteNode, membernames) =
    replace_syms!(Meta.quot(q.value), membernames)
replace_syms!(e::Expr, membernames) =
    if onearg(e, :^) # TODO: Delete this branch after deprecation period
        @warn "^() for escaping `Symbol`s is deprecated, use syms() instead"
        e.args[2]
    elseif onearg(e, :syms)
        e.args[2]
    elseif onearg(e, :_I_) # TODO: Delete this branch after deprecation period
        @warn "_I_() for escaping variables is deprecated, use cols() instead"
        addkey!(membernames, :($(e.args[2])))
    elseif onearg(e, :cols)
        addkey!(membernames, :($(e.args[2])))
    elseif e.head == :quote
        addkey!(membernames, Meta.quot(e.args[1]) )
    elseif e.head == :.
        replace_dotted!(e, membernames)
    else
        mapexpr(x -> replace_syms!(x, membernames), e)
    end

Should we use a more contemporary package to deal with expressions? Like MacroTools?

Or if it isn't broken, should we not fix it? I don't know very much about MacroTools but I'm sure I could learn.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions