private CanCastExpression CreateCanCastExpression(Pattern.MatchContext matchContext, BinaryExpression node)
        {
            SafeCastExpression safeCast = (SafeCastExpression)matchContext[SafeCastKey];

            List <Instruction> instructions = new List <Instruction>();

            instructions.AddRange(safeCast.MappedInstructions);
            instructions.AddRange(node.MappedInstructions);
            instructions.AddRange(node.Right.UnderlyingSameMethodInstructions);

            return(new CanCastExpression(
                       (Expression)codeTransformer.Visit(safeCast.Expression),
                       safeCast.TargetType,
                       instructions));
        }
        private bool TryMatchCanCastPattern(BinaryExpression node, IEnumerable <Pattern.ICodePattern> patterns, out CanCastExpression result)
        {
            foreach (Pattern.ICodePattern pattern in patterns)
            {
                Pattern.MatchContext matchContext = Pattern.CodePattern.Match(pattern, node);
                if (matchContext.Success)
                {
                    result = CreateCanCastExpression(matchContext, node);
                    return(true);
                }
            }

            result = null;
            return(false);
        }