List <MethodSourceStatement> GetClosest(int lineStart, int lineEnd) { var list = new List <MethodSourceStatement>(); foreach (var info in dict.Values) { MethodSourceStatement?methodSourceStatement = null; foreach (var sourceStatement in info.Statements) { if (lineStart >= sourceStatement.TextSpan.End) { continue; } if (methodSourceStatement == null || sourceStatement.TextSpan.Start < methodSourceStatement.Value.Statement.TextSpan.Start) { methodSourceStatement = new MethodSourceStatement(info.Method, sourceStatement); } } if (methodSourceStatement != null) { if (list.Count == 0) { list.Add(methodSourceStatement.Value); } else if (methodSourceStatement.Value.Statement.TextSpan.Start == list[0].Statement.TextSpan.Start) { list.Add(methodSourceStatement.Value); } else if (methodSourceStatement.Value.Statement.TextSpan.Start < list[0].Statement.TextSpan.Start) { list.Clear(); list.Add(methodSourceStatement.Value); } } } if (list.Count == 0) { return(null); } return(list.Distinct().ToList()); }
public EditMethodDecompileCodeState(object referenceToEdit, MethodSourceStatement? methodSourceStatement) { MainOutput = new ReferenceDecompilerOutput(referenceToEdit, methodSourceStatement); }
static int Sort(MethodSourceStatement a, MethodSourceStatement b) => a.Statement.TextSpan.Start - b.Statement.TextSpan.Start;
bool DebugGetMethodSourceStatementForSetNextStatement(IDocumentViewer documentViewer, out string errMsg, out MethodSourceStatement methodStatement) { errMsg = string.Empty; methodStatement = default(MethodSourceStatement); if (ProcessState == DebuggerProcessState.Terminated) { errMsg = dnSpy_Debugger_Resources.Error_NotDebugging; return false; } if (ProcessState == DebuggerProcessState.Starting || ProcessState == DebuggerProcessState.Continuing || ProcessState == DebuggerProcessState.Running) { errMsg = dnSpy_Debugger_Resources.Error_CantSetNextStatementWhenNotStopped; return false; } if (documentViewer == null) { documentViewer = documentTabService.ActiveTab.TryGetDocumentViewer(); if (documentViewer == null) { errMsg = dnSpy_Debugger_Resources.Error_NoTabAvailableDecompileCurrentMethod; return false; } } IMethodDebugService methodDebugService; if (currentLocation == null || !DebugUtils.VerifyAndGetCurrentDebuggedMethod(documentViewer, currentLocation.Value.SerializedDnToken, out methodDebugService)) { errMsg = dnSpy_Debugger_Resources.Error_NoDebugInfoAvailable; return false; } Debug.Assert(currentLocation != null); var methodStatements = methodDebugService.FindByTextPosition(documentViewer.Caret.Position.BufferPosition.Position, sameMethod: false); if (methodStatements.Count == 0) { errMsg = dnSpy_Debugger_Resources.Error_CantSetNextStatementHere; return false; } if (GetCurrentMethodILFrame() == null) { errMsg = dnSpy_Debugger_Resources.Error_CantSetNextStatementNoILFrame; return false; } foreach (var info in methodStatements) { var md = info.Method; if (currentLocation.Value.Function.Token != md.MDToken.Raw) continue; var moduleId = moduleIdProvider.Create(md.Module); if (!moduleId.Equals(currentLocation.Value.SerializedDnToken.Module)) continue; methodStatement = info; break; } if (methodStatement.Method == null) { errMsg = dnSpy_Debugger_Resources.Error_CantSetNextStatementToAnotherMethod; return false; } return true; }