示例#1
0
        public override void Convert(ref object reference)
        {
            switch (reference)
            {
            case DbgDotNetNativeCodeLocationImpl nativeLoc:
                switch (nativeLoc.ILOffsetMapping)
                {
                case DbgILOffsetMapping.Exact:
                case DbgILOffsetMapping.Approximate:
                    reference = new DotNetMethodBodyReference(nativeLoc.Module, nativeLoc.Token, nativeLoc.Offset);
                    break;

                case DbgILOffsetMapping.Prolog:
                    reference = new DotNetMethodBodyReference(nativeLoc.Module, nativeLoc.Token, DotNetMethodBodyReference.PROLOG);
                    break;

                case DbgILOffsetMapping.Epilog:
                    reference = new DotNetMethodBodyReference(nativeLoc.Module, nativeLoc.Token, DotNetMethodBodyReference.EPILOG);
                    break;

                case DbgILOffsetMapping.Unknown:
                case DbgILOffsetMapping.NoInfo:
                case DbgILOffsetMapping.UnmappedAddress:
                default:
                    // The IL offset isn't known so use a method reference
                    reference = new DotNetTokenReference(nativeLoc.Module, nativeLoc.Token);
                    break;
                }
                break;
            }
        }
        public override void Convert(ref object?reference)
        {
            switch (reference)
            {
            case DotNetMethodBodyBookmarkLocation bodyLoc:
                reference = new DotNetMethodBodyReference(bodyLoc.Module, bodyLoc.Token, bodyLoc.Offset);
                break;

            case DotNetTokenBookmarkLocation tokenLoc:
                reference = new DotNetTokenReference(tokenLoc.Module, tokenLoc.Token);
                break;
            }
        }
示例#3
0
        bool GoTo(DotNetTokenReference tokenRef, ReadOnlyCollection <object> options)
        {
            bool newTab = options.Any(a => StringComparer.Ordinal.Equals(PredefinedReferenceNavigatorOptions.NewTab, a));
            var  module = GetModule(tokenRef.Module, options);

            if (module == null)
            {
                return(false);
            }

            var def = module.ResolveToken(tokenRef.Token) as IMemberDef;

            if (def == null)
            {
                return(false);
            }

            bool found = documentTabService.DocumentTreeView.FindNode(def.Module) != null;

            if (found)
            {
                documentTabService.FollowReference(def, newTab, true, e => {
                    Debug.Assert(e.Tab.UIContext is IDocumentViewer);
                    if (e.Success && !e.HasMovedCaret)
                    {
                        MoveCaretTo(e.Tab.UIContext as IDocumentViewer, def);
                        e.HasMovedCaret = true;
                    }
                });
                return(true);
            }

            // If it wasn't found, it will be added to the treeview with a slight delay, make sure our code gets executed
            // after it's happened.
            uiDispatcher.UIBackground(() => {
                documentTabService.FollowReference(def, newTab, true, e => {
                    Debug.Assert(e.Tab.UIContext is IDocumentViewer);
                    if (e.Success && !e.HasMovedCaret)
                    {
                        MoveCaretTo(e.Tab.UIContext as IDocumentViewer, def);
                        e.HasMovedCaret = true;
                    }
                });
            });
            return(true);
        }
示例#4
0
        public override void Convert(ref object reference)
        {
            switch (reference)
            {
            case DbgDotNetCodeLocationImpl locImpl:
                if ((locImpl.Options & DbgDotNetCodeLocationOptions.InvalidOffset) != 0)
                {
                    reference = new DotNetTokenReference(locImpl.Module, locImpl.Token);
                }
                else
                {
                    reference = new DotNetMethodBodyReference(locImpl.Module, locImpl.Token, locImpl.Offset);
                }
                break;

            case DbgDotNetCodeLocation loc:
                reference = new DotNetMethodBodyReference(loc.Module, loc.Token, loc.Offset);
                break;
            }
        }