@@ -25,10 +25,11 @@ use exports::objdiff::core::{
25
25
GuestObjectDiff , Object , ObjectBorrow , ObjectDiff , ObjectDiffBorrow ,
26
26
} ,
27
27
display:: {
28
- ContextMenuItem , DiffText , DiffTextColor , DiffTextOpcode , DiffTextSegment , DiffTextSymbol ,
29
- DisplayConfig , Guest as GuestDisplay , HoverItem , InstructionDiffKind , InstructionDiffRow ,
30
- SectionDisplay , SectionDisplaySymbol , SymbolDisplay , SymbolFilter , SymbolFlags , SymbolKind ,
31
- SymbolRef ,
28
+ ContextItem , ContextItemCopy , ContextItemNavigate , DiffText , DiffTextColor , DiffTextOpcode ,
29
+ DiffTextSegment , DiffTextSymbol , DisplayConfig , Guest as GuestDisplay , HoverItem ,
30
+ HoverItemColor , HoverItemText , InstructionDiffKind , InstructionDiffRow , SectionDisplay ,
31
+ SectionDisplaySymbol , SymbolDisplay , SymbolFilter , SymbolFlags , SymbolKind ,
32
+ SymbolNavigationKind , SymbolRef ,
32
33
} ,
33
34
} ;
34
35
@@ -86,10 +87,6 @@ impl GuestDiff for Component {
86
87
}
87
88
88
89
impl GuestDisplay for Component {
89
- fn symbol_context ( _obj : ObjectBorrow , _symbol : SymbolRef ) -> Vec < ContextMenuItem > { todo ! ( ) }
90
-
91
- fn symbol_hover ( _obj : ObjectBorrow , _symbol : SymbolRef ) -> Vec < HoverItem > { todo ! ( ) }
92
-
93
90
fn display_sections (
94
91
diff : ObjectDiffBorrow ,
95
92
filter : SymbolFilter ,
@@ -202,6 +199,102 @@ impl GuestDisplay for Component {
202
199
. unwrap ( ) ;
203
200
InstructionDiffRow { segments, diff_kind : InstructionDiffKind :: from ( row. kind ) }
204
201
}
202
+
203
+ fn symbol_context (
204
+ diff : ObjectDiffBorrow ,
205
+ symbol_display : SectionDisplaySymbol ,
206
+ ) -> Vec < ContextItem > {
207
+ let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
208
+ let obj = obj_diff. 0 . as_ref ( ) ;
209
+ diff:: display:: symbol_context ( obj, symbol_display. symbol as usize )
210
+ . into_iter ( )
211
+ . map ( |item| ContextItem :: from ( item) )
212
+ . collect ( )
213
+ }
214
+
215
+ fn symbol_hover (
216
+ diff : ObjectDiffBorrow ,
217
+ symbol_display : SectionDisplaySymbol ,
218
+ ) -> Vec < HoverItem > {
219
+ let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
220
+ let obj = obj_diff. 0 . as_ref ( ) ;
221
+ diff:: display:: symbol_hover ( obj, symbol_display. symbol as usize , 0 /* TODO */ )
222
+ . into_iter ( )
223
+ . map ( |item| HoverItem :: from ( item) )
224
+ . collect ( )
225
+ }
226
+
227
+ fn instruction_context (
228
+ diff : ObjectDiffBorrow ,
229
+ symbol_display : SectionDisplaySymbol ,
230
+ row_index : u32 ,
231
+ diff_config : DiffConfigBorrow ,
232
+ ) -> Result < Vec < ContextItem > , String > {
233
+ let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
234
+ let obj = obj_diff. 0 . as_ref ( ) ;
235
+ let obj_diff = & obj_diff. 1 ;
236
+ let symbol_idx = symbol_display. symbol as usize ;
237
+ let symbol_diff = if symbol_display. is_mapping_symbol {
238
+ obj_diff
239
+ . mapping_symbols
240
+ . iter ( )
241
+ . find ( |s| s. symbol_index == symbol_idx)
242
+ . map ( |s| & s. symbol_diff )
243
+ . unwrap ( )
244
+ } else {
245
+ & obj_diff. symbols [ symbol_idx]
246
+ } ;
247
+ let row = & symbol_diff. instruction_rows [ row_index as usize ] ;
248
+ let Some ( ins_ref) = row. ins_ref else {
249
+ return Ok ( Vec :: new ( ) ) ;
250
+ } ;
251
+ let diff_config = diff_config. get :: < ResourceDiffConfig > ( ) . 0 . borrow ( ) ;
252
+ let Some ( resolved) = obj. resolve_instruction_ref ( symbol_idx, ins_ref) else {
253
+ return Err ( "Failed to resolve instruction" . into ( ) ) ;
254
+ } ;
255
+ let ins =
256
+ obj. arch . process_instruction ( resolved, & diff_config) . map_err ( |e| e. to_string ( ) ) ?;
257
+ Ok ( diff:: display:: instruction_context ( obj, resolved, & ins)
258
+ . into_iter ( )
259
+ . map ( |item| ContextItem :: from ( item) )
260
+ . collect ( ) )
261
+ }
262
+
263
+ fn instruction_hover (
264
+ diff : ObjectDiffBorrow ,
265
+ symbol_display : SectionDisplaySymbol ,
266
+ row_index : u32 ,
267
+ diff_config : DiffConfigBorrow ,
268
+ ) -> Result < Vec < HoverItem > , String > {
269
+ let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
270
+ let obj = obj_diff. 0 . as_ref ( ) ;
271
+ let obj_diff = & obj_diff. 1 ;
272
+ let symbol_idx = symbol_display. symbol as usize ;
273
+ let symbol_diff = if symbol_display. is_mapping_symbol {
274
+ obj_diff
275
+ . mapping_symbols
276
+ . iter ( )
277
+ . find ( |s| s. symbol_index == symbol_idx)
278
+ . map ( |s| & s. symbol_diff )
279
+ . unwrap ( )
280
+ } else {
281
+ & obj_diff. symbols [ symbol_idx]
282
+ } ;
283
+ let row = & symbol_diff. instruction_rows [ row_index as usize ] ;
284
+ let Some ( ins_ref) = row. ins_ref else {
285
+ return Ok ( Vec :: new ( ) ) ;
286
+ } ;
287
+ let diff_config = diff_config. get :: < ResourceDiffConfig > ( ) . 0 . borrow ( ) ;
288
+ let Some ( resolved) = obj. resolve_instruction_ref ( symbol_idx, ins_ref) else {
289
+ return Err ( "Failed to resolve instruction" . into ( ) ) ;
290
+ } ;
291
+ let ins =
292
+ obj. arch . process_instruction ( resolved, & diff_config) . map_err ( |e| e. to_string ( ) ) ?;
293
+ Ok ( diff:: display:: instruction_hover ( obj, resolved, & ins)
294
+ . into_iter ( )
295
+ . map ( |item| HoverItem :: from ( item) )
296
+ . collect ( ) )
297
+ }
205
298
}
206
299
207
300
impl From < obj:: SymbolKind > for SymbolKind {
@@ -342,4 +435,52 @@ impl GuestObjectDiff for ResourceObjectDiff {
342
435
}
343
436
}
344
437
438
+ impl From < diff:: display:: HoverItem > for HoverItem {
439
+ fn from ( item : diff:: display:: HoverItem ) -> Self {
440
+ match item {
441
+ diff:: display:: HoverItem :: Text { label, value, color } => {
442
+ HoverItem :: Text ( HoverItemText { label, value, color : HoverItemColor :: from ( color) } )
443
+ }
444
+ diff:: display:: HoverItem :: Separator => HoverItem :: Separator ,
445
+ }
446
+ }
447
+ }
448
+
449
+ impl From < diff:: display:: HoverItemColor > for HoverItemColor {
450
+ fn from ( color : diff:: display:: HoverItemColor ) -> Self {
451
+ match color {
452
+ diff:: display:: HoverItemColor :: Normal => HoverItemColor :: Normal ,
453
+ diff:: display:: HoverItemColor :: Emphasized => HoverItemColor :: Emphasized ,
454
+ diff:: display:: HoverItemColor :: Special => HoverItemColor :: Special ,
455
+ }
456
+ }
457
+ }
458
+
459
+ impl From < diff:: display:: ContextItem > for ContextItem {
460
+ fn from ( item : diff:: display:: ContextItem ) -> Self {
461
+ match item {
462
+ diff:: display:: ContextItem :: Copy { value, label } => {
463
+ ContextItem :: Copy ( ContextItemCopy { value, label } )
464
+ }
465
+ diff:: display:: ContextItem :: Navigate { label, symbol_index, kind } => {
466
+ ContextItem :: Navigate ( ContextItemNavigate {
467
+ label,
468
+ symbol : symbol_index as SymbolRef ,
469
+ kind : SymbolNavigationKind :: from ( kind) ,
470
+ } )
471
+ }
472
+ diff:: display:: ContextItem :: Separator => ContextItem :: Separator ,
473
+ }
474
+ }
475
+ }
476
+
477
+ impl From < diff:: display:: SymbolNavigationKind > for SymbolNavigationKind {
478
+ fn from ( kind : diff:: display:: SymbolNavigationKind ) -> Self {
479
+ match kind {
480
+ diff:: display:: SymbolNavigationKind :: Normal => SymbolNavigationKind :: Normal ,
481
+ diff:: display:: SymbolNavigationKind :: Extab => SymbolNavigationKind :: Extab ,
482
+ }
483
+ }
484
+ }
485
+
345
486
export ! ( Component ) ;
0 commit comments