Example #1
0
        /// <summary>
        /// Compile a collection of NodeModel to AST nodes in different contexts.
        /// If the context is ForNodeToCode, nodes should already be sorted in
        /// topological order.
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="context"></param>
        /// <param name="verboseLogging"></param>
        /// <returns></returns>
        public IEnumerable <Tuple <NodeModel, IEnumerable <AssociativeNode> > > CompileToAstNodes(
            IEnumerable <NodeModel> nodes,
            CompilationContext context,
            bool verboseLogging)
        {
            if (nodes == null)
            {
                throw new ArgumentNullException("nodes");
            }

            var topScopedNodes = ScopedNodeModel.GetNodesInTopScope(nodes);

            IEnumerable <NodeModel> sortedNodes = null;

            // Node should already be sorted!
            if (context == CompilationContext.NodeToCode)
            {
                sortedNodes = topScopedNodes;
            }
            else
            {
                sortedNodes = TopologicalSort(topScopedNodes);
            }

            if (context == CompilationContext.DeltaExecution)
            {
                sortedNodes = sortedNodes.Where(n => n.IsModified);
            }

            var result = new List <List <AssociativeNode> >();

            foreach (NodeModel node in sortedNodes)
            {
                var astNodes = new List <AssociativeNode>();
                CompileToAstNodes(node, astNodes, context, verboseLogging);
                result.Add(astNodes);
            }

            return(result.Zip(
                       sortedNodes,
                       (astNodes, node) => Tuple.Create(node, astNodes as IEnumerable <AssociativeNode>)));
        }
Example #2
0
        /// <summary>
        ///     Compiling a collection of Dynamo nodes to AST nodes, no matter
        ///     whether Dynamo node has been compiled or not.
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="isDeltaExecution"></param>
        public List <AssociativeNode> CompileToAstNodes(IEnumerable <NodeModel> nodes, bool isDeltaExecution)
        {
            // TODO: compile to AST nodes should be triggered after a node is
            // modified.

            var topScopedNodes = ScopedNodeModel.GetNodesInTopScope(nodes);
            var sortedNodes    = TopologicalSort(topScopedNodes);

            if (isDeltaExecution)
            {
                foreach (var node in sortedNodes)
                {
                    var scopedNode = node as ScopedNodeModel;
                    if (scopedNode != null)
                    {
                        var dirtyInScopeNodes = scopedNode.GetInScopeNodes(false).Where(n => n.RequiresRecalc || n.ForceReExecuteOfNode);
                        scopedNode.RequiresRecalc = dirtyInScopeNodes.Any();
                        foreach (var dirtyNode in dirtyInScopeNodes)
                        {
                            dirtyNode.RequiresRecalc = false;
                        }
                    }
                }

                sortedNodes = sortedNodes.Where(n => n.RequiresRecalc || n.ForceReExecuteOfNode);
            }

            var result = new List <AssociativeNode>();

            foreach (NodeModel node in sortedNodes)
            {
                _CompileToAstNodes(node, result, isDeltaExecution);

                if (isDeltaExecution)
                {
                    node.RequiresRecalc = false;
                }
            }

            return(result);
        }
Example #3
0
        /// <summary>
        ///     Compiling a collection of Dynamo nodes to AST nodes, no matter
        ///     whether Dynamo node has been compiled or not.
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="isDeltaExecution"></param>
        /// <param name="verboseLogging"></param>
        public List <AssociativeNode> CompileToAstNodes(IEnumerable <NodeModel> nodes, bool isDeltaExecution, bool verboseLogging)
        {
            // TODO: compile to AST nodes should be triggered after a node is
            // modified.

            var topScopedNodes = ScopedNodeModel.GetNodesInTopScope(nodes);
            var sortedNodes    = TopologicalSort(topScopedNodes);

            if (isDeltaExecution)
            {
                sortedNodes = sortedNodes.Where(n => n.IsModified);
            }

            var result = new List <AssociativeNode>();

            foreach (NodeModel node in sortedNodes)
            {
                _CompileToAstNodes(node, result, isDeltaExecution, verboseLogging);
            }

            return(result);
        }