func IsAny(o *desc.MessageDescriptor) bool {
	return string((&any.Any{}).ProtoReflect().Descriptor().FullName()) == o.GetFullyQualifiedName()
}
TODO maybe not compare by strings
package generator
import (
	"strings"
	"github.com/jhump/protoreflect/desc"
	"github.com/vektah/gqlparser/v2/ast"
	any "google.golang.org/protobuf/types/known/anypb"
)
type ObjectDescriptor struct {
	*ast.Definition
	desc.Descriptor
	fields     []*FieldDescriptor
	fieldNames map[string]*FieldDescriptor
}
func (o *ObjectDescriptor) AsGraphql() *ast.Definition {
	return o.Definition
}
func (o *ObjectDescriptor) uniqueName(f *desc.FieldDescriptor) string {
	return strings.Title(f.GetName())
}
func (o *ObjectDescriptor) IsInput() bool {
	return o.Kind == ast.InputObject
}
func (o *ObjectDescriptor) GetFields() []*FieldDescriptor {
	return o.fields
}
func (o *ObjectDescriptor) IsMessage() bool {
	_, ok := o.Descriptor.(*desc.MessageDescriptor)
	return ok
}
func IsEmpty(o *desc.MessageDescriptor) bool { return isEmpty(o, NewCallstack()) }
func isEmpty(o *desc.MessageDescriptor, callstack Callstack) bool {
	callstack.Push(o)
	defer callstack.Pop(o)
	if len(o.GetFields()) == 0 {
		return true
	}
	for _, f := range o.GetFields() {
		objType := f.GetMessageType()
		if objType == nil {
			return false
		}
		if callstack.Has(objType) {
			return true
		}
		if !isEmpty(objType, callstack) {
			return false
		}
	}
	return true
}