コード例 #1
0
        // Select the SyntaxNode / SyntaxToken / SyntaxTrivia whose span best matches the supplied span.
        private TreeViewItem NavigateToBestMatch(TreeViewItem current, TextSpan span, string kind = null)
        {
            TreeViewItem match = null;

            if (current != null)
            {
                SyntaxTag currentTag = (SyntaxTag)current.Tag;
                if (currentTag.FullSpan.Contains(span))
                {
                    if (currentTag.Span == span || currentTag.FullSpan == span)
                    {
                        if (kind == null)
                        {
                            CollapseEverythingBut(current);
                            match = current;
                        }
                        else if (currentTag.Kind == kind)
                        {
                            CollapseEverythingBut(current);
                            match = current;
                        }
                    }
                    else
                    {
                        CollapseEverythingBut(current);

                        foreach (TreeViewItem item in current.Items)
                        {
                            match = NavigateToBestMatch(item, span, kind);
                            if (match != null)
                            {
                                break;
                            }
                        }

                        if (match == null)
                        {
                            if (kind == null)
                            {
                                match = current;
                            }
                            else if (currentTag.Kind == kind)
                            {
                                match = current;
                            }
                        }
                    }
                }
            }

            return(match);
        }
コード例 #2
0
        private void AddTrivia(TreeViewItem parentItem, SyntaxTrivia trivia, bool isLeadingTrivia)
        {
            var kind = trivia.GetKind();
            var tag = new SyntaxTag()
            {
                SyntaxTrivia = trivia,
                Category = SyntaxCategory.SyntaxTrivia,
                Span = trivia.Span,
                FullSpan = trivia.FullSpan,
                Kind = kind,
                ParentItem = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag = tag,
                IsExpanded = false,
                Foreground = Brushes.Maroon,
                Background = trivia.ContainsDiagnostics ? Brushes.Pink : Brushes.White,
                Header = (isLeadingTrivia ? "Lead: " : "Trail: ") + tag.Kind + " " + trivia.Span.ToString()
            };

            if (SyntaxTree != null && trivia.ContainsDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(trivia))
                {
                    item.ToolTip += diagnostic.ToString() + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                _isNavigatingFromTreeToSource = true;

                typeTextLabel.Visibility = Visibility.Visible;
                kindTextLabel.Visibility = Visibility.Visible;
                typeValueLabel.Content = trivia.GetType().Name;
                kindValueLabel.Content = kind;
                _propertyGrid.SelectedObject = trivia;

                item.IsExpanded = true;

                if (!_isNavigatingFromSourceToTree && SyntaxTriviaNavigationToSourceRequested != null)
                {
                    SyntaxTriviaNavigationToSourceRequested(trivia);
                }

                _isNavigatingFromTreeToSource = false;
                e.Handled = true;
            });

            item.Expanded += new RoutedEventHandler((sender, e) =>
            {
                if (item.Items.Count == 1 && item.Items[0] == null)
                {
                    // Remove placeholder child and populate real children.
                    item.Items.RemoveAt(0);
                    AddNode(item, trivia.GetStructure());
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
                typeTextLabel.Visibility = Visibility.Hidden;
                kindTextLabel.Visibility = Visibility.Hidden;
                typeValueLabel.Content = string.Empty;
                kindValueLabel.Content = string.Empty;
            }
            else
            {
                parentItem.Items.Add(item);
            }

            if (trivia.HasStructure)
            {
                if (IsLazy)
                {
                    // Add placeholder child to indicate that real children need to be populated on expansion.
                    item.Items.Add(null);
                }
                else
                {
                    // Recursively populate all descendants.
                    AddNode(item, trivia.GetStructure());
                }
            }
        }
コード例 #3
0
        private void AddNode(TreeViewItem parentItem, SyntaxNode node)
        {
            var kind = node.GetKind();
            var tag = new SyntaxTag()
            {
                SyntaxNode = node,
                Category = SyntaxCategory.SyntaxNode,
                Span = node.Span,
                FullSpan = node.FullSpan,
                Kind = kind,
                ParentItem = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag = tag,
                IsExpanded = false,
                Foreground = Brushes.Blue,
                Background = node.ContainsDiagnostics ? Brushes.Pink : Brushes.White,
                Header = tag.Kind + " " + node.Span.ToString()
            };

            if (SyntaxTree != null && node.ContainsDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(node))
                {
                    item.ToolTip += diagnostic.ToString() + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                _isNavigatingFromTreeToSource = true;

                typeTextLabel.Visibility = Visibility.Visible;
                kindTextLabel.Visibility = Visibility.Visible;
                typeValueLabel.Content = node.GetType().Name;
                kindValueLabel.Content = kind;
                _propertyGrid.SelectedObject = node;

                item.IsExpanded = true;

                if (!_isNavigatingFromSourceToTree && SyntaxNodeNavigationToSourceRequested != null)
                {
                    SyntaxNodeNavigationToSourceRequested(node);
                }

                _isNavigatingFromTreeToSource = false;
                e.Handled = true;
            });

            item.Expanded += new RoutedEventHandler((sender, e) =>
            {
                if (item.Items.Count == 1 && item.Items[0] == null)
                {
                    // Remove placeholder child and populate real children.
                    item.Items.RemoveAt(0);
                    foreach (var child in node.ChildNodesAndTokens())
                    {
                        AddNodeOrToken(item, child);
                    }
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
            }
            else
            {
                parentItem.Items.Add(item);
            }

            if (node.ChildNodesAndTokens().Count > 0)
            {
                if (IsLazy)
                {
                    // Add placeholder child to indicate that real children need to be populated on expansion.
                    item.Items.Add(null);
                }
                else
                {
                    // Recursively populate all descendants.
                    foreach (var child in node.ChildNodesAndTokens())
                    {
                        AddNodeOrToken(item, child);
                    }
                }
            }
        }
コード例 #4
0
        private void AddTrivia(TreeViewItem parentItem, SyntaxTrivia trivia, bool isLeadingTrivia)
        {
            var kind = trivia.GetKind();
            var tag  = new SyntaxTag()
            {
                SyntaxTrivia = trivia,
                Category     = SyntaxCategory.SyntaxTrivia,
                Span         = trivia.Span,
                FullSpan     = trivia.FullSpan,
                Kind         = kind,
                ParentItem   = parentItem
            };

            var item = CreateTreeViewItem(tag, (isLeadingTrivia ? "Lead: " : "Trail: ") + tag.Kind + " " + trivia.Span.ToString(), trivia.ContainsDiagnostics);

            item.SetResourceReference(ForegroundProperty, SyntaxTriviaTextBrushKey);

            if (SyntaxTree != null && trivia.ContainsDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(trivia))
                {
                    item.ToolTip += diagnostic.ToString() + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                _isNavigatingFromTreeToSource = true;

                typeTextLabel.Visibility     = Visibility.Visible;
                kindTextLabel.Visibility     = Visibility.Visible;
                typeValueLabel.Content       = trivia.GetType().Name;
                kindValueLabel.Content       = kind;
                _propertyGrid.SelectedObject = trivia;

                item.IsExpanded = true;

                if (!_isNavigatingFromSourceToTree && SyntaxTriviaNavigationToSourceRequested != null)
                {
                    SyntaxTriviaNavigationToSourceRequested(trivia);
                }

                _isNavigatingFromTreeToSource = false;
                e.Handled = true;
            });

            item.Expanded += new RoutedEventHandler((sender, e) =>
            {
                if (item.Items.Count == 1 && item.Items[0] == null)
                {
                    // Remove placeholder child and populate real children.
                    item.Items.RemoveAt(0);
                    AddNode(item, trivia.GetStructure());
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
                typeTextLabel.Visibility = Visibility.Hidden;
                kindTextLabel.Visibility = Visibility.Hidden;
                typeValueLabel.Content   = string.Empty;
                kindValueLabel.Content   = string.Empty;
            }
            else
            {
                parentItem.Items.Add(item);
            }

            if (trivia.HasStructure)
            {
                if (IsLazy)
                {
                    // Add placeholder child to indicate that real children need to be populated on expansion.
                    item.Items.Add(null);
                }
                else
                {
                    // Recursively populate all descendants.
                    AddNode(item, trivia.GetStructure());
                }
            }
        }
コード例 #5
0
        private void AddNode(TreeViewItem parentItem, SyntaxNode node)
        {
            var kind = node.GetKind();
            var tag  = new SyntaxTag()
            {
                SyntaxNode = node,
                Category   = SyntaxCategory.SyntaxNode,
                Span       = node.Span,
                FullSpan   = node.FullSpan,
                Kind       = kind,
                ParentItem = parentItem
            };

            var item = CreateTreeViewItem(tag, tag.Kind + " " + node.Span.ToString(), node.ContainsDiagnostics);

            item.SetResourceReference(ForegroundProperty, SyntaxNodeTextBrushKey);

            if (SyntaxTree != null && node.ContainsDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(node))
                {
                    item.ToolTip += diagnostic.ToString() + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                _isNavigatingFromTreeToSource = true;

                typeTextLabel.Visibility     = Visibility.Visible;
                kindTextLabel.Visibility     = Visibility.Visible;
                typeValueLabel.Content       = node.GetType().Name;
                kindValueLabel.Content       = kind;
                _propertyGrid.SelectedObject = node;

                item.IsExpanded = true;

                if (!_isNavigatingFromSourceToTree && SyntaxNodeNavigationToSourceRequested != null)
                {
                    SyntaxNodeNavigationToSourceRequested(node);
                }

                _isNavigatingFromTreeToSource = false;
                e.Handled = true;
            });

            item.Expanded += new RoutedEventHandler((sender, e) =>
            {
                if (item.Items.Count == 1 && item.Items[0] == null)
                {
                    // Remove placeholder child and populate real children.
                    item.Items.RemoveAt(0);
                    foreach (var child in node.ChildNodesAndTokens())
                    {
                        AddNodeOrToken(item, child);
                    }
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
            }
            else
            {
                parentItem.Items.Add(item);
            }

            if (node.ChildNodesAndTokens().Count > 0)
            {
                if (IsLazy)
                {
                    // Add placeholder child to indicate that real children need to be populated on expansion.
                    item.Items.Add(null);
                }
                else
                {
                    // Recursively populate all descendants.
                    foreach (var child in node.ChildNodesAndTokens())
                    {
                        AddNodeOrToken(item, child);
                    }
                }
            }
        }
コード例 #6
0
        private void AddTrivia(TreeViewItem parentItem, CommonSyntaxTrivia trivia, bool isLeadingTrivia)
        {
            var kind = trivia.GetKind(SourceLanguage);
            var tag = new SyntaxTag()
            {
                SyntaxTrivia = trivia,
                IsSyntaxNode = false,
                IsSyntaxToken = false,
                IsSyntaxTrivia = true,
                Span = trivia.Span,
                FullSpan = trivia.FullSpan,
                Kind = kind,
                ParentItem = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag = tag,
                IsExpanded = true,
                Foreground = Brushes.Maroon,
                Background = trivia.HasDiagnostics ? Brushes.Pink : Brushes.White,
                Header = (isLeadingTrivia ? "Lead: " : "Trail: ") + tag.Kind + " " + trivia.Span.ToString()
            };

            if (trivia.HasDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(trivia))
                {
                    item.ToolTip += diagnostic.ToString(null) + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                if (!e.Handled)
                {
                    isNavigatingFromTreeToSource = true;

                    typeTextLabel.Visibility = Visibility.Visible;
                    kindTextLabel.Visibility = Visibility.Visible;
                    typeValueLabel.Content = trivia.GetType().Name;
                    kindValueLabel.Content = kind;
                    propertyGrid.SelectedObject = trivia;

                    // If IsLazy is true then populate only child items.
                    if (IsLazy && item.Items.Count == 0 && trivia.HasStructure)
                    {
                        AddNode(item, trivia.GetStructure());
                    }

                    item.IsExpanded = true;

                    if (!isNavigatingFromSourceToTree && SyntaxTriviaNavigationToSourceRequested != null)
                    {
                        SyntaxTriviaNavigationToSourceRequested(trivia);
                    }

                    isNavigatingFromTreeToSource = false;
                    e.Handled = true;
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
                typeTextLabel.Visibility = Visibility.Hidden;
                kindTextLabel.Visibility = Visibility.Hidden;
                typeValueLabel.Content = string.Empty;
                kindValueLabel.Content = string.Empty;
            }
            else
            {
                parentItem.Items.Add(item);
            }

            // If IsLazy is false then recursively populate all descendent items.
            if (!IsLazy && trivia.HasStructure)
            {
                AddNode(item, trivia.GetStructure());
            }
        }
コード例 #7
0
        private void AddNode(TreeViewItem parentItem, CommonSyntaxNode node)
        {
            var kind = node.GetKind(SourceLanguage);
            var tag = new SyntaxTag()
            {
                SyntaxNode = node,
                IsSyntaxNode = true,
                IsSyntaxToken = false,
                IsSyntaxTrivia = false,
                Span = node.Span,
                FullSpan = node.FullSpan,
                Kind = kind,
                ParentItem = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag = tag,
                IsExpanded = true,
                Foreground = Brushes.Blue,
                Background = node.HasDiagnostics ? Brushes.Pink : Brushes.White,
                Header = tag.Kind + " " + node.Span.ToString()
            };

            if (node.HasDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(node))
                {
                    item.ToolTip += diagnostic.ToString(null) + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                if (!e.Handled)
                {
                    isNavigatingFromTreeToSource = true;

                    typeTextLabel.Visibility = Visibility.Visible;
                    kindTextLabel.Visibility = Visibility.Visible;
                    typeValueLabel.Content = node.GetType().Name;
                    kindValueLabel.Content = kind;
                    propertyGrid.SelectedObject = node;

                    // If IsLazy is true then populate only child items.
                    if (IsLazy && item.Items.Count == 0 && node.HasChildren)
                    {
                        foreach (var child in node.ChildNodesAndTokens())
                        {
                            AddNodeOrToken(item, child);
                        }
                    }

                    item.IsExpanded = true;

                    if (!isNavigatingFromSourceToTree && SyntaxNodeNavigationToSourceRequested != null)
                    {
                        SyntaxNodeNavigationToSourceRequested(node);
                    }

                    isNavigatingFromTreeToSource = false;
                    e.Handled = true;
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
            }
            else
            {
                parentItem.Items.Add(item);
            }

            // If IsLazy is false then recursively populate all descendent items.
            if (!IsLazy && node.HasChildren)
            {
                foreach (var child in node.ChildNodesAndTokens())
                {
                    AddNodeOrToken(item, child);
                }
            }
        }
コード例 #8
0
        private void AddToken(TreeViewItem parentItem, SyntaxToken token)
        {
            var kind = token.GetKind();
            var tag  = new SyntaxTag()
            {
                SyntaxToken = token,
                Category    = SyntaxCategory.SyntaxToken,
                Span        = token.Span,
                FullSpan    = token.FullSpan,
                Kind        = kind,
                ParentItem  = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag        = tag,
                IsExpanded = false,
                Foreground = Brushes.DarkGreen,
                Background = token.ContainsDiagnostics ? Brushes.Pink : Brushes.White,
                Header     = tag.Kind + " " + token.Span.ToString()
            };

            if (SyntaxTree != null && token.ContainsDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(token))
                {
                    item.ToolTip += diagnostic.ToString() + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                _isNavigatingFromTreeToSource = true;

                typeTextLabel.Visibility     = Visibility.Visible;
                kindTextLabel.Visibility     = Visibility.Visible;
                typeValueLabel.Content       = token.GetType().Name;
                kindValueLabel.Content       = kind;
                _propertyGrid.SelectedObject = token;

                item.IsExpanded = true;

                if (!_isNavigatingFromSourceToTree && SyntaxTokenNavigationToSourceRequested != null)
                {
                    SyntaxTokenNavigationToSourceRequested(token);
                }

                _isNavigatingFromTreeToSource = false;
                e.Handled = true;
            });

            item.Expanded += new RoutedEventHandler((sender, e) =>
            {
                if (item.Items.Count == 1 && item.Items[0] == null)
                {
                    // Remove placeholder child and populate real children.
                    item.Items.RemoveAt(0);
                    foreach (var trivia in token.LeadingTrivia)
                    {
                        AddTrivia(item, trivia, true);
                    }

                    foreach (var trivia in token.TrailingTrivia)
                    {
                        AddTrivia(item, trivia, false);
                    }
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
            }
            else
            {
                parentItem.Items.Add(item);
            }

            if (token.HasLeadingTrivia || token.HasTrailingTrivia)
            {
                if (IsLazy)
                {
                    // Add placeholder child to indicate that real children need to be populated on expansion.
                    item.Items.Add(null);
                }
                else
                {
                    // Recursively populate all descendants.
                    foreach (var trivia in token.LeadingTrivia)
                    {
                        AddTrivia(item, trivia, true);
                    }

                    foreach (var trivia in token.TrailingTrivia)
                    {
                        AddTrivia(item, trivia, false);
                    }
                }
            }
        }
コード例 #9
0
        private void AddTrivia(TreeViewItem parentItem, CommonSyntaxTrivia trivia, bool isLeadingTrivia)
        {
            var kind = trivia.GetKind(SourceLanguage);
            var tag  = new SyntaxTag()
            {
                SyntaxTrivia   = trivia,
                IsSyntaxNode   = false,
                IsSyntaxToken  = false,
                IsSyntaxTrivia = true,
                Span           = trivia.Span,
                FullSpan       = trivia.FullSpan,
                Kind           = kind,
                ParentItem     = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag        = tag,
                IsExpanded = true,
                Foreground = Brushes.Maroon,
                Background = trivia.HasDiagnostics ? Brushes.Pink : Brushes.White,
                Header     = (isLeadingTrivia ? "Lead: " : "Trail: ") + tag.Kind + " " + trivia.Span.ToString()
            };

            if (trivia.HasDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(trivia))
                {
                    item.ToolTip += diagnostic.ToString(null) + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                if (!e.Handled)
                {
                    isNavigatingFromTreeToSource = true;

                    typeTextLabel.Visibility    = Visibility.Visible;
                    kindTextLabel.Visibility    = Visibility.Visible;
                    typeValueLabel.Content      = trivia.GetType().Name;
                    kindValueLabel.Content      = kind;
                    propertyGrid.SelectedObject = trivia;

                    // If IsLazy is true then populate only child items.
                    if (IsLazy && item.Items.Count == 0 && trivia.HasStructure)
                    {
                        AddNode(item, trivia.GetStructure());
                    }

                    item.IsExpanded = true;

                    if (!isNavigatingFromSourceToTree && SyntaxTriviaNavigationToSourceRequested != null)
                    {
                        SyntaxTriviaNavigationToSourceRequested(trivia);
                    }

                    isNavigatingFromTreeToSource = false;
                    e.Handled = true;
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
                typeTextLabel.Visibility = Visibility.Hidden;
                kindTextLabel.Visibility = Visibility.Hidden;
                typeValueLabel.Content   = string.Empty;
                kindValueLabel.Content   = string.Empty;
            }
            else
            {
                parentItem.Items.Add(item);
            }

            // If IsLazy is false then recursively populate all descendent items.
            if (!IsLazy && trivia.HasStructure)
            {
                AddNode(item, trivia.GetStructure());
            }
        }
コード例 #10
0
        private void AddNode(TreeViewItem parentItem, CommonSyntaxNode node)
        {
            var kind = node.GetKind(SourceLanguage);
            var tag  = new SyntaxTag()
            {
                SyntaxNode     = node,
                IsSyntaxNode   = true,
                IsSyntaxToken  = false,
                IsSyntaxTrivia = false,
                Span           = node.Span,
                FullSpan       = node.FullSpan,
                Kind           = kind,
                ParentItem     = parentItem
            };

            var item = new TreeViewItem()
            {
                Tag        = tag,
                IsExpanded = true,
                Foreground = Brushes.Blue,
                Background = node.HasDiagnostics ? Brushes.Pink : Brushes.White,
                Header     = tag.Kind + " " + node.Span.ToString()
            };

            if (node.HasDiagnostics)
            {
                item.ToolTip = string.Empty;
                foreach (var diagnostic in SyntaxTree.GetDiagnostics(node))
                {
                    item.ToolTip += diagnostic.ToString(null) + "\n";
                }

                item.ToolTip = item.ToolTip.ToString().Trim();
            }

            item.Selected += new RoutedEventHandler((sender, e) =>
            {
                if (!e.Handled)
                {
                    isNavigatingFromTreeToSource = true;

                    typeTextLabel.Visibility    = Visibility.Visible;
                    kindTextLabel.Visibility    = Visibility.Visible;
                    typeValueLabel.Content      = node.GetType().Name;
                    kindValueLabel.Content      = kind;
                    propertyGrid.SelectedObject = node;

                    // If IsLazy is true then populate only child items.
                    if (IsLazy && item.Items.Count == 0 && node.HasChildren)
                    {
                        foreach (var child in node.ChildNodesAndTokens())
                        {
                            AddNodeOrToken(item, child);
                        }
                    }

                    item.IsExpanded = true;

                    if (!isNavigatingFromSourceToTree && SyntaxNodeNavigationToSourceRequested != null)
                    {
                        SyntaxNodeNavigationToSourceRequested(node);
                    }

                    isNavigatingFromTreeToSource = false;
                    e.Handled = true;
                }
            });

            if (parentItem == null)
            {
                treeView.Items.Clear();
                treeView.Items.Add(item);
            }
            else
            {
                parentItem.Items.Add(item);
            }

            // If IsLazy is false then recursively populate all descendent items.
            if (!IsLazy && node.HasChildren)
            {
                foreach (var child in node.ChildNodesAndTokens())
                {
                    AddNodeOrToken(item, child);
                }
            }
        }