private FileMemberElement AsNode(SyntaxNode node, string text, Location location) { var ret = new FileMemberElement(); var lineSpan = location.GetLineSpan(); ret.Projects = new List <string>(); ret.ChildNodes = new List <FileMemberElement>(); ret.Kind = node.Kind().ToString(); ret.Location = new QuickFix(); ret.Location.Text = text; ret.Location.Line = lineSpan.StartLinePosition.Line; ret.Location.Column = lineSpan.StartLinePosition.Character; ret.Location.EndLine = lineSpan.EndLinePosition.Line; ret.Location.EndColumn = lineSpan.EndLinePosition.Character; foreach (var featureDiscover in _featureDiscovers) { var features = featureDiscover.Discover(node, _semanticModel); foreach (var feature in features) { ret.Features.Add(feature); } } return(ret); }
private static async Task <FileMemberElement> GetContainingMemberAsync(OmniSharpTestHost host, string filePath, int line, int column) { var membersAsTreeService = host.GetRequestHandler <MembersAsTreeService>(OmniSharpEndpoints.MembersTree); var request = new MembersTreeRequest { FileName = filePath }; var response = await membersAsTreeService.Handle(request); FileMemberElement containingMember = null; foreach (var node in response.TopLevelTypeDefinitions) { foreach (var child in node.ChildNodes) { if (child.Location.Contains(line, column)) { Assert.Null(containingMember); containingMember = child; } } } Assert.NotNull(containingMember); return(containingMember); }
public static async Task<IEnumerable<FileMemberElement>> Compute(IEnumerable<Document> documents) { var root = new FileMemberElement() { ChildNodes = new List<FileMemberElement>() }; var visitor = new StructureComputer(root); foreach (var document in documents) { visitor.CurrentProject = document.Project.Name; ((CSharpSyntaxNode)await document.GetSyntaxRootAsync()).Accept(visitor); } return root.ChildNodes; }
public static async Task <IEnumerable <FileMemberElement> > Compute(IEnumerable <Document> documents) { var root = new FileMemberElement() { ChildNodes = new List <FileMemberElement>() }; var visitor = new StructureComputer(root); foreach (var document in documents) { visitor.CurrentProject = document.Project.Name; ((CSharpSyntaxNode)await document.GetSyntaxRootAsync()).Accept(visitor); } return(root.ChildNodes); }
private FileMemberElement AsNode(SyntaxNode node, string text, Location location) { var ret = new FileMemberElement(); var lineSpan = location.GetLineSpan(); ret.Projects = new List<string>(); ret.ChildNodes = new List<FileMemberElement>(); ret.Kind = node.Kind().ToString(); ret.Location = new QuickFix(); ret.Location.Text = text; ret.Location.Line = 1 + lineSpan.StartLinePosition.Line; ret.Location.Column = 1 + lineSpan.StartLinePosition.Character; ret.Location.EndLine = 1 + lineSpan.EndLinePosition.Line; ret.Location.EndColumn = 1 + lineSpan.EndLinePosition.Character; return ret; }
private FileMemberElement AsNode(SyntaxNode node, string text, Location location) { var ret = new FileMemberElement(); var lineSpan = location.GetLineSpan(); ret.Projects = new List <string>(); ret.ChildNodes = new List <FileMemberElement>(); ret.Kind = node.Kind().ToString(); ret.Location = new QuickFix(); ret.Location.Text = text; ret.Location.Line = 1 + lineSpan.StartLinePosition.Line; ret.Location.Column = 1 + lineSpan.StartLinePosition.Character; ret.Location.EndLine = 1 + lineSpan.EndLinePosition.Line; ret.Location.EndColumn = 1 + lineSpan.EndLinePosition.Character; return(ret); }
public static async Task <IEnumerable <FileMemberElement> > Compute( IEnumerable <Document> documents, IEnumerable <ISyntaxFeaturesDiscover> featureDiscovers) { var root = new FileMemberElement() { ChildNodes = new List <FileMemberElement>() }; var visitor = new StructureComputer(root, featureDiscovers); foreach (var document in documents) { await visitor.Process(document); } return(root.ChildNodes); }
private static async Task <FileMemberElement> TranslateAsync(this FileMemberElement element, OmniSharpWorkspace workspace, Request request) { element.Location = await element.Location.TranslateAsync(workspace, request); var childNodes = new List <FileMemberElement>(); foreach (var childNode in element.ChildNodes) { await childNode.TranslateAsync(workspace, request); if (childNode.Location.Line >= 0) { childNodes.Add(childNode); } } element.ChildNodes = childNodes; return(element); }
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); }
private static void ToCodeLens(TextDocumentIdentifier textDocument, FileMemberElement node, List <CodeLens> codeLensContainer) { var codeLens = new CodeLens { Data = JToken.FromObject(string.IsNullOrEmpty(node.Location.FileName) ? textDocument.Uri : Helpers.ToUri(node.Location.FileName)), Range = node.Location.ToRange() }; codeLensContainer.Add(codeLens); if (node.ChildNodes != null) { foreach (var childNode in node.ChildNodes) { ToCodeLens(textDocument, childNode, codeLensContainer); } } }
private static void ToDocumentSymbol(FileMemberElement node, List <DocumentSymbolInformation> symbolInformationContainer, string containerName = null) { var symbolInformation = new DocumentSymbolInformation { Name = node.Location.Text, Kind = Kinds[node.Kind], Location = new Location { Uri = Helpers.ToUri(node.Location.FileName), Range = node.Location.ToRange() }, ContainerName = containerName }; if (node.ChildNodes != null) { foreach (var childNode in node.ChildNodes) { ToDocumentSymbol(childNode, symbolInformationContainer, symbolInformation.Name); } } symbolInformationContainer.Add(symbolInformation); }
public static bool IsCloserNodeDown(FileMemberElement candidateClosestNode, FileMemberElement closestNode, Request request) { return ((candidateClosestNode.Location.Line > request.Line) && (closestNode == null || candidateClosestNode.Location.Line < closestNode.Location.Line)); }
private StructureComputer(FileMemberElement root, IEnumerable <ISyntaxFeaturesDiscover> featureDiscovers) { _featureDiscovers = featureDiscovers ?? Enumerable.Empty <ISyntaxFeaturesDiscover>(); _roots.Push(root); }
public static bool IsCloserNodeDown(FileMemberElement candidateClosestNode, FileMemberElement closestNode, Request request) { return((candidateClosestNode.Location.Line > request.Line) && (closestNode == null || candidateClosestNode.Location.Line < closestNode.Location.Line)); }
private StructureComputer(FileMemberElement root) { _roots.Push(root); }
private bool IsCloserNodeUp(FileMemberElement candidateClosestNode, FileMemberElement closestNode, Request request) { return ((candidateClosestNode.Location.Line < request.Line) && (closestNode == null || candidateClosestNode.Location.Line > closestNode.Location.Line)); }
private bool IsCloserNodeUp(FileMemberElement candidateClosestNode, FileMemberElement closestNode, Request request) { return((candidateClosestNode.Location.Line < request.Line) && (closestNode == null || candidateClosestNode.Location.Line > closestNode.Location.Line)); }