gocore: convert dwarf names to runtime more accurately

Import paths can have dots, and struct names need to have package paths
removed.

This accounts for import paths like github.com/whatever, and also should
fix things like map[path/to/package.Type]path/to/package.Othertype.

Change-Id: Ief767f7fadf5c15f6d6343e0e1738904a4ca460a
Reviewed-on: https://go-review.googlesource.com/99675
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/gocore/dwarf.go b/gocore/dwarf.go
index 57b389e..cff0097 100644
--- a/gocore/dwarf.go
+++ b/gocore/dwarf.go
@@ -261,7 +261,7 @@
 	case *dwarf.StructType:
 		if !strings.HasPrefix(x.StructName, "struct {") {
 			// This is a named type, return that name.
-			return x.StructName
+			return stripPackagePath(x.StructName)
 		}
 		// Figure out which fields have anonymous names.
 		var anon []bool
@@ -299,17 +299,22 @@
 		s += " }"
 		return s
 	default:
-		name := dt.String()
-		// The runtime uses just package names. DWARF uses whole package paths.
-		// To convert from the latter to the former, get rid of the package paths.
-		// Examples:
-		//   text/template.Template -> template.Template
-		//   map[string]compress/gzip.Writer -> map[string]gzip.Writer
-		return strings.Join(pathRegexp.Split(name, -1), "")
+		return stripPackagePath(dt.String())
 	}
 }
 
-var pathRegexp = regexp.MustCompile("\\w+/")
+var pathRegexp = regexp.MustCompile(`([\w.]+/)+\w+`)
+
+func stripPackagePath(name string) string {
+	// The runtime uses just package names. DWARF uses whole package paths.
+	// To convert from the latter to the former, get rid of the package paths.
+	// Examples:
+	//   text/template.Template -> template.Template
+	//   map[string]compress/gzip.Writer -> map[string]gzip.Writer
+	return pathRegexp.ReplaceAllStringFunc(name, func(path string) string {
+		return path[strings.LastIndex(path, "/")+1:]
+	})
+}
 
 // readRuntimeConstants populates the p.rtConstants map.
 func (p *Process) readRuntimeConstants() {