Browse Source

Clean field, method, property and event tree node.

pull/1030/head
Siegfried Pammer 7 years ago
parent
commit
8c5a732851
  1. 35
      ILSpy/TreeNodes/EventTreeNode.cs
  2. 49
      ILSpy/TreeNodes/FieldTreeNode.cs
  3. 21
      ILSpy/TreeNodes/MethodTreeNode.cs
  4. 88
      ILSpy/TreeNodes/PropertyTreeNode.cs

35
ILSpy/TreeNodes/EventTreeNode.cs

@ -17,14 +17,9 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Linq;
using System.Reflection;
using SRM = System.Reflection.Metadata;
using System.Windows.Media; using System.Windows.Media;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using System.Reflection.Metadata;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -59,35 +54,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static ImageSource GetIcon(IEvent @event) public static ImageSource GetIcon(IEvent @event)
{ {
var metadata = ((MetadataAssembly)@event.ParentAssembly).PEFile.Metadata; return Images.GetIcon(MemberIcon.Event, MethodTreeNode.GetOverlayIcon(@event.Accessibility), @event.IsStatic);
var accessor = metadata.GetEventDefinition((EventDefinitionHandle)@event.MetadataToken).GetAccessors().GetAny();
if (!accessor.IsNil) {
var accessorMethod = metadata.GetMethodDefinition(accessor);
return Images.GetIcon(MemberIcon.Event, GetOverlayIcon(accessorMethod.Attributes), accessorMethod.HasFlag(MethodAttributes.Static));
}
return Images.GetIcon(MemberIcon.Event, AccessOverlayIcon.Public, false);
}
private static AccessOverlayIcon GetOverlayIcon(MethodAttributes methodAttributes)
{
switch (methodAttributes & MethodAttributes.MemberAccessMask) {
case MethodAttributes.Public:
return AccessOverlayIcon.Public;
case MethodAttributes.Assembly:
return AccessOverlayIcon.Internal;
case MethodAttributes.FamANDAssem:
return AccessOverlayIcon.PrivateProtected;
case MethodAttributes.Family:
return AccessOverlayIcon.Protected;
case MethodAttributes.FamORAssem:
return AccessOverlayIcon.ProtectedInternal;
case MethodAttributes.Private:
return AccessOverlayIcon.Private;
case 0:
return AccessOverlayIcon.CompilerControlled;
default:
throw new NotSupportedException();
}
} }
public override FilterResult Filter(FilterSettings settings) public override FilterResult Filter(FilterSettings settings)

49
ILSpy/TreeNodes/FieldTreeNode.cs

@ -17,13 +17,9 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Reflection;
using System.Reflection.Metadata;
using System.Windows.Media; using System.Windows.Media;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.Util;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -50,47 +46,16 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static ImageSource GetIcon(IField field) public static ImageSource GetIcon(IField field)
{ {
var metadata = ((MetadataAssembly)field.ParentAssembly).PEFile.Metadata; if (field.DeclaringType.Kind == TypeKind.Enum && field.ReturnType.Kind == TypeKind.Enum)
var fieldDefinition = metadata.GetFieldDefinition((FieldDefinitionHandle)field.MetadataToken); return Images.GetIcon(MemberIcon.EnumValue, MethodTreeNode.GetOverlayIcon(field.Accessibility), false);
if (fieldDefinition.GetDeclaringType().IsEnum(metadata) && !fieldDefinition.HasFlag(FieldAttributes.SpecialName))
return Images.GetIcon(MemberIcon.EnumValue, GetOverlayIcon(fieldDefinition.Attributes), false);
if (fieldDefinition.HasFlag(FieldAttributes.Literal)) if (field.IsConst)
return Images.GetIcon(MemberIcon.Literal, GetOverlayIcon(fieldDefinition.Attributes), false); return Images.GetIcon(MemberIcon.Literal, MethodTreeNode.GetOverlayIcon(field.Accessibility), false);
else if (fieldDefinition.HasFlag(FieldAttributes.InitOnly)) {
if (IsDecimalConstant(field))
return Images.GetIcon(MemberIcon.Literal, GetOverlayIcon(fieldDefinition.Attributes), false);
else
return Images.GetIcon(MemberIcon.FieldReadOnly, GetOverlayIcon(fieldDefinition.Attributes), fieldDefinition.HasFlag(FieldAttributes.Static));
} else
return Images.GetIcon(MemberIcon.Field, GetOverlayIcon(fieldDefinition.Attributes), fieldDefinition.HasFlag(FieldAttributes.Static));
}
private static bool IsDecimalConstant(IField field) if (field.IsReadOnly)
{ return Images.GetIcon(MemberIcon.FieldReadOnly, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic);
return field.IsConst && field.Type.IsKnownType(KnownTypeCode.Decimal) && field.ConstantValue != null;
}
private static AccessOverlayIcon GetOverlayIcon(FieldAttributes fieldAttributes) return Images.GetIcon(MemberIcon.Field, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic);
{
switch (fieldAttributes & FieldAttributes.FieldAccessMask) {
case FieldAttributes.Public:
return AccessOverlayIcon.Public;
case FieldAttributes.Assembly:
return AccessOverlayIcon.Internal;
case FieldAttributes.FamANDAssem:
return AccessOverlayIcon.PrivateProtected;
case FieldAttributes.Family:
return AccessOverlayIcon.Protected;
case FieldAttributes.FamORAssem:
return AccessOverlayIcon.ProtectedInternal;
case FieldAttributes.Private:
return AccessOverlayIcon.Private;
case 0:
return AccessOverlayIcon.CompilerControlled;
default:
throw new NotSupportedException();
}
} }
public override FilterResult Filter(FilterSettings settings) public override FilterResult Filter(FilterSettings settings)

21
ILSpy/TreeNodes/MethodTreeNode.cs

@ -17,17 +17,10 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Collections.Immutable;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Text;
using System.Windows.Media; using System.Windows.Media;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem;
using SRM = System.Reflection.Metadata;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -55,24 +48,24 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static ImageSource GetIcon(IMethod method) public static ImageSource GetIcon(IMethod method)
{ {
if (method.IsOperator) if (method.IsOperator)
return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method), false); return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method.Accessibility), false);
if (method.IsExtensionMethod) if (method.IsExtensionMethod)
return Images.GetIcon(MemberIcon.ExtensionMethod, GetOverlayIcon(method), false); return Images.GetIcon(MemberIcon.ExtensionMethod, GetOverlayIcon(method.Accessibility), false);
if (method.IsConstructor) if (method.IsConstructor)
return Images.GetIcon(MemberIcon.Constructor, GetOverlayIcon(method), method.IsStatic); return Images.GetIcon(MemberIcon.Constructor, GetOverlayIcon(method.Accessibility), method.IsStatic);
if (!method.HasBody && method.HasAttribute(KnownAttribute.DllImport)) if (!method.HasBody && method.HasAttribute(KnownAttribute.DllImport))
return Images.GetIcon(MemberIcon.PInvokeMethod, GetOverlayIcon(method), true); return Images.GetIcon(MemberIcon.PInvokeMethod, GetOverlayIcon(method.Accessibility), true);
return Images.GetIcon(method.IsVirtual ? MemberIcon.VirtualMethod : MemberIcon.Method, return Images.GetIcon(method.IsVirtual ? MemberIcon.VirtualMethod : MemberIcon.Method,
GetOverlayIcon(method), method.IsStatic); GetOverlayIcon(method.Accessibility), method.IsStatic);
} }
static AccessOverlayIcon GetOverlayIcon(IMethod method) internal static AccessOverlayIcon GetOverlayIcon(Accessibility accessibility)
{ {
switch (method.Accessibility) { switch (accessibility) {
case Accessibility.Public: case Accessibility.Public:
return AccessOverlayIcon.Public; return AccessOverlayIcon.Public;
case Accessibility.Internal: case Accessibility.Internal:

88
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -49,87 +49,19 @@ namespace ICSharpCode.ILSpy.TreeNodes
public IProperty PropertyDefinition { get; } public IProperty PropertyDefinition { get; }
public override object Text => GetText(PropertyDefinition, Language, isIndexer) + PropertyDefinition.MetadataToken.ToSuffixString(); public override object Text => GetText(PropertyDefinition, Language) + PropertyDefinition.MetadataToken.ToSuffixString();
public static object GetText(IProperty property, Language language, bool? isIndexer = null) public static object GetText(IProperty property, Language language)
{ {
return language.PropertyToString(property, false, false, isIndexer); return language.PropertyToString(property, false, false);
} }
public override object Icon => GetIcon(PropertyDefinition); public override object Icon => GetIcon(PropertyDefinition);
public static ImageSource GetIcon(IProperty property, bool isIndexer = false) public static ImageSource GetIcon(IProperty property)
{ {
MemberIcon icon = isIndexer ? MemberIcon.Indexer : MemberIcon.Property; return Images.GetIcon(property.IsIndexer ? MemberIcon.Indexer : MemberIcon.Property,
MethodAttributes attributesOfMostAccessibleMethod = GetAttributesOfMostAccessibleMethod(property); MethodTreeNode.GetOverlayIcon(property.Accessibility), property.IsStatic);
bool isStatic = (attributesOfMostAccessibleMethod & MethodAttributes.Static) != 0;
return Images.GetIcon(icon, GetOverlayIcon(attributesOfMostAccessibleMethod), isStatic);
}
private static AccessOverlayIcon GetOverlayIcon(MethodAttributes methodAttributes)
{
switch (methodAttributes & MethodAttributes.MemberAccessMask) {
case MethodAttributes.Public:
return AccessOverlayIcon.Public;
case MethodAttributes.Assembly:
return AccessOverlayIcon.Internal;
case MethodAttributes.FamANDAssem:
return AccessOverlayIcon.PrivateProtected;
case MethodAttributes.Family:
return AccessOverlayIcon.Protected;
case MethodAttributes.FamORAssem:
return AccessOverlayIcon.ProtectedInternal;
case MethodAttributes.Private:
return AccessOverlayIcon.Private;
case 0:
return AccessOverlayIcon.CompilerControlled;
default:
throw new NotSupportedException();
}
}
private static MethodAttributes GetAttributesOfMostAccessibleMethod(IProperty property)
{
// There should always be at least one method from which to
// obtain the result, but the compiler doesn't know this so
// initialize the result with a default value
MethodAttributes result = (MethodAttributes)0;
// Method access is defined from inaccessible (lowest) to public (highest)
// in numeric order, so we can do an integer comparison of the masked attribute
int accessLevel = 0;
var metadata = ((MetadataAssembly)property.ParentAssembly).PEFile.Metadata;
var propertyDefinition = metadata.GetPropertyDefinition((PropertyDefinitionHandle)property.MetadataToken);
var accessors = propertyDefinition.GetAccessors();
if (!accessors.Getter.IsNil) {
var getter = metadata.GetMethodDefinition(accessors.Getter);
int methodAccessLevel = (int)(getter.Attributes & MethodAttributes.MemberAccessMask);
if (accessLevel < methodAccessLevel) {
accessLevel = methodAccessLevel;
result = getter.Attributes;
}
}
if (!accessors.Setter.IsNil) {
var setter = metadata.GetMethodDefinition(accessors.Setter);
int methodAccessLevel = (int)(setter.Attributes & MethodAttributes.MemberAccessMask);
if (accessLevel < methodAccessLevel) {
accessLevel = methodAccessLevel;
result = setter.Attributes;
}
}
/*foreach (var m in property.OtherMethods) {
int methodAccessLevel = (int)(m.Attributes & MethodAttributes.MemberAccessMask);
if (accessLevel < methodAccessLevel) {
accessLevel = methodAccessLevel;
result = m.Attributes;
}
}*/
return result;
} }
public override FilterResult Filter(FilterSettings settings) public override FilterResult Filter(FilterSettings settings)
@ -149,10 +81,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override bool IsPublicAPI { public override bool IsPublicAPI {
get { get {
switch (GetAttributesOfMostAccessibleMethod(PropertyDefinition) & MethodAttributes.MemberAccessMask) { switch (PropertyDefinition.Accessibility) {
case MethodAttributes.Public: case Accessibility.Public:
case MethodAttributes.Family: case Accessibility.ProtectedOrInternal:
case MethodAttributes.FamORAssem: case Accessibility.Protected:
return true; return true;
default: default:
return false; return false;

Loading…
Cancel
Save