You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
5 years ago
|
package token
|
||
|
|
||
|
import "fmt"
|
||
|
|
||
|
// Pos describes an arbitrary source position
|
||
|
// including the file, line, and column location.
|
||
|
// A Position is valid if the line number is > 0.
|
||
|
type Pos struct {
|
||
|
Filename string // filename, if any
|
||
|
Offset int // offset, starting at 0
|
||
|
Line int // line number, starting at 1
|
||
|
Column int // column number, starting at 1 (character count)
|
||
|
}
|
||
|
|
||
|
// IsValid returns true if the position is valid.
|
||
|
func (p *Pos) IsValid() bool { return p.Line > 0 }
|
||
|
|
||
|
// String returns a string in one of several forms:
|
||
|
//
|
||
|
// file:line:column valid position with file name
|
||
|
// line:column valid position without file name
|
||
|
// file invalid position with file name
|
||
|
// - invalid position without file name
|
||
|
func (p Pos) String() string {
|
||
|
s := p.Filename
|
||
|
if p.IsValid() {
|
||
|
if s != "" {
|
||
|
s += ":"
|
||
|
}
|
||
|
s += fmt.Sprintf("%d:%d", p.Line, p.Column)
|
||
|
}
|
||
|
if s == "" {
|
||
|
s = "-"
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
// Before reports whether the position p is before u.
|
||
|
func (p Pos) Before(u Pos) bool {
|
||
|
return u.Offset > p.Offset || u.Line > p.Line
|
||
|
}
|
||
|
|
||
|
// After reports whether the position p is after u.
|
||
|
func (p Pos) After(u Pos) bool {
|
||
|
return u.Offset < p.Offset || u.Line < p.Line
|
||
|
}
|