Browse Source

Fix JumpToReference and GetTooltip

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
4961b33d2a
  1. 31
      ILSpy/TextView/DecompilerTextView.cs
  2. 12
      ILSpy/TreeNodes/AssemblyListTreeNode.cs
  3. 14
      ILSpy/TreeNodes/AssemblyTreeNode.cs

31
ILSpy/TextView/DecompilerTextView.cs

@ -211,8 +211,9 @@ namespace ICSharpCode.ILSpy.TextView
XmlDocRenderer renderer = new XmlDocRenderer(); XmlDocRenderer renderer = new XmlDocRenderer();
renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(entity)); renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(entity));
try { try {
//var docProvider = entity.Module.DocumentationResolver.GetProvider(); // TODO implement proper API if (entity.ParentAssembly == null || entity.ParentAssembly.PEFile == null)
var docProvider = XmlDocLoader.LoadDocumentation(((MetadataAssembly)entity.ParentAssembly).PEFile); return null;
var docProvider = XmlDocLoader.LoadDocumentation(entity.ParentAssembly.PEFile);
if (docProvider != null) { if (docProvider != null) {
string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(entity)); string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(entity));
if (documentation != null) { if (documentation != null) {
@ -224,6 +225,32 @@ namespace ICSharpCode.ILSpy.TextView
// ignore // ignore
} }
return renderer.CreateTextBlock(); return renderer.CreateTextBlock();
} else if (segment.Reference is ValueTuple<PEFile, System.Reflection.Metadata.EntityHandle> unresolvedEntity) {
var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver());
IEntity resolved;
if (unresolvedEntity.Item2.Kind.IsTypeKind())
resolved = typeSystem.ResolveAsType(unresolvedEntity.Item2).GetDefinition();
else
resolved = typeSystem.ResolveAsMember(unresolvedEntity.Item2);
if (resolved == null)
return null;
XmlDocRenderer renderer = new XmlDocRenderer();
renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(resolved));
try {
if (resolved.ParentAssembly == null || resolved.ParentAssembly.PEFile == null)
return null;
var docProvider = XmlDocLoader.LoadDocumentation(resolved.ParentAssembly.PEFile);
if (docProvider != null) {
string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(resolved));
if (documentation != null) {
renderer.AppendText(Environment.NewLine);
renderer.AddXmlDocumentation(documentation);
}
}
} catch (XmlException) {
// ignore
}
return renderer.CreateTextBlock();
} }
return null; return null;
} }

12
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -214,6 +214,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary> /// </summary>
public TypeTreeNode FindTypeNode(ITypeDefinition def) public TypeTreeNode FindTypeNode(ITypeDefinition def)
{ {
if (def == null)
return null;
var declaringType = def.DeclaringTypeDefinition; var declaringType = def.DeclaringTypeDefinition;
if (declaringType != null) { if (declaringType != null) {
TypeTreeNode decl = FindTypeNode(declaringType); TypeTreeNode decl = FindTypeNode(declaringType);
@ -245,25 +247,25 @@ namespace ICSharpCode.ILSpy.TreeNodes
parentNode.EnsureLazyChildren(); parentNode.EnsureLazyChildren();
switch (def.AccessorOwner) { switch (def.AccessorOwner) {
case IProperty p: case IProperty p:
parentNode = parentNode.Children.OfType<PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition.Equals(p)); parentNode = parentNode.Children.OfType<PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition.MetadataToken == p.MetadataToken && !m.IsHidden);
if (parentNode == null) if (parentNode == null)
return null; return null;
parentNode.EnsureLazyChildren(); parentNode.EnsureLazyChildren();
methodNode = parentNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.Equals(def)); methodNode = parentNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
if (methodNode == null || methodNode.IsHidden) if (methodNode == null || methodNode.IsHidden)
return parentNode; return parentNode;
return methodNode; return methodNode;
case IEvent e: case IEvent e:
parentNode = parentNode.Children.OfType<EventTreeNode>().FirstOrDefault(m => m.EventDefinition.Equals(e)); parentNode = parentNode.Children.OfType<EventTreeNode>().FirstOrDefault(m => m.EventDefinition.MetadataToken == e.MetadataToken && !m.IsHidden);
if (parentNode == null) if (parentNode == null)
return null; return null;
parentNode.EnsureLazyChildren(); parentNode.EnsureLazyChildren();
methodNode = parentNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.Equals(def)); methodNode = parentNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
if (methodNode == null || methodNode.IsHidden) if (methodNode == null || methodNode.IsHidden)
return parentNode; return parentNode;
return methodNode; return methodNode;
default: default:
methodNode = typeNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.Equals(def) && !m.IsHidden); methodNode = typeNode.Children.OfType<MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
if (methodNode != null) if (methodNode != null)
return methodNode; return methodNode;
return null; return null;

14
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -30,7 +30,7 @@ using ICSharpCode.ILSpy.TextView;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using Microsoft.Win32; using Microsoft.Win32;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem.Implementation; using TypeDefinitionHandle = System.Reflection.Metadata.TypeDefinitionHandle;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -41,7 +41,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public sealed class AssemblyTreeNode : ILSpyTreeNode public sealed class AssemblyTreeNode : ILSpyTreeNode
{ {
readonly Dictionary<string, NamespaceTreeNode> namespaces = new Dictionary<string, NamespaceTreeNode>(); readonly Dictionary<string, NamespaceTreeNode> namespaces = new Dictionary<string, NamespaceTreeNode>();
readonly Dictionary<ITypeDefinition, TypeTreeNode> typeDict = new Dictionary<ITypeDefinition, TypeTreeNode>(); readonly Dictionary<TypeDefinitionHandle, TypeTreeNode> typeDict = new Dictionary<TypeDefinitionHandle, TypeTreeNode>();
ICompilation typeSystem; ICompilation typeSystem;
public AssemblyTreeNode(LoadedAssembly assembly) public AssemblyTreeNode(LoadedAssembly assembly)
@ -145,13 +145,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
foreach (NamespaceTreeNode ns in namespaces.Values) { foreach (NamespaceTreeNode ns in namespaces.Values) {
ns.Children.Clear(); ns.Children.Clear();
} }
foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.FullName, NaturalStringComparer.Instance)) { foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance)) {
if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns)) { if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns)) {
ns = new NamespaceTreeNode(type.Namespace); ns = new NamespaceTreeNode(type.Namespace);
namespaces[type.Namespace] = ns; namespaces[type.Namespace] = ns;
} }
TypeTreeNode node = new TypeTreeNode(type, this); TypeTreeNode node = new TypeTreeNode(type, this);
typeDict[type] = node; typeDict[(TypeDefinitionHandle)type.MetadataToken] = node;
ns.Children.Add(node); ns.Children.Add(node);
} }
foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name, NaturalStringComparer.Instance)) { foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name, NaturalStringComparer.Instance)) {
@ -165,13 +165,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// <summary> /// <summary>
/// Finds the node for a top-level type. /// Finds the node for a top-level type.
/// </summary> /// </summary>
public TypeTreeNode FindTypeNode(ITypeDefinition def) public TypeTreeNode FindTypeNode(ITypeDefinition type)
{ {
if (def == null) if (type == null)
return null; return null;
EnsureLazyChildren(); EnsureLazyChildren();
TypeTreeNode node; TypeTreeNode node;
if (typeDict.TryGetValue(def, out node)) if (typeDict.TryGetValue((TypeDefinitionHandle)type.MetadataToken, out node))
return node; return node;
else else
return null; return null;

Loading…
Cancel
Save