Rollup merge of #98882 - compiler-errors:explain-doc-comments-in-macros, r=davidtwco
explain doc comments in macros a bit Open to suggestions on improving this... macro parsing is very foreign to me. Should we have a structured suggestion to turn them into their regular non-doc comments? Fixes #92846 Fixes #97850
This commit is contained in:
commit
943152008f
5
compiler/rustc_error_messages/locales/en-US/expand.ftl
Normal file
5
compiler/rustc_error_messages/locales/en-US/expand.ftl
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
expand-explain-doc-comment-outer =
|
||||||
|
outer doc comments expand to `#[doc = "..."]`, which is what this macro attempted to match
|
||||||
|
|
||||||
|
expand-explain-doc-comment-inner =
|
||||||
|
inner doc comments expand to `#![doc = "..."]`, which is what this macro attempted to match
|
@ -33,11 +33,12 @@ pub use unic_langid::{langid, LanguageIdentifier};
|
|||||||
fluent_messages! {
|
fluent_messages! {
|
||||||
borrowck => "../locales/en-US/borrowck.ftl",
|
borrowck => "../locales/en-US/borrowck.ftl",
|
||||||
builtin_macros => "../locales/en-US/builtin_macros.ftl",
|
builtin_macros => "../locales/en-US/builtin_macros.ftl",
|
||||||
|
const_eval => "../locales/en-US/const_eval.ftl",
|
||||||
|
expand => "../locales/en-US/expand.ftl",
|
||||||
lint => "../locales/en-US/lint.ftl",
|
lint => "../locales/en-US/lint.ftl",
|
||||||
parser => "../locales/en-US/parser.ftl",
|
parser => "../locales/en-US/parser.ftl",
|
||||||
privacy => "../locales/en-US/privacy.ftl",
|
privacy => "../locales/en-US/privacy.ftl",
|
||||||
typeck => "../locales/en-US/typeck.ftl",
|
typeck => "../locales/en-US/typeck.ftl",
|
||||||
const_eval => "../locales/en-US/const_eval.ftl",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};
|
pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};
|
||||||
|
@ -14,7 +14,7 @@ use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
|||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_attr::{self as attr, TransparencyError};
|
use rustc_attr::{self as attr, TransparencyError};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder};
|
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed};
|
||||||
use rustc_feature::Features;
|
use rustc_feature::Features;
|
||||||
use rustc_lint_defs::builtin::{
|
use rustc_lint_defs::builtin::{
|
||||||
RUST_2021_INCOMPATIBLE_OR_PATTERNS, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS,
|
RUST_2021_INCOMPATIBLE_OR_PATTERNS, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS,
|
||||||
@ -25,6 +25,7 @@ use rustc_session::parse::ParseSess;
|
|||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::hygiene::Transparency;
|
use rustc_span::hygiene::Transparency;
|
||||||
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, MacroRulesNormalizedIdent};
|
use rustc_span::symbol::{kw, sym, Ident, MacroRulesNormalizedIdent};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
@ -345,7 +346,7 @@ fn expand_macro<'cx>(
|
|||||||
if !def_span.is_dummy() && !cx.source_map().is_imported(def_span) {
|
if !def_span.is_dummy() && !cx.source_map().is_imported(def_span) {
|
||||||
err.span_label(cx.source_map().guess_head_span(def_span), "when calling this macro");
|
err.span_label(cx.source_map().guess_head_span(def_span), "when calling this macro");
|
||||||
}
|
}
|
||||||
|
annotate_doc_comment(&mut err, sess.source_map(), span);
|
||||||
// Check whether there's a missing comma in this macro call, like `println!("{}" a);`
|
// Check whether there's a missing comma in this macro call, like `println!("{}" a);`
|
||||||
if let Some((arg, comma_span)) = arg.add_comma() {
|
if let Some((arg, comma_span)) = arg.add_comma() {
|
||||||
for lhs in lhses {
|
for lhs in lhses {
|
||||||
@ -453,7 +454,10 @@ pub fn compile_declarative_macro(
|
|||||||
Failure(token, msg) => {
|
Failure(token, msg) => {
|
||||||
let s = parse_failure_msg(&token);
|
let s = parse_failure_msg(&token);
|
||||||
let sp = token.span.substitute_dummy(def.span);
|
let sp = token.span.substitute_dummy(def.span);
|
||||||
sess.parse_sess.span_diagnostic.struct_span_err(sp, &s).span_label(sp, msg).emit();
|
let mut err = sess.parse_sess.span_diagnostic.struct_span_err(sp, &s);
|
||||||
|
err.span_label(sp, msg);
|
||||||
|
annotate_doc_comment(&mut err, sess.source_map(), sp);
|
||||||
|
err.emit();
|
||||||
return dummy_syn_ext();
|
return dummy_syn_ext();
|
||||||
}
|
}
|
||||||
Error(sp, msg) => {
|
Error(sp, msg) => {
|
||||||
@ -590,6 +594,34 @@ pub fn compile_declarative_macro(
|
|||||||
(mk_syn_ext(expander), rule_spans)
|
(mk_syn_ext(expander), rule_spans)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(SessionSubdiagnostic)]
|
||||||
|
enum ExplainDocComment {
|
||||||
|
#[label(expand::explain_doc_comment_inner)]
|
||||||
|
Inner {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
},
|
||||||
|
#[label(expand::explain_doc_comment_outer)]
|
||||||
|
Outer {
|
||||||
|
#[primary_span]
|
||||||
|
span: Span,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
fn annotate_doc_comment(
|
||||||
|
err: &mut DiagnosticBuilder<'_, ErrorGuaranteed>,
|
||||||
|
sm: &SourceMap,
|
||||||
|
span: Span,
|
||||||
|
) {
|
||||||
|
if let Ok(src) = sm.span_to_snippet(span) {
|
||||||
|
if src.starts_with("///") || src.starts_with("/**") {
|
||||||
|
err.subdiagnostic(ExplainDocComment::Outer { span });
|
||||||
|
} else if src.starts_with("//!") || src.starts_with("/*!") {
|
||||||
|
err.subdiagnostic(ExplainDocComment::Inner { span });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn check_lhs_nt_follows(sess: &ParseSess, def: &ast::Item, lhs: &mbe::TokenTree) -> bool {
|
fn check_lhs_nt_follows(sess: &ParseSess, def: &ast::Item, lhs: &mbe::TokenTree) -> bool {
|
||||||
// lhs is going to be like TokenTree::Delimited(...), where the
|
// lhs is going to be like TokenTree::Delimited(...), where the
|
||||||
// entire lhs is those tts. Or, it can be a "bare sequence", not wrapped in parens.
|
// entire lhs is those tts. Or, it can be a "bare sequence", not wrapped in parens.
|
||||||
|
@ -5,7 +5,10 @@ LL | macro_rules! outer {
|
|||||||
| ------------------ when calling this macro
|
| ------------------ when calling this macro
|
||||||
...
|
...
|
||||||
LL | //! Inner
|
LL | //! Inner
|
||||||
| ^^^^^^^^^ no rules expected this token in macro call
|
| ^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| no rules expected this token in macro call
|
||||||
|
| inner doc comments expand to `#![doc = "..."]`, which is what this macro attempted to match
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -5,7 +5,10 @@ LL | macro_rules! inner {
|
|||||||
| ------------------ when calling this macro
|
| ------------------ when calling this macro
|
||||||
...
|
...
|
||||||
LL | /// Outer
|
LL | /// Outer
|
||||||
| ^^^^^^^^^ no rules expected this token in macro call
|
| ^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| no rules expected this token in macro call
|
||||||
|
| outer doc comments expand to `#[doc = "..."]`, which is what this macro attempted to match
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user