Esempio n. 1
0
        public virtual IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements)
        {
            if (!elements.Any())
            {
                return(resultNode);
            }

            IRPElement element = elements.First();

            if (!_rpElementRPResultNodeBuilderPairs.ContainsKey(element.GetType()))
            {
                throw new Exception($"{element.GetType()} does not have an associated RPResultNodeBuilder");
            }

            Type rpResultNodeBuilderType = _rpElementRPResultNodeBuilderPairs[element.GetType()];

            if (rpResultNodeBuilderType.GetMethod("EvaluateElement").DeclaringType == typeof(RPResultNodeBuilder))
            {
                throw new Exception($"{rpResultNodeBuilderType} does not implement the EvaluateElement method.");
            }

            IRPResultNodeBuilder resultNodeBuilder = (IRPResultNodeBuilder)Activator.CreateInstance(rpResultNodeBuilderType);

            return(resultNodeBuilder.EvaluateElement(resultNode, elements));
        }
        public override IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements)
        {
            if (!(elements.First() is RPIndexElement indexElement))
            {
                throw new ArgumentException($"{elements.First()} is not an RPIndexElement.");
            }

            IEnumerable <SyntaxNode> searchPool;

            switch (indexElement.ScanType)
            {
            case RPScanTypes.Children:
                searchPool = resultNode.SyntaxNode.ChildNodes();
                break;

            case RPScanTypes.Descendants:
                searchPool = resultNode.SyntaxNode.DescendantNodes();
                break;

            default:
                throw new ArgumentException("Invalid scan type.");
            }

            SyntaxNode matchingNode = searchPool.ElementAtOrDefault(indexElement.Index);

            if (matchingNode == null)
            {
                return(null);
            }

            resultNode.Children.Add(base.EvaluateElement(new RPResultNode(resultNode, matchingNode), elements.Skip(1)));

            return(resultNode);
        }
        public override IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements)
        {
            if (!(elements.First() is RPWildcardElement wildcardElement))
            {
                throw new ArgumentException($"{elements.First()} is not an RPWildcardElement.");
            }

            IEnumerable <SyntaxNode> searchPool;

            switch (wildcardElement.ScanType)
            {
            case RPScanTypes.Children:
                searchPool = resultNode.SyntaxNode.ChildNodes();
                break;

            case RPScanTypes.Descendants:
                searchPool = resultNode.SyntaxNode.DescendantNodes();
                break;

            default:
                throw new ArgumentException("Invalid scan type.");
            }

            if (searchPool.Count() == 0)
            {
                return(null);
            }

            foreach (SyntaxNode matchingNode in searchPool)
            {
                resultNode.Children.Add(base.EvaluateElement(new RPResultNode(resultNode, matchingNode), elements.Skip(1)));
            }

            return(resultNode);
        }
Esempio n. 4
0
        public IEnumerable <SyntaxNode> Evaluate(SyntaxNode syntaxNode, IEnumerable <IRPElement> roslynPath)
        {
            IRPResultNode resultNode = _builder.EvaluateElement(new RPResultNode(null, syntaxNode), roslynPath);

            _leaves = new List <IRPResultNode>();
            PopulateLeavesRecursive(resultNode);

            return(_leaves.Select(rn => rn.SyntaxNode));
        }
Esempio n. 5
0
        public override IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements)
        {
            if (!(elements.First() is RPSyntaxKindRegexPairElement syntaxKindRegexPairElement))
            {
                throw new ArgumentException($"{elements.First()} is not an RPSyntaxKindRegexPairElement.");
            }

            string parentText = resultNode.SyntaxNode.ToString();

            IEnumerable <TextSpan> matchingTextSpans = syntaxKindRegexPairElement.Regex.Matches(parentText)
                                                       .Cast <Match>()
                                                       .Select(m => new TextSpan(m.Index + resultNode.SyntaxNode.SpanStart, m.Length));

            if (matchingTextSpans.Count() == 0)
            {
                return(null);
            }

            bool anyMatches = false;

            foreach (TextSpan matchingTextSpan in matchingTextSpans)
            {
                IEnumerable <SyntaxNode> searchPool;

                switch (syntaxKindRegexPairElement.ScanType)
                {
                case RPScanTypes.Children:
                    searchPool = resultNode.SyntaxNode.ChildNodes();
                    break;

                case RPScanTypes.Descendants:
                    searchPool = resultNode.SyntaxNode.DescendantNodes();
                    break;

                default:
                    throw new ArgumentException("Invalid scan type.");
                }

                searchPool = searchPool.Where(sn => sn.IsKind(syntaxKindRegexPairElement.SyntaxKind));

                SyntaxNode matchingNode = searchPool.Where(sn => sn.Span.OverlapsWith(matchingTextSpan))
                                          .OrderBy(sn => (sn.Span, matchingTextSpan), _rpTextSpanComparer)
                                          .FirstOrDefault();

                if (matchingNode == null)
                {
                    continue;
                }

                anyMatches = true;
                resultNode.Children.Add(base.EvaluateElement(new RPResultNode(resultNode, matchingNode), elements.Skip(1)));
            }

            return(anyMatches ? resultNode : null);
        }
Esempio n. 6
0
        private void PopulateLeavesRecursive(IRPResultNode resultNode)
        {
            if (resultNode == null || resultNode.SyntaxNode == null)
            {
                return;
            }

            if (!resultNode.Children.Any())
            {
                _leaves.Add(resultNode);
            }
            else
            {
                foreach (IRPResultNode childNode in resultNode.Children)
                {
                    PopulateLeavesRecursive(childNode);
                }
            }
        }
 public override IRPResultNode EvaluateElement(IRPResultNode resultNode, IEnumerable <IRPElement> elements)
 {
     return(base.EvaluateElement(resultNode, elements.Skip(1)));
 }
Esempio n. 8
0
 public RPResultNode(IRPResultNode parent, SyntaxNode syntaxNode)
 {
     Parent     = parent;
     SyntaxNode = syntaxNode;
 }