Exemple #1
0
    public override AstNode ShallowClone()
    {
        var res = new AstSequence(Source, Start, End);

        res.Expressions.AddRange(Expressions.AsReadOnlySpan());
        return(res);
    }
Exemple #2
0
        private int GenerateSequence(AstSequence ast)
        {
            var temp = SP;
            var list = ast.BodyExpression;

            foreach (var val in list)
            {
                temp = Generate(val.AsAST());
            }
            return(temp);
        }
Exemple #3
0
        AstNode InstrumentExpression(AstNode node)
        {
            if (node is AstSequence)
            {
                return(node);
            }
            if (node.Source == null)
            {
                return(node);
            }
            var res  = new AstSequence(node);
            var idx  = _owner.LastIndex++;
            var call = new AstCall(new AstSymbolRef(_owner.FncNameStatement));

            call.Args.Add(new AstNumber(idx));
            res.Expressions.Add(call);
            res.Expressions.Add(node);
            _owner.GetForFile(node.Source)
            .AddInfo(new InstrumentedInfo(InstrumentedInfoType.Statement, idx, node.Start, node.End));
            return(res);
        }
Exemple #4
0
    void InstrumentFunction(AstLambda lambda)
    {
        if (lambda is AstArrow arrow)
        {
            if (arrow.Body.Count == 1 && arrow.Body.Last.IsExpression())
            {
                var original = arrow.Body[0];
                arrow.Body[0] = new AstBlock(original)
                {
                    Body = new() { new AstReturn(original)
                                   {
                                       Value = original
                                   } }
                };
            }
        }
        if (lambda.Source == null)
        {
            InstrumentBlock(ref lambda.Body);
            return;
        }

        var idx  = _owner.LastIndex++;
        var call = new AstCall(new AstSymbolRef(_owner.FncNameStatement));

        call.Args.Add(new AstNumber(idx));
        lambda.Body.Insert(0) = new AstSimpleStatement(call);
        _owner.GetForFile(lambda.Source)
        .AddInfo(new InstrumentedInfo(InstrumentedInfoType.Function, idx, lambda.Start, lambda.End));
        var input = new StructList <AstNode>();

        input.TransferFrom(ref lambda.Body);
        lambda.Body.Reserve(input.Count * 2 - 1);
        lambda.Body.Add(input[0]);
        for (var i = 1; i < input.Count; i++)
        {
            var ii = input[i];
            if (ShouldStatementCover(ii))
            {
                if (i != 1)
                {
                    idx  = _owner.LastIndex++;
                    call = new AstCall(new AstSymbolRef(_owner.FncNameStatement));
                    call.Args.Add(new AstNumber(idx));
                    lambda.Body.Add(new AstSimpleStatement(call));
                }

                _owner.GetForFile(ii.Source !)
                .AddInfo(new InstrumentedInfo(InstrumentedInfoType.Statement, idx, ii.Start, ii.End));
            }

            ii = Transform(ii);
            lambda.Body.Add(ii);
        }
    }

    AstNode InstrumentExpression(AstNode node)
    {
        if (node is AstSequence)
        {
            return(node);
        }
        if (node.Source == null)
        {
            return(node);
        }
        var res  = new AstSequence(node);
        var idx  = _owner.LastIndex++;
        var call = new AstCall(new AstSymbolRef(_owner.FncNameStatement));

        call.Args.Add(new AstNumber(idx));
        res.Expressions.Add(call);
        res.Expressions.Add(node);
        _owner.GetForFile(node.Source)
        .AddInfo(new InstrumentedInfo(InstrumentedInfoType.Statement, idx, node.Start, node.End));
        return(res);
    }

    void InstrumentBlock(ref StructList <AstNode> block, bool seq = false)
    {
        var input = new StructList <AstNode>();

        input.TransferFrom(ref block);
        block.Reserve(input.Count * 2);
        for (var i = 0; i < input.Count; i++)
        {
            var ii = input[i];
            if (ShouldStatementCover(ii))
            {
                var idx  = _owner.LastIndex++;
                var call = new AstCall(new AstSymbolRef(_owner.FncNameStatement));
                call.Args.Add(new AstNumber(idx));
                if (seq)
                {
                    block.Add(call);
                }
                else
                {
                    block.Add(new AstSimpleStatement(call));
                }

                _owner.GetForFile(ii.Source !)
                .AddInfo(new InstrumentedInfo(InstrumentedInfoType.Statement, idx, ii.Start, ii.End));
            }

            ii = Transform(ii);
            block.Add(ii);
        }
    }