@@ -12,6 +12,7 @@ use thiserror::Error;
1212use crate :: arena:: Handle ;
1313
1414use super :: Filter ;
15+ use super :: ImplicationFilter ;
1516use super :: NoFilter ;
1617
1718#[ derive( Clone , Debug , Default , Deserialize , Eq , PartialEq , Serialize ) ]
@@ -41,9 +42,10 @@ impl StackGraph {
4142 }
4243
4344 pub fn from_graph_filter < ' a > ( graph : & crate :: graph:: StackGraph , filter : & ' a dyn Filter ) -> Self {
44- let files = graph. filter_files ( filter) ;
45- let nodes = graph. filter_nodes ( filter) ;
46- let edges = graph. filter_edges ( filter) ;
45+ let filter = ImplicationFilter ( filter) ;
46+ let files = graph. filter_files ( & filter) ;
47+ let nodes = graph. filter_nodes ( & filter) ;
48+ let edges = graph. filter_edges ( & filter) ;
4749 Self {
4850 files,
4951 nodes,
@@ -146,7 +148,7 @@ impl StackGraph {
146148
147149 // load debug-info of each node
148150 if let Some ( debug_info) = node. debug_info ( ) {
149- * graph. debug_info_mut ( handle) = debug_info. data . iter ( ) . fold (
151+ * graph. node_debug_info_mut ( handle) = debug_info. data . iter ( ) . fold (
150152 crate :: graph:: DebugInfo :: default ( ) ,
151153 |mut info, entry| {
152154 let key = graph. add_string ( & entry. key ) ;
@@ -167,6 +169,7 @@ impl StackGraph {
167169 source,
168170 sink,
169171 precedence,
172+ debug_info,
170173 } in & self . edges . data
171174 {
172175 let source_id = source. to_node_id ( graph) ?;
@@ -180,6 +183,19 @@ impl StackGraph {
180183 . ok_or ( Error :: InvalidGlobalNodeID ( sink. local_id ) ) ?;
181184
182185 graph. add_edge ( source_handle, sink_handle, * precedence) ;
186+
187+ // load debug-info of each node
188+ if let Some ( debug_info) = debug_info {
189+ * graph. edge_debug_info_mut ( source_handle, sink_handle) = debug_info
190+ . data
191+ . iter ( )
192+ . fold ( crate :: graph:: DebugInfo :: default ( ) , |mut info, entry| {
193+ let key = graph. add_string ( & entry. key ) ;
194+ let value = graph. add_string ( & entry. value ) ;
195+ info. add ( key, value) ;
196+ info
197+ } ) ;
198+ }
183199 }
184200 Ok ( ( ) )
185201 }
@@ -392,6 +408,8 @@ pub struct Edge {
392408 pub source : NodeID ,
393409 pub sink : NodeID ,
394410 pub precedence : i32 ,
411+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
412+ pub debug_info : Option < DebugInfo > ,
395413}
396414
397415impl crate :: graph:: StackGraph {
@@ -430,12 +448,12 @@ impl crate::graph::StackGraph {
430448 } )
431449 }
432450
433- fn filter_debug_info < ' a > (
451+ fn filter_node_debug_info < ' a > (
434452 & self ,
435453 _filter : & ' a dyn Filter ,
436454 handle : Handle < crate :: graph:: Node > ,
437455 ) -> Option < DebugInfo > {
438- self . debug_info ( handle) . map ( |info| DebugInfo {
456+ self . node_debug_info ( handle) . map ( |info| DebugInfo {
439457 data : info
440458 . iter ( )
441459 . map ( |entry| DebugEntry {
@@ -455,7 +473,7 @@ impl crate::graph::StackGraph {
455473 let node = & self [ handle] ;
456474 let id = self . filter_node ( filter, node. id ( ) ) ;
457475 let source_info = self . filter_source_info ( filter, handle) ;
458- let debug_info = self . filter_debug_info ( filter, handle) ;
476+ let debug_info = self . filter_node_debug_info ( filter, handle) ;
459477
460478 match node {
461479 crate :: graph:: Node :: DropScopes ( _node) => Node :: DropScopes {
@@ -525,10 +543,29 @@ impl crate::graph::StackGraph {
525543 source : self . filter_node ( filter, self [ e. source ] . id ( ) ) ,
526544 sink : self . filter_node ( filter, self [ e. sink ] . id ( ) ) ,
527545 precedence : e. precedence ,
546+ debug_info : self . filter_edge_debug_info ( filter, e. source , e. sink ) ,
528547 } )
529548 } )
530549 . flatten ( )
531550 . collect :: < Vec < _ > > ( ) ,
532551 }
533552 }
553+
554+ fn filter_edge_debug_info < ' a > (
555+ & self ,
556+ _filter : & ' a dyn Filter ,
557+ source_handle : Handle < crate :: graph:: Node > ,
558+ sink_handle : Handle < crate :: graph:: Node > ,
559+ ) -> Option < DebugInfo > {
560+ self . edge_debug_info ( source_handle, sink_handle)
561+ . map ( |info| DebugInfo {
562+ data : info
563+ . iter ( )
564+ . map ( |entry| DebugEntry {
565+ key : self [ entry. key ] . to_owned ( ) ,
566+ value : self [ entry. value ] . to_owned ( ) ,
567+ } )
568+ . collect ( ) ,
569+ } )
570+ }
534571}
0 commit comments