Xamarin Public Jenkins (auto-signing) 64ac736ec5 Imported Upstream version 6.0.0.172
Former-commit-id: f3cc9b82f3e5bd8f0fd3ebc098f789556b44e9cd
2019-04-12 14:10:50 +00:00

230 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
#if ENABLE_CECIL
using C = Mono.Cecil;
#endif
namespace Mono.Debugger.Soft
{
public class FieldInfoMirror : Mirror {
TypeMirror parent;
string name;
TypeMirror type;
FieldAttributes attrs;
CustomAttributeDataMirror[] cattrs;
bool inited;
#if ENABLE_CECIL
C.FieldDefinition meta;
#endif
public FieldInfoMirror (TypeMirror parent, long id, string name, TypeMirror type, FieldAttributes attrs) : base (parent.VirtualMachine, id) {
this.parent = parent;
this.name = name;
this.type = type;
this.attrs = attrs;
inited = true;
}
public FieldInfoMirror (VirtualMachine vm, long id) : base (vm, id) {
}
public TypeMirror DeclaringType {
get {
if (!inited)
GetInfo ();
return parent;
}
}
public string Name {
get {
if (!inited)
GetInfo ();
return name;
}
}
public TypeMirror FieldType {
get {
if (!inited)
GetInfo ();
return type;
}
}
public FieldAttributes Attributes {
get {
if (!inited)
GetInfo ();
return attrs;
}
}
void GetInfo () {
if (inited)
return;
var info = vm.conn.Field_GetInfo (id);
name = info.Name;
parent = vm.GetType (info.Parent);
type = vm.GetType (info.TypeId);
attrs = (FieldAttributes)info.Attrs;
inited = true;
}
public bool IsLiteral
{
get {return (Attributes & FieldAttributes.Literal) != 0;}
}
public bool IsStatic
{
get {return (Attributes & FieldAttributes.Static) != 0;}
}
public bool IsInitOnly
{
get {return (Attributes & FieldAttributes.InitOnly) != 0;}
}
public Boolean IsPublic
{
get
{
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public;
}
}
public Boolean IsPrivate
{
get
{
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Private;
}
}
public Boolean IsFamily
{
get
{
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Family;
}
}
public Boolean IsAssembly
{
get
{
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Assembly;
}
}
public Boolean IsFamilyAndAssembly
{
get {
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamANDAssem;
}
}
public Boolean IsFamilyOrAssembly
{
get
{
return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamORAssem;
}
}
public Boolean IsPinvokeImpl
{
get
{
return (Attributes & FieldAttributes.PinvokeImpl) == FieldAttributes.PinvokeImpl;
}
}
public Boolean IsSpecialName
{
get
{
return (Attributes & FieldAttributes.SpecialName) == FieldAttributes.SpecialName;
}
}
public Boolean IsNotSerialized
{
get
{
return (Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized;
}
}
public CustomAttributeDataMirror[] GetCustomAttributes (bool inherit) {
return GetCAttrs (null, inherit);
}
public CustomAttributeDataMirror[] GetCustomAttributes (TypeMirror attributeType, bool inherit) {
if (attributeType == null)
throw new ArgumentNullException ("attributeType");
return GetCAttrs (attributeType, inherit);
}
#if ENABLE_CECIL
public C.FieldDefinition Metadata {
get {
if (parent.Metadata == null)
return null;
// FIXME: Speed this up
foreach (var fd in parent.Metadata.Fields) {
if (fd.Name == Name) {
meta = fd;
break;
}
}
if (meta == null)
/* Shouldn't happen */
throw new NotImplementedException ();
return meta;
}
}
#endif
CustomAttributeDataMirror[] GetCAttrs (TypeMirror type, bool inherit) {
#if ENABLE_CECIL
if (cattrs == null && Metadata != null && !Metadata.HasCustomAttributes)
cattrs = new CustomAttributeDataMirror [0];
#endif
// FIXME: Handle inherit
if (cattrs == null) {
CattrInfo[] info = vm.conn.Type_GetFieldCustomAttributes (DeclaringType.Id, id, 0, false);
cattrs = CustomAttributeDataMirror.Create (vm, info);
}
var res = new List<CustomAttributeDataMirror> ();
foreach (var attr in cattrs)
if (type == null || attr.Constructor.DeclaringType == type)
res.Add (attr);
return res.ToArray ();
}
public string FullName {
get {
string type_namespace = DeclaringType.Namespace;
string type_name = DeclaringType.Name;
StringBuilder sb = new StringBuilder ();
if (type_namespace != String.Empty)
sb.Append (type_namespace).Append (".");
sb.Append (type_name);
sb.Append (":");
sb.Append (Name);
return sb.ToString ();
}
}
}
}