summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-11-24 19:07:44 -0800
committerbors <bors@rust-lang.org>2013-11-24 19:07:44 -0800
commit09eca11805fd523b569047d0ec257cfbf439a73c (patch)
treef22ef10e7ad84533e25e0374a39424745376bf53 /src/libsyntax
parent861cced1193b13be87c6098cca93264e15cac351 (diff)
parent2431ac3080859e158f2a7379f939c40f27081ea7 (diff)
downloadrust-09eca11805fd523b569047d0ec257cfbf439a73c.tar.gz
rust-09eca11805fd523b569047d0ec257cfbf439a73c.zip
auto merge of #10637 : luqmana/rust/nmt, r=cmr
There's no need for it to be @mut.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/diagnostic.rs53
1 files changed, 30 insertions, 23 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs
index 15b82730629..bb908919678 100644
--- a/src/libsyntax/diagnostic.rs
+++ b/src/libsyntax/diagnostic.rs
@@ -12,6 +12,7 @@ use codemap::{Pos, Span};
 use codemap;
 
 use std::io;
+use std::io::stdio::StdWriter;
 use std::local_data;
 use extra::term;
 
@@ -197,38 +198,44 @@ fn diagnosticcolor(lvl: level) -> term::color::Color {
 }
 
 fn print_maybe_styled(msg: &str, color: term::attr::Attr) {
-    local_data_key!(tls_terminal: @Option<term::Terminal>)
+    local_data_key!(tls_terminal: ~Option<term::Terminal<StdWriter>>)
 
-    let stderr = @mut io::stderr() as @mut io::Writer;
     fn is_stderr_screen() -> bool {
         use std::libc;
         unsafe { libc::isatty(libc::STDERR_FILENO) != 0 }
     }
+    fn write_pretty<T: Writer>(term: &mut term::Terminal<T>, s: &str, c: term::attr::Attr) {
+        term.attr(c);
+        term.write(s.as_bytes());
+        term.reset();
+    }
 
     if is_stderr_screen() {
-        let t = match local_data::get(tls_terminal, |v| v.map(|k| *k)) {
-            None => {
-                let t = term::Terminal::new(stderr);
-                let tls = @match t {
-                    Ok(t) => Some(t),
-                    Err(_) => None
-                };
-                local_data::set(tls_terminal, tls);
-                &*tls
+        local_data::get_mut(tls_terminal, |term| {
+            match term {
+                Some(term) => {
+                    match **term {
+                        Some(ref mut term) => write_pretty(term, msg, color),
+                        None => io::stderr().write(msg.as_bytes())
+                    }
+                }
+                None => {
+                    let t = ~match term::Terminal::new(io::stderr()) {
+                        Ok(mut term) => {
+                            write_pretty(&mut term, msg, color);
+                            Some(term)
+                        }
+                        Err(_) => {
+                            io::stderr().write(msg.as_bytes());
+                            None
+                        }
+                    };
+                    local_data::set(tls_terminal, t);
+                }
             }
-            Some(tls) => &*tls
-        };
-
-        match t {
-            &Some(ref term) => {
-                term.attr(color);
-                write!(stderr, "{}", msg);
-                term.reset();
-            },
-            _ => write!(stderr, "{}", msg)
-        }
+        });
     } else {
-        write!(stderr, "{}", msg);
+        io::stderr().write(msg.as_bytes());
     }
 }