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);
            }
예제 #2
0
        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
            });
        }
예제 #3
0
        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));
        }
예제 #5
0
        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));
                            }
                        }
                    });
                }
            });
        }
예제 #6
0
        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));
                    }
                }
            }
        }