12 changed files with 1125 additions and 10 deletions
@ -0,0 +1,15 @@ |
|||||||
|
<gui:OptionPanel x:Class="ICSharpCode.SharpDevelop.Gui.OptionPanels.SharpDevelopUIOptions" |
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||||
|
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui" |
||||||
|
xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets" |
||||||
|
xmlns:local="clr-namespace:ICSharpCode.SharpDevelop.Gui.OptionPanels" |
||||||
|
xmlns:core="http://icsharpcode.net/sharpdevelop/core"> |
||||||
|
<GroupBox Header="{core:Localize Dialog.Options.IDEOptions.SharpDevelop.GeneralUI.GroupBoxHeader}"> |
||||||
|
<widgets:StackPanelWithSpacing SpaceBetweenItems="5"> |
||||||
|
<CheckBox x:Name="ExpandReferencesCheckBox" |
||||||
|
Content="{core:Localize Dialog.Options.IDEOptions.SharpDevelop.GeneralUI.ExpandReferences}" |
||||||
|
IsChecked="{core:OptionBinding local:SharpDevelopUIOptions.ExpandReferences}"/> |
||||||
|
</widgets:StackPanelWithSpacing> |
||||||
|
</GroupBox> |
||||||
|
</gui:OptionPanel> |
||||||
@ -0,0 +1,21 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
using System; |
||||||
|
using System.Windows.Controls; |
||||||
|
using ICSharpCode.Core; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels |
||||||
|
{ |
||||||
|
public partial class SharpDevelopUIOptions : OptionPanel |
||||||
|
{ |
||||||
|
public SharpDevelopUIOptions() |
||||||
|
{ |
||||||
|
InitializeComponent(); |
||||||
|
} |
||||||
|
|
||||||
|
public static bool ExpandReferences { |
||||||
|
get { return PropertyService.Get("ExpandReferences", false); } |
||||||
|
set { PropertyService.Set("ExpandReferences", value); } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,163 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
using System; |
||||||
|
using Mono.Cecil; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Project.InnerExpand |
||||||
|
{ |
||||||
|
public abstract class MemberNode : AbstractProjectBrowserTreeNode |
||||||
|
{ |
||||||
|
protected readonly MemberReference member; |
||||||
|
protected readonly TypeDefinition type; |
||||||
|
|
||||||
|
public MemberNode(string name, MemberReference member, TypeDefinition type) |
||||||
|
{ |
||||||
|
this.member = member; |
||||||
|
this.type = type; |
||||||
|
Text = name; |
||||||
|
} |
||||||
|
|
||||||
|
public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data) |
||||||
|
{ |
||||||
|
return visitor.Visit(this, data); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#region Field nodes
|
||||||
|
public class PublicFieldNode : MemberNode |
||||||
|
{ |
||||||
|
public PublicFieldNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Field"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalFieldNode : MemberNode |
||||||
|
{ |
||||||
|
public InternalFieldNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InteralField"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedFieldNode : MemberNode |
||||||
|
{ |
||||||
|
public ProtectedFieldNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedField"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateFieldNode : MemberNode |
||||||
|
{ |
||||||
|
public PrivateFieldNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateField"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties nodes
|
||||||
|
public class PublicPropertyNode : MemberNode |
||||||
|
{ |
||||||
|
public PublicPropertyNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Property"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalPropertyNode : MemberNode |
||||||
|
{ |
||||||
|
public InternalPropertyNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InteralProperty"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedPropertyNode : MemberNode |
||||||
|
{ |
||||||
|
public ProtectedPropertyNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedProperty"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivatePropertyNode : MemberNode |
||||||
|
{ |
||||||
|
public PrivatePropertyNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateProperty"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Method nodes
|
||||||
|
|
||||||
|
public class PublicMethodNode : MemberNode |
||||||
|
{ |
||||||
|
public PublicMethodNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Method"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalMethodNode : MemberNode |
||||||
|
{ |
||||||
|
public InternalMethodNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalMethod"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedMethodNode : MemberNode |
||||||
|
{ |
||||||
|
public ProtectedMethodNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedMethod"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateMethodNode : MemberNode |
||||||
|
{ |
||||||
|
public PrivateMethodNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateMethod"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Event node
|
||||||
|
public class PublicEventNode : MemberNode |
||||||
|
{ |
||||||
|
public PublicEventNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Event"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalEventNode : MemberNode |
||||||
|
{ |
||||||
|
public InternalEventNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalEvent"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedEventNode : MemberNode |
||||||
|
{ |
||||||
|
public ProtectedEventNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedEvent"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateEventNode : MemberNode |
||||||
|
{ |
||||||
|
public PrivateEventNode(string name, MemberReference member, TypeDefinition type) : base(name, member, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateEvent"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
} |
||||||
@ -0,0 +1,101 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Forms; |
||||||
|
|
||||||
|
using ICSharpCode.Core; |
||||||
|
using Mono.Cecil; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Project.InnerExpand |
||||||
|
{ |
||||||
|
public class NamespaceNode : CustomFolderNode |
||||||
|
{ |
||||||
|
readonly List<TypeDefinition> types; |
||||||
|
|
||||||
|
public NamespaceNode(string name, List<TypeDefinition> types) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.NameSpace"); |
||||||
|
Text = name; |
||||||
|
this.types = types; |
||||||
|
|
||||||
|
this.PerformInitialization(); |
||||||
|
} |
||||||
|
|
||||||
|
public void RefreshNodes(bool forceRefresh = false) |
||||||
|
{ |
||||||
|
if (Nodes.Count > 0 && !forceRefresh) |
||||||
|
return; |
||||||
|
|
||||||
|
Nodes.Clear(); |
||||||
|
|
||||||
|
foreach (var type in types) { |
||||||
|
TypeNode node = null; |
||||||
|
string name = type.Name; |
||||||
|
|
||||||
|
if (type.IsValueType) { |
||||||
|
if (type.IsPublic) { |
||||||
|
node = new PublicStructNode(name, type); |
||||||
|
} else { |
||||||
|
node = new PrivateStructNode(name, type); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (type.IsEnum) { |
||||||
|
if (type.IsPublic) { |
||||||
|
node = new PublicEnumNode(name, type); |
||||||
|
} else { |
||||||
|
node = new PrivateEnumNode(name, type); |
||||||
|
} |
||||||
|
} else { |
||||||
|
|
||||||
|
if (type.BaseType != null && type.BaseType.FullName == "System.MulticastDelegate"){ |
||||||
|
if (type.IsPublic) { |
||||||
|
node = new PublicDelegateNode(name, type); |
||||||
|
} else { |
||||||
|
node = new PrivateDelegateNode(name, type); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (type.IsClass) { |
||||||
|
if (type.IsPublic) { |
||||||
|
node = new PublicClassNode(name, type); |
||||||
|
} else { |
||||||
|
node = new PrivateClassNode(name, type); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
if (type.IsInterface) { |
||||||
|
if (type.IsPublic) { |
||||||
|
node = new PublicInterfaceNode(name, type); |
||||||
|
} else { |
||||||
|
node = new PrivateInterfaceNode(name, type); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (node != null) |
||||||
|
node.InsertSorted(this); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override void Expanding() |
||||||
|
{ |
||||||
|
foreach (var node in Nodes) { |
||||||
|
if (!(node is TypeNode)) continue; |
||||||
|
|
||||||
|
var n = (TypeNode)node; |
||||||
|
n.ShowMembers(); |
||||||
|
} |
||||||
|
|
||||||
|
base.Expanding(); |
||||||
|
} |
||||||
|
|
||||||
|
public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data) |
||||||
|
{ |
||||||
|
return visitor.Visit(this, data); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,279 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
using System; |
||||||
|
using System.Text; |
||||||
|
using Mono.Cecil; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Project.InnerExpand |
||||||
|
{ |
||||||
|
public abstract class TypeNode : AbstractProjectBrowserTreeNode |
||||||
|
{ |
||||||
|
protected readonly TypeDefinition type; |
||||||
|
|
||||||
|
public TypeNode(string name, TypeDefinition type) |
||||||
|
{ |
||||||
|
Text = name; |
||||||
|
this.type = type; |
||||||
|
|
||||||
|
this.PerformInitialization(); |
||||||
|
} |
||||||
|
|
||||||
|
public virtual void ShowMembers(bool forceRefresh = false) |
||||||
|
{ |
||||||
|
if (Nodes.Count > 0 && !forceRefresh) |
||||||
|
return; |
||||||
|
|
||||||
|
Nodes.Clear(); |
||||||
|
|
||||||
|
foreach (var ev in type.Events) { |
||||||
|
if (ev.AddMethod == null && ev.RemoveMethod == null ) continue; |
||||||
|
|
||||||
|
if (ev.AddMethod != null && !ev.AddMethod.IsPublic && |
||||||
|
ev.RemoveMethod != null && !ev.RemoveMethod.IsPublic) continue; |
||||||
|
|
||||||
|
new PublicEventNode(ev.Name, ev, type).InsertSorted(this); |
||||||
|
} |
||||||
|
|
||||||
|
foreach (var property in type.Properties) { |
||||||
|
if (property.GetMethod == null && property.SetMethod == null ) continue; |
||||||
|
|
||||||
|
if (property.GetMethod != null && !property.GetMethod.IsPublic && |
||||||
|
property.SetMethod != null && !property.SetMethod.IsPublic) continue; |
||||||
|
new PublicPropertyNode(property.Name, property, type).InsertSorted(this); |
||||||
|
} |
||||||
|
|
||||||
|
foreach (var method in type.Methods) { |
||||||
|
if (!method.IsPublic) continue; |
||||||
|
if (method.Name.StartsWith("get_") || method.Name.StartsWith("set_")) continue; |
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (!method.IsConstructor) { |
||||||
|
sb.Append(method.Name); |
||||||
|
} else { |
||||||
|
sb.Append(method.DeclaringType.Name); |
||||||
|
} |
||||||
|
|
||||||
|
sb.Append(DecompilerService.GetParameters(method)); |
||||||
|
|
||||||
|
new PublicMethodNode(sb.ToString(), method, type).InsertSorted(this); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data) |
||||||
|
{ |
||||||
|
return visitor.Visit(this, data); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#region Classes
|
||||||
|
|
||||||
|
public abstract class ClassNode : TypeNode |
||||||
|
{ |
||||||
|
public ClassNode(string name, TypeDefinition type) : base(name, type) { } |
||||||
|
} |
||||||
|
|
||||||
|
public class PublicClassNode : ClassNode |
||||||
|
{ |
||||||
|
public PublicClassNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Class"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalClassNode : ClassNode |
||||||
|
{ |
||||||
|
public InternalClassNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalClass"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedClassNode : ClassNode |
||||||
|
{ |
||||||
|
public ProtectedClassNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedClass"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateClassNode : ClassNode |
||||||
|
{ |
||||||
|
public PrivateClassNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateClass"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Interfaces
|
||||||
|
public abstract class InterfaceNode : TypeNode |
||||||
|
{ |
||||||
|
public InterfaceNode(string name, TypeDefinition type) : base(name, type) { } |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public class PublicInterfaceNode : InterfaceNode |
||||||
|
{ |
||||||
|
public PublicInterfaceNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Interface"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalInterfaceNode : InterfaceNode |
||||||
|
{ |
||||||
|
public InternalInterfaceNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalInterface"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedInterfaceNode : InterfaceNode |
||||||
|
{ |
||||||
|
public ProtectedInterfaceNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedInterface"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateInterfaceNode : InterfaceNode |
||||||
|
{ |
||||||
|
public PrivateInterfaceNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateInterface"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Structs
|
||||||
|
|
||||||
|
public abstract class StructNode : TypeNode |
||||||
|
{ |
||||||
|
public StructNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PublicStructNode : StructNode |
||||||
|
{ |
||||||
|
public PublicStructNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Struct"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalStructNode : StructNode |
||||||
|
{ |
||||||
|
public InternalStructNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalStruct"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedStructNode : StructNode |
||||||
|
{ |
||||||
|
public ProtectedStructNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedStruct"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateStructNode : StructNode |
||||||
|
{ |
||||||
|
public PrivateStructNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateStruct"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Enums
|
||||||
|
public abstract class EnumNode : TypeNode |
||||||
|
{ |
||||||
|
public EnumNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PublicEnumNode : EnumNode |
||||||
|
{ |
||||||
|
public PublicEnumNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Enum"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class IntenalEnumNode : EnumNode |
||||||
|
{ |
||||||
|
public IntenalEnumNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalEnum"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedEnumNode : EnumNode |
||||||
|
{ |
||||||
|
public ProtectedEnumNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedEnum"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateEnumNode : EnumNode |
||||||
|
{ |
||||||
|
public PrivateEnumNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateEnum"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Delegates
|
||||||
|
public abstract class DelegateNode : TypeNode |
||||||
|
{ |
||||||
|
public DelegateNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public override void ShowMembers(bool forceRefresh) |
||||||
|
{ |
||||||
|
// do nothing
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PublicDelegateNode : DelegateNode |
||||||
|
{ |
||||||
|
public PublicDelegateNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.Delegate"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class InternalDelegateNode : DelegateNode |
||||||
|
{ |
||||||
|
public InternalDelegateNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.InternalDelegate"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class ProtectedDelegateNode : DelegateNode |
||||||
|
{ |
||||||
|
public ProtectedDelegateNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.ProtectedDelegate"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class PrivateDelegateNode : DelegateNode |
||||||
|
{ |
||||||
|
public PrivateDelegateNode(string name, TypeDefinition type) : base(name, type) |
||||||
|
{ |
||||||
|
SetIcon("Icons.16x16.PrivateDelegate"); |
||||||
|
} |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
} |
||||||
@ -0,0 +1,329 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.CodeDom; |
||||||
|
using System.CodeDom.Compiler; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.IO; |
||||||
|
using System.Linq; |
||||||
|
using System.Text; |
||||||
|
using System.Windows.Navigation; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
using ICSharpCode.SharpDevelop.Gui; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using Mono.Cecil; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop |
||||||
|
{ |
||||||
|
public static class DecompilerService |
||||||
|
{ |
||||||
|
public static string GetParameters(MethodDefinition method) |
||||||
|
{ |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
|
||||||
|
if (!method.HasParameters) |
||||||
|
sb.Append("()"); |
||||||
|
else { |
||||||
|
sb.Append("("); |
||||||
|
for (int i = 0 ; i < method.Parameters.Count; ++i) { |
||||||
|
var p = method.Parameters[i]; |
||||||
|
|
||||||
|
if (p.IsOut) |
||||||
|
sb.Append("out "); |
||||||
|
else |
||||||
|
if (p.ParameterType.IsByReference) |
||||||
|
sb.Append("ref "); |
||||||
|
|
||||||
|
sb.Append(p.ParameterType.Name.Replace("&", string.Empty)); |
||||||
|
sb.Append(" "); |
||||||
|
|
||||||
|
sb.Append(p.Name); |
||||||
|
|
||||||
|
if (i < method.Parameters.Count - 1) |
||||||
|
sb.Append(", "); |
||||||
|
} |
||||||
|
sb.Append(")"); |
||||||
|
} |
||||||
|
|
||||||
|
return sb.ToString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void ReadMetadata(IClass c, out string filePath) |
||||||
|
{ |
||||||
|
CodeCompileUnit compileUnit = new CodeCompileUnit(); |
||||||
|
|
||||||
|
// add namespace
|
||||||
|
CodeNamespace generatedNamespace = new CodeNamespace(c.Namespace); |
||||||
|
generatedNamespace.Imports.Add(new CodeNamespaceImport("System")); |
||||||
|
compileUnit.Namespaces.Add(generatedNamespace); |
||||||
|
|
||||||
|
// add type
|
||||||
|
var targetClass = new CodeTypeDeclaration(c.Name); |
||||||
|
|
||||||
|
// write attributes
|
||||||
|
AddAttributes(c, targetClass); |
||||||
|
|
||||||
|
// write class definition
|
||||||
|
if (c.IsPublic) targetClass.TypeAttributes |= System.Reflection.TypeAttributes.Public; |
||||||
|
if (c.IsSealed) targetClass.TypeAttributes |= System.Reflection.TypeAttributes.Sealed; |
||||||
|
// static class limitation - c.IsStatic: https://connect.microsoft.com/VisualStudio/feedback/details/93653/codedom-unable-to-generate-static-events-and-classes
|
||||||
|
targetClass.IsPartial = c.IsPartial; |
||||||
|
|
||||||
|
switch (c.ClassType) { |
||||||
|
case ClassType.Class: |
||||||
|
targetClass.IsClass = true; |
||||||
|
break; |
||||||
|
case ClassType.Enum: |
||||||
|
targetClass.IsEnum = true; |
||||||
|
break; |
||||||
|
case ClassType.Interface: |
||||||
|
targetClass.IsInterface = true; |
||||||
|
break; |
||||||
|
case ClassType.Struct: |
||||||
|
targetClass.IsStruct = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
// generics
|
||||||
|
foreach (var typeParameter in c.TypeParameters) { |
||||||
|
var tp = new CodeTypeParameter(typeParameter.Name); |
||||||
|
foreach (var con in typeParameter.Constraints) { |
||||||
|
tp.Constraints.Add(con.Name); |
||||||
|
} |
||||||
|
targetClass.TypeParameters.Add(tp); |
||||||
|
} |
||||||
|
|
||||||
|
// base types
|
||||||
|
foreach (var basetype in c.BaseTypes) { |
||||||
|
if (basetype.FullyQualifiedName.Equals("System.Object", StringComparison.OrdinalIgnoreCase)) |
||||||
|
continue; |
||||||
|
var baseType = AddGenericBaseTypes(basetype); |
||||||
|
targetClass.BaseTypes.Add(baseType); |
||||||
|
} |
||||||
|
|
||||||
|
// field members
|
||||||
|
foreach (var f in c.Fields) { |
||||||
|
if (!f.IsPublic && !f.IsProtected) continue; |
||||||
|
|
||||||
|
CodeMemberField field = new CodeMemberField() { Name = f.Name, |
||||||
|
Attributes = MemberAttributes.Public }; |
||||||
|
AddDefinition(f, field); |
||||||
|
AddAttributes(f, field); |
||||||
|
AddDocumentation(f, field); |
||||||
|
|
||||||
|
field.Type = new CodeTypeReference(f.ReturnType.FullyQualifiedName); |
||||||
|
targetClass.Members.Add(field); |
||||||
|
} |
||||||
|
|
||||||
|
// event members
|
||||||
|
foreach (var e in c.Events) { |
||||||
|
if (!e.IsPublic && !e.IsProtected) continue; |
||||||
|
CodeMemberEvent ev = new CodeMemberEvent() { Name = e.Name, |
||||||
|
Attributes = MemberAttributes.Public, |
||||||
|
Type = new CodeTypeReference(e.ReturnType.FullyQualifiedName) }; |
||||||
|
AddDefinition(e, ev); |
||||||
|
AddDocumentation(e, ev); |
||||||
|
|
||||||
|
targetClass.Members.Add(ev); |
||||||
|
} |
||||||
|
|
||||||
|
// properties
|
||||||
|
foreach (var property in c.Properties) { |
||||||
|
if (!property.IsPublic && !property.IsProtected) continue; |
||||||
|
CodeMemberProperty p = new CodeMemberProperty() { |
||||||
|
Name = property.Name, |
||||||
|
Attributes = MemberAttributes.Public, |
||||||
|
Type = new CodeTypeReference(property.ReturnType.FullyQualifiedName), |
||||||
|
HasGet = property.CanGet, |
||||||
|
HasSet = property.CanSet |
||||||
|
}; |
||||||
|
|
||||||
|
AddAttributes(property, p); |
||||||
|
AddDefinition(property, p); |
||||||
|
AddDocumentation(property, p); |
||||||
|
|
||||||
|
if (property.IsIndexer) { |
||||||
|
p.Parameters.Add(new CodeParameterDeclarationExpression("System.Int32", "index")); |
||||||
|
} |
||||||
|
targetClass.Members.Add(p); |
||||||
|
} |
||||||
|
|
||||||
|
// methods and constructors
|
||||||
|
foreach (var method in c.Methods) { |
||||||
|
if (!method.IsPublic && !method.IsProtected) continue; |
||||||
|
|
||||||
|
if (method.IsConstructor) { |
||||||
|
CodeConstructor constructor = new CodeConstructor() { Name = c.Name, |
||||||
|
Attributes = MemberAttributes.Public }; |
||||||
|
AddAttributes(method, constructor); |
||||||
|
AddDefinition(method, constructor); |
||||||
|
AddParameters(method, constructor); |
||||||
|
AddDocumentation(method, constructor); |
||||||
|
|
||||||
|
targetClass.Members.Add(constructor); |
||||||
|
} else { |
||||||
|
CodeMemberMethod m = new CodeMemberMethod() { |
||||||
|
Name = method.Name, |
||||||
|
Attributes = MemberAttributes.Public, |
||||||
|
ReturnType = new CodeTypeReference(method.ReturnType.FullyQualifiedName), |
||||||
|
}; |
||||||
|
|
||||||
|
AddAttributes(method, m); |
||||||
|
AddDefinition(method, m); |
||||||
|
AddParameters(method, m); |
||||||
|
AddDocumentation(method, m); |
||||||
|
|
||||||
|
targetClass.Members.Add(m); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// delegates
|
||||||
|
foreach (var inner in c.InnerClasses) { |
||||||
|
if (inner.ClassType == ClassType.Delegate) { |
||||||
|
IMethod invoker = inner.Methods.Where(method => method.Name == "Invoke").FirstOrDefault(); |
||||||
|
CodeTypeDelegate del = new CodeTypeDelegate(inner.Name) { |
||||||
|
Attributes = MemberAttributes.Public, |
||||||
|
ReturnType = new CodeTypeReference(invoker.ReturnType.FullyQualifiedName) |
||||||
|
}; |
||||||
|
|
||||||
|
AddDocumentation(invoker, del); |
||||||
|
|
||||||
|
foreach (var p in invoker.Parameters) |
||||||
|
del.Parameters.Add(new CodeParameterDeclarationExpression(p.ReturnType.FullyQualifiedName, p.Name)); |
||||||
|
|
||||||
|
targetClass.Members.Add(del); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// add class
|
||||||
|
generatedNamespace.Types.Add(targetClass); |
||||||
|
filePath = WriteTempFile(c.Name, compileUnit); |
||||||
|
} |
||||||
|
|
||||||
|
static CodeTypeReference AddGenericBaseTypes(IReturnType basetype) |
||||||
|
{ |
||||||
|
string type = basetype.FullyQualifiedName; |
||||||
|
CodeTypeReference baseType = new CodeTypeReference(type); |
||||||
|
if (basetype.IsConstructedReturnType) |
||||||
|
{ |
||||||
|
var constructed = basetype as ConstructedReturnType; |
||||||
|
int i = 0; |
||||||
|
foreach (var typearg in constructed.TypeArguments) { |
||||||
|
baseType.TypeArguments.Add(new CodeTypeReference(typearg.Name, CodeTypeReferenceOptions.GenericTypeParameter)); |
||||||
|
|
||||||
|
if (typearg is ConstructedReturnType) { |
||||||
|
CodeTypeReference baseType1 = new CodeTypeReference(typearg.FullyQualifiedName); |
||||||
|
baseType1.TypeArguments.Add(AddGenericBaseTypes(typearg)); |
||||||
|
baseType.TypeArguments[i].TypeArguments.Add(baseType1); |
||||||
|
} |
||||||
|
++i; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return baseType; |
||||||
|
} |
||||||
|
|
||||||
|
static void AddParameters(IMethod method, CodeMemberMethod m) |
||||||
|
{ |
||||||
|
foreach (var p in method.Parameters) { |
||||||
|
string returnType = p.ReturnType.FullyQualifiedName; |
||||||
|
|
||||||
|
var par = new CodeParameterDeclarationExpression(returnType, p.Name); |
||||||
|
|
||||||
|
if (p.ReturnType.IsConstructedReturnType) |
||||||
|
{ |
||||||
|
CodeTypeReference baseType = new CodeTypeReference(returnType); |
||||||
|
var c = p.ReturnType as ConstructedReturnType; |
||||||
|
foreach (var typearg in c.TypeArguments) { |
||||||
|
baseType.TypeArguments.Add(new CodeTypeReference(typearg.Name, CodeTypeReferenceOptions.GenericTypeParameter)); |
||||||
|
} |
||||||
|
|
||||||
|
par.Type = baseType; |
||||||
|
} |
||||||
|
|
||||||
|
if (p.IsRef) |
||||||
|
par.Direction = FieldDirection.Ref; |
||||||
|
if (p.IsOut) |
||||||
|
par.Direction = FieldDirection.Out; |
||||||
|
if (p.IsParams) |
||||||
|
par.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(System.ParamArrayAttribute)))); |
||||||
|
// TODO: if (p.IsOptional)
|
||||||
|
|
||||||
|
m.Parameters.Add(par); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void AddDocumentation(IEntity entity, CodeTypeMember member) |
||||||
|
{ |
||||||
|
if (string.IsNullOrEmpty(entity.Documentation) || string.IsNullOrEmpty(entity.Documentation.Trim())) |
||||||
|
return; |
||||||
|
|
||||||
|
member.Comments.Add(new CodeCommentStatement(entity.Documentation.Replace(" ", string.Empty), true)); |
||||||
|
} |
||||||
|
|
||||||
|
static void AddDefinition(IEntity entity, CodeTypeMember member) |
||||||
|
{ |
||||||
|
if (entity.IsProtected) |
||||||
|
member.Attributes = MemberAttributes.Family; |
||||||
|
|
||||||
|
if (entity.IsStatic) |
||||||
|
member.Attributes |= MemberAttributes.Static; |
||||||
|
if (entity.IsNew) |
||||||
|
member.Attributes |= MemberAttributes.New; |
||||||
|
if (entity.IsOverride) |
||||||
|
member.Attributes |= MemberAttributes.Override; |
||||||
|
if (entity.IsAbstract) |
||||||
|
member.Attributes |= MemberAttributes.Abstract; |
||||||
|
if (entity.IsVirtual) |
||||||
|
member.Attributes |= MemberAttributes.Final; |
||||||
|
if (entity.IsConst) |
||||||
|
member.Attributes |= MemberAttributes.Const; |
||||||
|
} |
||||||
|
|
||||||
|
static void AddAttributes(IEntity entity, CodeTypeMember member) |
||||||
|
{ |
||||||
|
// write attributes
|
||||||
|
foreach (var attr in entity.Attributes) { |
||||||
|
|
||||||
|
List<CodeAttributeArgument> list = new List<CodeAttributeArgument>(); |
||||||
|
for (int i = 0; i < attr.PositionalArguments.Count; i++) { |
||||||
|
if (!(attr.PositionalArguments[i] is IReturnType)) |
||||||
|
list.Add(new CodeAttributeArgument(new CodePrimitiveExpression(attr.PositionalArguments[i]))); |
||||||
|
} |
||||||
|
|
||||||
|
if (list.Count == 0) { |
||||||
|
member.CustomAttributes.Add( |
||||||
|
new CodeAttributeDeclaration(attr.AttributeType.FullyQualifiedName)); |
||||||
|
} else { |
||||||
|
member.CustomAttributes.Add( |
||||||
|
new CodeAttributeDeclaration(attr.AttributeType.FullyQualifiedName, list.ToArray())); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static string WriteTempFile(string fileName, CodeCompileUnit compileUnit) |
||||||
|
{ |
||||||
|
// temp file
|
||||||
|
string tempFolder = Path.GetTempPath(); |
||||||
|
string file = fileName + ".temp.cs"; |
||||||
|
string filePath = Path.Combine(tempFolder, file); |
||||||
|
|
||||||
|
if (File.Exists(filePath)) |
||||||
|
File.Delete(filePath); |
||||||
|
|
||||||
|
// write file
|
||||||
|
using (var sw = new StreamWriter(filePath, false)) |
||||||
|
{ |
||||||
|
ProjectService |
||||||
|
.CurrentProject |
||||||
|
.LanguageProperties |
||||||
|
.CodeDomProvider.GenerateCodeFromCompileUnit( |
||||||
|
compileUnit, |
||||||
|
sw, |
||||||
|
new CodeGeneratorOptions()); |
||||||
|
} |
||||||
|
return filePath; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue