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; }
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); }
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)); } }