Commit c0f3b6c8 authored by Alex Brainman's avatar Alex Brainman Committed by Robert Griesemer

go/scanner: to interpret line comments with Windows filenames

Fixes #1614.

R=gri
CC=golang-dev
https://golang.org/cl/4290054
parent b3166bcb
...@@ -177,7 +177,7 @@ var prefix = []byte("//line ") ...@@ -177,7 +177,7 @@ var prefix = []byte("//line ")
func (S *Scanner) interpretLineComment(text []byte) { func (S *Scanner) interpretLineComment(text []byte) {
if bytes.HasPrefix(text, prefix) { if bytes.HasPrefix(text, prefix) {
// get filename and line number, if any // 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 { if line, err := strconv.Atoi(string(text[i+1:])); err == nil && line > 0 {
// valid //line filename:line comment; // valid //line filename:line comment;
filename := filepath.Clean(string(text[len(prefix):i])) filename := filepath.Clean(string(text[len(prefix):i]))
......
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"go/token" "go/token"
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"testing" "testing"
) )
...@@ -444,11 +445,13 @@ func TestSemis(t *testing.T) { ...@@ -444,11 +445,13 @@ func TestSemis(t *testing.T) {
} }
} }
var segments = []struct { type segment struct {
srcline string // a line of source text srcline string // a line of source text
filename string // filename for current token filename string // filename for current token
line int // line number 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 // exactly one token per line since the test consumes one token per segment
{" line1", filepath.Join("dir", "TestLineComments"), 1}, {" line1", filepath.Join("dir", "TestLineComments"), 1},
{"\nline2", filepath.Join("dir", "TestLineComments"), 2}, {"\nline2", filepath.Join("dir", "TestLineComments"), 2},
...@@ -466,9 +469,17 @@ var segments = []struct { ...@@ -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}, {"\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. // Verify that comments of the form "//line filename:line" are interpreted correctly.
func TestLineComments(t *testing.T) { func TestLineComments(t *testing.T) {
if runtime.GOOS == "windows" {
segments = append(segments, winsegments...)
}
// make source // make source
var src string var src string
for _, e := range segments { for _, e := range segments {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment