1// Copyright 2019 The Go Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// +build !go1.12
16
17package span
18
19import (
20	"go/token"
21)
22
23// lineStart is the pre-Go 1.12 version of (*token.File).LineStart. For Go
24// versions <= 1.11, we borrow logic from the analysisutil package.
25// TODO(rstambler): Delete this file when we no longer support Go 1.11.
26func lineStart(f *token.File, line int) token.Pos {
27	// Use binary search to find the start offset of this line.
28
29	min := 0        // inclusive
30	max := f.Size() // exclusive
31	for {
32		offset := (min + max) / 2
33		pos := f.Pos(offset)
34		posn := f.Position(pos)
35		if posn.Line == line {
36			return pos - (token.Pos(posn.Column) - 1)
37		}
38
39		if min+1 >= max {
40			return token.NoPos
41		}
42
43		if posn.Line < line {
44			min = offset
45		} else {
46			max = offset
47		}
48	}
49}
50