Skip to content

Commit eb4a80d

Browse files
Fix #3521: Add API to set an initially highlighted entity after navigation.
1 parent 967de58 commit eb4a80d

17 files changed

+116
-55
lines changed

ICSharpCode.Decompiler/Output/ITextOutput.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public interface ITextOutput
4141

4242
void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false, bool isDefinition = false);
4343
void MarkFoldEnd();
44+
45+
void SetInitialHighlight(object reference);
4446
}
4547

4648
public static class TextOutputExtensions

ICSharpCode.Decompiler/Output/PlainTextOutput.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,11 @@ void ITextOutput.MarkFoldStart(string collapsedText, bool defaultCollapsed, bool
150150
void ITextOutput.MarkFoldEnd()
151151
{
152152
}
153+
154+
void ITextOutput.SetInitialHighlight(object reference)
155+
{
156+
throw new NotImplementedException();
157+
}
153158
}
154159

155160
internal class TextOutputWithRollback : ITextOutput
@@ -239,5 +244,10 @@ public void WriteReference(IMember member, string text, bool isDefinition = fals
239244
{
240245
actions.Add(target => target.WriteReference(member, text, isDefinition));
241246
}
247+
248+
public void SetInitialHighlight(object reference)
249+
{
250+
actions.Add(target => target.SetInitialHighlight(reference));
251+
}
242252
}
243253
}

ILSpy/Analyzers/AnalyzerEntityTreeNode.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// DEALINGS IN THE SOFTWARE.
1818

1919
using System.Collections.Generic;
20+
using System.Diagnostics;
2021
using System.Windows;
2122

2223
using ICSharpCode.Decompiler.TypeSystem;
@@ -25,6 +26,8 @@
2526
using ICSharpCode.ILSpyX.TreeView;
2627
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
2728

29+
#nullable enable
30+
2831
namespace ICSharpCode.ILSpy.Analyzers
2932
{
3033
/// <summary>
@@ -34,6 +37,8 @@ public abstract class AnalyzerEntityTreeNode : AnalyzerTreeNode, IMemberTreeNode
3437
{
3538
public abstract IEntity Member { get; }
3639

40+
public IEntity? SourceMember { get; protected set; }
41+
3742
public override void ActivateItem(IPlatformRoutedEventArgs e)
3843
{
3944
e.Handled = true;
@@ -43,10 +48,14 @@ public override void ActivateItem(IPlatformRoutedEventArgs e)
4348
return;
4449
}
4550

46-
MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(this.Member.ParentModule?.MetadataFile, this.Member.MetadataToken)));
51+
var module = this.Member.ParentModule?.MetadataFile;
52+
53+
Debug.Assert(module != null);
54+
55+
MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(module, this.Member.MetadataToken), this.SourceMember));
4756
}
4857

49-
public override object ToolTip => Member?.ParentModule?.MetadataFile?.FileName;
58+
public override object? ToolTip => Member?.ParentModule?.MetadataFile?.FileName;
5059

5160
public override bool HandleAssemblyListChanged(ICollection<LoadedAssembly> removedAssemblies, ICollection<LoadedAssembly> addedAssemblies)
5261
{

ILSpy/Analyzers/AnalyzerSearchTreeNode.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,29 @@ protected IEnumerable<AnalyzerTreeNode> FetchChildren(CancellationToken ct)
7676
}
7777
}
7878

79-
AnalyzerTreeNode SymbolTreeNodeFactory(ISymbol symbol)
79+
AnalyzerTreeNode SymbolTreeNodeFactory(ISymbol resultSymbol)
8080
{
81-
if (symbol == null)
81+
if (resultSymbol == null)
8282
{
83-
throw new ArgumentNullException(nameof(symbol));
83+
throw new ArgumentNullException(nameof(resultSymbol));
8484
}
8585

86-
switch (symbol)
86+
switch (resultSymbol)
8787
{
8888
case IModule module:
89-
return new AnalyzedModuleTreeNode(module) { };
89+
return new AnalyzedModuleTreeNode(module, (IEntity)this.symbol);
9090
case ITypeDefinition td:
91-
return new AnalyzedTypeTreeNode(td) { };
91+
return new AnalyzedTypeTreeNode(td, (IEntity)this.symbol);
9292
case IField fd:
93-
return new AnalyzedFieldTreeNode(fd) { };
93+
return new AnalyzedFieldTreeNode(fd, (IEntity)this.symbol);
9494
case IMethod md:
95-
return new AnalyzedMethodTreeNode(md) { };
95+
return new AnalyzedMethodTreeNode(md, (IEntity)this.symbol);
9696
case IProperty pd:
97-
return new AnalyzedPropertyTreeNode(pd) { };
97+
return new AnalyzedPropertyTreeNode(pd, (IEntity)this.symbol);
9898
case IEvent ed:
99-
return new AnalyzedEventTreeNode(ed) { };
99+
return new AnalyzedEventTreeNode(ed, (IEntity)this.symbol);
100100
default:
101-
throw new ArgumentOutOfRangeException(nameof(symbol), $"Symbol {symbol.GetType().FullName} is not supported.");
101+
throw new ArgumentOutOfRangeException(nameof(resultSymbol), $"Symbol {resultSymbol.GetType().FullName} is not supported.");
102102
}
103103
}
104104

ILSpy/Analyzers/AnalyzerTreeViewModel.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,20 @@ public void Analyze(IEntity entity)
109109
switch (entity)
110110
{
111111
case ITypeDefinition td:
112-
AddOrSelect(new AnalyzedTypeTreeNode(td));
112+
AddOrSelect(new AnalyzedTypeTreeNode(td, null));
113113
break;
114114
case IField fd:
115115
if (!fd.IsConst)
116-
AddOrSelect(new AnalyzedFieldTreeNode(fd));
116+
AddOrSelect(new AnalyzedFieldTreeNode(fd, null));
117117
break;
118118
case IMethod md:
119-
AddOrSelect(new AnalyzedMethodTreeNode(md));
119+
AddOrSelect(new AnalyzedMethodTreeNode(md, null));
120120
break;
121121
case IProperty pd:
122-
AddOrSelect(new AnalyzedPropertyTreeNode(pd));
122+
AddOrSelect(new AnalyzedPropertyTreeNode(pd, null));
123123
break;
124124
case IEvent ed:
125-
AddOrSelect(new AnalyzedEventTreeNode(ed));
125+
AddOrSelect(new AnalyzedEventTreeNode(ed, null));
126126
break;
127127
default:
128128
throw new ArgumentOutOfRangeException(nameof(entity), $@"Entity {entity.GetType().FullName} is not supported.");

ILSpy/Analyzers/TreeNodes/AnalyzedAccessorTreeNode.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class AnalyzedAccessorTreeNode : AnalyzedMethodTreeNode
2424
{
2525
readonly string name;
2626

27-
public AnalyzedAccessorTreeNode(IMethod analyzedMethod, string name)
28-
: base(analyzedMethod)
27+
public AnalyzedAccessorTreeNode(IMethod analyzedMethod, IEntity source, string name)
28+
: base(analyzedMethod, source)
2929
{
3030
if (string.IsNullOrWhiteSpace(name))
3131
{

ILSpy/Analyzers/TreeNodes/AnalyzedEventTreeNode.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,21 @@
2121
using ICSharpCode.Decompiler.TypeSystem;
2222
using ICSharpCode.ILSpy.TreeNodes;
2323

24+
#nullable enable
25+
2426
namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
2527
{
2628
internal sealed class AnalyzedEventTreeNode : AnalyzerEntityTreeNode
2729
{
2830
readonly IEvent analyzedEvent;
2931
readonly string prefix;
3032

31-
public AnalyzedEventTreeNode(IEvent analyzedEvent, string prefix = "")
33+
public AnalyzedEventTreeNode(IEvent analyzedEvent, IEntity? source, string prefix = "")
3234
{
3335
this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent));
3436
this.prefix = prefix;
3537
this.LazyLoading = true;
38+
this.SourceMember = source;
3639
}
3740

3841
public override IEntity Member => analyzedEvent;
@@ -45,11 +48,11 @@ public AnalyzedEventTreeNode(IEvent analyzedEvent, string prefix = "")
4548
protected override void LoadChildren()
4649
{
4750
if (analyzedEvent.CanAdd)
48-
this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.AddAccessor, "add"));
51+
this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.AddAccessor, this.SourceMember, "add"));
4952
if (analyzedEvent.CanRemove)
50-
this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.RemoveAccessor, "remove"));
53+
this.Children.Add(new AnalyzedAccessorTreeNode(analyzedEvent.RemoveAccessor, this.SourceMember, "remove"));
5154
if (TryFindBackingField(analyzedEvent, out var backingField))
52-
this.Children.Add(new AnalyzedFieldTreeNode(backingField));
55+
this.Children.Add(new AnalyzedFieldTreeNode(backingField, this.SourceMember));
5356

5457
foreach (var lazy in Analyzers)
5558
{

ILSpy/Analyzers/TreeNodes/AnalyzedFieldTreeNode.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,18 @@
2121
using ICSharpCode.Decompiler.TypeSystem;
2222
using ICSharpCode.ILSpy.TreeNodes;
2323

24+
#nullable enable
25+
2426
namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
2527
{
2628
class AnalyzedFieldTreeNode : AnalyzerEntityTreeNode
2729
{
2830
readonly IField analyzedField;
2931

30-
public AnalyzedFieldTreeNode(IField analyzedField)
32+
public AnalyzedFieldTreeNode(IField analyzedField, IEntity? source)
3133
{
3234
this.analyzedField = analyzedField ?? throw new ArgumentNullException(nameof(analyzedField));
35+
this.SourceMember = source;
3336
this.LazyLoading = true;
3437
}
3538

ILSpy/Analyzers/TreeNodes/AnalyzedMethodTreeNode.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,19 @@
2121
using ICSharpCode.Decompiler.TypeSystem;
2222
using ICSharpCode.ILSpy.TreeNodes;
2323

24+
#nullable enable
25+
2426
namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
2527
{
2628
internal class AnalyzedMethodTreeNode : AnalyzerEntityTreeNode
2729
{
2830
readonly IMethod analyzedMethod;
2931
readonly string prefix;
3032

31-
public AnalyzedMethodTreeNode(IMethod analyzedMethod, string prefix = "")
33+
public AnalyzedMethodTreeNode(IMethod analyzedMethod, IEntity? source, string prefix = "")
3234
{
3335
this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod));
36+
this.SourceMember = source;
3437
this.prefix = prefix;
3538
this.LazyLoading = true;
3639
}

ILSpy/Analyzers/TreeNodes/AnalyzedModuleTreeNode.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,18 @@
2525
using ICSharpCode.ILSpyX.TreeView;
2626
using ICSharpCode.ILSpyX.TreeView.PlatformAbstractions;
2727

28+
#nullable enable
29+
2830
namespace ICSharpCode.ILSpy.Analyzers.TreeNodes
2931
{
3032
internal class AnalyzedModuleTreeNode : AnalyzerEntityTreeNode
3133
{
3234
readonly IModule analyzedModule;
3335

34-
public AnalyzedModuleTreeNode(IModule analyzedModule)
36+
public AnalyzedModuleTreeNode(IModule analyzedModule, IEntity? source)
3537
{
3638
this.analyzedModule = analyzedModule ?? throw new ArgumentNullException(nameof(analyzedModule));
39+
this.SourceMember = source;
3740
this.LazyLoading = true;
3841
}
3942

0 commit comments

Comments
 (0)