service/debugger: Bugfix: support pkg names with slashes in linespecs

Fixes #275
This commit is contained in:
aarzilli 2015-10-17 09:31:07 +02:00
parent b4fd5718d4
commit 971d7968c0
3 changed files with 15 additions and 8 deletions

@ -2,6 +2,7 @@ package main
import (
"fmt"
"io/ioutil"
)
type SomeType struct {
@ -32,4 +33,5 @@ func main() {
fmt.Printf("%s %s\n", a.String(), b.String())
a.SomeFunction()
anotherFunction()
ioutil.ReadFile("nonexistent.file.txt")
}

@ -156,10 +156,6 @@ func readRegex(in string) (rx string, rest string) {
}
func parseFuncLocationSpec(in string) *FuncLocationSpec {
if strings.Index(in, "/") >= 0 {
return nil
}
v := strings.Split(in, ".")
var spec FuncLocationSpec
switch len(v) {
@ -171,6 +167,8 @@ func parseFuncLocationSpec(in string) *FuncLocationSpec {
r := stripReceiverDecoration(v[0])
if r != v[0] {
spec.ReceiverName = r
} else if strings.Index(r, "/") >= 0 {
spec.PackageName = r
} else {
spec.PackageOrReceiverName = r
}
@ -184,6 +182,10 @@ func parseFuncLocationSpec(in string) *FuncLocationSpec {
return nil
}
if strings.Index(spec.BaseName, "/") >= 0 || strings.Index(spec.ReceiverName, "/") >= 0 {
return nil
}
return &spec
}

@ -556,7 +556,7 @@ func findLocationHelper(t *testing.T, c service.Client, loc string, shouldErr bo
func TestClientServer_FindLocations(t *testing.T) {
withTestClient("locationsprog", t, func(c service.Client) {
someFunctionCallAddr := findLocationHelper(t, c, "locationsprog.go:26", false, 1, 0)[0]
someFunctionCallAddr := findLocationHelper(t, c, "locationsprog.go:27", false, 1, 0)[0]
findLocationHelper(t, c, "anotherFunction:1", false, 1, someFunctionCallAddr)
findLocationHelper(t, c, "main.anotherFunction:1", false, 1, someFunctionCallAddr)
findLocationHelper(t, c, "anotherFunction", false, 1, someFunctionCallAddr)
@ -567,20 +567,23 @@ func TestClientServer_FindLocations(t *testing.T) {
findLocationHelper(t, c, "String", true, 0, 0)
findLocationHelper(t, c, "main.String", true, 0, 0)
someTypeStringFuncAddr := findLocationHelper(t, c, "locationsprog.go:14", false, 1, 0)[0]
otherTypeStringFuncAddr := findLocationHelper(t, c, "locationsprog.go:18", false, 1, 0)[0]
someTypeStringFuncAddr := findLocationHelper(t, c, "locationsprog.go:15", false, 1, 0)[0]
otherTypeStringFuncAddr := findLocationHelper(t, c, "locationsprog.go:19", false, 1, 0)[0]
findLocationHelper(t, c, "SomeType.String", false, 1, someTypeStringFuncAddr)
findLocationHelper(t, c, "(*SomeType).String", false, 1, someTypeStringFuncAddr)
findLocationHelper(t, c, "main.SomeType.String", false, 1, someTypeStringFuncAddr)
findLocationHelper(t, c, "main.(*SomeType).String", false, 1, someTypeStringFuncAddr)
// Issue #275
findLocationHelper(t, c, "io/ioutil.ReadFile", false, 1, 0)
stringAddrs := findLocationHelper(t, c, "/^main.*Type.*String$/", false, 2, 0)
if otherTypeStringFuncAddr != stringAddrs[0] && otherTypeStringFuncAddr != stringAddrs[1] {
t.Fatalf("Wrong locations returned for \"/.*Type.*String/\", got: %v expected: %v and %v\n", stringAddrs, someTypeStringFuncAddr, otherTypeStringFuncAddr)
}
_, err := c.CreateBreakpoint(&api.Breakpoint{FunctionName: "main.main", Line: 4, Tracepoint: false})
_, err := c.CreateBreakpoint(&api.Breakpoint{FunctionName: "main.main", Line: 3, Tracepoint: false})
if err != nil {
t.Fatalf("CreateBreakpoint(): %v\n", err)
}