mirror of
https://github.com/golang/go
synced 2024-11-18 11:04:42 -07:00
2f43c6d1a2
Change span to hide its fields and have validating accessors This catches the cases where either the offset or the position is being used when it was not set. It also normalizes the forms as the API now controls them, and allows us to simplify some of the logic. The converters are now allowed to return an error, which lets us cleanly propagate bad cases. The lsp was then converted to the new format, and also had some error checking of its own added on the top. All this allowed me to find and fix a few issues, most notably a case where the wrong column mapper was being used during the conversion of definition results. Change-Id: Iebdf8901e8269b28aaef60caf76574baa25c46d4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/167858 Run-TryBot: Ian Cottrell <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
101 lines
2.7 KiB
Go
101 lines
2.7 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package span
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
// Parse returns the location represented by the input.
|
|
// All inputs are valid locations, as they can always be a pure filename.
|
|
// The returned span will be normalized, and thus if printed may produce a
|
|
// different string.
|
|
func Parse(input string) Span {
|
|
// :0:0#0-0:0#0
|
|
valid := input
|
|
var hold, offset int
|
|
hadCol := false
|
|
suf := rstripSuffix(input)
|
|
if suf.sep == "#" {
|
|
offset = suf.num
|
|
suf = rstripSuffix(suf.remains)
|
|
}
|
|
if suf.sep == ":" {
|
|
valid = suf.remains
|
|
hold = suf.num
|
|
hadCol = true
|
|
suf = rstripSuffix(suf.remains)
|
|
}
|
|
switch {
|
|
case suf.sep == ":":
|
|
return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), Point{})
|
|
case suf.sep == "-":
|
|
// we have a span, fall out of the case to continue
|
|
default:
|
|
// separator not valid, rewind to either the : or the start
|
|
return New(NewURI(valid), NewPoint(hold, 0, offset), Point{})
|
|
}
|
|
// only the span form can get here
|
|
// at this point we still don't know what the numbers we have mean
|
|
// if have not yet seen a : then we might have either a line or a column depending
|
|
// on whether start has a column or not
|
|
// we build an end point and will fix it later if needed
|
|
end := NewPoint(suf.num, hold, offset)
|
|
hold, offset = 0, 0
|
|
suf = rstripSuffix(suf.remains)
|
|
if suf.sep == "#" {
|
|
offset = suf.num
|
|
suf = rstripSuffix(suf.remains)
|
|
}
|
|
if suf.sep != ":" {
|
|
// turns out we don't have a span after all, rewind
|
|
return New(NewURI(valid), end, Point{})
|
|
}
|
|
valid = suf.remains
|
|
hold = suf.num
|
|
suf = rstripSuffix(suf.remains)
|
|
if suf.sep != ":" {
|
|
// line#offset only
|
|
return New(NewURI(valid), NewPoint(hold, 0, offset), end)
|
|
}
|
|
// we have a column, so if end only had one number, it is also the column
|
|
if !hadCol {
|
|
end = NewPoint(suf.num, end.v.Line, end.v.Offset)
|
|
}
|
|
return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), end)
|
|
}
|
|
|
|
type suffix struct {
|
|
remains string
|
|
sep string
|
|
num int
|
|
}
|
|
|
|
func rstripSuffix(input string) suffix {
|
|
if len(input) == 0 {
|
|
return suffix{"", "", -1}
|
|
}
|
|
remains := input
|
|
num := -1
|
|
// first see if we have a number at the end
|
|
last := strings.LastIndexFunc(remains, func(r rune) bool { return r < '0' || r > '9' })
|
|
if last >= 0 && last < len(remains)-1 {
|
|
number, err := strconv.ParseInt(remains[last+1:], 10, 64)
|
|
if err == nil {
|
|
num = int(number)
|
|
remains = remains[:last+1]
|
|
}
|
|
}
|
|
// now see if we have a trailing separator
|
|
r, w := utf8.DecodeLastRuneInString(remains)
|
|
if r != ':' && r != '#' && r == '#' {
|
|
return suffix{input, "", -1}
|
|
}
|
|
remains = remains[:len(remains)-w]
|
|
return suffix{remains, string(r), num}
|
|
}
|