2023-10-31 11:47:27 -04:00

95 lines
2.7 KiB
C#
Executable File

using dotless.Core.Parser.Tree;
namespace dotless.Core.Utils
{
using System.Collections.Generic;
using Parser.Infrastructure;
using Parser.Infrastructure.Nodes;
internal class NodeHelper
{
public static void ExpandNodes<TNode>(Env env, NodeList rules)
where TNode : Node
{
for (var i = 0; i < rules.Count; i++)
{
var node = rules[i];
if (node is TNode)
{
var evaluated = node.Evaluate(env);
var nodes = evaluated as IEnumerable<Node>;
if (nodes != null)
{
rules.InsertRange(i + 1, nodes);
rules.RemoveAt(i);
i--;
}
else
{
rules[i] = evaluated;
}
}
}
}
public static void RecursiveExpandNodes<TNode>(Env env, Ruleset parentRuleset)
where TNode : Node
{
env.Frames.Push(parentRuleset);
for (var i = 0; i < parentRuleset.Rules.Count; i++)
{
var node = parentRuleset.Rules[i];
if (node is TNode)
{
var evaluated = node.Evaluate(env);
var nodes = evaluated as IEnumerable<Node>;
if (nodes != null)
{
parentRuleset.Rules.InsertRange(i + 1, nodes);
parentRuleset.Rules.RemoveAt(i);
i--;
}
else
{
parentRuleset.Rules[i] = evaluated;
}
}
else
{
var ruleset = node as Ruleset;
if (ruleset != null && ruleset.Rules != null)
{
RecursiveExpandNodes<TNode>(env, ruleset);
}
}
}
env.Frames.Pop();
}
public static IEnumerable<Node> NonDestructiveExpandNodes<TNode>(Env env, NodeList rules)
where TNode : Node
{
foreach (var node in rules)
{
if (node is TNode)
{
var expandedNodes = (IEnumerable<Node>)node.Evaluate(env);
foreach (var expandedNode in expandedNodes)
{
yield return expandedNode;
}
}
else
{
yield return node;
}
}
}
}
}