Exemple #1
0
        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());
        }
Exemple #2
0
			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;
Exemple #4
0
		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;
		}