hclpack: fix marshalling file index positions
When marshalling, the current file index was not stored. Because of this, a ';' was inserted multiple times for each file, even if the file did not change. When unmarshalling, the fileIdx determined by number of ';' was ignored. Thus, if there were more than one file, all the positions would still point to the first file.
This commit is contained in:
parent
d5b12e1c08
commit
40e962e08e
@ -28,6 +28,7 @@ func (pp positionsPacked) MarshalBinary() ([]byte, error) {
|
|||||||
// for a body to be entirely in one file, this can lead to considerable
|
// for a body to be entirely in one file, this can lead to considerable
|
||||||
// savings in that case.
|
// savings in that case.
|
||||||
delims := ppr.FileIdx - lastFileIdx
|
delims := ppr.FileIdx - lastFileIdx
|
||||||
|
lastFileIdx = ppr.FileIdx
|
||||||
for i := 0; i < delims; i++ {
|
for i := 0; i < delims; i++ {
|
||||||
buf = buf.AppendRawByte(';')
|
buf = buf.AppendRawByte(';')
|
||||||
}
|
}
|
||||||
@ -65,6 +66,7 @@ func (pp *positionsPacked) UnmarshalBinary(data []byte) error {
|
|||||||
|
|
||||||
var ppr positionPacked
|
var ppr positionPacked
|
||||||
var err error
|
var err error
|
||||||
|
ppr.FileIdx = fileIdx
|
||||||
ppr.LineDelta, buf, err = buf.ReadInt()
|
ppr.LineDelta, buf, err = buf.ReadInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
30
hclpack/positions_packed_test.go
Normal file
30
hclpack/positions_packed_test.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package hclpack
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBinaryRoundTrip(t *testing.T) {
|
||||||
|
startPacked := positionsPacked{
|
||||||
|
{FileIdx: 0, LineDelta: 1, ColumnDelta: 2, ByteDelta: 3},
|
||||||
|
{FileIdx: 1, LineDelta: 2, ColumnDelta: 3, ByteDelta: 4},
|
||||||
|
{FileIdx: 2, LineDelta: 3, ColumnDelta: 4, ByteDelta: 5},
|
||||||
|
}
|
||||||
|
|
||||||
|
b, err := startPacked.MarshalBinary()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to marshal: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var endPacked positionsPacked
|
||||||
|
err = endPacked.UnmarshalBinary(b)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to unmarshal: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !cmp.Equal(startPacked, endPacked) {
|
||||||
|
t.Errorf("Incorrect result\n%s", cmp.Diff(startPacked, endPacked))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user