mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 f6f8779843
			
		
	
	
		f6f8779843
		
	
	
	
	
		
			
			Currently many diagnostic modifier methods are available on both `Diagnostic` and `DiagnosticBuilder`. This commit removes most of them from `Diagnostic`. To minimize the diff size, it keeps them within `diagnostic.rs` but changes the surrounding `impl Diagnostic` block to `impl DiagnosticBuilder`. (I intend to move things around later, to give a more sensible code layout.) `Diagnostic` keeps a few methods that it still needs, like `sub`, `arg`, and `replace_args`. The `forward!` macro, which defined two additional methods per call (e.g. `note` and `with_note`), is replaced by the `with_fn!` macro, which defines one additional method per call (e.g. `with_note`). It's now also only used when necessary -- not all modifier methods currently need a `with_*` form. (New ones can be easily added as necessary.) All this also requires changing `trait AddToDiagnostic` so its methods take `DiagnosticBuilder` instead of `Diagnostic`, which leads to many mechanical changes. `SubdiagnosticMessageOp` gains a type parameter `G`. There are three subdiagnostics -- `DelayedAtWithoutNewline`, `DelayedAtWithNewline`, and `InvalidFlushedDelayedDiagnosticLevel` -- that are created within the diagnostics machinery and appended to external diagnostics. These are handled at the `Diagnostic` level, which means it's now hard to construct them via `derive(Diagnostic)`, so instead we construct them by hand. This has no effect on what they look like when printed. There are lots of new `allow` markers for `untranslatable_diagnostics` and `diagnostics_outside_of_impl`. This is because `#[rustc_lint_diagnostics]` annotations were present on the `Diagnostic` modifier methods, but missing from the `DiagnosticBuilder` modifier methods. They're now present.
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::path::PathBuf;
 | |
| 
 | |
| use crate::fluent_generated as fluent;
 | |
| use rustc_errors::{DiagCtxt, DiagnosticBuilder, EmissionGuarantee, IntoDiagnostic, Level};
 | |
| use rustc_macros::{Diagnostic, LintDiagnostic};
 | |
| use rustc_span::{Span, Symbol};
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_recursion_limit)]
 | |
| pub struct RecursionLimit {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub shrunk: String,
 | |
|     #[note]
 | |
|     pub def_span: Span,
 | |
|     pub def_path_str: String,
 | |
|     #[note(monomorphize_written_to_path)]
 | |
|     pub was_written: Option<()>,
 | |
|     pub path: PathBuf,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_type_length_limit)]
 | |
| #[help(monomorphize_consider_type_length_limit)]
 | |
| pub struct TypeLengthLimit {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub shrunk: String,
 | |
|     #[note(monomorphize_written_to_path)]
 | |
|     pub was_written: Option<()>,
 | |
|     pub path: PathBuf,
 | |
|     pub type_length: usize,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_no_optimized_mir)]
 | |
| pub struct NoOptimizedMir {
 | |
|     #[note]
 | |
|     pub span: Span,
 | |
|     pub crate_name: Symbol,
 | |
| }
 | |
| 
 | |
| pub struct UnusedGenericParamsHint {
 | |
|     pub span: Span,
 | |
|     pub param_spans: Vec<Span>,
 | |
|     pub param_names: Vec<String>,
 | |
| }
 | |
| 
 | |
| impl<G: EmissionGuarantee> IntoDiagnostic<'_, G> for UnusedGenericParamsHint {
 | |
|     #[track_caller]
 | |
|     fn into_diagnostic(self, dcx: &'_ DiagCtxt, level: Level) -> DiagnosticBuilder<'_, G> {
 | |
|         let mut diag =
 | |
|             DiagnosticBuilder::new(dcx, level, fluent::monomorphize_unused_generic_params);
 | |
|         diag.span(self.span);
 | |
|         for (span, name) in self.param_spans.into_iter().zip(self.param_names) {
 | |
|             // FIXME: I can figure out how to do a label with a fluent string with a fixed message,
 | |
|             // or a label with a dynamic value in a hard-coded string, but I haven't figured out
 | |
|             // how to combine the two. 😢
 | |
|             #[allow(rustc::untranslatable_diagnostic)]
 | |
|             diag.span_label(span, format!("generic parameter `{name}` is unused"));
 | |
|         }
 | |
|         diag
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[derive(LintDiagnostic)]
 | |
| #[diag(monomorphize_large_assignments)]
 | |
| #[note]
 | |
| pub struct LargeAssignmentsLint {
 | |
|     #[label]
 | |
|     pub span: Span,
 | |
|     pub size: u64,
 | |
|     pub limit: u64,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_symbol_already_defined)]
 | |
| pub struct SymbolAlreadyDefined {
 | |
|     #[primary_span]
 | |
|     pub span: Option<Span>,
 | |
|     pub symbol: String,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_couldnt_dump_mono_stats)]
 | |
| pub struct CouldntDumpMonoStats {
 | |
|     pub error: String,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_encountered_error_while_instantiating)]
 | |
| pub struct EncounteredErrorWhileInstantiating {
 | |
|     #[primary_span]
 | |
|     pub span: Span,
 | |
|     pub formatted_item: String,
 | |
| }
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_start_not_found)]
 | |
| #[help]
 | |
| pub struct StartNotFound;
 | |
| 
 | |
| #[derive(Diagnostic)]
 | |
| #[diag(monomorphize_unknown_cgu_collection_mode)]
 | |
| pub struct UnknownCguCollectionMode<'a> {
 | |
|     pub mode: &'a str,
 | |
| }
 |