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; } }
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); }
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; } }