public override AstNode ShallowClone() { var res = new AstSequence(Source, Start, End); res.Expressions.AddRange(Expressions.AsReadOnlySpan()); return(res); }
private int GenerateSequence(AstSequence ast) { var temp = SP; var list = ast.BodyExpression; foreach (var val in list) { temp = Generate(val.AsAST()); } return(temp); }
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 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); } }