|
@@ -28,23 +28,9 @@ func NewSrcFile(name, src string) *SrcFile {
|
|
|
func (f *SrcFile) Position(offset int) Position {
|
|
|
var line int
|
|
|
if offset > f.lastScannedOffset {
|
|
|
- f.scanTo(offset)
|
|
|
- line = len(f.lineOffsets) - 1
|
|
|
+ line = f.scanTo(offset)
|
|
|
} else {
|
|
|
- if len(f.lineOffsets) > 0 {
|
|
|
- line = sort.SearchInts(f.lineOffsets, offset)
|
|
|
- if line == len(f.lineOffsets) {
|
|
|
- line = line - 1
|
|
|
- }
|
|
|
- } else {
|
|
|
- line = -1
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if line >= 0 {
|
|
|
- if f.lineOffsets[line] > offset {
|
|
|
- line--
|
|
|
- }
|
|
|
+ line = sort.Search(len(f.lineOffsets), func(x int) bool { return f.lineOffsets[x] > offset }) - 1
|
|
|
}
|
|
|
|
|
|
var lineStart int
|
|
@@ -57,18 +43,24 @@ func (f *SrcFile) Position(offset int) Position {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (f *SrcFile) scanTo(offset int) {
|
|
|
+func (f *SrcFile) scanTo(offset int) int {
|
|
|
o := f.lastScannedOffset
|
|
|
for o < offset {
|
|
|
p := strings.Index(f.src[o:], "\n")
|
|
|
if p == -1 {
|
|
|
- o = len(f.src)
|
|
|
- break
|
|
|
+ f.lastScannedOffset = len(f.src)
|
|
|
+ return len(f.lineOffsets) - 1
|
|
|
}
|
|
|
o = o + p + 1
|
|
|
f.lineOffsets = append(f.lineOffsets, o)
|
|
|
}
|
|
|
f.lastScannedOffset = o
|
|
|
+
|
|
|
+ if o == offset {
|
|
|
+ return len(f.lineOffsets) - 1
|
|
|
+ }
|
|
|
+
|
|
|
+ return len(f.lineOffsets) - 2
|
|
|
}
|
|
|
|
|
|
func (p Position) String() string {
|