public CodeMappings(IList <MemberMapping> mappings, ISerializedDnModuleCreator serializedDnModuleCreator) { this.dict = new Dictionary <SerializedDnToken, MemberMapping>(mappings.Count); var serDict = new Dictionary <ModuleDef, SerializedDnModule>(); foreach (var m in mappings) { var module = m.Method.Module; if (module == null) { continue; } SerializedDnModule serMod; if (!serDict.TryGetValue(module, out serMod)) { serMod = serializedDnModuleCreator.Create(module); serDict.Add(module, serMod); } var key = new SerializedDnToken(serMod, m.Method.MDToken); MemberMapping oldMm; if (this.dict.TryGetValue(key, out oldMm)) { if (m.MemberCodeMappings.Count < oldMm.MemberCodeMappings.Count) { continue; } } this.dict[key] = m; } }
public MemberMapping TryGetMapping(SerializedDnToken key) { MemberMapping mm; dict.TryGetValue(key, out mm); return(mm); }
public static bool GoToIL(IFileTabManager fileTabManager, IDnSpyFile file, uint token, uint ilOffset, bool newTab) { if (file == null) { return(false); } var method = file.ModuleDef.ResolveToken(token) as MethodDef; if (method == null) { return(false); } var serMod = SerializedDnModuleCreator.Create(fileTabManager.FileTreeView, method.Module); var key = new SerializedDnToken(serMod, method.MDToken); bool found = fileTabManager.FileTreeView.FindNode(method.Module) != null; if (found) { fileTabManager.FollowReference(method, newTab, true, e => { Debug.Assert(e.Tab.UIContext is ITextEditorUIContext); if (e.Success && !e.HasMovedCaret) { MoveCaretTo(e.Tab.UIContext as ITextEditorUIContext, key, ilOffset); e.HasMovedCaret = true; } }); return(true); } Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { fileTabManager.FollowReference(method, newTab, true, e => { Debug.Assert(e.Tab.UIContext is ITextEditorUIContext); if (e.Success && !e.HasMovedCaret) { MoveCaretTo(e.Tab.UIContext as ITextEditorUIContext, key, ilOffset); e.HasMovedCaret = true; } }); })); return(true); }
public static bool MoveCaretTo(ITextEditorUIContext uiContext, SerializedDnToken key, uint ilOffset) { if (uiContext == null) { return(false); } CodeMappings cm; if (!VerifyAndGetCurrentDebuggedMethod(uiContext, key, out cm)) { return(false); } TextPosition location, endLocation; if (!cm.TryGetMapping(key).GetInstructionByTokenAndOffset(ilOffset, out location, out endLocation)) { return(false); } uiContext.ScrollAndMoveCaretTo(location.Line, location.Column); return(true); }
protected MarkedTextLine(SerializedDnToken methodKey, uint ilOffset, IMarkedTextLine senderObj = null) { this.methodKey = methodKey; this.ilOffset = ilOffset; this.senderObj = senderObj ?? this; }
public static bool VerifyAndGetCurrentDebuggedMethod(ITextEditorUIContext uiContext, SerializedDnToken serToken, out CodeMappings codeMappings) { codeMappings = uiContext.GetCodeMappings(); return(codeMappings.TryGetMapping(serToken) != null); }