public static ValueBridge Substitute(ValueBridge value, VariableBridge substituted, ValueBridge changedFor) { var str = value.ToString(); str = str.Replace(substituted.Name, changedFor.ToString()); return(SyntaxFactory.ParseExpression(str)); }
public static void Rewrite(RewriteDesign design, RewrittenValueBridge[] args) { var enlarging = args.FirstOrDefault()?.ToString() switch { "EnlargingCoefficient.By2" => 1, "EnlargingCoefficient.By4" => 2, "EnlargingCoefficient.By8" => 3, _ when design.SourceSize != null => 2, _ => 1 }; var(currentLength, currentResult) = RewriteToArray.GetResultVariable(design, design.LastValue.Type); VariableBridge result = RewriteToArray.RewriteOther(design, currentLength, currentResult, enlarging); RewriteToArray.SimplifyPart(design, result); var listResultType = ParseTypeName($"LinqRewrite.Core.SimpleList.SimpleList<{design.LastValue.Type}>"); LocalVariable finalResult = CreateGlobalVariable(design, listResultType); design.ResultAdd(finalResult.Assign(New(listResultType))); design.ResultAdd(finalResult.Access("Items").Assign(result)); design.ResultAdd(finalResult.Access("Count").Assign(design.ResultSize ?? design.Indexer)); design.ResultAdd(Return(finalResult)); } }
private static VariableBridge KnownSize(RewriteDesign design, VariableBridge resultVariable) { if (TryGetInt(design.ResultSize, out var resultInt) && resultInt < 0) { InitialErrorAdd(design, Return("System".Access("Array", $"Empty<{design.LastValue.Type}>").Invoke())); } design.ForAdd(resultVariable[design.Indexer].Assign(design.LastValue)); return(resultVariable); }
public static void SimplifyPart(RewriteDesign design, VariableBridge resultVariable) { var hadInvalid = false; design.IncompleteIterators.ForEach(x => { if (!TryGetInt(x.ForInc, out var inc) || x.Collection == null || x.IsReversed || !x.ListEnumeration || x.ForFrom == null || x.ForTo == null || inc != 1 || (design.ResultSize == null && hadInvalid)) { hadInvalid = true; return; } if (x.Collection.CollectionType == CollectionType.Array) { var countValue = (x.IsReversed ? x.ForFrom - x.ForTo + 1 : x.ForTo - x.ForFrom + 1); x.PostFor.Add((StatementBridge)"LinqRewrite".Access("Core", "EnlargeExtensions", "ArrayCopy") .Invoke(x.Collection, x.ForFrom, resultVariable, design.Indexer, countValue)); x.PostFor.Add((StatementBridge)design.Indexer.AddAssign(countValue)); x.IgnoreIterator = true; } else if (x.Collection.CollectionType == CollectionType.SimpleList) { var countValue = (x.IsReversed ? x.ForFrom - x.ForTo + 1 : x.ForTo - x.ForFrom + 1); x.PostFor.Add((StatementBridge)"LinqRewrite".Access("Core", "EnlargeExtensions", "ArrayCopy") .Invoke(x.Collection.Access("Items"), x.ForFrom, resultVariable, design.Indexer, countValue)); x.PostFor.Add((StatementBridge)design.Indexer.AddAssign(countValue)); x.IgnoreIterator = true; } else if (design.CurrentCollection.CollectionType == CollectionType.List) { var countValue = (x.IsReversed ? x.ForFrom - x.ForTo + 1 : x.ForTo - x.ForFrom + 1); x.PostFor.Add((StatementBridge)design.CurrentCollection.Access("CopyTo") .Invoke(x.ForFrom, resultVariable, design.Indexer, countValue)); x.PostFor.Add((StatementBridge)design.Indexer.AddAssign(countValue)); x.IgnoreIterator = true; } }); }
public static AssignmentExpressionSyntax AddAssign(this VariableBridge a, ValueBridge b) => AssignmentExpression(SyntaxKind.AddAssignmentExpression, a, b);
public static AssignmentExpressionSyntax SubAssign(this VariableBridge a, ValueBridge b) => AssignmentExpression(SyntaxKind.SubtractAssignmentExpression, a, b);
public static MemberAccessExpressionSyntax Access(this ValueBridge identifier, VariableBridge accessed) => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, identifier, accessed);
public static MemberAccessExpressionSyntax Access(this string identifier, VariableBridge accessed) => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(identifier), accessed);
public static VariableDeclarationSyntax VariableCreation(VariableBridge name, TypeSyntax type) => SyntaxFactory.VariableDeclaration(type, SyntaxFactory.SeparatedList(new [] { SyntaxFactory.VariableDeclarator(name) }));
private static VariableBridge KnownSourceSize(RewriteDesign design, ValueBridge currentLength, VariableBridge resultVariable, int enlarging) { var logVariable = CreateGlobalVariable(design, Int, "LinqRewrite".Access("Core", "IntExtensions", "Log2") .Invoke(Parenthesize(design.SourceSize).Cast(SyntaxKind.UIntKeyword)) - Constants.MinArraySizeLog); if (enlarging != 1) { design.PreUseAdd(logVariable.Assign( SyntaxFactory.ConditionalExpression(logVariable.GThan(enlarging), logVariable - logVariable % enlarging, IntValue(enlarging)))); } else { design.PreUseAdd(logVariable.Assign( SyntaxFactory.ConditionalExpression(logVariable.GThan(1), logVariable, IntValue(1)))); } var currentLengthVariable = CreateGlobalVariable(design, Int, currentLength); design.ForAdd(If(design.Indexer >= currentLengthVariable, "LinqRewrite".Access("Core", "EnlargeExtensions", "LogEnlargeArray") .Invoke(enlarging, design.SourceSize, RefArg(resultVariable), RefArg(logVariable), OutArg(currentLengthVariable)))); design.ForAdd(resultVariable[design.Indexer].Assign(design.LastValue)); return(resultVariable); }
public static VariableBridge RewriteOther(RewriteDesign design, ValueBridge currentLength, VariableBridge resultVariable, int enlarging) { if (design.ResultSize != null) { return(KnownSize(design, resultVariable)); } if (design.SourceSize != null) { return(KnownSourceSize(design, currentLength, resultVariable, enlarging)); } return(UnknownSourceSize(design, currentLength, resultVariable, enlarging)); }
private static VariableBridge UnknownSourceSize(RewriteDesign design, ValueBridge currentLength, VariableBridge resultVariable, int enlarging) { var currentLengthVariable = CreateGlobalVariable(design, Int, currentLength); design.ForAdd(If(design.Indexer >= currentLengthVariable, "LinqRewrite".Access("Core", "EnlargeExtensions", "LogEnlargeArray") .Invoke(enlarging, RefArg(resultVariable), RefArg(currentLengthVariable)))); design.ForAdd(resultVariable[design.Indexer].Assign(design.LastValue)); return(resultVariable); }