// 継承先ツリー private void ShowInheritanceDestinationTree() { var item = FindUserDefinition(); if (item is null) { InheritanceDestinationTreeItems.Clear(); return; } // 継承できるもの以外は何もしないで抜ける switch (item.DefineKinds) { case DefineKinds.Class: case DefineKinds.Struct: case DefineKinds.Interface: break; default: InheritanceDestinationTreeItems.Clear(); return; } InheritanceDestinationTreeItems.Clear(); AddInheritanceDestinationMember(item, true, string.Empty); }
private void AddInheritanceDestinationMember(UserDefinition item, bool isTargetDefinition, string relationName) { // UserDefinition -> TreeViewItemModel -> DefinitionItemModel // メンバー集めは、既存処理を使用する。すでに TreeViewItemModel 用のメソッドがあるので // いったんメンバーをくっつけて、それをもらう // class, struct, interface var containerModel = ConvertTreeViewItemModel(item); AddFilteredMember(containerModel, item); // 定義元のソースファイルが違う場合、名前空間も付ける var definitionName = item.DisplaySignature; if (item.SourceFile != SourceFile) { definitionName = $"{definitionName}({Path.GetFileName(item.SourceFile)})"; } // ヘッダー名 var model = new DefinitionItemModel { IsTargetDefinition = isTargetDefinition, RelationName = relationName, DefinitionName = definitionName, }; InheritanceDestinationTreeItems.Add(model); // メンバー名 if (containerModel.Children.Any()) { foreach (var child in containerModel.Children) { model.MemberTreeItems.Add(child.Copy()); } model.IsExpanded = true; } // 継承先クラス、インターフェースを取得 var destItems = AppEnv.UserDefinitions.Where(x => { if (x.BaseTypeInfos.Any(y => { if (!y.FoundDefinition) { return(false); } var b1 = (y.DefinitionSourceFile == item.SourceFile); var b2 = (y.DefinitionStartLength == item.StartLength); var b3 = (y.DefinitionEndLength == item.EndLength); if (b1 && b2 && b3) { return(true); } else { return(false); } })) { return(true); } return(false); }); if (!(destItems is null) && destItems.Any()) { foreach (var destItem in destItems) { AddInheritanceDestinationMember(destItem, false, model.DefinitionName); } } }