github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/internal/span/token111.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build !go1.12 6 // +build !go1.12 7 8 package span 9 10 import ( 11 "go/token" 12 ) 13 14 // lineStart is the pre-Go 1.12 version of (*token.File).LineStart. For Go 15 // versions <= 1.11, we borrow logic from the analysisutil package. 16 // TODO(rstambler): Delete this file when we no longer support Go 1.11. 17 func lineStart(f *token.File, line int) token.Pos { 18 // Use binary search to find the start offset of this line. 19 20 min := 0 // inclusive 21 max := f.Size() // exclusive 22 for { 23 offset := (min + max) / 2 24 pos := f.Pos(offset) 25 posn := f.Position(pos) 26 if posn.Line == line { 27 return pos - (token.Pos(posn.Column) - 1) 28 } 29 30 if min+1 >= max { 31 return token.NoPos 32 } 33 34 if posn.Line < line { 35 min = offset 36 } else { 37 max = offset 38 } 39 } 40 }