Skip to content

Commit 695f878

Browse files
authored
Rollup merge of #80784 - petrochenkov:nontspan, r=Aaron1011
rustc_parse: Better spans for synthesized token streams I think using the nonterminal span for synthesizing its tokens is a better approximation than using `DUMMY_SP` or the attribute span like #79472 did in `expand.rs`. r? `@Aaron1011`
2 parents 695f18e + 0dab076 commit 695f878

File tree

9 files changed

+151
-167
lines changed

9 files changed

+151
-167
lines changed

Diff for: compiler/rustc_ast/src/token.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ impl fmt::Display for NonterminalKind {
771771
}
772772

773773
impl Nonterminal {
774-
fn span(&self) -> Span {
774+
pub fn span(&self) -> Span {
775775
match self {
776776
NtItem(item) => item.span,
777777
NtBlock(block) => block.span,

Diff for: compiler/rustc_ast_lowering/src/lib.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,7 @@ pub trait ResolverAstLowering {
206206
) -> LocalDefId;
207207
}
208208

209-
type NtToTokenstream =
210-
fn(&Nonterminal, &ParseSess, Span, CanSynthesizeMissingTokens) -> TokenStream;
209+
type NtToTokenstream = fn(&Nonterminal, &ParseSess, CanSynthesizeMissingTokens) -> TokenStream;
211210

212211
/// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
213212
/// and if so, what meaning it has.
@@ -417,12 +416,7 @@ impl<'a> TokenStreamLowering<'a> {
417416
fn lower_token(&mut self, token: Token) -> TokenStream {
418417
match token.kind {
419418
token::Interpolated(nt) => {
420-
let tts = (self.nt_to_tokenstream)(
421-
&nt,
422-
self.parse_sess,
423-
token.span,
424-
self.synthesize_tokens,
425-
);
419+
let tts = (self.nt_to_tokenstream)(&nt, self.parse_sess, self.synthesize_tokens);
426420
TokenTree::Delimited(
427421
DelimSpan::from_single(token.span),
428422
DelimToken::NoDelim,

Diff for: compiler/rustc_expand/src/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ impl Annotatable {
141141
}
142142

143143
crate fn into_tokens(self, sess: &ParseSess) -> TokenStream {
144-
nt_to_tokenstream(&self.into_nonterminal(), sess, DUMMY_SP, CanSynthesizeMissingTokens::No)
144+
nt_to_tokenstream(&self.into_nonterminal(), sess, CanSynthesizeMissingTokens::No)
145145
}
146146

147147
pub fn expect_item(self) -> P<ast::Item> {

Diff for: compiler/rustc_expand/src/expand.rs

-1
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
743743
AttrStyle::Inner => rustc_parse::fake_token_stream(
744744
&self.cx.sess.parse_sess,
745745
&item.into_nonterminal(),
746-
span,
747746
),
748747
};
749748
let attr_item = attr.unwrap_normal_item();

Diff for: compiler/rustc_expand/src/proc_macro.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,7 @@ impl MultiItemModifier for ProcMacroDerive {
9494
let input = if item.pretty_printing_compatibility_hack() {
9595
TokenTree::token(token::Interpolated(Lrc::new(item)), DUMMY_SP).into()
9696
} else {
97-
nt_to_tokenstream(
98-
&item,
99-
&ecx.sess.parse_sess,
100-
DUMMY_SP,
101-
CanSynthesizeMissingTokens::Yes,
102-
)
97+
nt_to_tokenstream(&item, &ecx.sess.parse_sess, CanSynthesizeMissingTokens::Yes)
10398
};
10499

105100
let server = proc_macro_server::Rustc::new(ecx);

Diff for: compiler/rustc_expand/src/proc_macro_server.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ impl FromInternal<(TreeAndSpacing, &'_ ParseSess, &'_ mut Vec<Self>)>
179179
{
180180
TokenTree::Ident(Ident::new(sess, name.name, is_raw, name.span))
181181
} else {
182-
let stream = nt_to_tokenstream(&nt, sess, span, CanSynthesizeMissingTokens::No);
182+
let stream = nt_to_tokenstream(&nt, sess, CanSynthesizeMissingTokens::No);
183183
TokenTree::Group(Group {
184184
delimiter: Delimiter::None,
185185
stream,

Diff for: compiler/rustc_parse/src/lib.rs

+8-12
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ pub fn parse_in<'a, T>(
236236
pub fn nt_to_tokenstream(
237237
nt: &Nonterminal,
238238
sess: &ParseSess,
239-
span: Span,
240239
synthesize_tokens: CanSynthesizeMissingTokens,
241240
) -> TokenStream {
242241
// A `Nonterminal` is often a parsed AST item. At this point we now
@@ -256,11 +255,9 @@ pub fn nt_to_tokenstream(
256255
|tokens: Option<&LazyTokenStream>| tokens.as_ref().map(|t| t.create_token_stream());
257256

258257
let tokens = match *nt {
259-
Nonterminal::NtItem(ref item) => {
260-
prepend_attrs(sess, &item.attrs, nt, span, item.tokens.as_ref())
261-
}
258+
Nonterminal::NtItem(ref item) => prepend_attrs(sess, &item.attrs, nt, item.tokens.as_ref()),
262259
Nonterminal::NtBlock(ref block) => convert_tokens(block.tokens.as_ref()),
263-
Nonterminal::NtStmt(ref stmt) => prepend_attrs(sess, stmt.attrs(), nt, span, stmt.tokens()),
260+
Nonterminal::NtStmt(ref stmt) => prepend_attrs(sess, stmt.attrs(), nt, stmt.tokens()),
264261
Nonterminal::NtPat(ref pat) => convert_tokens(pat.tokens.as_ref()),
265262
Nonterminal::NtTy(ref ty) => convert_tokens(ty.tokens.as_ref()),
266263
Nonterminal::NtIdent(ident, is_raw) => {
@@ -277,31 +274,30 @@ pub fn nt_to_tokenstream(
277274
if expr.tokens.is_none() {
278275
debug!("missing tokens for expr {:?}", expr);
279276
}
280-
prepend_attrs(sess, &expr.attrs, nt, span, expr.tokens.as_ref())
277+
prepend_attrs(sess, &expr.attrs, nt, expr.tokens.as_ref())
281278
}
282279
};
283280

284281
if let Some(tokens) = tokens {
285282
return tokens;
286283
} else if matches!(synthesize_tokens, CanSynthesizeMissingTokens::Yes) {
287-
return fake_token_stream(sess, nt, span);
284+
return fake_token_stream(sess, nt);
288285
} else {
289286
let pretty = rustc_ast_pretty::pprust::nonterminal_to_string_no_extra_parens(&nt);
290-
panic!("Missing tokens at {:?} for nt {:?}", span, pretty);
287+
panic!("Missing tokens for nt {:?}", pretty);
291288
}
292289
}
293290

294-
pub fn fake_token_stream(sess: &ParseSess, nt: &Nonterminal, span: Span) -> TokenStream {
291+
pub fn fake_token_stream(sess: &ParseSess, nt: &Nonterminal) -> TokenStream {
295292
let source = pprust::nonterminal_to_string(nt);
296293
let filename = FileName::macro_expansion_source_code(&source);
297-
parse_stream_from_source_str(filename, source, sess, Some(span))
294+
parse_stream_from_source_str(filename, source, sess, Some(nt.span()))
298295
}
299296

300297
fn prepend_attrs(
301298
sess: &ParseSess,
302299
attrs: &[ast::Attribute],
303300
nt: &Nonterminal,
304-
span: Span,
305301
tokens: Option<&tokenstream::LazyTokenStream>,
306302
) -> Option<tokenstream::TokenStream> {
307303
if attrs.is_empty() {
@@ -312,7 +308,7 @@ fn prepend_attrs(
312308
// FIXME: Correctly handle tokens for inner attributes.
313309
// For now, we fall back to reparsing the original AST node
314310
if attr.style == ast::AttrStyle::Inner {
315-
return Some(fake_token_stream(sess, nt, span));
311+
return Some(fake_token_stream(sess, nt));
316312
}
317313
builder.push(attr.tokens());
318314
}

0 commit comments

Comments
 (0)