private static void Execute(CompilerState state, Element element) { if (BlockElement(element)) { state.Blocks.Push(); } foreach (var inline in element.Children) { Execute(state, inline); } var obj = state.Execute(element, state.Blocks.Current.Objects.ToArray()); if (BlockElement(element)) { state.Blocks.Pop(); } if (obj != null) { // basically pass the returned object to the previous environment var flattened = obj.Flatten(); if (IsEnvironmentArgument(element)) { flattened = new Argument[] { new Argument(element, flattened) }; } state.Blocks.Current.Objects.AddRange(flattened); } }
private static IEnumerable <DocumentElement> Execute(CompilerState state, SyntaxNode element) { var obj = state.Execute(element); var elements = new List <DocumentElement>(); if (obj != null) { var flattened = obj.Flatten(); return(flattened.Select(e => e.Value).OfType <DocumentElement>()); } else { return(Array.Empty <DocumentElement>()); } }