]> Cypherpunks repositories - gostls13.git/commitdiff
go/token: fix File.AddLineColumnInfo logic
authorchanxuehong <chanxuehong@gmail.com>
Sat, 1 Oct 2022 11:37:36 +0000 (11:37 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Mon, 3 Oct 2022 13:05:50 +0000 (13:05 +0000)
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 <gri@golang.org>
Reviewed-by: Zeke Lu <lvzecai@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Run-TryBot: hopehook <hopehook@golangcn.org>

src/go/token/position.go
src/go/token/position_test.go

index b12a8e408605acd7946ed90707854f94dcd549a9..cbc2ddb5ebde2dd64babcffc92bebafcfa4b3817 100644 (file)
@@ -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()
index 10831b2e20cd6986905124b6e1ff06feb645e1ce..65cb24280897fcb47474b9d0c567f0ddba6ee530 100644 (file)
@@ -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)
+                       }
+               })
+       }
+}