1 use crate::error::{TranslateError, TranslateErrorKind};
2 use crate::fluent_bundle::*;
3 use crate::translation::Translate;
4 use crate::FluentBundle;
5 use rustc_data_structures::sync::Lrc;
6 use rustc_error_messages::fluent_bundle::resolver::errors::{ReferenceKind, ResolverError};
7 use rustc_error_messages::langid;
8 use rustc_error_messages::DiagnosticMessage;
14 impl Translate for Dummy {
15 fn fluent_bundle(&self) -> Option<&Lrc<FluentBundle>> {
19 fn fallback_fluent_bundle(&self) -> &FluentBundle {
24 fn make_dummy(ftl: &'static str) -> Dummy {
25 let resource = FluentResource::try_new(ftl.into()).expect("Failed to parse an FTL string.");
27 let langid_en = langid!("en-US");
29 #[cfg(parallel_compiler)]
30 let mut bundle = FluentBundle::new_concurrent(vec![langid_en]);
32 #[cfg(not(parallel_compiler))]
33 let mut bundle = FluentBundle::new(vec![langid_en]);
35 bundle.add_resource(resource).expect("Failed to add FTL resources to the bundle.");
41 fn wellformed_fluent() {
42 let dummy = make_dummy("mir_build_borrow_of_moved_value = borrow of moved value
43 .label = value moved into `{$name}` here
44 .occurs_because_label = move occurs because `{$name}` has type `{$ty}` which does not implement the `Copy` trait
45 .value_borrowed_label = value borrowed here after move
46 .suggestion = borrow this binding in the pattern to avoid moving the value");
48 let mut args = FluentArgs::new();
49 args.set("name", "Foo");
50 args.set("ty", "std::string::String");
52 let message = DiagnosticMessage::FluentIdentifier(
53 "mir_build_borrow_of_moved_value".into(),
54 Some("suggestion".into()),
58 dummy.translate_message(&message, &args).unwrap(),
59 "borrow this binding in the pattern to avoid moving the value"
64 let message = DiagnosticMessage::FluentIdentifier(
65 "mir_build_borrow_of_moved_value".into(),
66 Some("value_borrowed_label".into()),
70 dummy.translate_message(&message, &args).unwrap(),
71 "value borrowed here after move"
76 let message = DiagnosticMessage::FluentIdentifier(
77 "mir_build_borrow_of_moved_value".into(),
78 Some("occurs_because_label".into()),
82 dummy.translate_message(&message, &args).unwrap(),
83 "move occurs because `\u{2068}Foo\u{2069}` has type `\u{2068}std::string::String\u{2069}` which does not implement the `Copy` trait"
87 let message = DiagnosticMessage::FluentIdentifier(
88 "mir_build_borrow_of_moved_value".into(),
93 dummy.translate_message(&message, &args).unwrap(),
94 "value moved into `\u{2068}Foo\u{2069}` here"
101 fn misformed_fluent() {
102 let dummy = make_dummy("mir_build_borrow_of_moved_value = borrow of moved value
103 .label = value moved into `{name}` here
104 .occurs_because_label = move occurs because `{$oops}` has type `{$ty}` which does not implement the `Copy` trait
105 .suggestion = borrow this binding in the pattern to avoid moving the value");
107 let mut args = FluentArgs::new();
108 args.set("name", "Foo");
109 args.set("ty", "std::string::String");
111 let message = DiagnosticMessage::FluentIdentifier(
112 "mir_build_borrow_of_moved_value".into(),
113 Some("value_borrowed_label".into()),
116 let err = dummy.translate_message(&message, &args).unwrap_err();
120 TranslateError::Two {
121 primary: box TranslateError::One {
122 kind: TranslateErrorKind::PrimaryBundleMissing,
125 fallback: box TranslateError::One {
126 kind: TranslateErrorKind::AttributeMissing { attr: "value_borrowed_label" },
135 "failed while formatting fluent string `mir_build_borrow_of_moved_value`: \nthe attribute `value_borrowed_label` was missing\nhelp: add `.value_borrowed_label = <message>`\n"
140 let message = DiagnosticMessage::FluentIdentifier(
141 "mir_build_borrow_of_moved_value".into(),
142 Some("label".into()),
145 let err = dummy.translate_message(&message, &args).unwrap_err();
146 if let TranslateError::Two {
147 primary: box TranslateError::One { kind: TranslateErrorKind::PrimaryBundleMissing, .. },
148 fallback: box TranslateError::One { kind: TranslateErrorKind::Fluent { errs }, .. },
150 && let [FluentError::ResolverError(ResolverError::Reference(
151 ReferenceKind::Message { id, .. }
152 | ReferenceKind::Variable { id, .. },
160 "failed while formatting fluent string `mir_build_borrow_of_moved_value`: \nargument `name` exists but was not referenced correctly\nhelp: try using `{$name}` instead\n"
165 let message = DiagnosticMessage::FluentIdentifier(
166 "mir_build_borrow_of_moved_value".into(),
167 Some("occurs_because_label".into()),
170 let err = dummy.translate_message(&message, &args).unwrap_err();
171 if let TranslateError::Two {
172 primary: box TranslateError::One { kind: TranslateErrorKind::PrimaryBundleMissing, .. },
173 fallback: box TranslateError::One { kind: TranslateErrorKind::Fluent { errs }, .. },
175 && let [FluentError::ResolverError(ResolverError::Reference(
176 ReferenceKind::Message { id, .. }
177 | ReferenceKind::Variable { id, .. },
185 "failed while formatting fluent string `mir_build_borrow_of_moved_value`: \nthe fluent string has an argument `oops` that was not found.\nhelp: the arguments `name` and `ty` are available\n"