Handle diagnostics customization on the fluent side
This commit is contained in:
parent
1a6ab6c16a
commit
64e5f9129f
@ -368,18 +368,6 @@ fn check_opaque_type_parameter_valid(
|
||||
for (i, arg) in opaque_type_key.substs.iter().enumerate() {
|
||||
let arg_is_param = match arg.unpack() {
|
||||
GenericArgKind::Type(ty) => matches!(ty.kind(), ty::Param(_)),
|
||||
GenericArgKind::Lifetime(lt) if lt.is_static() => {
|
||||
tcx.sess
|
||||
.struct_span_err(span, "non-defining opaque type use in defining scope")
|
||||
.span_label(
|
||||
tcx.def_span(opaque_generics.param_at(i, tcx).def_id),
|
||||
"cannot use static lifetime; use a bound lifetime \
|
||||
instead or remove the lifetime parameter from the \
|
||||
opaque type",
|
||||
)
|
||||
.emit();
|
||||
return false;
|
||||
}
|
||||
GenericArgKind::Lifetime(lt) => {
|
||||
matches!(*lt, ty::ReEarlyBound(_) | ty::ReFree(_))
|
||||
}
|
||||
|
@ -123,4 +123,7 @@ borrowck_cannot_move_when_borrowed =
|
||||
|
||||
borrowck_opaque_type_non_generic_param =
|
||||
expected generic {$kind} parameter, found `{$ty}`
|
||||
.label = this generic parameter must be used with a generic {$kind} parameter
|
||||
.label = {STREQ($ty, "'static") ->
|
||||
[true] cannot use static lifetime; use a bound lifetime instead or remove the lifetime parameter from the opaque type
|
||||
*[other] this generic parameter must be used with a generic {$kind} parameter
|
||||
}
|
||||
|
@ -182,6 +182,9 @@ pub fn fluent_bundle(
|
||||
trace!(?locale);
|
||||
let mut bundle = new_bundle(vec![locale]);
|
||||
|
||||
// Add convenience functions available to ftl authors.
|
||||
register_functions(&mut bundle);
|
||||
|
||||
// Fluent diagnostics can insert directionality isolation markers around interpolated variables
|
||||
// indicating that there may be a shift from right-to-left to left-to-right text (or
|
||||
// vice-versa). These are disabled because they are sometimes visible in the error output, but
|
||||
@ -244,6 +247,15 @@ pub fn fluent_bundle(
|
||||
Ok(Some(bundle))
|
||||
}
|
||||
|
||||
fn register_functions(bundle: &mut FluentBundle) {
|
||||
bundle
|
||||
.add_function("STREQ", |positional, _named| match positional {
|
||||
[FluentValue::String(a), FluentValue::String(b)] => format!("{}", (a == b)).into(),
|
||||
_ => FluentValue::Error,
|
||||
})
|
||||
.expect("Failed to add a function to the bundle.");
|
||||
}
|
||||
|
||||
/// Type alias for the result of `fallback_fluent_bundle` - a reference-counted pointer to a lazily
|
||||
/// evaluated fluent bundle.
|
||||
pub type LazyFallbackBundle = Lrc<Lazy<FluentBundle, impl FnOnce() -> FluentBundle>>;
|
||||
@ -256,6 +268,9 @@ pub fn fallback_fluent_bundle(
|
||||
) -> LazyFallbackBundle {
|
||||
Lrc::new(Lazy::new(move || {
|
||||
let mut fallback_bundle = new_bundle(vec![langid!("en-US")]);
|
||||
|
||||
register_functions(&mut fallback_bundle);
|
||||
|
||||
// See comment in `fluent_bundle`.
|
||||
fallback_bundle.set_use_isolating(with_directionality_markers);
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
fn f<'a: 'static>(t: &'a str) -> X<'a> {
|
||||
//~^ WARNING unnecessary lifetime parameter
|
||||
t
|
||||
//~^ ERROR non-defining opaque type use
|
||||
//~^ ERROR expected generic lifetime parameter, found `'static`
|
||||
}
|
||||
|
||||
fn extend_lt<'a>(o: &'a str) -> &'static str {
|
||||
|
@ -6,7 +6,7 @@ LL | fn f<'a: 'static>(t: &'a str) -> X<'a> {
|
||||
|
|
||||
= help: you can use the `'static` lifetime directly, in place of `'a`
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
error[E0792]: expected generic lifetime parameter, found `'static`
|
||||
--> $DIR/bounds-are-checked.rs:10:5
|
||||
|
|
||||
LL | type X<'a> = impl Into<&'static str> + From<&'a str>;
|
||||
@ -17,3 +17,4 @@ LL | t
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0792`.
|
||||
|
@ -19,7 +19,7 @@ fn concrete_ty() -> OneTy<u32> {
|
||||
|
||||
fn concrete_lifetime() -> OneLifetime<'static> {
|
||||
6u32
|
||||
//~^ ERROR non-defining opaque type use in defining scope
|
||||
//~^ ERROR expected generic lifetime parameter, found `'static`
|
||||
}
|
||||
|
||||
fn concrete_const() -> OneConst<{ 123 }> {
|
||||
|
@ -7,7 +7,7 @@ LL | type OneTy<T> = impl Debug;
|
||||
LL | 5u32
|
||||
| ^^^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
error[E0792]: expected generic lifetime parameter, found `'static`
|
||||
--> $DIR/generic_nondefining_use.rs:21:5
|
||||
|
|
||||
LL | type OneLifetime<'a> = impl Debug;
|
||||
|
Loading…
Reference in New Issue
Block a user