github.com/jmigpin/editor@v1.6.0/util/parseutil/reslocparser/singleton.go (about)

     1  package reslocparser
     2  
     3  import (
     4  	"os"
     5  	"runtime"
     6  	"sync"
     7  
     8  	"github.com/jmigpin/editor/util/iout/iorw"
     9  	"github.com/jmigpin/editor/util/osutil"
    10  	"github.com/jmigpin/editor/util/parseutil"
    11  )
    12  
    13  func ParseResLoc(src []byte, index int) (*ResLoc, error) {
    14  	rlp, err := getResLocParser()
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	return rlp.Parse(src, index)
    19  }
    20  func ParseResLoc2(rd iorw.ReaderAt, index int) (*ResLoc, error) {
    21  	src, err := iorw.ReadFastFull(rd)
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  	min := rd.Min() // keep to restore position
    26  	rl, err := ParseResLoc(src, index-min)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  	// restore position
    31  	rl.Pos += min
    32  	rl.End += min
    33  	return rl, nil
    34  }
    35  
    36  //----------
    37  
    38  // reslocparser singleton
    39  var rlps struct {
    40  	once sync.Once
    41  	p    *ResLocParser
    42  	err  error
    43  }
    44  
    45  func getResLocParser() (*ResLocParser, error) {
    46  	rlps.once.Do(func() {
    47  		rlps.p, rlps.err = newResLocParserSingletonInstance()
    48  	})
    49  	return rlps.p, rlps.err
    50  }
    51  func newResLocParserSingletonInstance() (*ResLocParser, error) {
    52  	rlp := NewResLocParser()
    53  
    54  	rlp.PathSeparator = rune(os.PathSeparator)
    55  	rlp.Escape = rune(osutil.EscapeRune)
    56  	rlp.ParseVolume = runtime.GOOS == "windows"
    57  
    58  	rlp.Init()
    59  
    60  	return rlp, nil
    61  }
    62  
    63  //----------
    64  //----------
    65  //----------
    66  
    67  // util func to replace parseutil.*
    68  func ParseFilePos(src []byte, index int) (*parseutil.FilePos, error) {
    69  	rl, err := ParseResLoc(src, index)
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  	return ResLocToFilePos(rl), nil
    74  }
    75  
    76  func ResLocToFilePos(rl *ResLoc) *parseutil.FilePos {
    77  	return &parseutil.FilePos{
    78  		Filename: rl.Path, // original string (unescaped)
    79  		Line:     rl.Line,
    80  		Column:   rl.Column,
    81  		Offset:   -1, // TODO
    82  	}
    83  }