コード例 #1
0
        public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args)
        {
            var collectionValue = args[0];

            if (!AssertNotNull(design, collectionValue))
            {
                return;
            }
            var methodValue = args[1];

            design.WrapWithTry = true;

            var itemType           = collectionValue.ItemType(design);
            var enumeratorVariable = CreateGlobalVariable(design, ParseTypeName($"System.Collections.Generic.IEnumerator<{itemType}>"));

            design.InitialAdd(enumeratorVariable.Assign(Parenthesize(collectionValue.Cast(ParseTypeName($"IEnumerable<{itemType}>")))
                                                        .Access("GetEnumerator").Invoke()));

            design.ForAdd(If(Not(enumeratorVariable.Access("MoveNext").Invoke()), Break()));
            design.LastValue = methodValue.Inline(design, design.LastValue, new TypedValueBridge(collectionValue.ItemType(design), enumeratorVariable.Access("Current")));

            design.FinalAdd(enumeratorVariable.Access("Dispose").Invoke());
            design.ListEnumeration     = false;
            design.ModifiedEnumeration = true;
        }
コード例 #2
0
        public static bool AssertLesser(RewriteDesign design, ValueBridge smaller, ValueBridge bigger, bool initialCheck = true, bool preCheck = false)
        {
            if (design.Unchecked)
            {
                return(true);
            }
            bool biggerPass  = ExpressionSimplifier.TryGetDouble(bigger, out double biggerD);
            bool smallerPass = ExpressionSimplifier.TryGetDouble(smaller, out double smallerD);

            if (biggerPass && smallerPass)
            {
                if (smallerD < biggerD)
                {
                    return(true);
                }
                InitialError(design, "System.InvalidOperationException", "Index out of range");
                return(false);
            }
            if (preCheck)
            {
                return(true);
            }
            if (initialCheck)
            {
                design.PreUseAdd(If(smaller >= bigger, Throw("System.InvalidOperationException", "Index out of range")));
            }
            else
            {
                design.FinalAdd(If(smaller >= bigger, Throw("System.InvalidOperationException", "Index out of range")));
            }
            return(true);
        }
コード例 #3
0
        public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args)
        {
            var collectionValue = args[0];

            if (!AssertNotNull(design, collectionValue))
            {
                return;
            }
            if (ExpressionSimplifier.TryGetInt(design.ResultSize, out var resultSizeInt))
            {
                if (resultSizeInt == 0)
                {
                    InitialErrorAdd(design, Return((collectionValue.Access("Count").Invoke()).IsEqual(0)));
                    return;
                }
            }

            design.WrapWithTry = true;
            var itemType           = collectionValue.ItemType(design);
            var enumeratorVariable = CreateGlobalVariable(design, ParseTypeName($"System.Collections.Generic.IEnumerator<{itemType}>"));

            design.InitialAdd(enumeratorVariable.Assign(Parenthesize(collectionValue.Cast(ParseTypeName($"IEnumerable<{itemType}>")))
                                                        .Access("GetEnumerator").Invoke()));

            var equalityTestValue = args.Length switch
            {
                1 => enumeratorVariable.Access("Current", "Equals").Invoke(design.LastValue),
                2 => args[1].ReusableConst(design).Access("Equals").Invoke(design.LastValue, enumeratorVariable.Access("Current"))
            };

            design.ForAdd(If(Not(enumeratorVariable.Access("MoveNext").Invoke().And(equalityTestValue)),
                             Return(false)));

            design.ResultAdd(If(enumeratorVariable.Access("MoveNext").Invoke(),
                                Return(false)));

            design.FinalAdd(enumeratorVariable.Access("Dispose").Invoke());
            design.ResultAdd(Return(true));
        }
    }