Пример #1
0
        protected virtual void VisitStack(IStackModel stack, HashSet <IStackModel> visitedStacks, HashSet <INodeModel> visitedNodes)
        {
            visitedStacks.Add(stack);

            // instance/data ports on stacks
            foreach (var inputPortModel in stack.InputPorts)
            {
                if (inputPortModel.PortType != PortType.Execution &&
                    inputPortModel.Connected)
                {
                    bool any = false;
                    foreach (var connectionPortModel in inputPortModel.ConnectionPortModels)
                    {
                        if (!visitedNodes.Contains(connectionPortModel.NodeModel))
                        {
                            VisitNode(connectionPortModel.NodeModel, visitedNodes);
                        }

                        any = true;
                        stack.OnConnection(inputPortModel, connectionPortModel);
                    }

                    if (!any)
                    {
                        stack.OnConnection(inputPortModel, null);
                    }
                }
            }

            // Still not visiting variable parameters...
            if (stack is IHasVariableDeclaration hasVariableDeclaration)
            {
                foreach (var variableDeclaration in hasVariableDeclaration.VariableDeclarations)
                {
                    VisitVariableDeclaration(variableDeclaration);
                }
            }

            foreach (INodeModel nodeModel in stack.NodeModels)
            {
                VisitNode(nodeModel, visitedNodes);
            }

            foreach (StackBaseModel connectedStack in RoslynTranslator.GetConnectedStacks(stack))
            {
                if (connectedStack == null || visitedStacks.Contains(connectedStack))
                {
                    continue;
                }
                VisitStack(connectedStack, visitedStacks, visitedNodes);
            }
        }