From 8489a67f0b0ca5a973d48b27d609c91cb93cf343 Mon Sep 17 00:00:00 2001 From: Xiretza Date: Wed, 14 Sep 2022 19:22:20 +0200 Subject: Implement IntoDiagnosticArg for rustc_ast::Path --- compiler/rustc_errors/src/diagnostic.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'compiler/rustc_errors/src') diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 1c440a0a07e..fb409c578f6 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -3,6 +3,8 @@ use crate::{ CodeSuggestion, DiagnosticMessage, EmissionGuarantee, Level, LintDiagnosticBuilder, MultiSpan, SubdiagnosticMessage, Substitution, SubstitutionPart, SuggestionStyle, }; +use rustc_ast as ast; +use rustc_ast_pretty::pprust; use rustc_data_structures::fx::FxHashMap; use rustc_error_messages::FluentValue; use rustc_hir as hir; @@ -175,6 +177,12 @@ impl IntoDiagnosticArg for hir::ConstContext { } } +impl IntoDiagnosticArg for ast::Path { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(&self))) + } +} + /// Trait implemented by error types. This should not be implemented manually. Instead, use /// `#[derive(Subdiagnostic)]` -- see [rustc_macros::Subdiagnostic]. #[cfg_attr(bootstrap, rustc_diagnostic_item = "AddSubdiagnostic")] -- cgit 1.4.1-3-g733a5 From d7c64574e03f1d44c0a9e200b7dbeba98c50d8b3 Mon Sep 17 00:00:00 2001 From: Xiretza Date: Thu, 22 Sep 2022 18:39:17 +0200 Subject: Implement IntoDiagnosticArg for rustc_ast::token::Token(Kind) --- .../rustc_error_messages/locales/en-US/parser.ftl | 20 ++++---- compiler/rustc_errors/src/diagnostic.rs | 12 +++++ compiler/rustc_parse/src/errors.rs | 53 ++++++++++++---------- compiler/rustc_parse/src/parser/attr.rs | 4 +- compiler/rustc_parse/src/parser/diagnostics.rs | 6 +-- compiler/rustc_parse/src/parser/expr.rs | 3 +- compiler/rustc_parse/src/parser/mod.rs | 41 +++++++---------- 7 files changed, 73 insertions(+), 66 deletions(-) (limited to 'compiler/rustc_errors/src') diff --git a/compiler/rustc_error_messages/locales/en-US/parser.ftl b/compiler/rustc_error_messages/locales/en-US/parser.ftl index dea85d8e7f4..6d34cdce340 100644 --- a/compiler/rustc_error_messages/locales/en-US/parser.ftl +++ b/compiler/rustc_error_messages/locales/en-US/parser.ftl @@ -291,11 +291,11 @@ parser_inner_doc_comment_not_permitted = expected outer doc comment .label_does_not_annotate_this = the inner doc comment doesn't annotate this {$item} .sugg_change_inner_to_outer = to annotate the {$item}, change the doc comment from inner to outer style -parser_expected_identifier_found_reserved_identifier_str = expected identifier, found reserved identifier `{$token_str}` -parser_expected_identifier_found_keyword_str = expected identifier, found keyword `{$token_str}` -parser_expected_identifier_found_reserved_keyword_str = expected identifier, found reserved keyword `{$token_str}` -parser_expected_identifier_found_doc_comment_str = expected identifier, found doc comment `{$token_str}` -parser_expected_identifier_found_str = expected identifier, found `{$token_str}` +parser_expected_identifier_found_reserved_identifier_str = expected identifier, found reserved identifier `{$token}` +parser_expected_identifier_found_keyword_str = expected identifier, found keyword `{$token}` +parser_expected_identifier_found_reserved_keyword_str = expected identifier, found reserved keyword `{$token}` +parser_expected_identifier_found_doc_comment_str = expected identifier, found doc comment `{$token}` +parser_expected_identifier_found_str = expected identifier, found `{$token}` parser_expected_identifier_found_reserved_identifier = expected identifier, found reserved identifier parser_expected_identifier_found_keyword = expected identifier, found keyword @@ -307,11 +307,11 @@ parser_sugg_escape_to_use_as_identifier = escape `{$ident_name}` to use it as an parser_sugg_remove_comma = remove this comma -parser_expected_semi_found_reserved_identifier_str = expected `;`, found reserved identifier `{$token_str}` -parser_expected_semi_found_keyword_str = expected `;`, found keyword `{$token_str}` -parser_expected_semi_found_reserved_keyword_str = expected `;`, found reserved keyword `{$token_str}` -parser_expected_semi_found_doc_comment_str = expected `;`, found doc comment `{$token_str}` -parser_expected_semi_found_str = expected `;`, found `{$token_str}` +parser_expected_semi_found_reserved_identifier_str = expected `;`, found reserved identifier `{$token}` +parser_expected_semi_found_keyword_str = expected `;`, found keyword `{$token}` +parser_expected_semi_found_reserved_keyword_str = expected `;`, found reserved keyword `{$token}` +parser_expected_semi_found_doc_comment_str = expected `;`, found doc comment `{$token}` +parser_expected_semi_found_str = expected `;`, found `{$token}` parser_sugg_change_this_to_semi = change this to `;` parser_sugg_add_semi = add `;` here diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index fb409c578f6..5520e22e476 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -183,6 +183,18 @@ impl IntoDiagnosticArg for ast::Path { } } +impl IntoDiagnosticArg for ast::token::Token { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + DiagnosticArgValue::Str(pprust::token_to_string(&self)) + } +} + +impl IntoDiagnosticArg for ast::token::TokenKind { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + DiagnosticArgValue::Str(pprust::token_kind_to_string(&self)) + } +} + /// Trait implemented by error types. This should not be implemented manually. Instead, use /// `#[derive(Subdiagnostic)]` -- see [rustc_macros::Subdiagnostic]. #[cfg_attr(bootstrap, rustc_diagnostic_item = "AddSubdiagnostic")] diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs index 3d364a956d3..98fee997427 100644 --- a/compiler/rustc_parse/src/errors.rs +++ b/compiler/rustc_parse/src/errors.rs @@ -1,3 +1,4 @@ +use rustc_ast::token::Token; use rustc_ast::Path; use rustc_errors::{fluent, AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic}; use rustc_macros::{Diagnostic, Subdiagnostic}; @@ -5,7 +6,7 @@ use rustc_session::errors::ExprParenthesesNeeded; use rustc_span::symbol::Ident; use rustc_span::{Span, Symbol}; -use crate::parser::{TokenDescription, TokenDescriptionKind}; +use crate::parser::TokenDescription; #[derive(Diagnostic)] #[diag(parser::maybe_report_ambiguous_plus)] @@ -572,7 +573,7 @@ pub(crate) struct FoundExprWouldBeStmt { #[primary_span] #[label] pub span: Span, - pub token: String, + pub token: Token, #[subdiagnostic] pub suggestion: ExprParenthesesNeeded, } @@ -871,7 +872,7 @@ pub(crate) struct SuffixedLiteralInAttribute { pub(crate) struct InvalidMetaItem { #[primary_span] pub span: Span, - pub token: String, + pub token: Token, } #[derive(Subdiagnostic)] @@ -908,14 +909,14 @@ pub(crate) enum ExpectedIdentifierFound { } impl ExpectedIdentifierFound { - pub fn new(token_descr_kind: Option, span: Span) -> Self { - (match token_descr_kind { - Some(TokenDescriptionKind::ReservedIdentifier) => { + pub fn new(token_descr: Option, span: Span) -> Self { + (match token_descr { + Some(TokenDescription::ReservedIdentifier) => { ExpectedIdentifierFound::ReservedIdentifier } - Some(TokenDescriptionKind::Keyword) => ExpectedIdentifierFound::Keyword, - Some(TokenDescriptionKind::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword, - Some(TokenDescriptionKind::DocComment) => ExpectedIdentifierFound::DocComment, + Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword, + Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword, + Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment, None => ExpectedIdentifierFound::Other, })(span) } @@ -923,7 +924,7 @@ impl ExpectedIdentifierFound { pub(crate) struct ExpectedIdentifier { pub span: Span, - pub token_descr: TokenDescription, + pub token: Token, pub suggest_raw: Option, pub suggest_remove_comma: Option, } @@ -933,29 +934,31 @@ impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier { self, handler: &'a rustc_errors::Handler, ) -> rustc_errors::DiagnosticBuilder<'a, G> { - let mut diag = handler.struct_diagnostic(match self.token_descr.kind { - Some(TokenDescriptionKind::ReservedIdentifier) => { + let token_descr = super::parser::TokenDescription::from_token(&self.token); + + let mut diag = handler.struct_diagnostic(match token_descr { + Some(TokenDescription::ReservedIdentifier) => { fluent::parser::expected_identifier_found_reserved_identifier_str } - Some(TokenDescriptionKind::Keyword) => { + Some(TokenDescription::Keyword) => { fluent::parser::expected_identifier_found_keyword_str } - Some(TokenDescriptionKind::ReservedKeyword) => { + Some(TokenDescription::ReservedKeyword) => { fluent::parser::expected_identifier_found_reserved_keyword_str } - Some(TokenDescriptionKind::DocComment) => { + Some(TokenDescription::DocComment) => { fluent::parser::expected_identifier_found_doc_comment_str } None => fluent::parser::expected_identifier_found_str, }); diag.set_span(self.span); - diag.set_arg("token_str", self.token_descr.name); + diag.set_arg("token", self.token); if let Some(sugg) = self.suggest_raw { sugg.add_to_diagnostic(&mut diag); } - ExpectedIdentifierFound::new(self.token_descr.kind, self.span).add_to_diagnostic(&mut diag); + ExpectedIdentifierFound::new(token_descr, self.span).add_to_diagnostic(&mut diag); if let Some(sugg) = self.suggest_remove_comma { sugg.add_to_diagnostic(&mut diag); @@ -967,7 +970,7 @@ impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier { pub(crate) struct ExpectedSemi { pub span: Span, - pub token_descr: TokenDescription, + pub token: Token, pub unexpected_token_label: Option, pub sugg: ExpectedSemiSugg, @@ -978,21 +981,23 @@ impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedSemi { self, handler: &'a rustc_errors::Handler, ) -> rustc_errors::DiagnosticBuilder<'a, G> { - let mut diag = handler.struct_diagnostic(match self.token_descr.kind { - Some(TokenDescriptionKind::ReservedIdentifier) => { + let token_descr = super::parser::TokenDescription::from_token(&self.token); + + let mut diag = handler.struct_diagnostic(match token_descr { + Some(TokenDescription::ReservedIdentifier) => { fluent::parser::expected_semi_found_reserved_identifier_str } - Some(TokenDescriptionKind::Keyword) => fluent::parser::expected_semi_found_keyword_str, - Some(TokenDescriptionKind::ReservedKeyword) => { + Some(TokenDescription::Keyword) => fluent::parser::expected_semi_found_keyword_str, + Some(TokenDescription::ReservedKeyword) => { fluent::parser::expected_semi_found_reserved_keyword_str } - Some(TokenDescriptionKind::DocComment) => { + Some(TokenDescription::DocComment) => { fluent::parser::expected_semi_found_doc_comment_str } None => fluent::parser::expected_semi_found_str, }); diag.set_span(self.span); - diag.set_arg("token_str", self.token_descr.name); + diag.set_arg("token", self.token); if let Some(unexpected_token_label) = self.unexpected_token_label { diag.span_label(unexpected_token_label, fluent::parser::label_unexpected_token); diff --git a/compiler/rustc_parse/src/parser/attr.rs b/compiler/rustc_parse/src/parser/attr.rs index ee3f7dbbc39..58be348883c 100644 --- a/compiler/rustc_parse/src/parser/attr.rs +++ b/compiler/rustc_parse/src/parser/attr.rs @@ -4,7 +4,6 @@ use super::{AttrWrapper, Capturing, FnParseMode, ForceCollect, Parser, PathStyle use rustc_ast as ast; use rustc_ast::attr; use rustc_ast::token::{self, Delimiter, Nonterminal}; -use rustc_ast_pretty::pprust; use rustc_errors::{error_code, fluent, Diagnostic, IntoDiagnostic, PResult}; use rustc_span::{sym, BytePos, Span}; use std::convert::TryInto; @@ -414,8 +413,7 @@ impl<'a> Parser<'a> { Err(err) => err.cancel(), } - let token = pprust::token_to_string(&self.token).to_string(); - Err(InvalidMetaItem { span: self.token.span, token } + Err(InvalidMetaItem { span: self.token.span, token: self.token.clone() } .into_diagnostic(&self.sess.span_diagnostic)) } } diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 5df94331d7b..b512f26335f 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -326,7 +326,7 @@ impl<'a> Parser<'a> { let err = ExpectedIdentifier { span: self.token.span, - token_descr: super::token_descr_struct(&self.token), + token: self.token.clone(), suggest_raw, suggest_remove_comma, }; @@ -426,7 +426,7 @@ impl<'a> Parser<'a> { // let y = 42; self.sess.emit_err(ExpectedSemi { span: self.token.span, - token_descr: super::token_descr_struct(&self.token), + token: self.token.clone(), unexpected_token_label: None, sugg: ExpectedSemiSugg::ChangeToSemi(self.token.span), }); @@ -451,7 +451,7 @@ impl<'a> Parser<'a> { let span = self.prev_token.span.shrink_to_hi(); self.sess.emit_err(ExpectedSemi { span, - token_descr: super::token_descr_struct(&self.token), + token: self.token.clone(), unexpected_token_label: Some(self.token.span), sugg: ExpectedSemiSugg::AddSemi(span), }); diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 02cee75a0f5..8b328e593ae 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -430,8 +430,7 @@ impl<'a> Parser<'a> { fn error_found_expr_would_be_stmt(&self, lhs: &Expr) { self.sess.emit_err(FoundExprWouldBeStmt { span: self.token.span, - // FIXME(#100717) - token: pprust::token_to_string(&self.token).to_string(), + token: self.token.clone(), suggestion: ExprParenthesesNeeded::surrounding(lhs.span), }); } diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index a1a224e8524..2aebaf7c3af 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -411,40 +411,33 @@ pub enum FollowedByType { } #[derive(Clone, Copy, PartialEq, Eq)] -pub enum TokenDescriptionKind { +pub enum TokenDescription { ReservedIdentifier, Keyword, ReservedKeyword, DocComment, } -#[derive(Clone, PartialEq, Eq)] -pub struct TokenDescription { - pub kind: Option, - pub name: String, -} - -pub(super) fn token_descr_struct(token: &Token) -> TokenDescription { - let kind = match token.kind { - _ if token.is_special_ident() => Some(TokenDescriptionKind::ReservedIdentifier), - _ if token.is_used_keyword() => Some(TokenDescriptionKind::Keyword), - _ if token.is_unused_keyword() => Some(TokenDescriptionKind::ReservedKeyword), - token::DocComment(..) => Some(TokenDescriptionKind::DocComment), - _ => None, - }; - let name = pprust::token_to_string(token).to_string(); - - TokenDescription { kind, name } +impl TokenDescription { + pub fn from_token(token: &Token) -> Option { + match token.kind { + _ if token.is_special_ident() => Some(TokenDescription::ReservedIdentifier), + _ if token.is_used_keyword() => Some(TokenDescription::Keyword), + _ if token.is_unused_keyword() => Some(TokenDescription::ReservedKeyword), + token::DocComment(..) => Some(TokenDescription::DocComment), + _ => None, + } + } } pub(super) fn token_descr(token: &Token) -> String { - let TokenDescription { kind, name } = token_descr_struct(token); + let name = pprust::token_to_string(token).to_string(); - let kind = kind.map(|kind| match kind { - TokenDescriptionKind::ReservedIdentifier => "reserved identifier", - TokenDescriptionKind::Keyword => "keyword", - TokenDescriptionKind::ReservedKeyword => "reserved keyword", - TokenDescriptionKind::DocComment => "doc comment", + let kind = TokenDescription::from_token(token).map(|kind| match kind { + TokenDescription::ReservedIdentifier => "reserved identifier", + TokenDescription::Keyword => "keyword", + TokenDescription::ReservedKeyword => "reserved keyword", + TokenDescription::DocComment => "doc comment", }); if let Some(kind) = kind { format!("{} `{}`", kind, name) } else { format!("`{}`", name) } -- cgit 1.4.1-3-g733a5