| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | // Copyright 2024 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 filedesc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"google.golang.org/protobuf/encoding/protowire" | 
					
						
							|  |  |  | 	"google.golang.org/protobuf/internal/editiondefaults" | 
					
						
							|  |  |  | 	"google.golang.org/protobuf/internal/genid" | 
					
						
							|  |  |  | 	"google.golang.org/protobuf/reflect/protoreflect" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var defaultsCache = make(map[Edition]EditionFeatures) | 
					
						
							| 
									
										
										
										
											2024-05-06 08:50:47 +00:00
										 |  |  | var defaultsKeys = []Edition{} | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							|  |  |  | 	unmarshalEditionDefaults(editiondefaults.Defaults) | 
					
						
							| 
									
										
										
										
											2024-05-06 08:50:47 +00:00
										 |  |  | 	SurrogateProto2.L1.EditionFeatures = getFeaturesFor(EditionProto2) | 
					
						
							|  |  |  | 	SurrogateProto3.L1.EditionFeatures = getFeaturesFor(EditionProto3) | 
					
						
							|  |  |  | 	SurrogateEdition2023.L1.EditionFeatures = getFeaturesFor(Edition2023) | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func unmarshalGoFeature(b []byte, parent EditionFeatures) EditionFeatures { | 
					
						
							|  |  |  | 	for len(b) > 0 { | 
					
						
							|  |  |  | 		num, _, n := protowire.ConsumeTag(b) | 
					
						
							|  |  |  | 		b = b[n:] | 
					
						
							|  |  |  | 		switch num { | 
					
						
							|  |  |  | 		case genid.GoFeatures_LegacyUnmarshalJsonEnum_field_number: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			parent.GenerateLegacyUnmarshalJSON = protowire.DecodeBool(v) | 
					
						
							| 
									
										
										
										
											2025-01-14 13:10:39 +00:00
										 |  |  | 		case genid.GoFeatures_ApiLevel_field_number: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			parent.APILevel = int(v) | 
					
						
							|  |  |  | 		case genid.GoFeatures_StripEnumPrefix_field_number: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			parent.StripEnumPrefix = int(v) | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 		default: | 
					
						
							|  |  |  | 			panic(fmt.Sprintf("unkown field number %d while unmarshalling GoFeatures", num)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return parent | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func unmarshalFeatureSet(b []byte, parent EditionFeatures) EditionFeatures { | 
					
						
							|  |  |  | 	for len(b) > 0 { | 
					
						
							|  |  |  | 		num, typ, n := protowire.ConsumeTag(b) | 
					
						
							|  |  |  | 		b = b[n:] | 
					
						
							|  |  |  | 		switch typ { | 
					
						
							|  |  |  | 		case protowire.VarintType: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			switch num { | 
					
						
							|  |  |  | 			case genid.FeatureSet_FieldPresence_field_number: | 
					
						
							|  |  |  | 				parent.IsFieldPresence = v == genid.FeatureSet_EXPLICIT_enum_value || v == genid.FeatureSet_LEGACY_REQUIRED_enum_value | 
					
						
							|  |  |  | 				parent.IsLegacyRequired = v == genid.FeatureSet_LEGACY_REQUIRED_enum_value | 
					
						
							|  |  |  | 			case genid.FeatureSet_EnumType_field_number: | 
					
						
							|  |  |  | 				parent.IsOpenEnum = v == genid.FeatureSet_OPEN_enum_value | 
					
						
							|  |  |  | 			case genid.FeatureSet_RepeatedFieldEncoding_field_number: | 
					
						
							|  |  |  | 				parent.IsPacked = v == genid.FeatureSet_PACKED_enum_value | 
					
						
							|  |  |  | 			case genid.FeatureSet_Utf8Validation_field_number: | 
					
						
							|  |  |  | 				parent.IsUTF8Validated = v == genid.FeatureSet_VERIFY_enum_value | 
					
						
							|  |  |  | 			case genid.FeatureSet_MessageEncoding_field_number: | 
					
						
							|  |  |  | 				parent.IsDelimitedEncoded = v == genid.FeatureSet_DELIMITED_enum_value | 
					
						
							|  |  |  | 			case genid.FeatureSet_JsonFormat_field_number: | 
					
						
							|  |  |  | 				parent.IsJSONCompliant = v == genid.FeatureSet_ALLOW_enum_value | 
					
						
							| 
									
										
										
										
											2025-04-14 09:43:56 +02:00
										 |  |  | 			case genid.FeatureSet_EnforceNamingStyle_field_number: | 
					
						
							|  |  |  | 				// EnforceNamingStyle is enforced in protoc, languages other than C++ | 
					
						
							|  |  |  | 				// are not supposed to do anything with this feature. | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 			default: | 
					
						
							|  |  |  | 				panic(fmt.Sprintf("unkown field number %d while unmarshalling FeatureSet", num)) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case protowire.BytesType: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeBytes(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			switch num { | 
					
						
							| 
									
										
										
										
											2025-01-14 13:10:39 +00:00
										 |  |  | 			case genid.FeatureSet_Go_ext_number: | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 				parent = unmarshalGoFeature(v, parent) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return parent | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func featuresFromParentDesc(parentDesc protoreflect.Descriptor) EditionFeatures { | 
					
						
							|  |  |  | 	var parentFS EditionFeatures | 
					
						
							|  |  |  | 	switch p := parentDesc.(type) { | 
					
						
							|  |  |  | 	case *File: | 
					
						
							|  |  |  | 		parentFS = p.L1.EditionFeatures | 
					
						
							|  |  |  | 	case *Message: | 
					
						
							|  |  |  | 		parentFS = p.L1.EditionFeatures | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("unknown parent type %T", parentDesc)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return parentFS | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func unmarshalEditionDefault(b []byte) { | 
					
						
							|  |  |  | 	var ed Edition | 
					
						
							|  |  |  | 	var fs EditionFeatures | 
					
						
							|  |  |  | 	for len(b) > 0 { | 
					
						
							|  |  |  | 		num, typ, n := protowire.ConsumeTag(b) | 
					
						
							|  |  |  | 		b = b[n:] | 
					
						
							|  |  |  | 		switch typ { | 
					
						
							|  |  |  | 		case protowire.VarintType: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			switch num { | 
					
						
							|  |  |  | 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number: | 
					
						
							|  |  |  | 				ed = Edition(v) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case protowire.BytesType: | 
					
						
							|  |  |  | 			v, m := protowire.ConsumeBytes(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			switch num { | 
					
						
							| 
									
										
										
										
											2024-05-21 13:17:22 +00:00
										 |  |  | 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number: | 
					
						
							|  |  |  | 				fs = unmarshalFeatureSet(v, fs) | 
					
						
							|  |  |  | 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number: | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 				fs = unmarshalFeatureSet(v, fs) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defaultsCache[ed] = fs | 
					
						
							| 
									
										
										
										
											2024-05-06 08:50:47 +00:00
										 |  |  | 	defaultsKeys = append(defaultsKeys, ed) | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func unmarshalEditionDefaults(b []byte) { | 
					
						
							|  |  |  | 	for len(b) > 0 { | 
					
						
							|  |  |  | 		num, _, n := protowire.ConsumeTag(b) | 
					
						
							|  |  |  | 		b = b[n:] | 
					
						
							|  |  |  | 		switch num { | 
					
						
							|  |  |  | 		case genid.FeatureSetDefaults_Defaults_field_number: | 
					
						
							|  |  |  | 			def, m := protowire.ConsumeBytes(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 			unmarshalEditionDefault(def) | 
					
						
							|  |  |  | 		case genid.FeatureSetDefaults_MinimumEdition_field_number, | 
					
						
							|  |  |  | 			genid.FeatureSetDefaults_MaximumEdition_field_number: | 
					
						
							|  |  |  | 			// We don't care about the minimum and maximum editions. If the | 
					
						
							|  |  |  | 			// edition we are looking for later on is not in the cache we know | 
					
						
							|  |  |  | 			// it is outside of the range between minimum and maximum edition. | 
					
						
							|  |  |  | 			_, m := protowire.ConsumeVarint(b) | 
					
						
							|  |  |  | 			b = b[m:] | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			panic(fmt.Sprintf("unkown field number %d while unmarshalling EditionDefault", num)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getFeaturesFor(ed Edition) EditionFeatures { | 
					
						
							| 
									
										
										
										
											2024-05-06 08:50:47 +00:00
										 |  |  | 	match := EditionUnknown | 
					
						
							|  |  |  | 	for _, key := range defaultsKeys { | 
					
						
							|  |  |  | 		if key > ed { | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		match = key | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if match == EditionUnknown { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("unsupported edition: %v", ed)) | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-05-06 08:50:47 +00:00
										 |  |  | 	return defaultsCache[match] | 
					
						
							| 
									
										
										
										
											2024-03-11 10:12:06 +00:00
										 |  |  | } |