@@ -340,50 +340,62 @@ void ValidateSingleFeatureLifetimes(
340340 results.errors .emplace_back (std::move (error_message));
341341 } else if (feature_support.has_edition_deprecated () &&
342342 edition >= feature_support.edition_deprecated ()) {
343- std::string error_message = absl::Substitute (
343+ std::string warning_message = absl::Substitute (
344344 " $0 has been deprecated in edition "
345345 " $1: $2" ,
346346 full_name, feature_support.edition_deprecated (),
347347 feature_support.deprecation_warning ());
348- results.warnings .emplace_back (std::move (error_message ));
348+ results.warnings .emplace_back (std::move (warning_message ));
349349 }
350350}
351351
352352void ValidateFeatureLifetimesImpl (Edition edition, const Message& message,
353- FeatureResolver::ValidationResults& results,
354- bool is_feature) {
353+ FeatureResolver::ValidationResults& results) {
355354 std::vector<const FieldDescriptor*> fields;
356355 message.GetReflection ()->ListFields (message, &fields);
357356 for (const FieldDescriptor* field : fields) {
358- // TODO: Support repeated option enum values and custom options
359- // feature support
360- if (is_feature) {
361- // Recurse into message extension.
362- if (field->is_extension () &&
363- field->cpp_type () == FieldDescriptor::CPPTYPE_MESSAGE) {
357+ const Reflection* reflector = message.GetReflection ();
358+ // Recurse into all Messages to be validated
359+ if (field->cpp_type () == FieldDescriptor::CPPTYPE_MESSAGE) {
360+ // Recursing into repeated Messages
361+ if (field->is_repeated ()) {
362+ for (int index = 0 ; index < reflector->FieldSize (message, field);
363+ index++) {
364+ ValidateFeatureLifetimesImpl (
365+ edition, reflector->GetRepeatedMessage (message, field, index),
366+ results);
367+ }
368+ } else {
364369 ValidateFeatureLifetimesImpl (
365- edition, message.GetReflection ()->GetMessage (message, field),
366- results, is_feature);
367- continue ;
370+ edition, reflector->GetMessage (message, field), results);
368371 }
369-
370- if (field->enum_type () != nullptr ) {
371- int number = message.GetReflection ()->GetEnumValue (message, field);
372+ }
373+ // Validating ENUM value
374+ if (field->enum_type () != nullptr ) {
375+ // Handling repeated enum values. Ex: OptionTargetType option
376+ if (field->is_repeated ()) {
377+ for (int index = 0 ; index < reflector->FieldSize (message, field);
378+ index++) {
379+ int number = reflector->GetRepeatedEnumValue (message, field, index);
380+ auto value = field->enum_type ()->FindValueByNumber (number);
381+ if (value == nullptr ) {
382+ continue ;
383+ }
384+ ValidateSingleFeatureLifetimes (edition, value->full_name (),
385+ value->options ().feature_support (),
386+ results);
387+ }
388+ } else {
389+ int number = reflector->GetEnumValue (message, field);
372390 auto value = field->enum_type ()->FindValueByNumber (number);
373391 if (value == nullptr ) {
374- results.errors .emplace_back (absl::StrCat (
375- " Feature " , field->full_name (), " has no known value " , number));
376392 continue ;
377393 }
378394 ValidateSingleFeatureLifetimes (edition, value->full_name (),
379395 value->options ().feature_support (),
380396 results);
381397 }
382398 }
383- // TODO: Support custom options
384- if (field->is_extension ()) {
385- continue ;
386- }
387399 ValidateSingleFeatureLifetimes (edition, field->full_name (),
388400 field->options ().feature_support (), results);
389401 }
@@ -521,10 +533,7 @@ FeatureResolver::ValidationResults FeatureResolver::ValidateFeatureLifetimes(
521533 const Message* pool_option = nullptr ;
522534 DynamicMessageFactory factory;
523535 std::unique_ptr<Message> message_storage;
524- bool is_feature =
525- option.GetDescriptor ()->name () == FeatureSet::descriptor ()->name ();
526- // TODO: Support custom options
527- if (pool_descriptor != nullptr && is_feature) {
536+ if (pool_descriptor != nullptr ) {
528537 // Move the messages back to the current pool so that we can reflect on
529538 // any extensions.
530539 message_storage =
@@ -543,7 +552,7 @@ FeatureResolver::ValidationResults FeatureResolver::ValidateFeatureLifetimes(
543552
544553 ValidationResults results;
545554 // Validate feature support
546- ValidateFeatureLifetimesImpl (edition, *pool_option, results, is_feature );
555+ ValidateFeatureLifetimesImpl (edition, *pool_option, results);
547556
548557 return results;
549558}
0 commit comments