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  }