Browse Source

Simplified Position() implementation (see #65)

Dmitry Panov 7 years ago
parent
commit
0cb5b6c554
2 changed files with 16 additions and 20 deletions
  1. 11 19
      srcfile.go
  2. 5 1
      srcfile_test.go

+ 11 - 19
srcfile.go

@@ -28,23 +28,9 @@ func NewSrcFile(name, src string) *SrcFile {
 func (f *SrcFile) Position(offset int) Position {
 func (f *SrcFile) Position(offset int) Position {
 	var line int
 	var line int
 	if offset > f.lastScannedOffset {
 	if offset > f.lastScannedOffset {
-		f.scanTo(offset)
-		line = len(f.lineOffsets) - 1
+		line = f.scanTo(offset)
 	} else {
 	} 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
 	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
 	o := f.lastScannedOffset
 	for o < offset {
 	for o < offset {
 		p := strings.Index(f.src[o:], "\n")
 		p := strings.Index(f.src[o:], "\n")
 		if p == -1 {
 		if p == -1 {
-			o = len(f.src)
-			break
+			f.lastScannedOffset = len(f.src)
+			return len(f.lineOffsets) - 1
 		}
 		}
 		o = o + p + 1
 		o = o + p + 1
 		f.lineOffsets = append(f.lineOffsets, o)
 		f.lineOffsets = append(f.lineOffsets, o)
 	}
 	}
 	f.lastScannedOffset = o
 	f.lastScannedOffset = o
+
+	if o == offset {
+		return len(f.lineOffsets) - 1
+	}
+
+	return len(f.lineOffsets) - 2
 }
 }
 
 
 func (p Position) String() string {
 func (p Position) String() string {

+ 5 - 1
srcfile_test.go

@@ -13,13 +13,17 @@ line3`
 		line   int
 		line   int
 		col    int
 		col    int
 	}{
 	}{
-		{12, 3, 1},
+		{0, 1, 1},
 		{2, 1, 3},
 		{2, 1, 3},
 		{2, 1, 3},
 		{2, 1, 3},
+		{6, 2, 1},
 		{7, 2, 2},
 		{7, 2, 2},
 		{12, 3, 1},
 		{12, 3, 1},
+		{12, 3, 1},
 		{13, 3, 2},
 		{13, 3, 2},
 		{13, 3, 2},
 		{13, 3, 2},
+		{16, 3, 5},
+		{17, 3, 6},
 	}
 	}
 
 
 	for i, test := range tests {
 	for i, test := range tests {