Bug 1519175 - Allow creating PrintTree instances with other sinks. r=kvark
authorKartikaya Gupta <kgupta@mozilla.com>
Thu, 10 Jan 2019 22:47:37 +0000
changeset 510465 5641b0f246e9d113528cf2b8813e2f716d4830e0
parent 510464 585a078ac5b3ffa4d19fbe5eddecfbb4fefa3ea7
child 510466 d14dcd460210d5a5ac2e457e94417793743ebbdc
push id10547
push userffxbld-merge
push dateMon, 21 Jan 2019 13:03:58 +0000
treeherdermozilla-beta@24ec1916bffe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskvark
bugs1519175
milestone66.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1519175 - Allow creating PrintTree instances with other sinks. r=kvark This will let us print trees to files instead of stdout. Differential Revision: https://phabricator.services.mozilla.com/D16228
gfx/wr/webrender/src/print_tree.rs
--- a/gfx/wr/webrender/src/print_tree.rs
+++ b/gfx/wr/webrender/src/print_tree.rs
@@ -1,63 +1,84 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+use std::io::{stdout, Stdout, Write};
+
 /// A struct that makes it easier to print out a pretty tree of data, which
 /// can be visually scanned more easily.
-pub struct PrintTree {
+pub struct PrintTree<W>
+where
+    W: Write
+{
     /// The current level of recursion.
     level: u32,
 
     /// An item which is queued up, so that we can determine if we need
     /// a mid-tree prefix or a branch ending prefix.
     queued_item: Option<String>,
+
+    /// The sink to print to.
+    sink: W,
 }
 
 /// A trait that makes it easy to describe a pretty tree of data,
 /// regardless of the printing destination, to either print it
 /// directly to stdout, or serialize it as in the debugger
 pub trait PrintTreePrinter {
     fn new_level(&mut self, title: String);
     fn end_level(&mut self);
     fn add_item(&mut self, text: String);
 }
 
-impl PrintTree {
-    pub fn new(title: &str) -> PrintTree {
-        println!("\u{250c} {}", title);
+impl PrintTree<Stdout> {
+    pub fn new(title: &str) -> Self {
+        PrintTree::new_with_sink(title, stdout())
+    }
+}
+
+impl<W> PrintTree<W>
+where
+    W: Write
+{
+    pub fn new_with_sink(title: &str, mut sink: W) -> Self {
+        writeln!(sink, "\u{250c} {}", title).unwrap();
         PrintTree {
             level: 1,
             queued_item: None,
+            sink,
         }
     }
 
-    fn print_level_prefix(&self) {
+    fn print_level_prefix(&mut self) {
         for _ in 0 .. self.level {
-            print!("\u{2502}  ");
+            write!(self.sink, "\u{2502}  ").unwrap();
         }
     }
 
     fn flush_queued_item(&mut self, prefix: &str) {
         if let Some(queued_item) = self.queued_item.take() {
             self.print_level_prefix();
-            println!("{} {}", prefix, queued_item);
+            writeln!(self.sink, "{} {}", prefix, queued_item).unwrap();
         }
     }
 }
 
 // The default `println!` based printer
-impl PrintTreePrinter for PrintTree {
+impl<W> PrintTreePrinter for PrintTree<W>
+where
+    W: Write
+{
     /// Descend one level in the tree with the given title.
     fn new_level(&mut self, title: String) {
         self.flush_queued_item("\u{251C}\u{2500}");
 
         self.print_level_prefix();
-        println!("\u{251C}\u{2500} {}", title);
+        writeln!(self.sink, "\u{251C}\u{2500} {}", title).unwrap();
 
         self.level = self.level + 1;
     }
 
     /// Ascend one level in the tree.
     fn end_level(&mut self) {
         self.flush_queued_item("\u{2514}\u{2500}");
         self.level = self.level - 1;
@@ -65,13 +86,16 @@ impl PrintTreePrinter for PrintTree {
 
     /// Add an item to the current level in the tree.
     fn add_item(&mut self, text: String) {
         self.flush_queued_item("\u{251C}\u{2500}");
         self.queued_item = Some(text);
     }
 }
 
-impl Drop for PrintTree {
+impl<W> Drop for PrintTree<W>
+where
+    W: Write
+{
     fn drop(&mut self) {
         self.flush_queued_item("\u{9492}\u{9472}");
     }
 }