@@ -34,7 +34,7 @@ public ObservableRecipientGenerator()
34
34
IncrementalGeneratorInitializationContext context ,
35
35
IncrementalValuesProvider < ( INamedTypeSymbol Symbol , AttributeData AttributeData ) > source )
36
36
{
37
- static ObservableRecipientInfo GetInfo ( INamedTypeSymbol typeSymbol , AttributeData attributeData )
37
+ static ObservableRecipientInfo GetInfo ( INamedTypeSymbol typeSymbol , AttributeData attributeData , bool isRequiresUnreferencedCodeAttributeAvailable )
38
38
{
39
39
string typeName = typeSymbol . Name ;
40
40
bool hasExplicitConstructors = ! ( typeSymbol . InstanceConstructors . Length == 1 && typeSymbol . InstanceConstructors [ 0 ] is { Parameters . IsEmpty : true , IsImplicitlyDeclared : true } ) ;
@@ -45,10 +45,19 @@ static ObservableRecipientInfo GetInfo(INamedTypeSymbol typeSymbol, AttributeDat
45
45
typeName ,
46
46
hasExplicitConstructors ,
47
47
isAbstract ,
48
- isObservableValidator ) ;
48
+ isObservableValidator ,
49
+ isRequiresUnreferencedCodeAttributeAvailable ) ;
49
50
}
50
51
51
- return source . Select ( static ( item , _ ) => ( item . Symbol , GetInfo ( item . Symbol , item . AttributeData ) ) ) ;
52
+ // Check whether [RequiresUnreferencedCode] is available
53
+ IncrementalValueProvider < bool > isRequiresUnreferencedCodeAttributeAvailable =
54
+ context . CompilationProvider
55
+ . Select ( static ( item , _ ) => item . GetTypeByMetadataName ( "System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute" ) is not null ) ;
56
+
57
+ return
58
+ source
59
+ . Combine ( isRequiresUnreferencedCodeAttributeAvailable )
60
+ . Select ( static ( item , _ ) => ( item . Left . Symbol , GetInfo ( item . Left . Symbol , item . Left . AttributeData , item . Right ) ) ) ;
52
61
}
53
62
54
63
/// <inheritdoc/>
@@ -110,14 +119,31 @@ protected override ImmutableArray<MemberDeclarationSyntax> FilterDeclaredMembers
110
119
}
111
120
}
112
121
122
+ MemberDeclarationSyntax RemoveRequiresUnreferencedCodeAttributeIfNeeded ( MemberDeclarationSyntax member )
123
+ {
124
+ if ( ! info . IsRequiresUnreferencedCodeAttributeAvailable &&
125
+ member is PropertyDeclarationSyntax { Identifier . ValueText : "IsActive" } or MethodDeclarationSyntax { Identifier . ValueText : "OnActivated" } )
126
+ {
127
+ SyntaxNode attributeNode =
128
+ member
129
+ . DescendantNodes ( )
130
+ . OfType < AttributeListSyntax > ( )
131
+ . First ( node => ( ( IdentifierNameSyntax ) ( ( QualifiedNameSyntax ) node . Attributes [ 0 ] . Name ) . Right ) . Identifier . ValueText == "RequiresUnreferencedCode" ) ;
132
+
133
+ return member . RemoveNode ( attributeNode , SyntaxRemoveOptions . KeepExteriorTrivia ) ! ;
134
+ }
135
+
136
+ return member ;
137
+ }
138
+
113
139
// Skip the SetProperty overloads if the target type inherits from ObservableValidator, to avoid conflicts
114
140
if ( info . IsObservableValidator )
115
141
{
116
142
foreach ( MemberDeclarationSyntax member in memberDeclarations . Where ( static member => member is not ConstructorDeclarationSyntax ) )
117
143
{
118
144
if ( member is not MethodDeclarationSyntax { Identifier . ValueText : "SetProperty" } )
119
145
{
120
- builder . Add ( member ) ;
146
+ builder . Add ( RemoveRequiresUnreferencedCodeAttributeIfNeeded ( member ) ) ;
121
147
}
122
148
}
123
149
@@ -127,7 +153,7 @@ protected override ImmutableArray<MemberDeclarationSyntax> FilterDeclaredMembers
127
153
// If the target type has at least one custom constructor, only generate methods
128
154
foreach ( MemberDeclarationSyntax member in memberDeclarations . Where ( static member => member is not ConstructorDeclarationSyntax ) )
129
155
{
130
- builder . Add ( member ) ;
156
+ builder . Add ( RemoveRequiresUnreferencedCodeAttributeIfNeeded ( member ) ) ;
131
157
}
132
158
133
159
return builder . ToImmutable ( ) ;
0 commit comments