in internal/filesystem/filesystem.go [123:169]
func (fs *fsystem) applyDocumentChange(buf *bytes.Buffer, change DocumentChange) error {
// if the range is nil, we assume it is full content change
if change.Range() == nil {
buf.Reset()
_, err := buf.WriteString(change.Text())
return err
}
lines := source.MakeSourceLines("", buf.Bytes())
startByte, err := ByteOffsetForPos(lines, change.Range().Start)
if err != nil {
return err
}
endByte, err := ByteOffsetForPos(lines, change.Range().End)
if err != nil {
return err
}
diff := endByte - startByte
if diff > 0 {
buf.Grow(diff)
}
beforeChange := make([]byte, startByte)
copy(beforeChange, buf.Bytes())
afterBytes := buf.Bytes()[endByte:]
afterChange := make([]byte, len(afterBytes))
copy(afterChange, afterBytes)
buf.Reset()
_, err = buf.Write(beforeChange)
if err != nil {
return err
}
_, err = buf.WriteString(change.Text())
if err != nil {
return err
}
_, err = buf.Write(afterChange)
if err != nil {
return err
}
return nil
}