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