static Modifiers ReadMethodModifiers(MethodBase mb, TypeSpec declaringType)
{
Modifiers mod;
var ma = mb.Attributes;
switch (ma & MethodAttributes.MemberAccessMask) {
case MethodAttributes.Public:
mod = Modifiers.PUBLIC;
break;
case MethodAttributes.Assembly:
mod = Modifiers.INTERNAL;
break;
case MethodAttributes.Family:
mod = Modifiers.PROTECTED;
break;
case MethodAttributes.FamORAssem:
mod = Modifiers.PROTECTED | Modifiers.INTERNAL;
break;
default:
mod = Modifiers.PRIVATE;
break;
}
if ((ma & MethodAttributes.Static) != 0) {
mod |= Modifiers.STATIC;
return mod;
}
if ((ma & MethodAttributes.Abstract) != 0 && declaringType.IsClass) {
mod |= Modifiers.ABSTRACT;
return mod;
}
if ((ma & MethodAttributes.Final) != 0)
mod |= Modifiers.SEALED;
// It can be sealed and override
if ((ma & MethodAttributes.Virtual) != 0) {
if ((ma & MethodAttributes.NewSlot) != 0 || !declaringType.IsClass) {
// No private virtual or sealed virtual
if ((mod & (Modifiers.PRIVATE | Modifiers.SEALED)) == 0)
mod |= Modifiers.VIRTUAL;
} else {
mod |= Modifiers.OVERRIDE;
}
}
return mod;
}