From 77f612f1c0ff24b328215bd8a784543feb5b975e Mon Sep 17 00:00:00 2001 From: Dan Kortschak Date: Fri, 7 Jan 2022 09:08:25 +1030 Subject: [PATCH] utter: fix local package removal logic --- common.go | 1 - dump.go | 27 ++++++++++++++++++++++----- spew_test.go | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/common.go b/common.go index 3d7fa7d..870839f 100644 --- a/common.go +++ b/common.go @@ -168,7 +168,6 @@ var ( ampersandBytes = []byte("&") colonSpaceBytes = []byte(": ") spaceBytes = []byte(" ") - dotBytes = []byte(".") openParenBytes = []byte("(") closeParenBytes = []byte(")") nilBytes = []byte("nil") diff --git a/dump.go b/dump.go index dc8647a..df47c89 100644 --- a/dump.go +++ b/dump.go @@ -146,17 +146,16 @@ func (d *dumpState) dumpPtr(v reflect.Value) { var typeBytes []byte if displayed { d.w.Write(openParenBytes) - typeBytes = []byte(strings.TrimPrefix(orig.Type().String(), d.cs.LocalPackage)) + typeBytes = []byte(typeString(orig.Type(), d.cs.LocalPackage)) } else { d.w.Write(bytes.Repeat(ampersandBytes, indirects)) - typeBytes = []byte(strings.TrimPrefix(v.Type().String(), d.cs.LocalPackage)) + typeBytes = []byte(typeString(v.Type(), d.cs.LocalPackage)) } kind := v.Kind() bufferedChan := kind == reflect.Chan && v.Cap() != 0 if kind == reflect.Ptr || bufferedChan { d.w.Write(openParenBytes) } - typeBytes = bytes.TrimPrefix(typeBytes, dotBytes) d.w.Write(bytes.ReplaceAll(typeBytes, interfaceTypeBytes, interfaceBytes)) if displayed { d.w.Write(closeParenBytes) @@ -377,8 +376,7 @@ func (d *dumpState) dump(v reflect.Value, wasPtr, static, canElideCompound bool, if bufferedChan { d.w.Write(openParenBytes) } - typeBytes := []byte(strings.TrimPrefix(v.Type().String(), d.cs.LocalPackage)) - typeBytes = bytes.TrimPrefix(typeBytes, dotBytes) + typeBytes := []byte(typeString(v.Type(), d.cs.LocalPackage)) d.w.Write(bytes.ReplaceAll(typeBytes, interfaceTypeBytes, interfaceBytes)) if bufferedChan { switch len := v.Len(); len { @@ -587,6 +585,25 @@ func (d *dumpState) dump(v reflect.Value, wasPtr, static, canElideCompound bool, } } +// typeString returns the string representation of the reflect.Type with the local +// package selector removed. +func typeString(typ reflect.Type, local string) string { + switch typ.Kind() { + case reflect.Ptr: + return "*" + strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(typ.String(), "*"), local), ".") + case reflect.Array: + return fmt.Sprintf("[%d]%s", typ.Len(), typeString(typ.Elem(), local)) + case reflect.Chan: + return fmt.Sprintf("%s %s", typ.ChanDir(), typeString(typ.Elem(), local)) + case reflect.Map: + return fmt.Sprintf("map[%s]%s", typeString(typ.Key(), local), typeString(typ.Elem(), local)) + case reflect.Slice: + return fmt.Sprintf("[]%s", typeString(typ.Elem(), local)) + default: + return strings.TrimPrefix(strings.TrimPrefix(typ.String(), local), ".") + } +} + // isDefault returns whether the type is a default type absent of context. func isDefault(typ reflect.Type) bool { if typ.PkgPath() != "" || typ.Name() == "" { diff --git a/spew_test.go b/spew_test.go index a73f9e3..b353c00 100644 --- a/spew_test.go +++ b/spew_test.go @@ -194,6 +194,21 @@ func initSpewTests() { {elideLocalDefault, fCSFdump, Foo{Bar{flag: 1}, map[interface{}]interface{}{"one": true}}, "Foo{\n unexportedField: Bar{\n flag: Flag(1),\n data: uintptr(0),\n },\n ExportedField: map[interface{}]interface{}{\n string(\"one\"): bool(true),\n },\n}\n", }, + {elideLocalDefault, fCSFdump, map[cs]cs{{}: {}}, + "map[cs]cs{\n cs{\n cs: (*cs)(nil),\n }: cs{\n cs: (*cs)(nil),\n },\n}\n", + }, + {elideLocalDefault, fCSFdump, [2]cs{}, + "[2]cs{\n cs{\n cs: (*cs)(nil),\n },\n cs{\n cs: (*cs)(nil),\n },\n}\n", + }, + {elideLocalDefault, fCSFdump, []cs{{}}, + "[]cs{\n cs{\n cs: (*cs)(nil),\n },\n}\n", + }, + {elideLocalDefault, fCSFdump, chan cs(nil), + "chan cs(nil)\n", + }, + {elideLocalDefault, fCSFdump, chan<- cs(nil), + "chan<- cs(nil)\n", + }, {elideTypeDefault, fCSFdump, float64(1), "1.0\n"}, {elideTypeDefault, fCSFdump, float32(1), "float32(1)\n"}, {elideTypeDefault, fCSFdump, int(1), "1\n"},