Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
    }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
        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;
                }
            });
        }
Exemplo n.º 5
0
 public static AssignmentExpressionSyntax AddAssign(this VariableBridge a, ValueBridge b)
 => AssignmentExpression(SyntaxKind.AddAssignmentExpression, a, b);
Exemplo n.º 6
0
 public static AssignmentExpressionSyntax SubAssign(this VariableBridge a, ValueBridge b)
 => AssignmentExpression(SyntaxKind.SubtractAssignmentExpression, a, b);
Exemplo n.º 7
0
 public static MemberAccessExpressionSyntax Access(this ValueBridge identifier, VariableBridge accessed)
 => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, identifier, accessed);
Exemplo n.º 8
0
 public static MemberAccessExpressionSyntax Access(this string identifier, VariableBridge accessed)
 => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(identifier), accessed);
Exemplo n.º 9
0
 public static VariableDeclarationSyntax VariableCreation(VariableBridge name, TypeSyntax type)
 => SyntaxFactory.VariableDeclaration(type,
                                      SyntaxFactory.SeparatedList(new [] { SyntaxFactory.VariableDeclarator(name) }));
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
 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));
 }
Exemplo n.º 12
0
        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);
        }