public DocSpan Map(SourceSpan span) { int generatedStartLine = span.Start.Line; int index = _spans.BinarySearch(span, _comparer); SourceSpan containingSpan = (SourceSpan)_spans[index]; DocSpan docSpan = _mappings[containingSpan]; int rawStartIndex = docSpan.Span.Start.Index + span.Start.Index - containingSpan.Start.Index; int lineOffSet = generatedStartLine - containingSpan.Start.Line; int rawStartLine = docSpan.Span.Start.Line + lineOffSet; int rawStartColumn; if (lineOffSet == 0) { rawStartColumn = docSpan.Span.Start.Column + span.Start.Column; } else { rawStartColumn = span.Start.Column; } int lines = span.End.Line - generatedStartLine; int rawEndIndex = rawStartIndex + span.End.Index + span.Start.Index; int rawEndLine = rawStartLine + lines; int rawEndColumn; if (lines == 0) { rawEndColumn = rawStartColumn + span.End.Column - span.Start.Column; } else { rawEndColumn = span.End.Column; } return(new DocSpan(docSpan.Uri, new SourceSpan( new SourceLocation(rawStartIndex, rawStartLine, rawStartColumn), new SourceLocation(rawEndIndex, rawEndLine, rawEndColumn) ) )); }
public void AddMapping(SourceSpan generatedSpan, DocSpan span) { _spans.Add(generatedSpan); _mappings[generatedSpan] = span; }