private static bool CheckBounds(RewriteDesign design, ref RewrittenValueBridge skippedValue) { if (design.ResultSize == null) { return(true); } if (TryGetInt(skippedValue, out var skippedInt)) { if (skippedInt <= 0) { return(false); } if (TryGetInt(design.ResultSize, out var resultSizeInt) && skippedInt > resultSizeInt) { skippedValue = new RewrittenValueBridge(design.ResultSize); } else if (!design.Unchecked) { var skippedVariable = CreateGlobalVariable(design, Int); design.InitialAdd(skippedVariable.Assign(ConditionalExpression(skippedValue > design.ResultSize, design.ResultSize, skippedValue))); skippedValue = new RewrittenValueBridge(skippedVariable); } } else if (!design.Unchecked && !design.ModifiedEnumeration) { var skippedVariable = CreateGlobalVariable(design, Int); design.InitialAdd(If(skippedValue < 0, skippedVariable.Assign(0), If(skippedValue > design.ResultSize, skippedVariable.Assign(design.ResultSize), skippedVariable.Assign(skippedValue)))); skippedValue = new RewrittenValueBridge(skippedVariable); } return(true); }
private static void CheckBounds(RewriteDesign design, ref RewrittenValueBridge takeValue) { if (design.Unchecked) { return; } var takeIntPass = TryGetInt(takeValue, out var takeInt); var resultIntPass = TryGetInt(design.ResultSize, out var resultInt); if (takeIntPass) { if (takeInt < 0) { takeValue = new RewrittenValueBridge(IntValue(0)); } if (!resultIntPass) { if (design.ResultSize == null) { return; } var takeVariable = CreateGlobalVariable(design, Int); design.PreUseAdd(If(takeValue > design.ResultSize, takeVariable.Assign(design.ResultSize), takeVariable.Assign(takeValue))); takeValue = new RewrittenValueBridge(takeVariable); } else if (takeInt > resultInt) { takeValue = new RewrittenValueBridge(design.ResultSize); } } else if (design.ResultSize != null) { var takeVariable = CreateGlobalVariable(design, Int); design.PreUseAdd(If(takeValue < 0, takeVariable.Assign(IntValue(0)), If(takeValue > design.ResultSize, takeVariable.Assign(design.ResultSize), takeVariable.Assign(takeValue)))); takeValue = new RewrittenValueBridge(takeVariable); } else { var takeVariable = CreateGlobalVariable(design, Int); design.PreUseAdd(If(takeValue < 0, takeVariable.Assign(IntValue(0)), takeVariable.Assign(takeValue))); takeValue = new RewrittenValueBridge(takeVariable); } }
public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args) { var innerValue = args[0]; RewrittenValueBridge outerKeySelector = args[1]; RewrittenValueBridge innerKeySelector = args[2]; if (design.CurrentIterator.IgnoreIterator) { return; } var resultSelectorValue = args[3]; var comparerValue = args.Length == 5 ? args[4] : null; var lookupType = ParseTypeName($"LinqRewrite.Core.SimpleLookup<{innerValue.ItemType(design)},{innerKeySelector.ReturnType(design)}>"); var lookupVariable = CreateGlobalVariable(design, lookupType, lookupType.Access("CreateForJoin") .Invoke(innerValue, innerKeySelector, comparerValue)); var itemValue = design.LastValue; var groupingType = ParseTypeName($"LinqRewrite.Core.SimpleLookup<{innerValue.ItemType(design)},{outerKeySelector.ReturnType(design)}>.Grouping"); var groupingVariable = CreateGlobalVariable(design, groupingType); design.ForAdd(groupingVariable.Assign(lookupVariable.Access("GetGrouping") .Invoke(outerKeySelector.Inline(design, itemValue), false))); design.ForAdd(If(groupingVariable.IsEqual(null), Continue())); var rewritten = new RewrittenValueBridge(((LambdaExpressionSyntax)innerKeySelector.Old).ExpressionBody, groupingVariable); var iteratorVariable = CreateGlobalVariable(design, innerKeySelector.ReturnType(design)); design.IncompleteIterators.ToArray().ForEach(x => { var newIterator = new IteratorDesign(design, new CollectionValueBridge(design, groupingType, innerKeySelector.ReturnType(design), rewritten, true)); x.ForBody.Add(newIterator); design.Iterators.Add(newIterator); design.Iterators.Remove(x); design.CurrentIterator = newIterator; RewriteCollectionEnumeration.RewriteOther(design, design.CurrentIterator.Collection, iteratorVariable); }); design.CurrentIterator = design.Iterators.Last(); design.LastValue = resultSelectorValue.Inline(design, itemValue, design.LastValue); design.ModifiedEnumeration = true; design.ListEnumeration = false; design.SourceSize = null; }
public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args) { RewrittenValueBridge keySelector = args[0]; var elementSelectorValue = args.Length switch { 1 => design.LastValue, _ when args[1].OldVal.Invokable1Param(design) => args[1].Inline(design, design.LastValue), _ => design.LastValue }; var lookupType = ParseTypeName($"LinqRewrite.Core.SimpleLookup<{keySelector.ReturnType(design)},{elementSelectorValue.Type}>"); var lookupVariable = CreateGlobalVariable(design, lookupType, args.Length switch { 2 when !args[1].OldVal.IsInvokable(design) => New(lookupType, args[1]), 3 when !args[2].OldVal.IsInvokable(design) => New(lookupType, args[2]), 4 when !args[3].OldVal.IsInvokable(design) => New(lookupType, args[3]), _ => New(lookupType, ParseTypeName($"System.Collections.Generic.EqualityComparer<{keySelector.ReturnType(design)}>").Access("Default")) });
public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args) { RewrittenValueBridge inner = args[0]; RewrittenValueBridge outerKeySelector = args[1]; RewrittenValueBridge innerKeySelector = args[2]; RewrittenValueBridge resultSelector = args[3]; RewrittenValueBridge comparer = args.Length == 5 ? args[4] : null; var lookupType = ParseTypeName($"LinqRewrite.Core.SimpleLookup<{inner.ItemType(design)},{innerKeySelector.ReturnType(design)}>"); var lookupVariable = CreateGlobalVariable(design, lookupType, lookupType.Access("CreateForJoin") .Invoke(inner, innerKeySelector, comparer)); var lookupItemType = ParseTypeName($"System.Collections.IEnumerable<{inner.ItemType(design)}>"); design.LastValue = resultSelector.Inline(design, design.LastValue, new TypedValueBridge(lookupItemType, lookupVariable[outerKeySelector.Inline(design, design.LastValue)])); design.ListEnumeration = false; design.ModifiedEnumeration = true; }
public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args) { RewrittenValueBridge method = args[0]; var newExpression = (LambdaExpressionSyntax)method.NewVal; if (design.CurrentIterator.IgnoreIterator) { return; } var collectionValue = args.Length switch { _ when newExpression.Invokable1Param(design) => method.Inline(design, design.LastValue), _ => method.Inline(design, design.LastValue, design.Indexer) }; var rewritten = new RewrittenValueBridge(newExpression.ExpressionBody, collectionValue); var iteratorVariable = CreateGlobalVariable(design, method.ReturnItemType(design)); design.IncompleteIterators.ToArray().ForEach(iterator => { var newIterator = new IteratorDesign(design, new CollectionValueBridge(design, method.ReturnType(design), method.ReturnItemType(design), rewritten, true)); iterator.ForBody.Add(newIterator); design.Iterators.Add(newIterator); design.Iterators.Remove(iterator); design.CurrentIterator = newIterator; RewriteCollectionEnumeration.RewriteOther(design, design.CurrentIterator.Collection, iteratorVariable); }); design.CurrentIterator = design.Iterators.Last(); design.LastValue = args.Length switch { 1 => design.LastValue, 2 => args[1].Inline(design, design.LastValue, design.Indexer) }; design.ModifiedEnumeration = true; design.ListEnumeration = false; design.SourceSize = null; } } }
public TypeInfo GetTypeInfo(RewrittenValueBridge collectionValue) => Semantic.GetTypeInfo(collectionValue.OldVal);