private void GenerateLines(List <Node> nodes)
    {
        for (int i = 0; i < nodes.Count; i++)
        {
            var node = nodes[i];
            if (node is IfNode)
            {
                IfNode ifNode = node as IfNode;

                if (ifNode.TrueNodes.Any())
                {
                    ifNode.GetExitPoint("True").SetTarget(ifNode.TrueNodes.First(), null, null);
                }
                if (ifNode.FalseNodes.Any())
                {
                    ifNode.GetExitPoint("False").SetTarget(ifNode.FalseNodes.First(), null, null);
                }

                GenerateLines(ifNode.TrueNodes);
                GenerateLines(ifNode.FalseNodes);
                if (i < nodes.Count - 1)
                {
                    ifNode.GetExitPoint("Exit").SetTarget(nodes[i + 1].GetFirst(), null, null);
                }
            }
            else if (node is WhileNode)
            {
                WhileNode whileNode = node as WhileNode;
                if (!whileNode.Repeat)
                {
                    whileNode.GetExitPoint("Start").SetTarget(whileNode.children.First(), null, null);
                }
                GenerateLines(whileNode.children);
                whileNode.children.Last().GetExitPoint(whileNode.Repeat ? "Start" : "Exit").SetTarget(whileNode.GetFirst(), whileNode.Repeat ? null : whileNode, null);
                if (i < nodes.Count - 1)
                {
                    if (!whileNode.Repeat)
                    {
                        whileNode.GetExitPoint("Exit").SetTarget(nodes[i + 1].GetFirst(), whileNode, null);
                    }
                    else
                    {
                        whileNode.children.Last().GetExitPoint("Exit").SetTarget(nodes[i + 1].GetFirst(), null, null);
                    }
                }
            }
            else if (node is ForNode)
            {
                ForNode forNode = node as ForNode;
                forNode.GetExitPoint("Start").SetTarget(forNode.children.First(), null, null);
                GenerateLines(forNode.children);
                var last = forNode.children.Last();
                last.GetExitPoint("Exit").SetTarget(forNode, forNode, last, "Loop");
                if (i < nodes.Count - 1)
                {
                    forNode.GetExitPoint("Exit").SetTarget(nodes[i + 1].GetFirst(), forNode, null);
                }
            }
            else if (node is FunctionNode)
            {
                FunctionNode fNode = node as FunctionNode;
                fNode.GetExitPoint("Start").SetTarget(fNode.children.First(), null, null);
                GenerateLines(fNode.children);
            }
            else /*if (node is CodeNode || node is BeginEndNode || node is Node)*/
            {
                if (node is CodeNode)
                {
                    var cNode = node as CodeNode;
                    while (cNode.Text.EndsWith("\r\n"))
                    {
                        cNode.Text = cNode.Text.Substring(0, cNode.Text.Length - 2);
                    }
                }
                if (i < nodes.Count - 1)
                {
                    node.GetExitPoint("Exit").SetTarget(nodes[i + 1].GetFirst(), null, null);
                }
            }
        }
    }