Skip to content

Re-factor expression handling #230

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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