예제 #1
0
        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;
            }
        }
예제 #2
0
        public MemberMapping TryGetMapping(SerializedDnToken key)
        {
            MemberMapping mm;

            dict.TryGetValue(key, out mm);
            return(mm);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
 protected MarkedTextLine(SerializedDnToken methodKey, uint ilOffset, IMarkedTextLine senderObj = null)
 {
     this.methodKey = methodKey;
     this.ilOffset  = ilOffset;
     this.senderObj = senderObj ?? this;
 }
예제 #6
0
 public static bool VerifyAndGetCurrentDebuggedMethod(ITextEditorUIContext uiContext, SerializedDnToken serToken, out CodeMappings codeMappings)
 {
     codeMappings = uiContext.GetCodeMappings();
     return(codeMappings.TryGetMapping(serToken) != null);
 }