コード例 #1
0
        public override bool VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression)
        {
            bool result = base.VisitMemberReferenceExpression(memberReferenceExpression);
            UnaryOperatorExpression uoe = memberReferenceExpression.Target as UnaryOperatorExpression;

            if (uoe != null && uoe.Operator == UnaryOperatorType.Dereference)
            {
                PointerReferenceExpression pre = new PointerReferenceExpression();
                pre.Target     = uoe.Expression.Detach();
                pre.MemberName = memberReferenceExpression.MemberName;
                memberReferenceExpression.TypeArguments.MoveTo(pre.TypeArguments);
                pre.CopyAnnotationsFrom(uoe);
                pre.RemoveAnnotations <ResolveResult>();                // only copy the ResolveResult from the MRE
                pre.CopyAnnotationsFrom(memberReferenceExpression);
                memberReferenceExpression.ReplaceWith(pre);
            }
            var rr = memberReferenceExpression.GetResolveResult();

            if (rr != null)
            {
                if (IsUnsafeType(rr.Type))
                {
                    return(true);
                }
            }

            return(result);
        }
コード例 #2
0
		public override bool VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression)
		{
			bool result = base.VisitMemberReferenceExpression(memberReferenceExpression);
			UnaryOperatorExpression uoe = memberReferenceExpression.Target as UnaryOperatorExpression;
			if (uoe != null && uoe.Operator == UnaryOperatorType.Dereference) {
				PointerReferenceExpression pre = new PointerReferenceExpression();
				pre.Target = uoe.Expression.Detach();
				pre.MemberName = memberReferenceExpression.MemberName;
				memberReferenceExpression.TypeArguments.MoveTo(pre.TypeArguments);
				pre.CopyAnnotationsFrom(uoe);
				pre.RemoveAnnotations<ResolveResult>(); // only copy the ResolveResult from the MRE
				pre.CopyAnnotationsFrom(memberReferenceExpression);
				memberReferenceExpression.ReplaceWith(pre);
			}
			var rr = memberReferenceExpression.GetResolveResult();
			if (rr != null) {
				if (rr.Type is PointerType)
					return true;
				if (rr is MemberResolveResult mrr && mrr.Member.ReturnType.Kind == TypeKind.Delegate) {
					var method = mrr.Member.ReturnType.GetDefinition()?.GetDelegateInvokeMethod();
					if (method != null && (method.ReturnType is PointerType || method.Parameters.Any(p => p.Type is PointerType)))
						return true;
				}
			}

			return result;
		}