public ObservableCollection <ContextActionViewModel> BuildTreeViewModel(IEnumerable <ITreeNode <ITypeDefinition> > classTree) { ObservableCollection <ContextActionViewModel> c = new ObservableCollection <ContextActionViewModel>(); foreach (var node in classTree) { var childNodes = BuildTreeViewModel(node.Children); // the derived class might be in a different compilation: IMember importedMember = node.Content.Compilation.Import(member); IMember derivedMember = importedMember != null?InheritanceHelper.GetDerivedMember(importedMember, node.Content) : null; if (derivedMember != null) { c.Add(GoToEntityAction.MakeViewModel(derivedMember, childNodes)); } else { // If the member doesn't exist in the derived class, directly append the // children of that derived class here. c.AddRange(childNodes); // This is necessary so that the method C.M() is shown in the case // "class A { virtual void M(); } class B : A {} class C : B { override void M(); }" } } return(c); }
static ObservableCollection <ContextActionViewModel> BuildBaseMemberListViewModel(IMember member) { var c = new ObservableCollection <ContextActionViewModel>(); ObservableCollection <ContextActionViewModel> lastBase = c; IMember thisMember = member; while (thisMember != null) { IMember baseMember = InheritanceHelper.GetBaseMembers(thisMember, true).FirstOrDefault(); if (baseMember != null) { // Only allow this base member, if overriding a virtual/abstract member of a class // or implementing a member of an interface. if ((baseMember.DeclaringTypeDefinition.Kind == TypeKind.Interface) || (baseMember.IsOverridable && thisMember.IsOverride)) { var newChild = new ObservableCollection <ContextActionViewModel>(); lastBase.Add(GoToEntityAction.MakeViewModel(baseMember, newChild)); lastBase = newChild; } else { thisMember = null; } } thisMember = baseMember; } return(c); }
static ObservableCollection <ContextActionViewModel> BuildTreeViewModel(IEnumerable <ITreeNode <ITypeDefinition> > classTree) { return(new ObservableCollection <ContextActionViewModel>( classTree.Select( node => GoToEntityAction.MakeViewModel(node.Content, BuildTreeViewModel(node.Children))))); }
static ObservableCollection <ContextActionViewModel> BuildListViewModel(IEnumerable <ITypeDefinition> classList) { return(new ObservableCollection <ContextActionViewModel>( classList.Select(@class => GoToEntityAction.MakeViewModel(@class, null)))); }