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) )); }
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))); }