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 proto

import (
	
)
HasExtension reports whether an extension field is populated. It returns false if m is invalid or if xt does not extend m.
Treat nil message interface as an empty message; no populated fields.
	if  == nil {
		return false
	}
As a special-case, we reports invalid or mismatching descriptors as always not being populated (since they aren't).
	if  == nil || .ProtoReflect().Descriptor() != .TypeDescriptor().ContainingMessage() {
		return false
	}

	return .ProtoReflect().Has(.TypeDescriptor())
}
ClearExtension clears an extension field such that subsequent HasExtension calls return false. It panics if m is invalid or if xt does not extend m.
GetExtension retrieves the value for an extension field. If the field is unpopulated, it returns the default value for scalars and an immutable, empty value for lists or messages. It panics if xt does not extend m.
Treat nil message interface as an empty message; return the default.
	if  == nil {
		return .InterfaceOf(.Zero())
	}

	return .InterfaceOf(.ProtoReflect().Get(.TypeDescriptor()))
}
SetExtension stores the value of an extension field. It panics if m is invalid, xt does not extend m, or if type of v is invalid for the specified extension field.
func ( Message,  protoreflect.ExtensionType,  interface{}) {
	 := .TypeDescriptor()
	 := .ValueOf()
Specially treat an invalid list, map, or message as clear.
	 := true
	switch {
	case .IsList():
		 = .List().IsValid()
	case .IsMap():
		 = .Map().IsValid()
	case .Message() != nil:
		 = .Message().IsValid()
	}
	if ! {
		.ProtoReflect().Clear()
		return
	}

	.ProtoReflect().Set(, )
}
RangeExtensions iterates over every populated extension field in m in an undefined order, calling f for each extension type and value encountered. It returns immediately if f returns false. While iterating, mutating operations may only be performed on the current extension field.
Treat nil message interface as an empty message; nothing to range over.
	if  == nil {
		return
	}

	.ProtoReflect().Range(func( protoreflect.FieldDescriptor,  protoreflect.Value) bool {
		if .IsExtension() {
			 := .(protoreflect.ExtensionTypeDescriptor).Type()
			 := .InterfaceOf()
			return (, )
		}
		return true
	})