예제 #1
0
        public bool IsAccessible(IAccessibleMember member)
        {
            if (member.IsPublic)
            {
                return(true);
            }

            IInternalEntity internalEntity = GetInternalEntity(member);

            if (null != internalEntity)
            {
                internalEntity.Node.RemoveAnnotation("PrivateMemberNeverUsed");
                if (member.IsInternal)
                {
                    return(true);
                }
            }

            IType declaringType = member.DeclaringType;

            if (declaringType == CurrentType())
            {
                return(true);
            }

            if (member.IsProtected && CurrentType().IsSubclassOf(declaringType))
            {
                return(true);
            }

            return(IsDeclaredInside(declaringType));
        }
예제 #2
0
        override public void LeaveMemberReferenceExpression(MemberReferenceExpression node)
        {
            if (AstUtil.IsLhsOfAssignment(node))
            {
                return;
            }
            IAccessibleMember member = GetAccessibleMemberToReplace(node);

            if (null == member)
            {
                return;
            }

            IMethod accessor = GetMemberAccessor(member);

            if (member.EntityType == EntityType.Field)
            {
                ReplaceCurrentNode(
                    _context.CodeBuilder.CreateMethodInvocation(
                        node.Target,
                        accessor));
            }
            else
            {
                node.Entity = accessor;
            }
        }
예제 #3
0
        override public void LeaveBinaryExpression(BinaryExpression node)
        {
            if (node.Operator != BinaryOperatorType.Assign)
            {
                return;
            }

            MemberReferenceExpression mre = node.Left as MemberReferenceExpression;

            if (null == mre)
            {
                return;
            }

            IAccessibleMember member = GetAccessibleMemberToReplace(mre);

            if (null == member)
            {
                return;
            }

            ReplaceCurrentNode(
                _context.CodeBuilder.CreateMethodInvocation(
                    mre.Target,
                    GetFieldSetter((IField)member),
                    node.Right));
        }
예제 #4
0
        IMethod NewAccessor(IDictionary cache, IAccessibleMember member, Method accessor)
        {
            _externalType.Members.Add(accessor);
            IMethod entity = (IMethod)accessor.Entity;

            cache.Add(member, entity);
            return(entity);
        }
예제 #5
0
 public bool IsAccessible(IAccessibleMember member)
 {
     if (member.IsPublic)
     {
         return(true);
     }
     return(member.IsInternal && member is IInternalEntity);
 }
예제 #6
0
		static IInternalEntity GetInternalEntity(IAccessibleMember member)
		{
			if (member is IInternalEntity)
				return (IInternalEntity) member;

			IGenericMappedMember gmp = member as IGenericMappedMember;
			if (null != gmp && gmp.SourceMember is IInternalEntity)
				return (IInternalEntity) gmp.SourceMember;

			return null;
		}
예제 #7
0
        public bool IsAccessible(IAccessibleMember member)
        {
            if (member.IsPublic) return true;

            IType declaringType = member.DeclaringType;
            if (declaringType == CurrentType()) return true;
            if (member.IsInternal && member is IInternalEntity) return true;
            if (member.IsProtected && CurrentType().IsSubclassOf(declaringType)) return true;

            return IsDeclaredInside(declaringType);
        }
예제 #8
0
        Method CreateAccessorFor(IAccessibleMember member)
        {
            switch (member.EntityType)
            {
            case EntityType.Field:
                return(CreateFieldAccessor((IField)member));

            case EntityType.Method:
                return(CreateMethodAccessor((IMethod)member));
            }
            throw new System.ArgumentException("Unsupported member:" + member);
        }
예제 #9
0
 public static TypeMemberModifiers GetAccess(IAccessibleMember member)
 {
     if (member.IsPublic)
     {
         return(TypeMemberModifiers.Public);
     }
     else if (member.IsProtected)
     {
         return(TypeMemberModifiers.Protected);
     }
     return(TypeMemberModifiers.Private);
 }
예제 #10
0
        IMethod GetMemberAccessor(IAccessibleMember member)
        {
            IDictionary accessors = GetDictionary(AccessorsKey);
            IMethod     accessor  = (IMethod)accessors[member];

            if (null != accessor)
            {
                return(accessor);
            }

            return(NewAccessor(accessors, member, CreateAccessorFor(member)));
        }
예제 #11
0
        override public void OnReferenceExpression(ReferenceExpression node)
        {
            IAccessibleMember member = node.Entity as IAccessibleMember;

            if (null == member)
            {
                return;
            }

            if (_checker.IsAccessible(member))
            {
                return;
            }
            Error(CompilerErrorFactory.UnaccessibleMember(node, member.FullName));
        }
예제 #12
0
        static IInternalEntity GetInternalEntity(IAccessibleMember member)
        {
            if (member is IInternalEntity)
            {
                return((IInternalEntity)member);
            }

            IGenericMappedMember gmp = member as IGenericMappedMember;

            if (null != gmp && gmp.SourceMember is IInternalEntity)
            {
                return((IInternalEntity)gmp.SourceMember);
            }

            return(null);
        }
예제 #13
0
        IAccessibleMember GetAccessibleMemberToReplace(MemberReferenceExpression node)
        {
            IAccessibleMember member = node.Entity as IAccessibleMember;

            if (member == null)
            {
                return(null);
            }
            if (member.IsPublic || member.IsInternal)
            {
                return(null);
            }
            if (IsCurrentType(member.DeclaringType))
            {
                return(null);
            }
            return(member);
        }
예제 #14
0
		public bool IsAccessible(IAccessibleMember member)
		{
			if (member.IsPublic)
				return true;

			IInternalEntity internalEntity = GetInternalEntity(member);
			if (null != internalEntity)
			{
				internalEntity.Node.RemoveAnnotation("PrivateMemberNeverUsed");
				if (member.IsInternal)
					return true;
			}

			IType declaringType = member.DeclaringType;
			if (declaringType == CurrentType())
				return true;

			if (member.IsProtected && CurrentType().IsSubclassOf(declaringType))
				return true;

			return IsDeclaredInside(declaringType);
		}
예제 #15
0
        override public void LeaveMemberReferenceExpression(MemberReferenceExpression node)
        {
            IAccessibleMember member = node.Entity as IAccessibleMember;

            if (null == member)
            {
                return;
            }
            if (member.IsPublic)
            {
                return;
            }

            IType declaringType = member.DeclaringType;

            if (declaringType == _currentType)
            {
                return;
            }
            if (member.IsInternal && member is IInternalEntity)
            {
                return;
            }
            if (member.IsProtected)
            {
                if (_currentType.IsSubclassOf(declaringType))
                {
                    return;
                }
            }

            if (IsDeclaredInside(declaringType))
            {
                return;
            }
            Error(CompilerErrorFactory.UnaccessibleMember(node, member.FullName));
        }
예제 #16
0
        public bool IsAccessible(IAccessibleMember member)
        {
            if (member.IsPublic)
            {
                return(true);
            }

            IType declaringType = member.DeclaringType;

            if (declaringType == CurrentType())
            {
                return(true);
            }
            if (member.IsInternal && member is IInternalEntity)
            {
                return(true);
            }
            if (member.IsProtected && CurrentType().IsSubclassOf(declaringType))
            {
                return(true);
            }

            return(IsDeclaredInside(declaringType));
        }
예제 #17
0
 private bool IsAccessible(IAccessibleMember accessible)
 {
     return GetAccessibilityChecker().IsAccessible(accessible);
 }
예제 #18
0
 private static bool IsVisible(IAccessibleMember member)
 {
     // TODO: should it just be IsAccessible(member) here?
     return member.IsPublic || member.IsInternal;
 }
예제 #19
0
 public static CompilerError UnaccessibleMember(Node node, IAccessibleMember name)
 {
     return(Instantiate("BCE0120", node, name));
 }
예제 #20
0
 public bool IsAccessible(IAccessibleMember member)
 {
     if (member.IsPublic) return true;
     return member.IsInternal && member is IInternalEntity;
 }
예제 #21
0
		public static TypeMemberModifiers GetAccess(IAccessibleMember member)
		{
			if (member.IsPublic)
				return TypeMemberModifiers.Public;
			if (member.IsProtected)
			{
				if (member.IsInternal)
					return TypeMemberModifiers.Protected | TypeMemberModifiers.Internal;
				return TypeMemberModifiers.Protected;
			}
			if (member.IsInternal)
				return TypeMemberModifiers.Internal;
			return TypeMemberModifiers.Private;
		}
예제 #22
0
 public static CompilerError UnaccessibleMember(Node node, IAccessibleMember name)
 {
     return Instantiate("BCE0120", node, name);
 }
예제 #23
0
	    private bool IsAccessible(IAccessibleMember member)
	    {
	        return _checker.IsAccessible(member);
	    }
예제 #24
0
 private bool IsAccessible(IAccessibleMember method)
 {
     return GetAccessibilityChecker().IsAccessible(method);
 }
예제 #25
0
 public static TypeMemberModifiers GetAccess(IAccessibleMember member)
 {
     if (member.IsPublic)
     {
         return TypeMemberModifiers.Public;
     }
     else if (member.IsProtected)
     {
         return TypeMemberModifiers.Protected;
     }
     return TypeMemberModifiers.Private;
 }
예제 #26
0
 private bool IsAccessible(IAccessibleMember member)
 {
     return(_checker.IsAccessible(member));
 }