public void AddEdges() { foreach (var block in GetActionResultBlocks()) { int startOfViewName = block[0].IndexOf("public ActionResult ") + 20; int lengthOfViewName = block[0].IndexOf('(', startOfViewName) - startOfViewName; string viewName = block[0].Substring(startOfViewName, lengthOfViewName); if (viewName.Contains("<IActionResult> ")) { viewName = viewName.Substring(viewName.LastIndexOf(" ") + 1); } string currentNode = _controller + '/' + viewName; _applicationData.AddAction(currentNode); if (!_applicationData.GetViewDataGraph().ContainsVertex(currentNode)) { _applicationData.GetViewDataGraph().AddVertex(currentNode); } block.Remove(block[0]); foreach (string line in block) { string temp = line; if (temp.Contains("RedirectToContract(")) { temp = temp.Replace("RedirectToContract(", "RedirectToAction(\"Edit\","); } if (temp.Contains("RedirectToAction")) { int startOfRedirectedViewName = temp.IndexOf("RedirectToAction(\"") + 18; if (startOfRedirectedViewName == 17) { startOfRedirectedViewName = temp.IndexOf("RedirectToAction(nameof(") + 24; int lengthOfRedirectedViewName = temp.IndexOf(')', startOfRedirectedViewName) - startOfRedirectedViewName; string redirectedViewName = temp.Substring(startOfRedirectedViewName, lengthOfRedirectedViewName); string from = currentNode; string to = redirectedViewName.Contains("Controller.") ? redirectedViewName.Replace("Controller.", "/") : _controller + '/' + redirectedViewName; AddEdge(from, to); } else { int lengthOfRedirectedViewName = temp.IndexOf('\"', startOfRedirectedViewName) - startOfRedirectedViewName; string redirectedViewName = temp.Substring(startOfRedirectedViewName, lengthOfRedirectedViewName); string to; if (line.Contains(redirectedViewName + '"' + ',')) { int startOfRedirectedControllerName = temp.IndexOf('"', temp.IndexOf(redirectedViewName + '"' + ',') + redirectedViewName.Length + 1) + 1; int lengthOfRedirectedConreollerName = temp.IndexOf('"', startOfRedirectedControllerName + 1) - startOfRedirectedControllerName; string toController = temp.Substring(startOfRedirectedControllerName, lengthOfRedirectedConreollerName); to = toController + '/' + redirectedViewName; } else { to = _controller + '/' + redirectedViewName; } AddEdge(currentNode, to); } } else if (temp.Contains("RedirectToIndex(") || temp.Contains("Delete(") || temp.Contains("DeleteChild(")) { string to = _controller + '/' + "Index"; AddEdge(currentNode, to); } else if (temp.Contains("RedirectToLocal(\"/\"")) { string from = currentNode; int startIndexOfDestionation = temp.IndexOf("RedirectToLocal(\"/\"") + 19; int lengthOfDestination = temp.IndexOf("\"", startIndexOfDestionation); string destination = lengthOfDestination == -1 ? "Index" : temp.Substring(startIndexOfDestionation, lengthOfDestination); string to = _controller + '/' + destination; AddEdge(from, to); } } } }