aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/gopkg.in/sourcemap.v1/sourcemap.go
blob: 0e9af1a256367e08c47c9ca82ada0e82590c8500 (plain) (tree)




























































































































































                                                              
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,
        })
    }
}