go/scanner: to interpret line comments with Windows filenames

Fixes #1614.

R=gri
CC=golang-dev
https://golang.org/cl/4290054
This commit is contained in:
Alex Brainman 2011-03-17 11:49:56 -07:00 committed by Robert Griesemer
parent b3166bcb8e
commit c0f3b6c8a8
2 changed files with 14 additions and 3 deletions

View File

@ -177,7 +177,7 @@ var prefix = []byte("//line ")
func (S *Scanner) interpretLineComment(text []byte) {
if bytes.HasPrefix(text, prefix) {
// get filename and line number, if any
if i := bytes.Index(text, []byte{':'}); i > 0 {
if i := bytes.LastIndex(text, []byte{':'}); i > 0 {
if line, err := strconv.Atoi(string(text[i+1:])); err == nil && line > 0 {
// valid //line filename:line comment;
filename := filepath.Clean(string(text[len(prefix):i]))

View File

@ -8,6 +8,7 @@ import (
"go/token"
"os"
"path/filepath"
"runtime"
"testing"
)
@ -444,11 +445,13 @@ func TestSemis(t *testing.T) {
}
}
var segments = []struct {
type segment struct {
srcline string // a line of source text
filename string // filename for current token
line int // line number for current token
}{
}
var segments = []segment{
// exactly one token per line since the test consumes one token per segment
{" line1", filepath.Join("dir", "TestLineComments"), 1},
{"\nline2", filepath.Join("dir", "TestLineComments"), 2},
@ -466,9 +469,17 @@ var segments = []struct {
{"\n//line a/b/c/File1.go:100\n line100", filepath.Join("dir", "a", "b", "c", "File1.go"), 100},
}
var winsegments = []segment{
{"\n//line c:\\dir\\File1.go:100\n line100", "c:\\dir\\File1.go", 100},
}
// Verify that comments of the form "//line filename:line" are interpreted correctly.
func TestLineComments(t *testing.T) {
if runtime.GOOS == "windows" {
segments = append(segments, winsegments...)
}
// make source
var src string
for _, e := range segments {