diff --git a/ILSpy/TreeNodes/EventTreeNode.cs b/ILSpy/TreeNodes/EventTreeNode.cs index 16b3c23e6..e67a38984 100644 --- a/ILSpy/TreeNodes/EventTreeNode.cs +++ b/ILSpy/TreeNodes/EventTreeNode.cs @@ -17,14 +17,9 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Linq; -using System.Reflection; -using SRM = System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.TypeSystem; -using System.Reflection.Metadata; namespace ICSharpCode.ILSpy.TreeNodes { @@ -59,35 +54,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IEvent @event) { - var metadata = ((MetadataAssembly)@event.ParentAssembly).PEFile.Metadata; - 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(); - } + return Images.GetIcon(MemberIcon.Event, MethodTreeNode.GetOverlayIcon(@event.Accessibility), @event.IsStatic); } public override FilterResult Filter(FilterSettings settings) diff --git a/ILSpy/TreeNodes/FieldTreeNode.cs b/ILSpy/TreeNodes/FieldTreeNode.cs index bcd577bb8..4ec9c4e6f 100644 --- a/ILSpy/TreeNodes/FieldTreeNode.cs +++ b/ILSpy/TreeNodes/FieldTreeNode.cs @@ -17,13 +17,9 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Reflection; -using System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.TypeSystem; -using ICSharpCode.Decompiler.Util; namespace ICSharpCode.ILSpy.TreeNodes { @@ -50,47 +46,16 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IField field) { - var metadata = ((MetadataAssembly)field.ParentAssembly).PEFile.Metadata; - var fieldDefinition = metadata.GetFieldDefinition((FieldDefinitionHandle)field.MetadataToken); - if (fieldDefinition.GetDeclaringType().IsEnum(metadata) && !fieldDefinition.HasFlag(FieldAttributes.SpecialName)) - return Images.GetIcon(MemberIcon.EnumValue, GetOverlayIcon(fieldDefinition.Attributes), false); + if (field.DeclaringType.Kind == TypeKind.Enum && field.ReturnType.Kind == TypeKind.Enum) + return Images.GetIcon(MemberIcon.EnumValue, MethodTreeNode.GetOverlayIcon(field.Accessibility), false); - if (fieldDefinition.HasFlag(FieldAttributes.Literal)) - return Images.GetIcon(MemberIcon.Literal, GetOverlayIcon(fieldDefinition.Attributes), 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)); - } + if (field.IsConst) + return Images.GetIcon(MemberIcon.Literal, MethodTreeNode.GetOverlayIcon(field.Accessibility), false); - private static bool IsDecimalConstant(IField field) - { - return field.IsConst && field.Type.IsKnownType(KnownTypeCode.Decimal) && field.ConstantValue != null; - } + if (field.IsReadOnly) + return Images.GetIcon(MemberIcon.FieldReadOnly, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic); - private static AccessOverlayIcon GetOverlayIcon(FieldAttributes fieldAttributes) - { - 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(); - } + return Images.GetIcon(MemberIcon.Field, MethodTreeNode.GetOverlayIcon(field.Accessibility), field.IsStatic); } public override FilterResult Filter(FilterSettings settings) diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index 33a6f4fe7..7b799b48d 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -17,17 +17,10 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Collections.Immutable; -using System.Linq; -using System.Reflection; -using System.Reflection.Metadata; -using System.Text; using System.Windows.Media; using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.TypeSystem; -using SRM = System.Reflection.Metadata; namespace ICSharpCode.ILSpy.TreeNodes { @@ -55,24 +48,24 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IMethod method) { if (method.IsOperator) - return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method), false); + return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method.Accessibility), false); if (method.IsExtensionMethod) - return Images.GetIcon(MemberIcon.ExtensionMethod, GetOverlayIcon(method), false); + return Images.GetIcon(MemberIcon.ExtensionMethod, GetOverlayIcon(method.Accessibility), false); 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)) - 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, - 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: return AccessOverlayIcon.Public; case Accessibility.Internal: diff --git a/ILSpy/TreeNodes/PropertyTreeNode.cs b/ILSpy/TreeNodes/PropertyTreeNode.cs index 174769c85..d4387335f 100644 --- a/ILSpy/TreeNodes/PropertyTreeNode.cs +++ b/ILSpy/TreeNodes/PropertyTreeNode.cs @@ -49,87 +49,19 @@ namespace ICSharpCode.ILSpy.TreeNodes 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 static ImageSource GetIcon(IProperty property, bool isIndexer = false) + public static ImageSource GetIcon(IProperty property) { - MemberIcon icon = isIndexer ? MemberIcon.Indexer : MemberIcon.Property; - MethodAttributes attributesOfMostAccessibleMethod = GetAttributesOfMostAccessibleMethod(property); - 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; + return Images.GetIcon(property.IsIndexer ? MemberIcon.Indexer : MemberIcon.Property, + MethodTreeNode.GetOverlayIcon(property.Accessibility), property.IsStatic); } public override FilterResult Filter(FilterSettings settings) @@ -149,10 +81,10 @@ namespace ICSharpCode.ILSpy.TreeNodes public override bool IsPublicAPI { get { - switch (GetAttributesOfMostAccessibleMethod(PropertyDefinition) & MethodAttributes.MemberAccessMask) { - case MethodAttributes.Public: - case MethodAttributes.Family: - case MethodAttributes.FamORAssem: + switch (PropertyDefinition.Accessibility) { + case Accessibility.Public: + case Accessibility.ProtectedOrInternal: + case Accessibility.Protected: return true; default: return false;