public void FormatGraphsAsBlocks(StringBuilder sb, IEnumerable <ICfgNode> trees, int indent) { var counter = new CountEventsVisitor(); bool first = true; bool lastWasTrivial = false; foreach (var tree in trees) { if (!first) { sb.AppendLine(); } tree.Accept(counter); var eventCount = counter.Count; counter.Reset(); if (eventCount > 1) { if (lastWasTrivial) { sb.AppendLine(); } sb.AppendLine("{"); var visitor = new FormatScriptVisitor(sb) { PrettyPrint = true, IndentLevel = indent, Formatter = this }; visitor.IndentLevel += visitor.TabSize; tree.Accept(visitor); sb.AppendLine(); sb.AppendLine("}"); lastWasTrivial = false; } else { sb.Append("{ "); var visitor = new FormatScriptVisitor(sb) { PrettyPrint = false }; tree.Accept(visitor); sb.Append(" }"); lastWasTrivial = true; } first = false; } }
static void TestRoundTrip <T>( string source, ICfgNode expected, TokenListParser <ScriptToken, T> parser, bool pretty = false) where T : ICfgNode { var parsed = TestParse(source, expected, parser); var visitor = new FormatScriptVisitor { PrettyPrint = pretty, WrapStatements = false }; parsed.Accept(visitor); Assert.Equal(source, visitor.Code); }
protected override ICfgNode Build(Statement statement) { var sb = new StringBuilder(); var formatter = new FormatScriptVisitor(sb); statement.Head.Accept(formatter); foreach (var part in statement.Parameters) { sb.Append(' '); part.Accept(formatter); } var e = Event.Parse(formatter.Code); if (e == null) { throw new InvalidOperationException($"Could not parse \"{formatter.Code}\" as an event"); } return(Emit.Event(e)); }