@@ -325,10 +325,14 @@ pub enum SymbolNavigationKind {
325
325
Extab ,
326
326
}
327
327
328
+ #[ derive( Debug , Clone , Default , Eq , PartialEq ) ]
328
329
pub enum HoverItemColor {
329
- Normal , // Gray
330
+ #[ default]
331
+ Normal , // Gray
330
332
Emphasized , // White
331
333
Special , // Blue
334
+ Delete , // Red
335
+ Insert , // Green
332
336
}
333
337
334
338
pub enum HoverItem {
@@ -355,7 +359,12 @@ pub fn symbol_context(obj: &Object, symbol_index: usize) -> Vec<ContextItem> {
355
359
out
356
360
}
357
361
358
- pub fn symbol_hover ( obj : & Object , symbol_index : usize , addend : i64 ) -> Vec < HoverItem > {
362
+ pub fn symbol_hover (
363
+ obj : & Object ,
364
+ symbol_index : usize ,
365
+ addend : i64 ,
366
+ override_color : Option < HoverItemColor > ,
367
+ ) -> Vec < HoverItem > {
359
368
let symbol = & obj. symbols [ symbol_index] ;
360
369
let addend_str = match addend. cmp ( & 0i64 ) {
361
370
Ordering :: Greater => format ! ( "+{:x}" , addend) ,
@@ -366,51 +375,51 @@ pub fn symbol_hover(obj: &Object, symbol_index: usize, addend: i64) -> Vec<Hover
366
375
out. push ( HoverItem :: Text {
367
376
label : "Name" . into ( ) ,
368
377
value : format ! ( "{}{}" , symbol. name, addend_str) ,
369
- color : HoverItemColor :: Normal ,
378
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
370
379
} ) ;
371
380
if let Some ( demangled_name) = & symbol. demangled_name {
372
381
out. push ( HoverItem :: Text {
373
382
label : "Demangled" . into ( ) ,
374
383
value : demangled_name. into ( ) ,
375
- color : HoverItemColor :: Normal ,
384
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
376
385
} ) ;
377
386
}
378
387
if let Some ( section) = symbol. section {
379
388
out. push ( HoverItem :: Text {
380
389
label : "Section" . into ( ) ,
381
390
value : obj. sections [ section] . name . clone ( ) ,
382
- color : HoverItemColor :: Normal ,
391
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
383
392
} ) ;
384
393
out. push ( HoverItem :: Text {
385
394
label : "Address" . into ( ) ,
386
395
value : format ! ( "{:x}{}" , symbol. address, addend_str) ,
387
- color : HoverItemColor :: Normal ,
396
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
388
397
} ) ;
389
398
if symbol. flags . contains ( SymbolFlag :: SizeInferred ) {
390
399
out. push ( HoverItem :: Text {
391
400
label : "Size" . into ( ) ,
392
401
value : format ! ( "{:x} (inferred)" , symbol. size) ,
393
- color : HoverItemColor :: Normal ,
402
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
394
403
} ) ;
395
404
} else {
396
405
out. push ( HoverItem :: Text {
397
406
label : "Size" . into ( ) ,
398
407
value : format ! ( "{:x}" , symbol. size) ,
399
- color : HoverItemColor :: Normal ,
408
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
400
409
} ) ;
401
410
}
402
411
if let Some ( align) = symbol. align {
403
412
out. push ( HoverItem :: Text {
404
413
label : "Alignment" . into ( ) ,
405
414
value : align. get ( ) . to_string ( ) ,
406
- color : HoverItemColor :: Normal ,
415
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
407
416
} ) ;
408
417
}
409
418
if let Some ( address) = symbol. virtual_address {
410
419
out. push ( HoverItem :: Text {
411
420
label : "Virtual address" . into ( ) ,
412
421
value : format ! ( "{:x}" , address) ,
413
- color : HoverItemColor :: Special ,
422
+ color : override_color . clone ( ) . unwrap_or ( HoverItemColor :: Special ) ,
414
423
} ) ;
415
424
}
416
425
} else {
@@ -443,22 +452,31 @@ pub fn relocation_context(
443
452
out
444
453
}
445
454
446
- pub fn relocation_hover ( obj : & Object , reloc : ResolvedRelocation ) -> Vec < HoverItem > {
455
+ pub fn relocation_hover (
456
+ obj : & Object ,
457
+ reloc : ResolvedRelocation ,
458
+ override_color : Option < HoverItemColor > ,
459
+ ) -> Vec < HoverItem > {
447
460
let mut out = Vec :: new ( ) ;
448
461
if let Some ( name) = obj. arch . reloc_name ( reloc. relocation . flags ) {
449
462
out. push ( HoverItem :: Text {
450
463
label : "Relocation" . into ( ) ,
451
464
value : name. to_string ( ) ,
452
- color : HoverItemColor :: Normal ,
465
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
453
466
} ) ;
454
467
} else {
455
468
out. push ( HoverItem :: Text {
456
469
label : "Relocation" . into ( ) ,
457
470
value : format ! ( "<{:?}>" , reloc. relocation. flags) ,
458
- color : HoverItemColor :: Normal ,
471
+ color : override_color . clone ( ) . unwrap_or_default ( ) ,
459
472
} ) ;
460
473
}
461
- out. append ( & mut symbol_hover ( obj, reloc. relocation . target_symbol , reloc. relocation . addend ) ) ;
474
+ out. append ( & mut symbol_hover (
475
+ obj,
476
+ reloc. relocation . target_symbol ,
477
+ reloc. relocation . addend ,
478
+ override_color,
479
+ ) ) ;
462
480
out
463
481
}
464
482
@@ -545,7 +563,7 @@ pub fn instruction_hover(
545
563
}
546
564
if let Some ( reloc) = resolved. relocation {
547
565
out. push ( HoverItem :: Separator ) ;
548
- out. append ( & mut relocation_hover ( obj, reloc) ) ;
566
+ out. append ( & mut relocation_hover ( obj, reloc, None ) ) ;
549
567
if let Some ( ty) = obj. arch . guess_data_type ( resolved) {
550
568
let literals = display_ins_data_literals ( obj, resolved) ;
551
569
if !literals. is_empty ( ) {
0 commit comments