public ControlFlowViewerViewModel(IExtendedShell extendedShell)
		{
			_graph = new CfgGraph();

			extendedShell.ActiveDocumentChanged += (sender, e) =>
			{
				Graph.RemoveVertexIf(x => true);
				Graph.Clear();

				var rewrittenInstructions = ExplicitBranchingRewriter.Rewrite(e.Editor.BytecodeContainer.Shader.InstructionTokens);
				var cfg = ControlFlowGraph.FromInstructions(rewrittenInstructions);

				var basicBlockLookup = cfg.BasicBlocks.ToDictionary(x => x, x => new BasicBlockViewModel(x));

				Graph.AddVertexRange(basicBlockLookup.Values);

				foreach (var basicBlock in cfg.BasicBlocks)
				{
					foreach (var successor in basicBlock.Successors)
						Graph.AddEdge(new CfgEdge(basicBlockLookup[basicBlock], basicBlockLookup[successor]));
					if (basicBlock.ImmediatePostDominator != null)
						Graph.AddEdge(new CfgEdge(basicBlockLookup[basicBlock],
							basicBlockLookup[basicBlock.ImmediatePostDominator])
						{
							IsImmediatePostDominatorEdge = true
						});
				}

				NotifyOfPropertyChange(() => LayoutAlgorithmType);
			};
		}
        public ControlFlowViewerViewModel(IExtendedShell extendedShell)
        {
            _graph = new CfgGraph();

            extendedShell.ActiveDocumentChanged += (sender, e) =>
            {
                Graph.RemoveVertexIf(x => true);
                Graph.Clear();

                var rewrittenInstructions = ExplicitBranchingRewriter.Rewrite(e.Editor.BytecodeContainer.Shader.InstructionTokens);
                var cfg = ControlFlowGraph.FromInstructions(rewrittenInstructions);

                var basicBlockLookup = cfg.BasicBlocks.ToDictionary(x => x, x => new BasicBlockViewModel(x));

                Graph.AddVertexRange(basicBlockLookup.Values);

                foreach (var basicBlock in cfg.BasicBlocks)
                {
                    foreach (var successor in basicBlock.Successors)
                    {
                        Graph.AddEdge(new CfgEdge(basicBlockLookup[basicBlock], basicBlockLookup[successor]));
                    }
                    if (basicBlock.ImmediatePostDominator != null)
                    {
                        Graph.AddEdge(new CfgEdge(basicBlockLookup[basicBlock],
                                                  basicBlockLookup[basicBlock.ImmediatePostDominator])
                        {
                            IsImmediatePostDominatorEdge = true
                        });
                    }
                }

                NotifyOfPropertyChange(() => LayoutAlgorithmType);
            };
        }