private ReferrerTreeNode CreateChildNode(IReadOnlyList <ReferenceGraphNode> backingItems, ClrType referrerType, int fieldOffset, List <FieldReference> referrerChain, bool isCycle) { string scope; string name; var match = _typeNameRegex.Match(referrerType.Name); if (match.Success) { scope = match.Groups["scope"].Value; name = match.Groups["name"].Value; } else { scope = null; name = referrerType.Name; } var fieldChain = FieldReference.DescribeFieldReferences(referrerChain); if (fieldChain.Length != 0) { fieldChain = "." + fieldChain; } return(new ReferrerTreeNode(this, backingItems, scope, name, fieldChain, referrerType, fieldOffset, referrerChain, isCycle, false, ReferrerTreeNodeType.FieldReference)); }
public ReferrersPage(MainWindow mainWindow, ReferrerTreeViewModel referrerTree, HeapAnalyzer analyzer, string headerText) { ReferrerTree = referrerTree ?? throw new ArgumentNullException(nameof(referrerTree)); HeaderText = headerText; _analyzerLease = analyzer.GetLease(); ShowStringReferencedByFieldCommand = new DelegateCommand <ReferrerTreeNode>(ShowStringReferencedByField); void ShowStringReferencedByField(ReferrerTreeNode node) { var title = $"Refs of {FieldReference.DescribeFieldReferences(node.ReferrerChain)}"; var operation = new LoadingOperation( (progressCallback, token) => { var summary = analyzer.GetTypeReferenceStringSummary(node.ReferrerType, node.FieldOffset); var description = $"Strings referenced by field {FieldReference.DescribeFieldReferences(node.ReferrerChain)} of type {node.ReferrerType.Name}"; return(new StringListPage(mainWindow, summary, analyzer, title, description)); }); mainWindow.AddTab(new LoadingTabPage(title, StringListPage.IconDrawingBrush, operation)); } }