2021-09-20 18:20:01 +02:00

177 lines
12 KiB
C#

/*
Copyright (C) 2014-2019 de4dot@gmail.com
This file is part of dnSpy
dnSpy is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
dnSpy is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with dnSpy. If not, see <http://www.gnu.org/licenses/>.
*/
using dnSpy.Contracts.Debugger.Evaluation;
using dnSpy.Debugger.DotNet.Metadata;
namespace dnSpy.Roslyn.Debugger.ValueNodes {
static class ImageNameUtils {
public static string GetImageName(DmdFieldInfo field) {
if (field.ReflectedType!.IsEnum && !field.IsSpecialName) {
switch (field.Attributes & DmdFieldAttributes.FieldAccessMask) {
case DmdFieldAttributes.PrivateScope: return PredefinedDbgValueNodeImageNames.EnumerationItemCompilerControlled;
case DmdFieldAttributes.Private: return PredefinedDbgValueNodeImageNames.EnumerationItemPrivate;
case DmdFieldAttributes.FamANDAssem: return PredefinedDbgValueNodeImageNames.EnumerationItemFamilyAndAssembly;
case DmdFieldAttributes.Assembly: return PredefinedDbgValueNodeImageNames.EnumerationItemAssembly;
case DmdFieldAttributes.Family: return PredefinedDbgValueNodeImageNames.EnumerationItemFamily;
case DmdFieldAttributes.FamORAssem: return PredefinedDbgValueNodeImageNames.EnumerationItemFamilyOrAssembly;
case DmdFieldAttributes.Public: return PredefinedDbgValueNodeImageNames.EnumerationItemPublic;
default: return PredefinedDbgValueNodeImageNames.EnumerationItem;
}
}
if (field.IsLiteral) {
switch (field.Attributes & DmdFieldAttributes.FieldAccessMask) {
case DmdFieldAttributes.PrivateScope: return PredefinedDbgValueNodeImageNames.ConstantCompilerControlled;
case DmdFieldAttributes.Private: return PredefinedDbgValueNodeImageNames.ConstantPrivate;
case DmdFieldAttributes.FamANDAssem: return PredefinedDbgValueNodeImageNames.ConstantFamilyAndAssembly;
case DmdFieldAttributes.Assembly: return PredefinedDbgValueNodeImageNames.ConstantAssembly;
case DmdFieldAttributes.Family: return PredefinedDbgValueNodeImageNames.ConstantFamily;
case DmdFieldAttributes.FamORAssem: return PredefinedDbgValueNodeImageNames.ConstantFamilyOrAssembly;
case DmdFieldAttributes.Public: return PredefinedDbgValueNodeImageNames.ConstantPublic;
default: return PredefinedDbgValueNodeImageNames.Constant;
}
}
switch (field.Attributes & DmdFieldAttributes.FieldAccessMask) {
case DmdFieldAttributes.PrivateScope: return PredefinedDbgValueNodeImageNames.FieldCompilerControlled;
case DmdFieldAttributes.Private: return PredefinedDbgValueNodeImageNames.FieldPrivate;
case DmdFieldAttributes.FamANDAssem: return PredefinedDbgValueNodeImageNames.FieldFamilyAndAssembly;
case DmdFieldAttributes.Assembly: return PredefinedDbgValueNodeImageNames.FieldAssembly;
case DmdFieldAttributes.Family: return PredefinedDbgValueNodeImageNames.FieldFamily;
case DmdFieldAttributes.FamORAssem: return PredefinedDbgValueNodeImageNames.FieldFamilyOrAssembly;
case DmdFieldAttributes.Public: return PredefinedDbgValueNodeImageNames.FieldPublic;
default: return PredefinedDbgValueNodeImageNames.Field;
}
}
public static string GetImageName(DmdType type, bool canBeModule) {
if (canBeModule && type.DeclaringType is null && type.IsSealed && type.IsAbstract) {
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.ModuleInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.ModulePublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.ModulePublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.ModulePrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.ModuleProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.ModuleInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.ModuleInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.ModuleProtected;
default: return PredefinedDbgValueNodeImageNames.Module;
}
}
if (type.IsInterface) {
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.InterfaceInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.InterfacePublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.InterfacePublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.InterfacePrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.InterfaceProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.InterfaceInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.InterfaceInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.InterfaceProtected;
default: return PredefinedDbgValueNodeImageNames.Interface;
}
}
if (type.IsEnum) {
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.EnumerationInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.EnumerationPublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.EnumerationPublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.EnumerationPrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.EnumerationProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.EnumerationInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.EnumerationInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.EnumerationProtected;
default: return PredefinedDbgValueNodeImageNames.Enumeration;
}
}
if (type.IsValueType) {
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.StructureInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.StructurePublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.StructurePublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.StructurePrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.StructureProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.StructureInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.StructureInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.StructureProtected;
default: return PredefinedDbgValueNodeImageNames.Structure;
}
}
if (type.BaseType == type.AppDomain.System_MulticastDelegate) {
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.DelegateInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.DelegatePublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.DelegatePublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.DelegatePrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.DelegateProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.DelegateInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.DelegateInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.DelegateProtected;
default: return PredefinedDbgValueNodeImageNames.Delegate;
}
}
switch (type.Attributes & DmdTypeAttributes.VisibilityMask) {
case DmdTypeAttributes.NotPublic: return PredefinedDbgValueNodeImageNames.ClassInternal;
case DmdTypeAttributes.Public: return PredefinedDbgValueNodeImageNames.ClassPublic;
case DmdTypeAttributes.NestedPublic: return PredefinedDbgValueNodeImageNames.ClassPublic;
case DmdTypeAttributes.NestedPrivate: return PredefinedDbgValueNodeImageNames.ClassPrivate;
case DmdTypeAttributes.NestedFamily: return PredefinedDbgValueNodeImageNames.ClassProtected;
case DmdTypeAttributes.NestedAssembly: return PredefinedDbgValueNodeImageNames.ClassInternal;
case DmdTypeAttributes.NestedFamANDAssem: return PredefinedDbgValueNodeImageNames.ClassInternal;
case DmdTypeAttributes.NestedFamORAssem: return PredefinedDbgValueNodeImageNames.ClassProtected;
default: return PredefinedDbgValueNodeImageNames.Class;
}
}
public static string GetImageName(DmdMethodBase method, bool canBeModule) {
if (method is DmdConstructorInfo)
return GetImageName(method.DeclaringType!, canBeModule);
if (method.IsStatic) {
if (method.IsDefined("System.Runtime.CompilerServices.ExtensionAttribute", inherit: false))
return PredefinedDbgValueNodeImageNames.ExtensionMethod;
}
switch (method.Attributes & DmdMethodAttributes.MemberAccessMask) {
case DmdMethodAttributes.PrivateScope: return PredefinedDbgValueNodeImageNames.MethodCompilerControlled;
case DmdMethodAttributes.Private: return PredefinedDbgValueNodeImageNames.MethodPrivate;
case DmdMethodAttributes.FamANDAssem: return PredefinedDbgValueNodeImageNames.MethodFamilyAndAssembly;
case DmdMethodAttributes.Assembly: return PredefinedDbgValueNodeImageNames.MethodAssembly;
case DmdMethodAttributes.Family: return PredefinedDbgValueNodeImageNames.MethodFamily;
case DmdMethodAttributes.FamORAssem: return PredefinedDbgValueNodeImageNames.MethodFamilyOrAssembly;
case DmdMethodAttributes.Public: return PredefinedDbgValueNodeImageNames.MethodPublic;
default: return PredefinedDbgValueNodeImageNames.Method;
}
}
public static string GetImageName(DmdPropertyInfo property) {
var method = property.GetGetMethod(DmdGetAccessorOptions.All) ?? property.GetSetMethod(DmdGetAccessorOptions.All);
if (method is null)
return PredefinedDbgValueNodeImageNames.Property;
switch (method.Attributes & DmdMethodAttributes.MemberAccessMask) {
case DmdMethodAttributes.PrivateScope: return PredefinedDbgValueNodeImageNames.PropertyCompilerControlled;
case DmdMethodAttributes.Private: return PredefinedDbgValueNodeImageNames.PropertyPrivate;
case DmdMethodAttributes.FamANDAssem: return PredefinedDbgValueNodeImageNames.PropertyFamilyAndAssembly;
case DmdMethodAttributes.Assembly: return PredefinedDbgValueNodeImageNames.PropertyAssembly;
case DmdMethodAttributes.Family: return PredefinedDbgValueNodeImageNames.PropertyFamily;
case DmdMethodAttributes.FamORAssem: return PredefinedDbgValueNodeImageNames.PropertyFamilyOrAssembly;
case DmdMethodAttributes.Public: return PredefinedDbgValueNodeImageNames.PropertyPublic;
default: return PredefinedDbgValueNodeImageNames.Property;
}
}
}
}