bool IsAccessibleFrom(IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected)
{
if (currentMember == null) {
return member.IsStatic || member.IsPublic;
}
// if (currentMember is MonoDevelop.Projects.Dom.BaseResolveResult.BaseMemberDecorator)
// return member.IsPublic | member.IsProtected;
// if (member.IsStatic && !IsStatic)
// return false;
if (member.IsPublic || calledType != null && calledType.Kind == TypeKind.Interface && !member.IsProtected) {
return true;
}
if (member.DeclaringTypeDefinition != null) {
if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) {
return IsAccessibleFrom(
member.DeclaringTypeDefinition,
calledType,
currentMember,
includeProtected
);
}
if (member.IsProtected && !(member.DeclaringTypeDefinition.IsProtectedOrInternal && !includeProtected)) {
return includeProtected;
}
}
if (member.IsInternal || member.IsProtectedAndInternal || member.IsProtectedOrInternal) {
//var type1 = member is ITypeDefinition ? (ITypeDefinition)member : member.DeclaringTypeDefinition;
//var type2 = currentMember is ITypeDefinition ? (ITypeDefinition)currentMember : currentMember.DeclaringTypeDefinition;
bool result = true;
// easy case, projects are the same
/*// if (type1.ProjectContent == type2.ProjectContent) {
// result = true;
// } else
if (type1.ProjectContent != null) {
// maybe type2 hasn't project dom set (may occur in some cases), check if the file is in the project
//TODO !!
// result = type1.ProjectContent.Annotation<MonoDevelop.Projects.Project> ().GetProjectFile (type2.Region.FileName) != null;
result = false;
} else if (type2.ProjectContent != null) {
//TODO!!
// result = type2.ProjectContent.Annotation<MonoDevelop.Projects.Project> ().GetProjectFile (type1.Region.FileName) != null;
result = false;
} else {
// should never happen !
result = true;
}*/
return member.IsProtectedAndInternal ? includeProtected && result : result;
}
if (!(currentMember is IType) && (currentMember.DeclaringTypeDefinition == null || member.DeclaringTypeDefinition == null)) {
return false;
}
// inner class
var declaringType = currentMember.DeclaringTypeDefinition;
while (declaringType != null) {
if (declaringType.ReflectionName == currentMember.DeclaringType.ReflectionName) {
return true;
}
declaringType = declaringType.DeclaringTypeDefinition;
}
return currentMember.DeclaringTypeDefinition != null && member.DeclaringTypeDefinition.FullName == currentMember.DeclaringTypeDefinition.FullName;
}