提交 75120d43 编写于 作者: S shyamn

Add ability to view symbol details in syntax visulizer (changeset 1213574)

上级 f47551cd
......@@ -60,15 +60,6 @@
</Grid>
</Border>
<TreeView Grid.Row="1" Name="treeView" SelectedItemChanged="TreeView_SelectedItemChanged" PreviewMouseRightButtonDown="TreeView_PreviewMouseRightButtonDown" ContextMenuOpening="TreeView_ContextMenuOpening" Padding="5">
<TreeView.Resources>
<ContextMenu x:Key="treeViewItemContextMenu">
<MenuItem Name="directedSyntaxGraphMenuItem" Header="Directed Syntax Graph" Click="DirectedSyntaxGraphMenuItem_Click">
<MenuItem.Icon>
<Image Height="16" Width="16" Source="/Roslyn.SyntaxVisualizer.Control;component/SyntaxGraph.ico" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TreeView.Resources>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Resources>
......@@ -76,9 +67,19 @@
x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="{x:Static SystemColors.HighlightColor}"/>
</Style.Resources>
<Setter Property="ContextMenu" Value="{StaticResource ResourceKey=treeViewItemContextMenu}"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ContextMenu>
<ContextMenu Name="treeViewItemContextMenu">
<MenuItem Name="directedSyntaxGraphMenuItem" Header="View Directed Syntax Graph" Click="DirectedSyntaxGraphMenuItem_Click">
<MenuItem.Icon>
<Image Height="16" Width="16" Source="/Roslyn.SyntaxVisualizer.Control;component/SyntaxGraph.ico" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Name="symbolDetailsMenuItem" Header="View Symbol (if any)" Click="SymbolDetailsMenuItem_Click"/>
<MenuItem Name="typeSymbolDetailsMenuItem" Header="View TypeSymbol (if any)" Click="TypeSymbolDetailsMenuItem_Click"/>
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
<GridSplitter Grid.Row="2" ResizeDirection="Rows" HorizontalAlignment="Stretch" Height="5"/>
<Grid Grid.Row="3">
......
......@@ -42,8 +42,8 @@ private class SyntaxTag
#endregion
#region Public Properties, Events
public bool DirectedSyntaxGraphContextMenuEnabled { get; set; }
public SyntaxTree SyntaxTree { get; private set; }
public SemanticModel SemanticModel { get; private set; }
public bool IsLazy { get; private set; }
public delegate void SyntaxNodeDelegate(SyntaxNode node);
......@@ -88,12 +88,13 @@ public void Clear()
// the children for any given item are only populated when the item is selected. If lazy is
// false then the entire tree is populated at once (and this can result in bad performance when
// displaying large trees).
public void DisplaySyntaxTree(SyntaxTree tree, bool lazy = true)
public void DisplaySyntaxTree(SyntaxTree tree, SemanticModel model = null, bool lazy = true)
{
if (tree != null)
{
IsLazy = lazy;
SyntaxTree = tree;
SemanticModel = model;
AddNode(null, SyntaxTree.GetRoot());
legendButton.Visibility = Visibility.Visible;
}
......@@ -103,12 +104,13 @@ public void DisplaySyntaxTree(SyntaxTree tree, bool lazy = true)
// the children for any given item are only populated when the item is selected. If lazy is
// false then the entire tree is populated at once (and this can result in bad performance when
// displaying large trees).
public void DisplaySyntaxNode(SyntaxNode node, bool lazy = true)
public void DisplaySyntaxNode(SyntaxNode node, SemanticModel model = null, bool lazy = true)
{
if (node != null)
{
IsLazy = lazy;
SyntaxTree = node.SyntaxTree;
SemanticModel = model;
AddNode(null, node);
legendButton.Visibility = Visibility.Visible;
}
......@@ -609,6 +611,26 @@ private void AddTrivia(TreeViewItem parentItem, SyntaxTrivia trivia, bool isLead
#endregion
#region Private Helpers - Other
private void DisplaySymbolInPropertyGrid(ISymbol symbol)
{
if (symbol == null)
{
typeTextLabel.Visibility = Visibility.Hidden;
kindTextLabel.Visibility = Visibility.Hidden;
typeValueLabel.Content = string.Empty;
kindValueLabel.Content = string.Empty;
}
else
{
typeTextLabel.Visibility = Visibility.Visible;
kindTextLabel.Visibility = Visibility.Visible;
typeValueLabel.Content = symbol.GetType().Name;
kindValueLabel.Content = symbol.Kind.ToString();
}
propertyGrid.SelectedObject = symbol;
}
private static TreeViewItem FindTreeViewItem(DependencyObject source)
{
while (source != null && !(source is TreeViewItem))
......@@ -641,10 +663,25 @@ private void TreeView_PreviewMouseRightButtonDown(object sender, MouseButtonEven
private void TreeView_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
if (!DirectedSyntaxGraphContextMenuEnabled)
var directedSyntaxGraphEnabled =
((SyntaxNodeDirectedGraphRequested != null) &&
(SyntaxTokenDirectedGraphRequested != null) &&
(SyntaxTriviaDirectedGraphRequested != null));
var symbolDetailsEnabled =
((SemanticModel != null) &&
(((SyntaxTag)currentSelection.Tag).Category == SyntaxCategory.SyntaxNode));
if ((!directedSyntaxGraphEnabled) && (!symbolDetailsEnabled))
{
e.Handled = true;
}
else
{
directedSyntaxGraphMenuItem.Visibility = directedSyntaxGraphEnabled ? Visibility.Visible : Visibility.Collapsed;
symbolDetailsMenuItem.Visibility = symbolDetailsEnabled ? Visibility.Visible : Visibility.Collapsed;
typeSymbolDetailsMenuItem.Visibility = symbolDetailsMenuItem.Visibility;
}
}
private void DirectedSyntaxGraphMenuItem_Click(object sender, RoutedEventArgs e)
......@@ -668,6 +705,31 @@ private void DirectedSyntaxGraphMenuItem_Click(object sender, RoutedEventArgs e)
}
}
private void SymbolDetailsMenuItem_Click(object sender, RoutedEventArgs e)
{
var currentTag = (SyntaxTag)currentSelection.Tag;
if ((SemanticModel != null) && (currentTag.Category == SyntaxCategory.SyntaxNode))
{
var symbol = SemanticModel.GetSymbolInfo(currentTag.SyntaxNode).Symbol;
if (symbol == null)
{
symbol = SemanticModel.GetDeclaredSymbol(currentTag.SyntaxNode);
}
DisplaySymbolInPropertyGrid(symbol);
}
}
private void TypeSymbolDetailsMenuItem_Click(object sender, RoutedEventArgs e)
{
var currentTag = (SyntaxTag)currentSelection.Tag;
if ((SemanticModel != null) && (currentTag.Category == SyntaxCategory.SyntaxNode))
{
var symbol = SemanticModel.GetTypeInfo(currentTag.SyntaxNode).Type;
DisplaySymbolInPropertyGrid(symbol);
}
}
private void LegendButton_Click(object sender, RoutedEventArgs e)
{
legendPopup.IsOpen = true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册