@@ -357,15 +357,10 @@ IEnumerable<string> VerifyTypeDefinition (TypeDefinition original, LinkedEntity?
357357 if ( linked == null )
358358 yield break ;
359359
360- // Compiler generated members can't be annotated with `Kept` attributes directly
361- // For some of them we have special attributes (backing fields for example), but it's impractical to define
362- // special attributes for all types of compiler generated members (there are quite a few of them and they're
363- // going to change/increase over time).
364- // So we're effectively disabling Kept validation on compiler generated members
365- // Note that we still want to go "inside" each such member, as it might have additional attributes
360+ // Note that we still want to go "inside" each skipped type, as it might have additional attributes
366361 // we do want to validate. There's no specific use case right now, but I can easily imagine one
367362 // for more detailed testing of for example custom attributes on local functions, or similar.
368- if ( ! IsCompilerGeneratedMember ( original ) )
363+ if ( ! SkipKeptItemsValidation ( original ) )
369364 yield return $ "Type `{ original } ' should have been removed";
370365 }
371366
@@ -408,8 +403,7 @@ protected virtual IEnumerable<string> VerifyTypeDefinitionKept (TypeDefinition o
408403 }
409404
410405#if false
411- // Skip verification of type metadata for compiler generated types (we don't currently need it yet)
412- if ( ! IsCompilerGeneratedMember ( original ) ) {
406+ if ( ! SkipKeptItemsValidation ( original ) ) {
413407 foreach ( var err in VerifyKeptByAttributes ( original , linked ) )
414408 yield return err ;
415409 if ( ! original . IsInterface )
@@ -422,7 +416,7 @@ protected virtual IEnumerable<string> VerifyTypeDefinitionKept (TypeDefinition o
422416 yield return err ;
423417 foreach ( var err in VerifyPseudoAttributes ( original , linked ) )
424418 yield return err ;
425- foreach ( var err in VerifyGenericParameters ( original , linked ) )
419+ foreach ( var err in VerifyGenericParameters ( original , linked , skipKeptItemsValidation : false ) )
426420 yield return err ;
427421 foreach ( var err in VerifyCustomAttributes ( original , linked ) )
428422 yield return err ;
@@ -557,21 +551,21 @@ private static string FormatBaseOrInterfaceAttributeValue (CustomAttribute attr)
557551
558552 private IEnumerable < string > VerifyField ( FieldDefinition src , FieldDesc ? linked )
559553 {
560- bool compilerGenerated = IsCompilerGeneratedMember ( src ) ;
561- bool expectedKept = ShouldBeKept ( src ) | compilerGenerated ;
554+ bool skipKeptItemsValidation = SkipKeptItemsValidation ( src ) ;
555+ bool expectedKept = ShouldBeKept ( src ) ;
562556
563557 if ( ! expectedKept ) {
564- if ( linked != null )
558+ if ( linked != null && ! skipKeptItemsValidation )
565559 yield return $ "Field `{ src } ' should have been removed";
566560
567561 yield break ;
568562 }
569563
570- foreach ( var err in VerifyFieldKept ( src , linked , compilerGenerated ) )
564+ foreach ( var err in VerifyFieldKept ( src , linked , skipKeptItemsValidation ) )
571565 yield return err ;
572566 }
573567
574- private static IEnumerable < string > VerifyFieldKept ( FieldDefinition src , FieldDesc ? linked , bool compilerGenerated )
568+ private static IEnumerable < string > VerifyFieldKept ( FieldDefinition src , FieldDesc ? linked , bool skipKeptItemsValidation )
575569 {
576570 if ( linked == null ) {
577571 yield return $ "Field `{ src } ' should have been kept";
@@ -590,7 +584,7 @@ private static IEnumerable<string> VerifyFieldKept (FieldDefinition src, FieldDe
590584#if false
591585 foreach ( var err in VerifyPseudoAttributes ( src , linked ) )
592586 yield return err ;
593- if ( ! compilerGenerated )
587+ if ( ! skipKeptItemsValidation )
594588 foreach ( var err in VerifyCustomAttributes ( src , linked ) )
595589 yield return err ;
596590#endif
@@ -601,11 +595,11 @@ private IEnumerable<string> VerifyProperty (PropertyDefinition src, LinkedEntity
601595 PropertyPseudoDesc ? linked = linkedEntity ? . Entity as PropertyPseudoDesc ;
602596 VerifyMemberBackingField ( src , linkedType ) ;
603597
604- bool compilerGenerated = IsCompilerGeneratedMember ( src ) ;
605- bool expectedKept = ShouldBeKept ( src ) || compilerGenerated ;
598+ bool skipKeptItemsValidation = SkipKeptItemsValidation ( src ) ;
599+ bool expectedKept = ShouldBeKept ( src ) ;
606600
607601 if ( ! expectedKept ) {
608- if ( linked is not null )
602+ if ( linked is not null && ! skipKeptItemsValidation )
609603 yield return $ "Property `{ src } ' should have been removed";
610604
611605 yield break ;
@@ -627,7 +621,7 @@ private IEnumerable<string> VerifyProperty (PropertyDefinition src, LinkedEntity
627621#if false
628622 foreach ( var err in VerifyPseudoAttributes ( src , linked ) )
629623 yield return err ;
630- if ( ! compilerGenerated )
624+ if ( ! skipKeptItemsValidation )
631625 {
632626 foreach ( var err in VerifyCustomAttributes ( src , linked ) )
633627 yield return err ;
@@ -641,11 +635,11 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
641635 foreach ( var err in VerifyMemberBackingField ( src , linkedType ) )
642636 yield return err ;
643637
644- bool compilerGenerated = IsCompilerGeneratedMember ( src ) ;
645- bool expectedKept = ShouldBeKept ( src ) | compilerGenerated ;
638+ bool skipKeptItemsValidation = SkipKeptItemsValidation ( src ) ;
639+ bool expectedKept = ShouldBeKept ( src ) ;
646640
647641 if ( ! expectedKept ) {
648- if ( linked is not null )
642+ if ( linked is not null && ! skipKeptItemsValidation )
649643 yield return $ "Event `{ src } ' should have been removed";
650644
651645 yield break ;
@@ -659,7 +653,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
659653 if ( src . CustomAttributes . Any ( attr => attr . AttributeType . Name == nameof ( KeptEventAddMethodAttribute ) ) ) {
660654 // TODO: This is wrong - we can't validate that the method is present by looking at linked (as that is not actually linked)
661655 // we need to look into linkedMembers to see if the method was actually preserved by the compiler (and has an entry point)
662- foreach ( var err in VerifyMethodInternal ( src . AddMethod , new LinkedMethodEntity ( linked . AddMethod , false ) , true , compilerGenerated ) )
656+ foreach ( var err in VerifyMethodInternal ( src . AddMethod , new LinkedMethodEntity ( linked . AddMethod , false ) , true , skipKeptItemsValidation ) )
663657 yield return err ;
664658 verifiedEventMethods . Add ( src . AddMethod . FullName ) ;
665659 linkedMembers . Remove ( new AssemblyQualifiedToken ( src . AddMethod ) ) ;
@@ -668,7 +662,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
668662 if ( src . CustomAttributes . Any ( attr => attr . AttributeType . Name == nameof ( KeptEventRemoveMethodAttribute ) ) ) {
669663 // TODO: This is wrong - we can't validate that the method is present by looking at linked (as that is not actually linked)
670664 // we need to look into linkedMembers to see if the method was actually preserved by the compiler (and has an entry point)
671- foreach ( var err in VerifyMethodInternal ( src . RemoveMethod , new LinkedMethodEntity ( linked . RemoveMethod , false ) , true , compilerGenerated ) )
665+ foreach ( var err in VerifyMethodInternal ( src . RemoveMethod , new LinkedMethodEntity ( linked . RemoveMethod , false ) , true , skipKeptItemsValidation ) )
672666 yield return err ;
673667 verifiedEventMethods . Add ( src . RemoveMethod . FullName ) ;
674668 linkedMembers . Remove ( new AssemblyQualifiedToken ( src . RemoveMethod ) ) ;
@@ -677,7 +671,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
677671#if false
678672 foreach ( var err in VerifyPseudoAttributes ( src , linked ) )
679673 yield return err ;
680- if ( ! compilerGenerated )
674+ if ( ! skipKeptItemsValidation )
681675 {
682676 foreach ( var err in VerifyCustomAttributes ( src , linned ) )
683677 yield return err ;
@@ -688,26 +682,25 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
688682 private IEnumerable < string > VerifyMethod ( MethodDefinition src , LinkedEntity ? linkedEntity )
689683 {
690684 LinkedMethodEntity ? linked = linkedEntity as LinkedMethodEntity ;
691- bool compilerGenerated = IsCompilerGeneratedMember ( src ) ;
685+ bool skipKeptItemsValidation = SkipKeptItemsValidation ( src ) ;
692686 bool expectedKept = ShouldMethodBeKept ( src ) ;
693- foreach ( var err in VerifyMethodInternal ( src , linked , expectedKept , compilerGenerated ) )
687+ foreach ( var err in VerifyMethodInternal ( src , linked , expectedKept , skipKeptItemsValidation ) )
694688 yield return err ;
695689 }
696690
697- private IEnumerable < string > VerifyMethodInternal ( MethodDefinition src , LinkedMethodEntity ? linked , bool expectedKept , bool compilerGenerated )
691+ private IEnumerable < string > VerifyMethodInternal ( MethodDefinition src , LinkedMethodEntity ? linked , bool expectedKept , bool skipKeptItemsValidation )
698692 {
699693 if ( ! expectedKept ) {
700694 if ( linked == null )
701695 yield break ;
702696
703- // Similar to comment on types, compiler-generated methods can't be annotated with Kept attribute directly
704- // so we're not going to validate kept/remove on them. Note that we're still going to go validate "into" them
705- // to check for other properties (like parameter name presence/removal for example)
706- if ( ! compilerGenerated )
697+ // Note that we're still going to go validate "into" the skipped methods to check for other properties
698+ // (like parameter name presence/removal for example)
699+ if ( ! skipKeptItemsValidation )
707700 yield return $ "Method `{ NameUtils . GetExpectedOriginDisplayName ( src ) } ' should have been removed";
708701 }
709702
710- foreach ( var err in VerifyMethodKept ( src , linked , compilerGenerated ) )
703+ foreach ( var err in VerifyMethodKept ( src , linked , skipKeptItemsValidation ) )
711704 yield return err ;
712705 }
713706
@@ -735,13 +728,13 @@ private IEnumerable<string> VerifyMemberBackingField (IMemberDefinition src, Typ
735728 yield break ;
736729 }
737730
738- foreach ( var err in VerifyFieldKept ( srcField , linkedType ? . GetFields ( ) ? . FirstOrDefault ( l => srcField . Name == l . Name ) , compilerGenerated : true ) )
731+ foreach ( var err in VerifyFieldKept ( srcField , linkedType ? . GetFields ( ) ? . FirstOrDefault ( l => srcField . Name == l . Name ) , skipKeptItemsValidation : true ) )
739732 yield return err ;
740733 verifiedGeneratedFields . Add ( srcField . FullName ) ;
741734 linkedMembers . Remove ( new AssemblyQualifiedToken ( srcField ) ) ;
742735 }
743736
744- IEnumerable < string > VerifyMethodKept ( MethodDefinition src , LinkedMethodEntity ? linked , bool compilerGenerated )
737+ IEnumerable < string > VerifyMethodKept ( MethodDefinition src , LinkedMethodEntity ? linked , bool skipKeptItemsValidation )
745738 {
746739 if ( linked == null ) {
747740 yield return $ "Method `{ NameUtils . GetExpectedOriginDisplayName ( src ) } ' should have been kept";
@@ -751,16 +744,16 @@ IEnumerable<string> VerifyMethodKept (MethodDefinition src, LinkedMethodEntity?
751744#if false
752745 foreach ( var err in VerifyPseudoAttributes ( src , linked ) )
753746 yield return err ;
754- foreach ( var err in VerifyGenericParameters ( src , linked ) )
747+ foreach ( var err in VerifyGenericParameters ( src , linked , skipKeptItemsValidation ) )
755748 yield return err ;
756- if ( ! compilerGenerated ) {
749+ if ( ! skipKeptItemsValidation ) {
757750 foreach ( var err in VerifyCustomAttributes ( src , linked ) )
758751 yield return err ;
759752 foreach ( var err in VerifyCustomAttributes ( src . MethodReturnType , linked . MethodReturnType ) )
760753 yield return err ;
761754 }
762755#endif
763- foreach ( var err in VerifyParameters ( src , linked ) )
756+ foreach ( var err in VerifyParameters ( src , linked , skipKeptItemsValidation ) )
764757 yield return err ;
765758#if false
766759 foreach ( var err in VerifySecurityAttributes ( src , linked ) )
@@ -1156,7 +1149,7 @@ protected virtual IEnumerable<string> VerifyArrayInitializers (MethodDefinition
11561149
11571150 private IEnumerable < string > VerifyInitializerField ( FieldDefinition src , FieldDefinition ? linked )
11581151 {
1159- foreach ( var err in VerifyFieldKept ( src , linked ) )
1152+ foreach ( var err in VerifyFieldKept ( src , linked , skipKeptItemsValidation : true ) )
11601153 yield return err ;
11611154 verifiedGeneratedFields . Add ( linked ! . FullName ) ;
11621155 linkedMembers . Remove ( new ( linked ) ) ;
@@ -1264,7 +1257,7 @@ private IEnumerable<string> VerifyFixedBufferFields (TypeDefinition src, TypeDef
12641257 }
12651258
12661259 var linkedField = linkedCompilerGeneratedBufferType ? . Fields . FirstOrDefault ( ) ;
1267- foreach ( var err in VerifyFieldKept ( originalElementField , linkedField ) )
1260+ foreach ( var err in VerifyFieldKept ( originalElementField , linkedField , skipKeptItemsValidation : true ) )
12681261 yield return err ;
12691262 verifiedGeneratedFields . Add ( originalElementField . FullName ) ;
12701263 linkedMembers . Remove ( new ( linkedField ! ) ) ;
@@ -1289,15 +1282,15 @@ private IEnumerable<string> VerifyDelegateBackingFields (TypeDefinition src, Typ
12891282 continue ;
12901283
12911284 var linkedField = linked ? . Fields . FirstOrDefault ( l => l . Name == srcField . Name ) ;
1292- foreach ( var err in VerifyFieldKept ( srcField , linkedField ) )
1285+ foreach ( var err in VerifyFieldKept ( srcField , linkedField , skipKeptItemsValidation : true ) )
12931286 yield return err ;
12941287 verifiedGeneratedFields . Add ( srcField . FullName ) ;
12951288 linkedMembers . Remove ( new ( srcField ) ) ;
12961289 }
12971290 }
12981291#endif
12991292
1300- private IEnumerable < string > VerifyGenericParameters ( IGenericParameterProvider src , IGenericParameterProvider linked )
1293+ private IEnumerable < string > VerifyGenericParameters ( IGenericParameterProvider src , IGenericParameterProvider linked , bool skipKeptItemsValidation )
13011294 {
13021295 if ( src . HasGenericParameters != linked . HasGenericParameters )
13031296 yield return $ "Mismatch in having generic paramters. Expected { src . HasGenericParameters } , actual { linked . HasGenericParameters } ";
@@ -1307,8 +1300,12 @@ private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider s
13071300 // TODO: Verify constraints
13081301 var srcp = src . GenericParameters [ i ] ;
13091302 var lnkp = linked . GenericParameters [ i ] ;
1310- foreach ( var err in VerifyCustomAttributes ( srcp , lnkp ) )
1311- yield return err ;
1303+
1304+ if ( ! skipKeptItemsValidation )
1305+ {
1306+ foreach ( var err in VerifyCustomAttributes ( srcp , lnkp ) )
1307+ yield return err ;
1308+ }
13121309
13131310 if ( checkNames ) {
13141311 if ( srcp . CustomAttributes . Any ( attr => attr . AttributeType . Name == nameof ( RemovedNameValueAttribute ) ) ) {
@@ -1324,7 +1321,7 @@ private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider s
13241321 }
13251322 }
13261323
1327- private IEnumerable < string > VerifyParameters ( IMethodSignature src , LinkedMethodEntity linked )
1324+ private IEnumerable < string > VerifyParameters ( IMethodSignature src , LinkedMethodEntity linked , bool skipKeptItemsValidation )
13281325 {
13291326 if ( src . HasParameters != linked . Method . Signature . Length > 0 )
13301327 yield return $ "Mismatch in having parameters in { src as MethodDefinition } : Expected { src . HasParameters } , actual { linked . Method . Signature . Length > 0 } ";
@@ -1334,8 +1331,11 @@ private IEnumerable<string> VerifyParameters (IMethodSignature src, LinkedMethod
13341331 //var lnkp = linked.Parameters[i];
13351332
13361333#if false
1337- foreach ( var err in VerifyCustomAttributes ( srcp , lnkp ) )
1338- yield return err ;
1334+ if ( ! skipKeptItemsValidation )
1335+ {
1336+ foreach ( var err in VerifyCustomAttributes ( srcp , lnkp ) )
1337+ yield return err ;
1338+ }
13391339#endif
13401340
13411341 if ( checkNames ) {
0 commit comments