Copyright 2019 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 impl

import (
	
	
	

	pref 
	piface 
)
ExtensionInfo implements ExtensionType. This type contains a number of exported fields for legacy compatibility. The only non-deprecated use of this type is through the methods of the ExtensionType interface.
An ExtensionInfo may exist in several stages of initialization. extensionInfoUninitialized: Some or all of the legacy exported fields may be set, but none of the unexported fields have been initialized. This is the starting state for an ExtensionInfo in legacy generated code. extensionInfoDescInit: The desc field is set, but other unexported fields may not be initialized. Legacy exported fields may or may not be set. This is the starting state for an ExtensionInfo in newly generated code. extensionInfoFullInit: The ExtensionInfo is fully initialized. This state is only entered after lazy initialization is complete.
ExtendedType is a typed nil-pointer to the parent message type that is being extended. It is possible for this to be unpopulated in v2 since the message may no longer implement the MessageV1 interface. Deprecated: Use the ExtendedType method instead.
ExtensionType is the zero value of the extension type. For historical reasons, reflect.TypeOf(ExtensionType) and the type returned by InterfaceOf may not be identical. Deprecated: Use InterfaceOf(xt.Zero()) instead.
	ExtensionType interface{}
Field is the field number of the extension. Deprecated: Use the Descriptor().Number method instead.
Name is the fully qualified name of extension. Deprecated: Use the Descriptor().FullName method instead.
Tag is the protobuf struct tag used in the v1 API. Deprecated: Do not use.
Filename is the proto filename in which the extension is defined. Deprecated: Use Descriptor().ParentFile().Path() instead.
Stages of initialization: See the ExtensionInfo.init field.
const (
	extensionInfoUninitialized = 0
	extensionInfoDescInit      = 1
	extensionInfoFullInit      = 2
)

func ( *ExtensionInfo,  pref.ExtensionDescriptor,  reflect.Type) {
	.goType = 
	.desc = extensionTypeDescriptor{, }
	.init = extensionInfoDescInit
}

func ( *ExtensionInfo) () pref.Value {
	return .lazyInit().New()
}
func ( *ExtensionInfo) () pref.Value {
	return .lazyInit().Zero()
}
func ( *ExtensionInfo) ( interface{}) pref.Value {
	return .lazyInit().PBValueOf(reflect.ValueOf())
}
func ( *ExtensionInfo) ( pref.Value) interface{} {
	return .lazyInit().GoValueOf().Interface()
}
func ( *ExtensionInfo) ( pref.Value) bool {
	return .lazyInit().IsValidPB()
}
func ( *ExtensionInfo) ( interface{}) bool {
	return .lazyInit().IsValidGo(reflect.ValueOf())
}
func ( *ExtensionInfo) () pref.ExtensionTypeDescriptor {
	if atomic.LoadUint32(&.init) < extensionInfoDescInit {
		.lazyInitSlow()
	}
	return &.desc
}

func ( *ExtensionInfo) () Converter {
	if atomic.LoadUint32(&.init) < extensionInfoFullInit {
		.lazyInitSlow()
	}
	return .conv
}

func ( *ExtensionInfo) () {
	.mu.Lock()
	defer .mu.Unlock()

	if .init == extensionInfoFullInit {
		return
	}
	defer atomic.StoreUint32(&.init, extensionInfoFullInit)

	if .desc.ExtensionDescriptor == nil {
		.initFromLegacy()
	}
	if !.desc.ExtensionDescriptor.IsPlaceholder() {
		if .ExtensionType == nil {
			.initToLegacy()
		}
		.conv = NewConverter(.goType, .desc.ExtensionDescriptor)
		.info = makeExtensionFieldInfo(.desc.ExtensionDescriptor)
		.info.validation = newValidationInfo(.desc.ExtensionDescriptor, .goType)
	}
}

type extensionTypeDescriptor struct {
	pref.ExtensionDescriptor
	xi *ExtensionInfo
}

func ( *extensionTypeDescriptor) () pref.ExtensionType {
	return .xi
}
func ( *extensionTypeDescriptor) () pref.ExtensionDescriptor {
	return .ExtensionDescriptor