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); }
private GotoImplementationResponse GetMemberResponse(CSharpTypeResolveContext rctx, MemberResolveResult resolveResult) { var locations = new List <Location>(); //TODO: we don't need to scan all types in all projects foreach (IUnresolvedTypeDefinition type in GetAllTypes()) { ITypeDefinition resolvedDef = type.Resolve(rctx).GetDefinition(); if (resolvedDef != null) { IMember member = InheritanceHelper.GetDerivedMember(resolveResult.Member, resolvedDef); if (member != null) { var region = member.MemberDefinition.Region; var location = new Location { FileName = region.FileName, Line = region.BeginLine, Column = region.BeginColumn }; locations.Add(location); } } } return(new GotoImplementationResponse { Locations = locations }); }
private static IMember FindDerivedMember(IMember importedMember, ITypeDefinition derivedType) { IMember result; if (importedMember.DeclaringTypeDefinition.Kind == TypeKind.Interface) { result = derivedType.GetMembers(null, GetMemberOptions.IgnoreInheritedMembers).FirstOrDefault((IMember m) => m.ImplementedInterfaceMembers.Any((IMember im) => im.Region == importedMember.Region)); } else { result = InheritanceHelper.GetDerivedMember(importedMember, derivedType); } return(result); }
private QuickFixResponse GetMemberResponse(ITypeResolveContext rctx, MemberResolveResult resolveResult) { var quickFixes = new List <QuickFix>(); //TODO: we don't need to scan all types in all projects foreach (ITypeDefinition type in GetAllTypes(rctx)) { if (type != null) { IMember member = InheritanceHelper.GetDerivedMember(resolveResult.Member, type); if (member != null) { var quickFix = QuickFix.ForFirstLineInRegion (member.MemberDefinition.Region , _solution.GetFile(type.Region.FileName)); quickFixes.Add(quickFix); } } } return(new QuickFixResponse(quickFixes)); }
public void Run() { var assemblies = GetAllAssemblies(); assemblies.ContinueWith(delegate(Task <HashSet <IAssembly> > arg) { using (var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor(true, true)) { monitor.BeginTask(GettextCatalog.GetString("Building type graph in solution ..."), 1); var tg = new TypeGraph(arg.Result); var node = tg.GetNode(entity.DeclaringTypeDefinition); monitor.EndTask(); if (node == null) { return; } Gtk.Application.Invoke(delegate { Stack <IList <TypeGraphNode> > derivedTypes = new Stack <IList <TypeGraphNode> > (); derivedTypes.Push(node.DerivedTypes); HashSet <ITypeDefinition> visitedType = new HashSet <ITypeDefinition> (); while (derivedTypes.Count > 0) { foreach (var derived in derivedTypes.Pop()) { if (visitedType.Contains(derived.TypeDefinition)) { continue; } derivedTypes.Push(tg.GetNode(derived.TypeDefinition).DerivedTypes); visitedType.Add(derived.TypeDefinition); var impMember = derived.TypeDefinition.Compilation.Import(entity); if (impMember == null) { continue; } IMember derivedMember; if (entity.DeclaringTypeDefinition.Kind == TypeKind.Interface) { derivedMember = derived.TypeDefinition.GetMembers(null, GetMemberOptions.IgnoreInheritedMembers).FirstOrDefault( m => m.ImplementedInterfaceMembers.Any(im => im.Region == entity.Region) ); } else { derivedMember = InheritanceHelper.GetDerivedMember(impMember, derived.TypeDefinition); } if (derivedMember == null || string.IsNullOrEmpty(derivedMember.Region.FileName)) { continue; } var tf = TextFileProvider.Instance.GetReadOnlyTextEditorData(derivedMember.Region.FileName); var start = tf.LocationToOffset(derivedMember.Region.Begin); tf.SearchRequest.SearchPattern = derivedMember.Name; var sr = tf.SearchForward(start); if (sr != null) { start = sr.Offset; } monitor.ReportResult(new MemberReference(derivedMember, derivedMember.Region, start, derivedMember.Name.Length)); } } }); } }); }
public void Run() { var assemblies = new HashSet <IAssembly> (); foreach (var project in IdeApp.ProjectOperations.CurrentSelectedSolution.GetAllProjects()) { var comp = TypeSystemService.GetCompilation(project); if (comp == null) { continue; } assemblies.Add(comp.MainAssembly); } TypeGraph tg = new TypeGraph(assemblies); var node = tg.GetNode(entity.DeclaringTypeDefinition); using (var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor(true, true)) { Stack <IList <TypeGraphNode> > derivedTypes = new Stack <IList <TypeGraphNode> > (); derivedTypes.Push(node.DerivedTypes); HashSet <ITypeDefinition> visitedType = new HashSet <ITypeDefinition> (); while (derivedTypes.Count > 0) { foreach (var derived in derivedTypes.Pop()) { if (visitedType.Contains(derived.TypeDefinition)) { continue; } derivedTypes.Push(tg.GetNode(derived.TypeDefinition).DerivedTypes); visitedType.Add(derived.TypeDefinition); var impMember = derived.TypeDefinition.Compilation.Import(entity); if (impMember == null) { continue; } IMember derivedMember; if (entity.DeclaringTypeDefinition.Kind == TypeKind.Interface) { derivedMember = derived.TypeDefinition.GetMembers(null, GetMemberOptions.IgnoreInheritedMembers).FirstOrDefault( m => m.ImplementedInterfaceMembers.Any(im => im.Region == entity.Region) ); } else { derivedMember = InheritanceHelper.GetDerivedMember(impMember, derived.TypeDefinition); } if (derivedMember == null) { continue; } var tf = TextFileProvider.Instance.GetReadOnlyTextEditorData(derivedMember.Region.FileName); var start = tf.LocationToOffset(derivedMember.Region.Begin); tf.SearchRequest.SearchPattern = derivedMember.Name; var sr = tf.SearchForward(start); if (sr != null) { start = sr.Offset; } monitor.ReportResult(new MemberReference(derivedMember, derivedMember.Region, start, derivedMember.Name.Length)); } } } }