Add -Zgraphviz_dark_mode
Many developers use a dark theme with editors and IDEs, but this typically doesn't extend to graphviz output. When I bring up a MIR graphviz document, the white background is strikingly bright. This new option changes the colors used for graphviz output to work better in dark-themed UIs.
This commit is contained in:
parent
5099914a16
commit
c19b2370e4
@ -599,6 +599,7 @@ pub enum RenderOption {
|
|||||||
NoNodeStyles,
|
NoNodeStyles,
|
||||||
|
|
||||||
Monospace,
|
Monospace,
|
||||||
|
DarkTheme,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns vec holding all the default render options.
|
/// Returns vec holding all the default render options.
|
||||||
@ -630,10 +631,23 @@ pub fn render_opts<'a, N, E, G, W>(g: &'a G, w: &mut W, options: &[RenderOption]
|
|||||||
writeln!(w, "digraph {} {{", g.graph_id().as_slice())?;
|
writeln!(w, "digraph {} {{", g.graph_id().as_slice())?;
|
||||||
|
|
||||||
// Global graph properties
|
// Global graph properties
|
||||||
|
let mut graph_attrs = Vec::new();
|
||||||
|
let mut content_attrs = Vec::new();
|
||||||
if options.contains(&RenderOption::Monospace) {
|
if options.contains(&RenderOption::Monospace) {
|
||||||
writeln!(w, r#" graph[fontname="monospace"];"#)?;
|
let font = r#"fontname="monospace""#;
|
||||||
writeln!(w, r#" node[fontname="monospace"];"#)?;
|
graph_attrs.push(font);
|
||||||
writeln!(w, r#" edge[fontname="monospace"];"#)?;
|
content_attrs.push(font);
|
||||||
|
};
|
||||||
|
if options.contains(&RenderOption::DarkTheme) {
|
||||||
|
graph_attrs.push(r#"bgcolor="black""#);
|
||||||
|
content_attrs.push(r#"color="white""#);
|
||||||
|
content_attrs.push(r#"fontcolor="white""#);
|
||||||
|
}
|
||||||
|
if !(graph_attrs.is_empty() && content_attrs.is_empty()) {
|
||||||
|
writeln!(w, r#" graph[{}];"#, graph_attrs.join(" "))?;
|
||||||
|
let content_attrs_str = content_attrs.join(" ");
|
||||||
|
writeln!(w, r#" node[{}];"#, content_attrs_str)?;
|
||||||
|
writeln!(w, r#" edge[{}];"#, content_attrs_str)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
for n in g.nodes().iter() {
|
for n in g.nodes().iter() {
|
||||||
|
@ -306,7 +306,11 @@ fn write_graphviz_results<A>(
|
|||||||
let mut buf = Vec::new();
|
let mut buf = Vec::new();
|
||||||
|
|
||||||
let graphviz = graphviz::Formatter::new(body, def_id, results, style);
|
let graphviz = graphviz::Formatter::new(body, def_id, results, style);
|
||||||
dot::render_opts(&graphviz, &mut buf, &[dot::RenderOption::Monospace])?;
|
let mut render_opts = vec![dot::RenderOption::Monospace];
|
||||||
|
if tcx.sess.opts.debugging_opts.graphviz_dark_mode {
|
||||||
|
render_opts.push(dot::RenderOption::DarkTheme);
|
||||||
|
}
|
||||||
|
dot::render_opts(&graphviz, &mut buf, &render_opts)?;
|
||||||
|
|
||||||
if let Some(parent) = path.parent() {
|
if let Some(parent) = path.parent() {
|
||||||
fs::create_dir_all(parent)?;
|
fs::create_dir_all(parent)?;
|
||||||
|
@ -55,16 +55,28 @@ pub fn write_mir_fn_graphviz<'tcx, W>(
|
|||||||
writeln!(w, "{} {}Mir_{} {{", kind, cluster, def_name)?;
|
writeln!(w, "{} {}Mir_{} {{", kind, cluster, def_name)?;
|
||||||
|
|
||||||
// Global graph properties
|
// Global graph properties
|
||||||
writeln!(w, r#" graph [fontname="monospace"];"#)?;
|
let font = r#"fontname="monospace""#;
|
||||||
writeln!(w, r#" node [fontname="monospace"];"#)?;
|
let mut graph_attrs = vec![font];
|
||||||
writeln!(w, r#" edge [fontname="monospace"];"#)?;
|
let mut content_attrs = vec![font];
|
||||||
|
|
||||||
|
let dark_mode = tcx.sess.opts.debugging_opts.graphviz_dark_mode;
|
||||||
|
if dark_mode {
|
||||||
|
graph_attrs.push(r#"bgcolor="black""#);
|
||||||
|
content_attrs.push(r#"color="white""#);
|
||||||
|
content_attrs.push(r#"fontcolor="white""#);
|
||||||
|
}
|
||||||
|
|
||||||
|
writeln!(w, r#" graph [{}];"#, graph_attrs.join(" "))?;
|
||||||
|
let content_attrs_str = content_attrs.join(" ");
|
||||||
|
writeln!(w, r#" node [{}];"#, content_attrs_str)?;
|
||||||
|
writeln!(w, r#" edge [{}];"#, content_attrs_str)?;
|
||||||
|
|
||||||
// Graph label
|
// Graph label
|
||||||
write_graph_label(tcx, def_id, body, w)?;
|
write_graph_label(tcx, def_id, body, w)?;
|
||||||
|
|
||||||
// Nodes
|
// Nodes
|
||||||
for (block, _) in body.basic_blocks().iter_enumerated() {
|
for (block, _) in body.basic_blocks().iter_enumerated() {
|
||||||
write_node(def_id, block, body, w)?;
|
write_node(def_id, block, body, dark_mode, w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Edges
|
// Edges
|
||||||
@ -84,6 +96,7 @@ pub fn write_mir_fn_graphviz<'tcx, W>(
|
|||||||
pub fn write_node_label<W: Write, INIT, FINI>(
|
pub fn write_node_label<W: Write, INIT, FINI>(
|
||||||
block: BasicBlock,
|
block: BasicBlock,
|
||||||
body: &Body<'_>,
|
body: &Body<'_>,
|
||||||
|
dark_mode: bool,
|
||||||
w: &mut W,
|
w: &mut W,
|
||||||
num_cols: u32,
|
num_cols: u32,
|
||||||
init: INIT,
|
init: INIT,
|
||||||
@ -100,8 +113,9 @@ pub fn write_node_label<W: Write, INIT, FINI>(
|
|||||||
// Basic block number at the top.
|
// Basic block number at the top.
|
||||||
write!(
|
write!(
|
||||||
w,
|
w,
|
||||||
r#"<tr><td {attrs} colspan="{colspan}">{blk}</td></tr>"#,
|
r#"<tr><td bgcolor="{bgcolor}" {attrs} colspan="{colspan}">{blk}</td></tr>"#,
|
||||||
attrs = r#"bgcolor="gray" align="center""#,
|
bgcolor = if dark_mode { "dimgray" } else { "gray" },
|
||||||
|
attrs = r#"align="center""#,
|
||||||
colspan = num_cols,
|
colspan = num_cols,
|
||||||
blk = block.index()
|
blk = block.index()
|
||||||
)?;
|
)?;
|
||||||
@ -134,11 +148,12 @@ fn write_node<W: Write>(
|
|||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
block: BasicBlock,
|
block: BasicBlock,
|
||||||
body: &Body<'_>,
|
body: &Body<'_>,
|
||||||
|
dark_mode: bool,
|
||||||
w: &mut W,
|
w: &mut W,
|
||||||
) -> io::Result<()> {
|
) -> io::Result<()> {
|
||||||
// Start a new node with the label to follow, in one of DOT's pseudo-HTML tables.
|
// Start a new node with the label to follow, in one of DOT's pseudo-HTML tables.
|
||||||
write!(w, r#" {} [shape="none", label=<"#, node(def_id, block))?;
|
write!(w, r#" {} [shape="none", label=<"#, node(def_id, block))?;
|
||||||
write_node_label(block, body, w, 1, |_| Ok(()), |_| Ok(()))?;
|
write_node_label(block, body, dark_mode, w, 1, |_| Ok(()), |_| Ok(()))?;
|
||||||
// Close the node label and the node itself.
|
// Close the node label and the node itself.
|
||||||
writeln!(w, ">];")
|
writeln!(w, ">];")
|
||||||
}
|
}
|
||||||
|
@ -907,6 +907,8 @@ fn parse_target_feature(slot: &mut String, v: Option<&str>) -> bool {
|
|||||||
"force all crates to be `rustc_private` unstable (default: no)"),
|
"force all crates to be `rustc_private` unstable (default: no)"),
|
||||||
fuel: Option<(String, u64)> = (None, parse_optimization_fuel, [TRACKED],
|
fuel: Option<(String, u64)> = (None, parse_optimization_fuel, [TRACKED],
|
||||||
"set the optimization fuel quota for a crate"),
|
"set the optimization fuel quota for a crate"),
|
||||||
|
graphviz_dark_mode: bool = (false, parse_bool, [UNTRACKED],
|
||||||
|
"use dark-themed colors in graphviz output (default: no)"),
|
||||||
hir_stats: bool = (false, parse_bool, [UNTRACKED],
|
hir_stats: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"print some statistics about AST and HIR (default: no)"),
|
"print some statistics about AST and HIR (default: no)"),
|
||||||
human_readable_cgu_names: bool = (false, parse_bool, [TRACKED],
|
human_readable_cgu_names: bool = (false, parse_bool, [TRACKED],
|
||||||
|
Loading…
Reference in New Issue
Block a user