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 @@ -211,8 +211,9 @@ namespace ICSharpCode.ILSpy.TextView
XmlDocRenderer renderer = new XmlDocRenderer();
renderer.AppendText(MainWindow.Instance.CurrentLanguage.GetTooltip(entity));
try {
//var docProvider = entity.Module.DocumentationResolver.GetProvider(); // TODO implement proper API
var docProvider = XmlDocLoader.LoadDocumentation(((MetadataAssembly)entity.ParentAssembly).PEFile);
if (entity.ParentAssembly == null || entity.ParentAssembly.PEFile == null)
return null;
var docProvider = XmlDocLoader.LoadDocumentation(entity.ParentAssembly.PEFile);
if (docProvider != null) {
string documentation = docProvider.GetDocumentation(XmlDocKeyProvider.GetKey(entity));
if (documentation != null) {
@ -224,6 +225,32 @@ namespace ICSharpCode.ILSpy.TextView @@ -224,6 +225,32 @@ namespace ICSharpCode.ILSpy.TextView
// ignore
}
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;
}

12
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -214,6 +214,8 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -214,6 +214,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary>
public TypeTreeNode FindTypeNode(ITypeDefinition def)
{
if (def == null)
return null;
var declaringType = def.DeclaringTypeDefinition;
if (declaringType != null) {
TypeTreeNode decl = FindTypeNode(declaringType);
@ -245,25 +247,25 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -245,25 +247,25 @@ namespace ICSharpCode.ILSpy.TreeNodes
parentNode.EnsureLazyChildren();
switch (def.AccessorOwner) {
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)
return null;
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)
return parentNode;
return methodNode;
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)
return null;
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)
return parentNode;
return methodNode;
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)
return methodNode;
return null;

14
ILSpy/TreeNodes/AssemblyTreeNode.cs

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

Loading…
Cancel
Save