lineIndex2Index method

CodeLineIndex lineIndex2Index(
  1. int lineIndex
)

Implementation

CodeLineIndex lineIndex2Index(int lineIndex) {
  if (lineIndex < 0) {
    return const CodeLineIndex(-1, -1);
  }
  // Find the segment first
  int segmentIndex = -1;
  int lineCount = 0;
  for (int i = 0, start = 0; i < segments.length; i++) {
    final int end = start + segments[i].lineCount;
    if (lineIndex >= start && lineIndex < end) {
      segmentIndex = i;
      lineIndex -= start;
      break;
    }
    start = end;
    lineCount += segments[i].length;
  }
  if (segmentIndex < 0) {
    return const CodeLineIndex(-1, -1);
  }
  // Find the index in the segment
  final List<CodeLine> codeLines = segments[segmentIndex].codeLines;
  int index = -1;
  int start = 0;
  for (int i = 0; i < codeLines.length; i++) {
    final int end = start + codeLines[i].lineCount;
    if (lineIndex >= start && lineIndex < end) {
      index = i;
      start++;
      break;
    }
    start = end;
  }
  if (index == -1) {
    return const CodeLineIndex(-1, -1);
  }
  // Find the index in the chunk
  int chunkIndex = -1;
  final List<CodeLine> chunks = codeLines[index].chunks;
  for (int i = 0; i < chunks.length; i++) {
    final int end = start + chunks[i].lineCount;
    if (lineIndex >= start && lineIndex < end) {
      chunkIndex = i;
      break;
    }
    start = end;
  }
  return CodeLineIndex(index + lineCount, chunkIndex);
}