go-jsonnet/static_error.go
2016-01-21 13:11:48 -08:00

96 lines
2.2 KiB
Go

package jsonnet
import (
"fmt"
)
//////////////////////////////////////////////////////////////////////////////
// Location
// Location represents a single location in an (unspecified) file.
type Location struct {
Line int
Column int
}
// IsSet returns if this Location has been set.
func (l *Location) IsSet() bool {
return l.Line != 0
}
func (l *Location) String() string {
return fmt.Sprintf("%v:%v", l.Line, l.Column)
}
//////////////////////////////////////////////////////////////////////////////
// LocationRange
// LocationRange represents a range of a source file.
type LocationRange struct {
FileName string
Begin Location
End Location
}
// IsSet returns if this LocationRange has been set.
func (lr *LocationRange) IsSet() bool {
return lr.Begin.IsSet()
}
func (lr *LocationRange) String() string {
if !lr.IsSet() {
return lr.FileName
}
var filePrefix string
if len(lr.FileName) > 0 {
filePrefix = lr.FileName + ":"
}
if lr.Begin.Line == lr.End.Line {
if lr.Begin.Column == lr.End.Column {
return fmt.Sprintf("%s%v", filePrefix, lr.Begin.String())
}
return fmt.Sprintf("%s%v-%v", filePrefix, lr.Begin.String(), lr.End.Column)
}
return fmt.Sprintf("%s(%v)-(%v)", filePrefix, lr.Begin.String(), lr.End.String())
}
// This is useful for special locations, e.g. manifestation entry point.
func makeLocationRangeMessage(msg string) LocationRange {
return LocationRange{FileName: msg}
}
func makeLocationRange(fn string, begin Location, end Location) LocationRange {
return LocationRange{FileName: fn, Begin: begin, End: end}
}
//////////////////////////////////////////////////////////////////////////////
// StaticError
// StaticError represents an error during parsing/lexing some jsonnet.
type StaticError struct {
Loc LocationRange
Msg string
}
func makeStaticErrorMsg(msg string) StaticError {
return StaticError{Msg: msg}
}
func makeStaticErrorPoint(msg string, fn string, l Location) StaticError {
return StaticError{Msg: msg, Loc: makeLocationRange(fn, l, l)}
}
func makeStaticError(msg string, lr LocationRange) StaticError {
return StaticError{Msg: msg, Loc: lr}
}
func (err StaticError) Error() string {
loc := ""
if err.Loc.IsSet() {
loc = err.Loc.String()
}
return fmt.Sprintf("%v %v", loc, err.Msg)
}