]> git.proxmox.com Git - rustc.git/blobdiff - vendor/syn/tests/test_round_trip.rs
New upstream version 1.63.0+dfsg1
[rustc.git] / vendor / syn / tests / test_round_trip.rs
index b9202371e913500c0f36b71ba1b42d5d044e97a1..c7e6e488fecf845dfe5d9325de57df6cee2a422a 100644 (file)
@@ -5,6 +5,8 @@
 #![allow(clippy::manual_assert)]
 
 extern crate rustc_ast;
+extern crate rustc_data_structures;
+extern crate rustc_error_messages;
 extern crate rustc_errors;
 extern crate rustc_expand;
 extern crate rustc_parse as parse;
@@ -19,7 +21,8 @@ use rustc_ast::ast::{
     WhereClause,
 };
 use rustc_ast::mut_visit::{self, MutVisitor};
-use rustc_errors::PResult;
+use rustc_error_messages::{DiagnosticMessage, FluentArgs, LazyFallbackBundle};
+use rustc_errors::{Diagnostic, PResult};
 use rustc_session::parse::ParseSess;
 use rustc_span::source_map::FilePathMapping;
 use rustc_span::FileName;
@@ -94,18 +97,11 @@ fn test(path: &Path, failed: &AtomicUsize, abort_after: usize) {
             let before = match librustc_parse(content, &sess) {
                 Ok(before) => before,
                 Err(diagnostic) => {
-                    if diagnostic
-                        .message()
-                        .starts_with("file not found for module")
-                    {
-                        errorf!("=== {}: ignore\n", path.display());
-                    } else {
-                        errorf!(
-                            "=== {}: ignore - librustc failed to parse original content: {}\n",
-                            path.display(),
-                            diagnostic.message(),
-                        );
-                    }
+                    errorf!(
+                        "=== {}: ignore - librustc failed to parse original content: {}\n",
+                        path.display(),
+                        translate_message(&diagnostic),
+                    );
                     diagnostic.cancel();
                     return Err(true);
                 }
@@ -162,6 +158,42 @@ fn librustc_parse(content: String, sess: &ParseSess) -> PResult<Crate> {
     parse::parse_crate_from_source_str(name, content, sess)
 }
 
+fn translate_message(diagnostic: &Diagnostic) -> String {
+    thread_local! {
+        static FLUENT_BUNDLE: LazyFallbackBundle = {
+            let resources = rustc_error_messages::DEFAULT_LOCALE_RESOURCES;
+            let with_directionality_markers = false;
+            rustc_error_messages::fallback_fluent_bundle(resources, with_directionality_markers)
+        };
+    }
+
+    let message = &diagnostic.message[0].0;
+    let args = diagnostic.args().iter().cloned().collect::<FluentArgs>();
+
+    let (identifier, attr) = match message {
+        DiagnosticMessage::Str(msg) => return msg.clone(),
+        DiagnosticMessage::FluentIdentifier(identifier, attr) => (identifier, attr),
+    };
+
+    FLUENT_BUNDLE.with(|fluent_bundle| {
+        let message = fluent_bundle
+            .get_message(identifier)
+            .expect("missing diagnostic in fluent bundle");
+        let value = match attr {
+            Some(attr) => message
+                .get_attribute(attr)
+                .expect("missing attribute in fluent message")
+                .value(),
+            None => message.value().expect("missing value in fluent message"),
+        };
+
+        let mut err = Vec::new();
+        let translated = fluent_bundle.format_pattern(value, Some(&args), &mut err);
+        assert!(err.is_empty());
+        translated.into_owned()
+    })
+}
+
 fn normalize(krate: &mut Crate) {
     struct NormalizeVisitor;