forked from golang/hotime
158 lines
2.6 KiB
Go
158 lines
2.6 KiB
Go
package sourcemap // import "gopkg.in/sourcemap.v1"
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
|
|
"gopkg.in/sourcemap.v1/base64vlq"
|
|
)
|
|
|
|
type fn func(m *mappings) (fn, error)
|
|
|
|
type sourceMap struct {
|
|
Version int `json:"version"`
|
|
File string `json:"file"`
|
|
SourceRoot string `json:"sourceRoot"`
|
|
Sources []string `json:"sources"`
|
|
Names []interface{} `json:"names"`
|
|
Mappings string `json:"mappings"`
|
|
}
|
|
|
|
type mapping struct {
|
|
genLine int
|
|
genCol int
|
|
sourcesInd int
|
|
sourceLine int
|
|
sourceCol int
|
|
namesInd int
|
|
}
|
|
|
|
type mappings struct {
|
|
rd *strings.Reader
|
|
dec *base64vlq.Decoder
|
|
|
|
hasName bool
|
|
value mapping
|
|
|
|
values []mapping
|
|
}
|
|
|
|
func parseMappings(s string) ([]mapping, error) {
|
|
rd := strings.NewReader(s)
|
|
m := &mappings{
|
|
rd: rd,
|
|
dec: base64vlq.NewDecoder(rd),
|
|
}
|
|
m.value.genLine = 1
|
|
m.value.sourceLine = 1
|
|
|
|
err := m.parse()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return m.values, nil
|
|
}
|
|
|
|
func (m *mappings) parse() error {
|
|
next := parseGenCol
|
|
for {
|
|
c, err := m.rd.ReadByte()
|
|
if err == io.EOF {
|
|
m.pushValue()
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch c {
|
|
case ',':
|
|
m.pushValue()
|
|
next = parseGenCol
|
|
case ';':
|
|
m.pushValue()
|
|
|
|
m.value.genLine++
|
|
m.value.genCol = 0
|
|
|
|
next = parseGenCol
|
|
default:
|
|
err := m.rd.UnreadByte()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
next, err = next(m)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func parseGenCol(m *mappings) (fn, error) {
|
|
n, err := m.dec.Decode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.value.genCol += n
|
|
return parseSourcesInd, nil
|
|
}
|
|
|
|
func parseSourcesInd(m *mappings) (fn, error) {
|
|
n, err := m.dec.Decode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.value.sourcesInd += n
|
|
return parseSourceLine, nil
|
|
}
|
|
|
|
func parseSourceLine(m *mappings) (fn, error) {
|
|
n, err := m.dec.Decode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.value.sourceLine += n
|
|
return parseSourceCol, nil
|
|
}
|
|
|
|
func parseSourceCol(m *mappings) (fn, error) {
|
|
n, err := m.dec.Decode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.value.sourceCol += n
|
|
return parseNamesInd, nil
|
|
}
|
|
|
|
func parseNamesInd(m *mappings) (fn, error) {
|
|
n, err := m.dec.Decode()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.hasName = true
|
|
m.value.namesInd += n
|
|
return parseGenCol, nil
|
|
}
|
|
|
|
func (m *mappings) pushValue() {
|
|
if m.value.sourceLine == 1 && m.value.sourceCol == 0 {
|
|
return
|
|
}
|
|
|
|
if m.hasName {
|
|
m.values = append(m.values, m.value)
|
|
m.hasName = false
|
|
} else {
|
|
m.values = append(m.values, mapping{
|
|
genLine: m.value.genLine,
|
|
genCol: m.value.genCol,
|
|
sourcesInd: m.value.sourcesInd,
|
|
sourceLine: m.value.sourceLine,
|
|
sourceCol: m.value.sourceCol,
|
|
namesInd: -1,
|
|
})
|
|
}
|
|
}
|