// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package prototype

import (
	"fmt"

	"google.golang.org/proto/internal/pragma"
	pref "google.golang.org/proto/reflect/protoreflect"
)

type standaloneMessage struct{ m *StandaloneMessage }

func (t standaloneMessage) Parent() (pref.Descriptor, bool)                   { return nil, false }
func (t standaloneMessage) Index() int                                        { return 0 }
func (t standaloneMessage) Syntax() pref.Syntax                               { return t.m.Syntax }
func (t standaloneMessage) Name() pref.Name                                   { return t.m.FullName.Name() }
func (t standaloneMessage) FullName() pref.FullName                           { return t.m.FullName }
func (t standaloneMessage) IsPlaceholder() bool                               { return false }
func (t standaloneMessage) DescriptorProto() (pref.Message, bool)             { return nil, false }
func (t standaloneMessage) DescriptorOptions() (pref.DescriptorOptions, bool) { return nil, false }
func (t standaloneMessage) IsMapEntry() bool                                  { return t.m.IsMapEntry }
func (t standaloneMessage) Fields() pref.FieldDescriptors                     { return t.m.fields.lazyInit(t, t.m.Fields) }
func (t standaloneMessage) Oneofs() pref.OneofDescriptors                     { return t.m.oneofs.lazyInit(t, t.m.Oneofs) }
func (t standaloneMessage) RequiredNumbers() pref.FieldNumbers                { return t.m.nums.lazyInit(t.m.Fields) }
func (t standaloneMessage) ExtensionRanges() pref.FieldRanges                 { return (*ranges)(&t.m.ExtensionRanges) }
func (t standaloneMessage) Messages() pref.MessageDescriptors                 { return &emptyMessages }
func (t standaloneMessage) Enums() pref.EnumDescriptors                       { return &emptyEnums }
func (t standaloneMessage) Extensions() pref.ExtensionDescriptors             { return &emptyExtensions }
func (t standaloneMessage) Format(s fmt.State, r rune)                        { formatDesc(s, r, t) }
func (t standaloneMessage) ProtoType(pref.MessageDescriptor)                  {}
func (t standaloneMessage) ProtoInternal(pragma.DoNotImplement)               {}

type standaloneEnum struct{ e *StandaloneEnum }

func (t standaloneEnum) Parent() (pref.Descriptor, bool)                   { return nil, false }
func (t standaloneEnum) Index() int                                        { return 0 }
func (t standaloneEnum) Syntax() pref.Syntax                               { return t.e.Syntax }
func (t standaloneEnum) Name() pref.Name                                   { return t.e.FullName.Name() }
func (t standaloneEnum) FullName() pref.FullName                           { return t.e.FullName }
func (t standaloneEnum) IsPlaceholder() bool                               { return false }
func (t standaloneEnum) DescriptorProto() (pref.Message, bool)             { return nil, false }
func (t standaloneEnum) DescriptorOptions() (pref.DescriptorOptions, bool) { return nil, false }
func (t standaloneEnum) Values() pref.EnumValueDescriptors                 { return t.e.vals.lazyInit(t, t.e.Values) }
func (t standaloneEnum) Format(s fmt.State, r rune)                        { formatDesc(s, r, t) }
func (t standaloneEnum) ProtoType(pref.EnumDescriptor)                     {}
func (t standaloneEnum) ProtoInternal(pragma.DoNotImplement)               {}

type standaloneExtension struct{ x *StandaloneExtension }

func (t standaloneExtension) Parent() (pref.Descriptor, bool)                   { return nil, false }
func (t standaloneExtension) Index() int                                        { return 0 }
func (t standaloneExtension) Syntax() pref.Syntax                               { return t.x.Syntax }
func (t standaloneExtension) Name() pref.Name                                   { return t.x.FullName.Name() }
func (t standaloneExtension) FullName() pref.FullName                           { return t.x.FullName }
func (t standaloneExtension) IsPlaceholder() bool                               { return false }
func (t standaloneExtension) DescriptorProto() (pref.Message, bool)             { return nil, false }
func (t standaloneExtension) DescriptorOptions() (pref.DescriptorOptions, bool) { return nil, false }
func (t standaloneExtension) Number() pref.FieldNumber                          { return t.x.Number }
func (t standaloneExtension) Cardinality() pref.Cardinality                     { return t.x.Cardinality }
func (t standaloneExtension) Kind() pref.Kind                                   { return t.x.Kind }
func (t standaloneExtension) JSONName() string                                  { return "" }
func (t standaloneExtension) IsPacked() bool                                    { return t.x.IsPacked }
func (t standaloneExtension) IsMap() bool                                       { return false }
func (t standaloneExtension) IsWeak() bool                                      { return false }
func (t standaloneExtension) Default() pref.Value                               { return t.x.dv.lazyInit(t, t.x.Default) }
func (t standaloneExtension) HasDefault() bool                                  { return t.x.Default.IsValid() }
func (t standaloneExtension) OneofType() pref.OneofDescriptor                   { return nil }
func (t standaloneExtension) MessageType() pref.MessageDescriptor               { return t.x.MessageType }
func (t standaloneExtension) EnumType() pref.EnumDescriptor                     { return t.x.EnumType }
func (t standaloneExtension) ExtendedType() pref.MessageDescriptor              { return t.x.ExtendedType }
func (t standaloneExtension) Format(s fmt.State, r rune)                        { formatDesc(s, r, t) }
func (t standaloneExtension) ProtoType(pref.FieldDescriptor)                    {}
func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement)               {}
