func NewError(message string, nodes []ast.Node, stack string, source *source.Source, positions []int) *Error { if stack == "" && message != "" { stack = message } if source == nil { for _, node := range nodes { // get source from first node if node.GetLoc() != nil { source = node.GetLoc().Source } break } } if len(positions) == 0 && len(nodes) > 0 { for _, node := range nodes { if node.GetLoc() == nil { continue } positions = append(positions, node.GetLoc().Start) } } locations := []location.SourceLocation{} for _, pos := range positions { loc := location.GetLocation(source, pos) locations = append(locations, loc) } return &Error{ Message: message, Stack: stack, Nodes: nodes, Source: source, Positions: positions, Locations: locations, } }
func NewSyntaxError(s *source.Source, position int, description string) *Error { l := location.GetLocation(s, position) return NewError( fmt.Sprintf("Syntax Error %s (%d:%d) %s\n\n%s", s.Name, l.Line, l.Column, description, highlightSourceAtLocation(s, l)), []ast.Node{}, "", s, []int{position}, ) }