mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 5d9dfbd08f
			
		
	
	
		5d9dfbd08f
		
	
	
	
	
		
			
			Error codes are integers, but `String` is used everywhere to represent them. Gross! This commit introduces `ErrCode`, an integral newtype for error codes, replacing `String`. It also introduces a constant for every error code, e.g. `E0123`, and removes the `error_code!` macro. The constants are imported wherever used with `use rustc_errors::codes::*`. With the old code, we have three different ways to specify an error code at a use point: ``` error_code!(E0123) // macro call struct_span_code_err!(dcx, span, E0123, "msg"); // bare ident arg to macro call \#[diag(name, code = "E0123")] // string struct Diag; ``` With the new code, they all use the `E0123` constant. ``` E0123 // constant struct_span_code_err!(dcx, span, E0123, "msg"); // constant \#[diag(name, code = E0123)] // constant struct Diag; ``` The commit also changes the structure of the error code definitions: - `rustc_error_codes` now just defines a higher-order macro listing the used error codes and nothing else. - Because that's now the only thing in the `rustc_error_codes` crate, I moved it into the `lib.rs` file and removed the `error_codes.rs` file. - `rustc_errors` uses that macro to define everything, e.g. the error code constants and the `DIAGNOSTIC_TABLES`. This is in its new `codes.rs` file.
		
			
				
	
	
		
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::fluent_generated as fluent;
 | |
| use rustc_errors::{
 | |
|     codes::*, AddToDiagnostic, Applicability, DiagCtxt, Diagnostic, DiagnosticBuilder,
 | |
|     EmissionGuarantee, IntoDiagnostic, Level, SubdiagnosticMessage,
 | |
| };
 | |
| use rustc_macros::Diagnostic;
 | |
| use rustc_middle::ty::{self, ClosureKind, PolyTraitRef, Ty};
 | |
| use rustc_span::{Span, Symbol};
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_dump_vtable_entries)]
 | |
| pub struct DumpVTableEntries<'a> {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub trait_ref: PolyTraitRef<'a>,
 | |
|     pub entries: String,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_unable_to_construct_constant_value)]
 | |
| pub struct UnableToConstructConstantValue<'a> {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub unevaluated: ty::UnevaluatedConst<'a>,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_empty_on_clause_in_rustc_on_unimplemented, code = E0232)]
 | |
| pub struct EmptyOnClauseInOnUnimplemented {
 | |
|     #[primary_span]
 | |
|     #[label]
 | |
|     pub span: Span,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_invalid_on_clause_in_rustc_on_unimplemented, code = E0232)]
 | |
| pub struct InvalidOnClauseInOnUnimplemented {
 | |
|     #[primary_span]
 | |
|     #[label]
 | |
|     pub span: Span,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_no_value_in_rustc_on_unimplemented, code = E0232)]
 | |
| #[note]
 | |
| pub struct NoValueInOnUnimplemented {
 | |
|     #[primary_span]
 | |
|     #[label]
 | |
|     pub span: Span,
 | |
| }
 | |
| 
 | |
| pub struct NegativePositiveConflict<'tcx> {
 | |
|     pub impl_span: Span,
 | |
|     pub trait_desc: ty::TraitRef<'tcx>,
 | |
|     pub self_ty: Option<Ty<'tcx>>,
 | |
|     pub negative_impl_span: Result<Span, Symbol>,
 | |
|     pub positive_impl_span: Result<Span, Symbol>,
 | |
| }
 | |
| 
 | |
| impl<G: EmissionGuarantee> IntoDiagnostic<'_, G> for NegativePositiveConflict<'_> {
 | |
|     #[track_caller]
 | |
|     fn into_diagnostic(self, dcx: &DiagCtxt, level: Level) -> DiagnosticBuilder<'_, G> {
 | |
|         let mut diag =
 | |
|             DiagnosticBuilder::new(dcx, level, fluent::trait_selection_negative_positive_conflict);
 | |
|         diag.arg("trait_desc", self.trait_desc.print_only_trait_path().to_string());
 | |
|         diag.arg("self_desc", self.self_ty.map_or_else(|| "none".to_string(), |ty| ty.to_string()));
 | |
|         diag.span(self.impl_span);
 | |
|         diag.code(E0751);
 | |
|         match self.negative_impl_span {
 | |
|             Ok(span) => {
 | |
|                 diag.span_label(span, fluent::trait_selection_negative_implementation_here);
 | |
|             }
 | |
|             Err(cname) => {
 | |
|                 diag.note(fluent::trait_selection_negative_implementation_in_crate);
 | |
|                 diag.arg("negative_impl_cname", cname.to_string());
 | |
|             }
 | |
|         }
 | |
|         match self.positive_impl_span {
 | |
|             Ok(span) => {
 | |
|                 diag.span_label(span, fluent::trait_selection_positive_implementation_here);
 | |
|             }
 | |
|             Err(cname) => {
 | |
|                 diag.note(fluent::trait_selection_positive_implementation_in_crate);
 | |
|                 diag.arg("positive_impl_cname", cname.to_string());
 | |
|             }
 | |
|         }
 | |
|         diag
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_inherent_projection_normalization_overflow)]
 | |
| pub struct InherentProjectionNormalizationOverflow {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub ty: String,
 | |
| }
 | |
| 
 | |
| pub enum AdjustSignatureBorrow {
 | |
|     Borrow { to_borrow: Vec<(Span, String)> },
 | |
|     RemoveBorrow { remove_borrow: Vec<(Span, String)> },
 | |
| }
 | |
| 
 | |
| impl AddToDiagnostic for AdjustSignatureBorrow {
 | |
|     fn add_to_diagnostic_with<F>(self, diag: &mut Diagnostic, _: F)
 | |
|     where
 | |
|         F: Fn(&mut Diagnostic, SubdiagnosticMessage) -> SubdiagnosticMessage,
 | |
|     {
 | |
|         match self {
 | |
|             AdjustSignatureBorrow::Borrow { to_borrow } => {
 | |
|                 diag.arg("len", to_borrow.len());
 | |
|                 diag.multipart_suggestion_verbose(
 | |
|                     fluent::trait_selection_adjust_signature_borrow,
 | |
|                     to_borrow,
 | |
|                     Applicability::MaybeIncorrect,
 | |
|                 );
 | |
|             }
 | |
|             AdjustSignatureBorrow::RemoveBorrow { remove_borrow } => {
 | |
|                 diag.arg("len", remove_borrow.len());
 | |
|                 diag.multipart_suggestion_verbose(
 | |
|                     fluent::trait_selection_adjust_signature_remove_borrow,
 | |
|                     remove_borrow,
 | |
|                     Applicability::MaybeIncorrect,
 | |
|                 );
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(trait_selection_closure_kind_mismatch, code = E0525)]
 | |
| pub struct ClosureKindMismatch {
 | |
|     #[primary_span]
 | |
|     #[label]
 | |
|     pub closure_span: Span,
 | |
|     pub expected: ClosureKind,
 | |
|     pub found: ClosureKind,
 | |
|     #[label(trait_selection_closure_kind_requirement)]
 | |
|     pub cause_span: Span,
 | |
| 
 | |
|     #[subdiagnostic]
 | |
|     pub fn_once_label: Option<ClosureFnOnceLabel>,
 | |
| 
 | |
|     #[subdiagnostic]
 | |
|     pub fn_mut_label: Option<ClosureFnMutLabel>,
 | |
| }
 | |
| 
 | |
| #[derive(Subdiagnostic)]
 | |
| #[label(trait_selection_closure_fn_once_label)]
 | |
| pub struct ClosureFnOnceLabel {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub place: String,
 | |
| }
 | |
| 
 | |
| #[derive(Subdiagnostic)]
 | |
| #[label(trait_selection_closure_fn_mut_label)]
 | |
| pub struct ClosureFnMutLabel {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub place: String,
 | |
| }
 |