-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Migrate parser to the new span combining scheme #126763
Comments
It may also be possible to introduce a smarter |
The "token" here is a "token tree" really, despite Rust parser working mostly with flattened token sequences at the moment. Also span combining for delimited groups can ignore all their internal tokens and only consider their delimiters. |
@rustbot assing |
@rustbot claim |
@petrochenkov do you mentor this? |
@danik292 Yes |
@petrochenkov ok where Is spans implemented? |
I suggest implementing this for some specific AST nodes that are not too complex, e.g. for paths maybe ( I'd also suggest starting with some testing infra, like a new attribute for showing spans in an AST node. #[rustc_show_spans(expr)]
fn foo() {
let x = a + b;
} should show a diagnostic (probably a note) similar to this
See e.g. |
Is the main issue that something like |
Summary:
I
a
,b
, ...,z
are multiple consecutive span nodes that need to be combined into a single new span node, then its combined span should be"Span node" is either an individual token (every token has a span), or some larger AST node having a
Span
field.Examples:
The combined span for these pieces of code will be
Status quo:
Currently the resulting span is typically built like
span_first_token.to(span_last_token)
.So anything in the middle and the internal structure (i.e. nodes, as opposed to tokens) are ignored.
Why we need to change it:
The
to
operation will automatically take macro variables into account, and will try to put the resulting span into the best suitable macro context (this was implemented in #119673).E.g. in
$tt + 5
the combined expression span will be put into the context of the macro using$tt
as a macro parameter.Note, that the same thing often happens in the current parser as well, but not consistently, e.g.
$a::$b
will produce an incorrect resulting path span because the::
in the middle is not considered.This will also give us some single relatively well predictable rule for combining AST spans.
Implementation:
This work should be parallelizable relatively well (but may require a one time initial setup).
I'll review PRs doing this, they can be assigned to me.
It may be convenient to have a rolling value in the
Parser
structure for span of the current (or previous?) span node.The parser has a lot of bespoke diagnostic logic (including snapshotting) that stands in the way of any systematic improvements like this.
How this can be tested:
Make a macro that emits complex nodes using tokens from different contexts, e.g.
and emit some diagnostic using those nodes' spans (maybe can add a special internal diagnostic for this testing).
The text was updated successfully, but these errors were encountered: