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 }