11//! D2 diagram format output for MIR graphs.
22
33extern crate stable_mir;
4- use stable_mir:: mir:: TerminatorKind ;
4+ use stable_mir:: mir:: { Operand , Statement , Terminator , TerminatorKind } ;
55
66use crate :: printer:: SmirJson ;
77use crate :: MonoItemKind ;
@@ -11,24 +11,28 @@ use crate::mk_graph::util::{
1111 escape_d2, is_unqualified, name_lines, short_name, terminator_targets,
1212} ;
1313
14- use crate :: mk_graph:: traverse:: GraphBuilder ;
1514use crate :: mk_graph:: traverse:: render_graph;
15+ use crate :: mk_graph:: traverse:: GraphBuilder ;
1616
1717// =============================================================================
1818// D2 Builder
1919// =============================================================================
2020
21- struct D2Builder {
21+ pub struct D2Builder < ' a > {
22+ ctx : & ' a GraphContext ,
2223 buf : String ,
2324}
2425
25- impl D2Builder {
26- fn new ( ) -> Self {
27- Self { buf : String :: new ( ) }
26+ impl < ' a > D2Builder < ' a > {
27+ pub fn new ( ctx : & ' a GraphContext ) -> Self {
28+ Self {
29+ ctx,
30+ buf : String :: new ( ) ,
31+ }
2832 }
2933}
3034
31- impl GraphBuilder for D2Builder {
35+ impl < ' a > GraphBuilder for D2Builder < ' a > {
3236 type Output = String ;
3337
3438 fn begin_graph ( & mut self , _name : & str ) {
@@ -44,24 +48,28 @@ impl GraphBuilder for D2Builder {
4448 . map ( |s| escape_d2 ( s) )
4549 . collect :: < Vec < _ > > ( )
4650 . join ( "\\ n" ) ;
47- self . buf . push_str ( & format ! ( " label: \" {}\" \n " , legend_text) ) ;
51+ self . buf
52+ . push_str ( & format ! ( " label: \" {}\" \n " , legend_text) ) ;
4853 self . buf . push_str ( "}\n \n " ) ;
4954 }
5055
5156 fn type_legend ( & mut self , _: & [ String ] ) { }
5257
5358 fn begin_function ( & mut self , id : & str , label : & str , _is_local : bool ) {
5459 self . buf . push_str ( & format ! ( "{}: {{\n " , id) ) ;
55- self . buf . push_str ( & format ! ( " label: \" {}\" \n " , escape_d2( label) ) ) ;
60+ self . buf
61+ . push_str ( & format ! ( " label: \" {}\" \n " , escape_d2( label) ) ) ;
5662 self . buf . push_str ( " style.fill: \" #e0e0ff\" \n " ) ;
5763 }
5864
59- fn block ( & mut self , _fn_id : & str , idx : usize , stmts : & [ String ] , terminator : & str ) {
65+ fn block ( & mut self , _fn_id : & str , idx : usize , stmts : & [ Statement ] , terminator : & Terminator ) {
6066 let mut label = format ! ( "bb{}:" , idx) ;
6167 for stmt in stmts {
62- label. push_str ( & format ! ( "\\ n{}" , escape_d2( stmt) ) ) ;
68+ let s = self . ctx . render_stmt ( stmt) ;
69+ label. push_str ( & format ! ( "\\ n{}" , escape_d2( & s) ) ) ;
6370 }
64- label. push_str ( & format ! ( "\\ n---\\ n{}" , escape_d2( terminator) ) ) ;
71+ let term_str = self . ctx . render_terminator ( terminator) ;
72+ label. push_str ( & format ! ( "\\ n---\\ n{}" , escape_d2( & term_str) ) ) ;
6573
6674 self . buf . push_str ( & format ! ( " bb{}: \" {}\" \n " , idx, label) ) ;
6775 }
@@ -70,11 +78,20 @@ impl GraphBuilder for D2Builder {
7078 self . buf . push_str ( & format ! ( " bb{} -> bb{}\n " , from, to) ) ;
7179 }
7280
73- fn call_edge ( & mut self , fn_id : & str , block : usize , callee_id : & str , callee_name : & str ) {
74- self . buf . push_str ( & format ! ( "{}: \" {}\" \n " , callee_id, escape_d2( callee_name) ) ) ;
75- self . buf . push_str ( & format ! ( "{}.style.fill: \" #ffe0e0\" \n " , callee_id) ) ;
76- self . buf . push_str ( & format ! ( "{}.bb{} -> {}: call\n " , fn_id, block, callee_id
77- ) ) ;
81+ fn call_edge (
82+ & mut self ,
83+ fn_id : & str ,
84+ block : usize ,
85+ callee_id : & str ,
86+ callee_name : & str ,
87+ _args : & [ Operand ] ,
88+ ) {
89+ self . buf
90+ . push_str ( & format ! ( "{}: \" {}\" \n " , callee_id, escape_d2( callee_name) ) ) ;
91+ self . buf
92+ . push_str ( & format ! ( "{}.style.fill: \" #ffe0e0\" \n " , callee_id) ) ;
93+ self . buf
94+ . push_str ( & format ! ( "{}.bb{} -> {}: call\n " , fn_id, block, callee_id) ) ;
7895 }
7996
8097 fn end_function ( & mut self , _id : & str ) {
@@ -120,7 +137,8 @@ impl SmirJson<'_> {
120137
121138 /// Convert the MIR to D2 using GraphBuilder traversal (experimental)
122139 pub fn to_d2_file_new ( & self ) -> String {
123- render_graph ( self , D2Builder :: new ( ) )
140+ let ctx = GraphContext :: from_smir ( self ) ;
141+ render_graph ( self , D2Builder :: new ( & ctx) )
124142 }
125143}
126144
0 commit comments