]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cover: add //line comment pointing to original file
authorRuss Cox <rsc@golang.org>
Fri, 10 Nov 2017 04:55:15 +0000 (23:55 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 16 Nov 2017 01:41:30 +0000 (01:41 +0000)
Now that cover does not modify the formatting of the original file
or add any newline characters, we can make it print a //line comment
pointing back at the original, and compiler errors and panics will
report accurate line numbers.

Fixes #6329.
Fixes #15757.

Change-Id: I7b0e386112c69beafe69e0d47c5f9e9abc87c0f5
Reviewed-on: https://go-review.googlesource.com/77151
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/cover/cover.go
src/cmd/go/go_test.go
src/cmd/go/testdata/src/coverbad/p.go [new file with mode: 0644]
src/cmd/go/testdata/src/coverbad/p_test.go [new file with mode: 0644]

index d74a0f18801b90988b3805280691bdef486af5d5..500027ee0d5a99ff5d7ea9648bb824096fb8dc74 100644 (file)
@@ -340,6 +340,7 @@ func annotate(name string) {
                }
        }
 
+       fmt.Fprintf(fd, "//line %s:1\n", name)
        fd.Write(newContent)
 
        // After printing the source tree, add some declarations for the counters etc.
index 2cf3d7d9de8dc2c48db621bd781292754dab9978..d2933bc3cbca0b7e11da98e124a1b5f513e1d690 100644 (file)
@@ -2430,6 +2430,33 @@ func TestCoveragePattern(t *testing.T) {
        tg.run("test", "-coverprofile="+filepath.Join(tg.tempdir, "cover.out"), "-coverpkg=sleepy...", "-run=^$", "sleepy1")
 }
 
+func TestCoverageErrorLine(t *testing.T) {
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.parallel()
+       tg.makeTempdir()
+       tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
+       tg.setenv("GOTMPDIR", tg.tempdir)
+
+       tg.runFail("test", "coverbad")
+       tg.grepStderr(`coverbad[\\/]p.go:4`, "did not find correct line number for error")
+       tg.grepStderrNot(regexp.QuoteMeta(tg.tempdir), "found temporary directory in error")
+       stderr := tg.getStderr()
+
+       tg.runFail("test", "-cover", "coverbad")
+       tg.grepStderr(`coverbad[\\/]p.go:4`, "did not find correct line number for error")
+       stderr2 := tg.getStderr()
+
+       // It's OK that stderr2 drops the character position in the error,
+       // because of the //line directive.
+       stderr = strings.Replace(stderr, "p.go:4:2:", "p.go:4:", -1)
+       if stderr != stderr2 {
+               t.Logf("test -cover changed error messages:\nbefore:\n%s\n\nafter:\n%s", stderr, stderr2)
+               t.Skip("golang.org/issue/22660")
+               t.FailNow()
+       }
+}
+
 func TestPluginNonMain(t *testing.T) {
        wd, err := os.Getwd()
        if err != nil {
diff --git a/src/cmd/go/testdata/src/coverbad/p.go b/src/cmd/go/testdata/src/coverbad/p.go
new file mode 100644 (file)
index 0000000..16504a4
--- /dev/null
@@ -0,0 +1,5 @@
+package p
+
+func f() {
+       g()
+}
diff --git a/src/cmd/go/testdata/src/coverbad/p_test.go b/src/cmd/go/testdata/src/coverbad/p_test.go
new file mode 100644 (file)
index 0000000..3a876d6
--- /dev/null
@@ -0,0 +1,5 @@
+package p
+
+import "testing"
+
+func Test(t *testing.T) {}