// 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); }
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()); } } }
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); } } } }
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()); } } }
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); } } } }
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()); } }
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); } } }
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); } } } }