|
1 | 1 | use crate::snippet::Style;
|
2 | 2 | use crate::{DiagnosticArg, DiagnosticMessage, FluentBundle};
|
3 | 3 | use rustc_data_structures::sync::Lrc;
|
4 |
| -use rustc_error_messages::FluentArgs; |
| 4 | +use rustc_error_messages::{ |
| 5 | + fluent_bundle::resolver::errors::{ReferenceKind, ResolverError}, |
| 6 | + FluentArgs, FluentError, |
| 7 | +}; |
5 | 8 | use std::borrow::Cow;
|
6 | 9 |
|
7 | 10 | /// Convert diagnostic arguments (a rustc internal type that exists to implement
|
@@ -102,14 +105,31 @@ pub trait Translate {
|
102 | 105 | .or_else(|| translate_with_bundle(self.fallback_fluent_bundle()))
|
103 | 106 | .map(|(translated, errs)| {
|
104 | 107 | // Always bail out for errors with the fallback bundle.
|
105 |
| - assert!( |
106 |
| - errs.is_empty(), |
107 |
| - "identifier: {:?}, attr: {:?}, args: {:?}, errors: {:?}", |
108 |
| - identifier, |
109 |
| - attr, |
110 |
| - args, |
111 |
| - errs |
112 |
| - ); |
| 108 | + |
| 109 | + let mut help_messages = vec![]; |
| 110 | + |
| 111 | + if !errs.is_empty() { |
| 112 | + for error in &errs { |
| 113 | + match error { |
| 114 | + FluentError::ResolverError(ResolverError::Reference( |
| 115 | + ReferenceKind::Message { id, .. }, |
| 116 | + )) if args.iter().any(|(arg_id, _)| arg_id == id) => { |
| 117 | + help_messages.push(format!("Argument `{id}` exists but was not referenced correctly. Try using `{{${id}}}` instead")); |
| 118 | + } |
| 119 | + _ => {} |
| 120 | + } |
| 121 | + } |
| 122 | + |
| 123 | + panic!( |
| 124 | + "Encountered errors while formatting message for `{identifier}`\n\ |
| 125 | + help: {}\n\ |
| 126 | + attr: `{attr:?}`\n\ |
| 127 | + args: `{args:?}`\n\ |
| 128 | + errors: `{errs:?}`", |
| 129 | + help_messages.join("\nhelp: ") |
| 130 | + ); |
| 131 | + } |
| 132 | + |
113 | 133 | translated
|
114 | 134 | })
|
115 | 135 | .expect("failed to find message in primary or fallback fluent bundles")
|
|
0 commit comments