d26c1e395a
The only two AST nodes that track any semblance of location right now are ast.Workspace and ast.Stack. This is simply because, using the standard JSON and YAML parsers, we aren't given any information about the resulting unmarshaled node locations. To fix that, we'll need to crack open the parsers and get our hands dirty. In the meantime, we can crudely implement diag.Diagable on ast.Workspace and ast.Stack, however, to simply return their diag.Documents.
41 lines
931 B
Go
41 lines
931 B
Go
// Copyright 2016 Marapongo, Inc. All rights reserved.
|
|
|
|
package diag
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"path/filepath"
|
|
)
|
|
|
|
// Document is a file used during compilation, for which advanced diagnostics, such as line/column numbers, may be
|
|
// required. It stores the contents of the entire file so that precise errors can be given; Forget discards them.
|
|
type Document struct {
|
|
File string
|
|
Body []byte
|
|
}
|
|
|
|
var _ Diagable = &Document{} // compile-time assertion that *Document implements Diagable.
|
|
|
|
func NewDocument(file string) *Document {
|
|
return &Document{File: file}
|
|
}
|
|
|
|
func ReadDocument(file string) (*Document, error) {
|
|
body, err := ioutil.ReadFile(file)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Document{File: file, Body: body}, nil
|
|
}
|
|
|
|
func (doc *Document) Ext() string {
|
|
return filepath.Ext(doc.File)
|
|
}
|
|
|
|
func (doc *Document) Forget() {
|
|
doc.Body = nil
|
|
}
|
|
|
|
func (doc *Document) Where() (*Document, *Location) {
|
|
return doc, nil
|
|
}
|