diff --git a/reflection/serverreflection.go b/reflection/serverreflection.go index e0857e56..e9d0cc13 100644 --- a/reflection/serverreflection.go +++ b/reflection/serverreflection.go @@ -129,3 +129,13 @@ func (s *serverReflectionServer) nameForType(st reflect.Type) (string, error) { func (s *serverReflectionServer) nameForPointer(i interface{}) (string, error) { return s.nameForType(reflect.TypeOf(i).Elem()) } + +func (s *serverReflectionServer) filenameForType(st reflect.Type) (string, error) { + fd, _, err := s.fileDescForType(st) + if err != nil { + return "", err + } + return fd.GetName(), nil +} + +// TODO filenameForMethod and Service diff --git a/reflection/serverreflection_test.go b/reflection/serverreflection_test.go index 94126cdc..70c2b79b 100644 --- a/reflection/serverreflection_test.go +++ b/reflection/serverreflection_test.go @@ -71,3 +71,19 @@ func TestNameForPointer(t *testing.T) { } } } + +func TestFilenameForType(t *testing.T) { + for _, test := range []struct { + st reflect.Type + want string + }{ + {reflect.TypeOf(pb.SearchResponse{}), "test.proto"}, + {reflect.TypeOf(pb.SearchResponse_Result{}), "test.proto"}, + } { + r, err := s.filenameForType(test.st) + t.Logf("filenameForType(%q) = %q, %v", test.st, r, err) + if err != nil || r != test.want { + t.Fatalf("filenameForType(%q) = %q, %v, want %q, ", test.st, r, err, test.want) + } + } +}