public static async Task <NavigateResponse> TranslateAsync(this NavigateResponse response, OmniSharpWorkspace workspace, Request request) { var(line, _) = await LineIndexHelper.TranslateFromGenerated(request.FileName, response.Line, workspace, true); response.Line = line; return(response); }
public static async Task <NavigateResponse> Navigate(OmniSharpWorkspace workspace, Request request, Func <FileMemberElement, FileMemberElement, Request, bool> IsCloserNode) { var stack = new List <FileMemberElement>(await StructureComputer.Compute(workspace.GetDocuments(request.FileName))); var response = new NavigateResponse(); //Retain current line in case we dont need to navigate. response.Line = request.Line; response.Column = request.Column; FileMemberElement closestNode = null; FileMemberElement thisNode = null; while (stack.Count > 0) { var node = stack[0]; stack.Remove(node); var isCloserNode = IsCloserNode(node, closestNode, request); if (isCloserNode) { closestNode = node; } if (node.Location.Line == request.Line) { thisNode = node; } stack.AddRange(node.ChildNodes); } //If there is a closest node, use its line and column. //or if we are on the last node, adjust column. //if we are above the first or below the last node, do nothing. if (closestNode != null) { response.Line = closestNode.Location.Line; response.Column = closestNode.Location.Column; } else if (thisNode != null) { response.Column = thisNode.Location.Column; } return(response); }
public void NavigateResponse_ZeroBased() { Configuration.ZeroBasedIndices = true; var input = new NavigateResponse() { Line = 0, Column = 0 }; var json = JsonConvert.SerializeObject(input, Formatting.Indented); var output = @" { ""Line"": 0, ""Column"": 0 } ".Trim(); Assert.Equal(output, json); }
public void NavigateResponse_OneBased() { Configuration.ZeroBasedIndices = false; var input = new NavigateResponse() { Line = 0, Column = 0 }; var json = JsonConvert.SerializeObject(input, Formatting.Indented); const string output = @" { ""Line"": 1, ""Column"": 1 } "; Assert.Equal(output.Trim(), json); }