Handle diagnostics customization on the fluent side

This commit is contained in:
Oli Scherer 2023-01-17 08:21:34 +00:00
parent 1a6ab6c16a
commit 64e5f9129f
7 changed files with 24 additions and 17 deletions

View File

@ -368,18 +368,6 @@ fn check_opaque_type_parameter_valid(
for (i, arg) in opaque_type_key.substs.iter().enumerate() { for (i, arg) in opaque_type_key.substs.iter().enumerate() {
let arg_is_param = match arg.unpack() { let arg_is_param = match arg.unpack() {
GenericArgKind::Type(ty) => matches!(ty.kind(), ty::Param(_)), 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) => { GenericArgKind::Lifetime(lt) => {
matches!(*lt, ty::ReEarlyBound(_) | ty::ReFree(_)) matches!(*lt, ty::ReEarlyBound(_) | ty::ReFree(_))
} }

View File

@ -123,4 +123,7 @@ borrowck_cannot_move_when_borrowed =
borrowck_opaque_type_non_generic_param = borrowck_opaque_type_non_generic_param =
expected generic {$kind} parameter, found `{$ty}` 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
}

View File

@ -182,6 +182,9 @@ pub fn fluent_bundle(
trace!(?locale); trace!(?locale);
let mut bundle = new_bundle(vec![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 // 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 // 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 // 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)) 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 /// Type alias for the result of `fallback_fluent_bundle` - a reference-counted pointer to a lazily
/// evaluated fluent bundle. /// evaluated fluent bundle.
pub type LazyFallbackBundle = Lrc<Lazy<FluentBundle, impl FnOnce() -> FluentBundle>>; pub type LazyFallbackBundle = Lrc<Lazy<FluentBundle, impl FnOnce() -> FluentBundle>>;
@ -256,6 +268,9 @@ pub fn fallback_fluent_bundle(
) -> LazyFallbackBundle { ) -> LazyFallbackBundle {
Lrc::new(Lazy::new(move || { Lrc::new(Lazy::new(move || {
let mut fallback_bundle = new_bundle(vec![langid!("en-US")]); let mut fallback_bundle = new_bundle(vec![langid!("en-US")]);
register_functions(&mut fallback_bundle);
// See comment in `fluent_bundle`. // See comment in `fluent_bundle`.
fallback_bundle.set_use_isolating(with_directionality_markers); fallback_bundle.set_use_isolating(with_directionality_markers);

View File

@ -8,7 +8,7 @@ type X<'a> = impl Into<&'static str> + From<&'a str>;
fn f<'a: 'static>(t: &'a str) -> X<'a> { fn f<'a: 'static>(t: &'a str) -> X<'a> {
//~^ WARNING unnecessary lifetime parameter //~^ WARNING unnecessary lifetime parameter
t t
//~^ ERROR non-defining opaque type use //~^ ERROR expected generic lifetime parameter, found `'static`
} }
fn extend_lt<'a>(o: &'a str) -> &'static str { fn extend_lt<'a>(o: &'a str) -> &'static str {

View File

@ -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` = 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 --> $DIR/bounds-are-checked.rs:10:5
| |
LL | type X<'a> = impl Into<&'static str> + From<&'a str>; 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 error: aborting due to previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0792`.

View File

@ -19,7 +19,7 @@ fn concrete_ty() -> OneTy<u32> {
fn concrete_lifetime() -> OneLifetime<'static> { fn concrete_lifetime() -> OneLifetime<'static> {
6u32 6u32
//~^ ERROR non-defining opaque type use in defining scope //~^ ERROR expected generic lifetime parameter, found `'static`
} }
fn concrete_const() -> OneConst<{ 123 }> { fn concrete_const() -> OneConst<{ 123 }> {

View File

@ -7,7 +7,7 @@ LL | type OneTy<T> = impl Debug;
LL | 5u32 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 --> $DIR/generic_nondefining_use.rs:21:5
| |
LL | type OneLifetime<'a> = impl Debug; LL | type OneLifetime<'a> = impl Debug;