From 5451ba3ac4f0a61e1fffdabac3d9b5daa5f04124 Mon Sep 17 00:00:00 2001 From: chanxuehong Date: Sat, 1 Oct 2022 11:37:36 +0000 Subject: [PATCH] go/token: fix File.AddLineColumnInfo logic The offset of the line info should be smaller than the file size. Otherwise, it should be ignored. Before the change, such an invalid line info won't be ignored when it's the first one to add. Change-Id: Id17492a8de97f277a49a59fae0070efeec40b2f9 GitHub-Last-Rev: 4d61d73c3ac248409ff9dabff558ec993cc8a25a GitHub-Pull-Request: golang/go#48456 Reviewed-on: https://go-review.googlesource.com/c/go/+/350741 Reviewed-by: Robert Griesemer Reviewed-by: Zeke Lu Reviewed-by: Dmitri Shuralyov TryBot-Result: Gopher Robot Reviewed-by: Benny Siegert Run-TryBot: hopehook --- src/go/token/position.go | 2 +- src/go/token/position_test.go | 95 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/go/token/position.go b/src/go/token/position.go index b12a8e4086..cbc2ddb5eb 100644 --- a/src/go/token/position.go +++ b/src/go/token/position.go @@ -245,7 +245,7 @@ func (f *File) AddLineInfo(offset int, filename string, line int) { // information for line directives such as //line filename:line:column. func (f *File) AddLineColumnInfo(offset int, filename string, line, column int) { f.mutex.Lock() - if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size { + if i := len(f.infos); (i == 0 || f.infos[i-1].Offset < offset) && offset < f.size { f.infos = append(f.infos, lineInfo{offset, filename, line, column}) } f.mutex.Unlock() diff --git a/src/go/token/position_test.go b/src/go/token/position_test.go index 10831b2e20..65cb242808 100644 --- a/src/go/token/position_test.go +++ b/src/go/token/position_test.go @@ -7,6 +7,7 @@ package token import ( "fmt" "math/rand" + "reflect" "sync" "testing" ) @@ -380,3 +381,97 @@ func TestRemoveFile(t *testing.T) { checkPos(bpos3, "fileB:1:4") checkNumFiles(1) } + +func TestFileAddLineColumnInfo(t *testing.T) { + const ( + filename = "test.go" + filesize = 100 + ) + + tests := []struct { + name string + infos []lineInfo + want []lineInfo + }{ + { + name: "normal", + infos: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: 50, Filename: filename, Line: 3, Column: 1}, + {Offset: 80, Filename: filename, Line: 4, Column: 2}, + }, + want: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: 50, Filename: filename, Line: 3, Column: 1}, + {Offset: 80, Filename: filename, Line: 4, Column: 2}, + }, + }, + { + name: "offset1 == file size", + infos: []lineInfo{ + {Offset: filesize, Filename: filename, Line: 2, Column: 1}, + }, + want: nil, + }, + { + name: "offset1 > file size", + infos: []lineInfo{ + {Offset: filesize + 1, Filename: filename, Line: 2, Column: 1}, + }, + want: nil, + }, + { + name: "offset2 == file size", + infos: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: filesize, Filename: filename, Line: 3, Column: 1}, + }, + want: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + }, + }, + { + name: "offset2 > file size", + infos: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: filesize + 1, Filename: filename, Line: 3, Column: 1}, + }, + want: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + }, + }, + { + name: "offset2 == offset1", + infos: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: 10, Filename: filename, Line: 3, Column: 1}, + }, + want: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + }, + }, + { + name: "offset2 < offset1", + infos: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + {Offset: 9, Filename: filename, Line: 3, Column: 1}, + }, + want: []lineInfo{ + {Offset: 10, Filename: filename, Line: 2, Column: 1}, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + fs := NewFileSet() + f := fs.AddFile(filename, -1, filesize) + for _, info := range test.infos { + f.AddLineColumnInfo(info.Offset, info.Filename, info.Line, info.Column) + } + if !reflect.DeepEqual(f.infos, test.want) { + t.Errorf("\ngot %+v, \nwant %+v", f.infos, test.want) + } + }) + } +} -- 2.48.1