public static BoundSourceFile ToBoundSourceFile(SourceFileModel sourceFile) { Contract.Requires(sourceFile != null); Contract.Ensures(Contract.Result <BoundSourceFile>() != null); return(new BoundSourceFile { SourceFile = new SourceFile { Content = sourceFile.Content, Info = new SourceFileInfo { Language = sourceFile.Language, Path = sourceFile.Path, WebAddress = sourceFile.WebAddress, RepoRelativePath = sourceFile.RepoRelativePath } }, Uid = sourceFile.Uid, ProjectId = sourceFile.ProjectId, ExcludeFromSearch = sourceFile.ExcludeFromSearch, // TODO: Possible NRE, Spans could be null ClassificationSpans = IndexableListAdapter.GetSpanList(sourceFile.Classifications), Definitions = sourceFile.Definitions?.Select(s => ToObjectModel(s)).ToList() ?? new List <DefinitionSpan>(0), References = IndexableListAdapter.GetSpanList(sourceFile.References) ?? IndexableSpans.Empty <ReferenceSpan>() }); }
public ListSegment <TSpan> GetSpans(int startPosition, int length) { var segmentList = new SegmentRangeList(Segments); var segmentListRange = segmentList.GetReadOnlyList().GetRange(new Range(startPosition, length), (searchRange, segmentRange) => RangeHelper.MinCompare(searchRange, segmentRange, inclusive: true), (searchRange, segmentRange) => RangeHelper.MaxCompare(searchRange, segmentRange, inclusive: true)); var segmentStart = segmentListRange.Start; var segmentCount = segmentListRange.Count; var absoluteStart = segmentStart << SegmentSpanCountBitWidth; var absoluteLength = segmentCount << SegmentSpanCountBitWidth; var endSegmentExclusive = segmentStart + segmentCount; if (endSegmentExclusive >= Segments.Count) { absoluteLength -= (SegmentOffsetBitMask - (SegmentOffsetBitMask & (Count - 1))); } var spanRangeList = IndexableListAdapter.GetReadOnlyList(new SpanRangeList(this)); var rangeListSegment = new ListSegment <Range>(spanRangeList, absoluteStart, absoluteLength); var spanRange = rangeListSegment.GetRange(new Range(startPosition, length), (r, start) => RangeHelper.MinCompare(r, start, inclusive: true), (r, start) => RangeHelper.MaxCompare(r, start, inclusive: true)); return(new ListSegment <TSpan>(this.GetReadOnlyList(), rangeListSegment.Start + spanRange.Start, spanRange.Count)); }