private IFormattingResult FormatMergedSpan(
            SyntaxNode node,
            AnalyzerConfigOptions options,
            IEnumerable <AbstractFormattingRule> rules,
            IList <TextSpan> spansToFormat,
            CancellationToken cancellationToken
            )
        {
            var spanToFormat = TextSpan.FromBounds(
                spansToFormat[0].Start,
                spansToFormat[spansToFormat.Count - 1].End
                );
            var pair = node.ConvertToTokenPair(spanToFormat);

            if (node.IsInvalidTokenRange(pair.Item1, pair.Item2))
            {
                return(CreateAggregatedFormattingResult(
                           node,
                           SpecializedCollections.EmptyList <AbstractFormattingResult>()
                           ));
            }

            // more expensive case
            var result = Format(node, options, rules, pair.Item1, pair.Item2, cancellationToken);

            return(CreateAggregatedFormattingResult(
                       node,
                       new List <AbstractFormattingResult>(1)
            {
                result
            },
                       SimpleIntervalTree.Create(new TextSpanIntervalIntrospector(), spanToFormat)
                       ));
        }
示例#2
0
        public static IEnumerable <ValueTuple <SyntaxToken, SyntaxToken> > ConvertToTokenPairs(
            this SyntaxNode root,
            IList <TextSpan> spans
            )
        {
            Contract.ThrowIfNull(root);
            Contract.ThrowIfFalse(spans.Count > 0);

            if (spans.Count == 1)
            {
                // special case, if there is only one span, return right away
                yield return(root.ConvertToTokenPair(spans[0]));

                yield break;
            }

            var previousOne = root.ConvertToTokenPair(spans[0]);

            // iterate through each spans and make sure each one doesn't overlap each other
            for (var i = 1; i < spans.Count; i++)
            {
                var currentOne = root.ConvertToTokenPair(spans[i]);
                if (currentOne.Item1.SpanStart <= previousOne.Item2.Span.End)
                {
                    // oops, looks like two spans are overlapping each other. merge them
                    previousOne = ValueTuple.Create(
                        previousOne.Item1,
                        previousOne.Item2.Span.End < currentOne.Item2.Span.End
                          ? currentOne.Item2
                          : previousOne.Item2
                        );
                    continue;
                }

                // okay, looks like things are in good shape
                yield return(previousOne);

                // move to next one
                previousOne = currentOne;
            }

            // give out the last one
            yield return(previousOne);
        }
        private IFormattingResult FormatMergedSpan(
            SyntaxNode node, OptionSet options, IEnumerable<IFormattingRule> rules, IList<TextSpan> spansToFormat, CancellationToken cancellationToken)
        {
            var spanToFormat = TextSpan.FromBounds(spansToFormat[0].Start, spansToFormat[spansToFormat.Count - 1].End);
            var pair = node.ConvertToTokenPair(spanToFormat);

            if (node.IsInvalidTokenRange(pair.Item1, pair.Item2))
            {
                return CreateAggregatedFormattingResult(node, SpecializedCollections.EmptyList<AbstractFormattingResult>());
            }

            // more expensive case
            var result = Format(node, options, rules, pair.Item1, pair.Item2, cancellationToken);
            return CreateAggregatedFormattingResult(node, new List<AbstractFormattingResult>(1) { result }, SimpleIntervalTree.Create(TextSpanIntervalIntrospector.Instance, spanToFormat));
        }
        private async Task <IFormattingResult> FormatMergedSpanAsync(
            SyntaxNode node, OptionSet options, IEnumerable <IFormattingRule> rules, IList <TextSpan> spansToFormat, CancellationToken cancellationToken)
        {
            var spanToFormat = TextSpan.FromBounds(spansToFormat[0].Start, spansToFormat[spansToFormat.Count - 1].End);
            var pair         = node.ConvertToTokenPair(spanToFormat);

            if (node.IsInvalidTokenRange(pair.Item1, pair.Item2))
            {
                return(CreateAggregatedFormattingResult(node, SpecializedCollections.EmptyList <AbstractFormattingResult>()));
            }

            // more expensive case
            var result = await FormatAsync(node, options, rules, pair.Item1, pair.Item2, cancellationToken).ConfigureAwait(false);

            return(CreateAggregatedFormattingResult(node, new List <AbstractFormattingResult>(1)
            {
                result
            }, SimpleIntervalTree.Create(TextSpanIntervalIntrospector.Instance, spanToFormat)));
        }