@ -185,24 +185,28 @@ namespace ICSharpCode.Decompiler.Ast
if ( derivedType = = null )
if ( derivedType = = null )
throw new ArgumentNullException ( "derivedType" ) ;
throw new ArgumentNullException ( "derivedType" ) ;
var visibility = IsVisibleFromDerived ( baseMember ) ;
MethodAttributes attrs = GetAccessAttributes ( baseMember ) & MethodAttributes . MemberAccessMask ;
if ( visibility . HasValu e)
if ( attrs = = MethodAttributes . Privat e)
return visibility . Valu e;
return fals e;
if ( baseMember . DeclaringType . Module = = derivedType . Module )
if ( attrs = = MethodAttributes . Assembly | | attrs = = MethodAttributes . FamANDAssem ) {
var derivedTypeAsm = derivedType . Module . Assembly ;
var asm = baseMember . DeclaringType . Module . Assembly ;
if ( asm . HasCustomAttributes ) {
var attributes = asm . CustomAttributes
. Where ( attr = > attr . AttributeType . FullName = = "System.Runtime.CompilerServices.InternalsVisibleToAttribute" ) ;
foreach ( var attribute in attributes ) {
string assemblyName = attribute . ConstructorArguments [ 0 ] . Value as string ;
assemblyName = assemblyName . Split ( ',' ) [ 0 ] ; // strip off any public key info
if ( assemblyName = = derivedTypeAsm . Name . Name )
return true ;
return true ;
// TODO: Check also InternalsVisibleToAttribute.
}
}
return false ;
return false ;
}
}
private static bool? IsVisibleFromDerived ( IMemberDefinition member )
{
MethodAttributes attrs = GetAccessAttributes ( member ) & MethodAttributes . MemberAccessMask ;
if ( attrs = = MethodAttributes . Private )
return false ;
if ( attrs = = MethodAttributes . Assembly | | attrs = = MethodAttributes . FamANDAssem )
return null ;
return true ;
return true ;
}
}
private static MethodAttributes GetAccessAttributes ( IMemberDefinition member )
private static MethodAttributes GetAccessAttributes ( IMemberDefinition member )