Skip to content

TraverseAncestry::current_address to get address of current node #140

@overlookmotel

Description

@overlookmotel

See: oxc-project/oxc#6881 (comment)

We want to avoid implementing GetAddress for &T because it's error-prone. But often in transformer you only have a &T not a &Box<T> and want to get it's address (e.g. in a visitor like exit_function).

This is legitimate because the &mut T passed into visitor function is always a reference to value in the arena.

We could achieve this by:

  • Pushing Ancestor to the stack of ancestors before calling enter_* and pop it after calling exit_*.
  • TraverseAncestry::parent return not stack.last() but 1 ancestor before it.
  • TraverseAncestry::ancestor return the item at index last_index - level - 1 (not last_index - level).
  • TraverseAncestry::ancestors skip the last item on stack.
  • Always push to ancestors stack in all walk_* functions (I think we skip that for leaf nodes at present).

Then existing APIs behave as they do now, but TraverseAncestry::current_address can get the address of the current node with stack.last().address().

Problem: What about visitors for enums e.g. Expression? current_address would return the address of parent node, because enums don't get an Ancestor. Either:

  1. Live with it. or
  2. Move pushing to ancestor stack up into the walk_* functions for enums (a bit tricky, because some nodes don't always live within an enum).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions