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;
 }
示例#4
0
        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;
 }
示例#6
0
        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);
        }
示例#9
0
        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);
 }
示例#14
0
 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);
 }
示例#16
0
 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));
 }
示例#18
0
 private bool IsCloserNodeUp(FileMemberElement candidateClosestNode, FileMemberElement closestNode, Request request)
 {
     return((candidateClosestNode.Location.Line < request.Line) && (closestNode == null || candidateClosestNode.Location.Line > closestNode.Location.Line));
 }