mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-29 02:52:11 +00:00
Allow wrapping builtin#offset_of fields argument in parentheses
This is necessary to correctly handle nested fields (`foo.bar`), see the comments in the code for explanation.
This commit is contained in:
parent
2f2cff19f8
commit
db6db2aacc
4 changed files with 61 additions and 0 deletions
|
|
@ -258,6 +258,15 @@ fn builtin_expr(p: &mut Parser<'_>) -> Option<CompletedMarker> {
|
|||
p.expect(T!['(']);
|
||||
type_(p);
|
||||
p.expect(T![,]);
|
||||
// Due to our incomplete handling of macro groups, especially
|
||||
// those with empty delimiters, we wrap `expr` fragments in
|
||||
// parentheses sometimes. Since `offset_of` is a macro, and takes
|
||||
// `expr`, the field names could be wrapped in parentheses.
|
||||
let wrapped_in_parens = p.eat(T!['(']);
|
||||
// test offset_of_parens
|
||||
// fn foo() {
|
||||
// builtin#offset_of(Foo, (bar.baz.0));
|
||||
// }
|
||||
while !p.at(EOF) && !p.at(T![')']) {
|
||||
name_ref_mod_path_or_index(p);
|
||||
if !p.at(T![')']) {
|
||||
|
|
@ -265,6 +274,9 @@ fn builtin_expr(p: &mut Parser<'_>) -> Option<CompletedMarker> {
|
|||
}
|
||||
}
|
||||
p.expect(T![')']);
|
||||
if wrapped_in_parens {
|
||||
p.expect(T![')']);
|
||||
}
|
||||
Some(m.complete(p, OFFSET_OF_EXPR))
|
||||
} else if p.at_contextual_kw(T![format_args]) {
|
||||
p.bump_remap(T![format_args]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue