@ -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 . HasValue )
if ( attrs = = MethodAttributes . Private )
return visibility . Value ;
if ( baseMember . DeclaringType . Module = = derivedType . Module )
return true ;
// TODO: Check also InternalsVisibleToAttribute.
return false ;
return false ;
}
private static bool? IsVisibleFromDerived ( IMemberDefinition member )
if ( attrs = = MethodAttributes . Assembly | | attrs = = MethodAttributes . FamANDAssem ) {
{
var derivedTypeAsm = derivedType . Module . Assembly ;
MethodAttributes attrs = GetAccessAttributes ( member ) & MethodAttributes . MemberAccessMask ;
var asm = baseMember . DeclaringType . Module . Assembly ;
if ( attrs = = MethodAttributes . Private )
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 false ;
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 )