position.go raw

   1  package token
   2  
   3  import "fmt"
   4  
   5  // Pos describes an arbitrary source position
   6  // including the file, line, and column location.
   7  // A Position is valid if the line number is > 0.
   8  type Pos struct {
   9  	Filename string // filename, if any
  10  	Offset   int    // offset, starting at 0
  11  	Line     int    // line number, starting at 1
  12  	Column   int    // column number, starting at 1 (character count)
  13  }
  14  
  15  // IsValid returns true if the position is valid.
  16  func (p *Pos) IsValid() bool { return p.Line > 0 }
  17  
  18  // String returns a string in one of several forms:
  19  //
  20  //	file:line:column    valid position with file name
  21  //	line:column         valid position without file name
  22  //	file                invalid position with file name
  23  //	-                   invalid position without file name
  24  func (p Pos) String() string {
  25  	s := p.Filename
  26  	if p.IsValid() {
  27  		if s != "" {
  28  			s += ":"
  29  		}
  30  		s += fmt.Sprintf("%d:%d", p.Line, p.Column)
  31  	}
  32  	if s == "" {
  33  		s = "-"
  34  	}
  35  	return s
  36  }
  37  
  38  // Before reports whether the position p is before u.
  39  func (p Pos) Before(u Pos) bool {
  40  	return u.Offset > p.Offset || u.Line > p.Line
  41  }
  42  
  43  // After reports whether the position p is after u.
  44  func (p Pos) After(u Pos) bool {
  45  	return u.Offset < p.Offset || u.Line < p.Line
  46  }
  47