@@ -39,8 +39,9 @@ public override void Initialize(AnalysisContext context)
39
39
40
40
context . RegisterCompilationStartAction ( context =>
41
41
{
42
- INamedTypeSymbol ? readonlySpanType = context . Compilation . GetOrCreateTypeByMetadataName ( WellKnownTypeNames . SystemReadOnlySpan1 ) ;
43
- INamedTypeSymbol ? functionType = context . Compilation . GetOrCreateTypeByMetadataName ( WellKnownTypeNames . SystemFunc2 ) ;
42
+ var knownTypeProvider = WellKnownTypeProvider . GetOrCreate ( context . Compilation ) ;
43
+ INamedTypeSymbol ? readonlySpanType = knownTypeProvider . GetOrCreateTypeByMetadataName ( WellKnownTypeNames . SystemReadOnlySpan1 ) ;
44
+ INamedTypeSymbol ? functionType = knownTypeProvider . GetOrCreateTypeByMetadataName ( WellKnownTypeNames . SystemFunc2 ) ;
44
45
45
46
// Analyzes an argument operation
46
47
context . RegisterOperationAction ( context =>
@@ -110,12 +111,7 @@ public override void Initialize(AnalysisContext context)
110
111
string ? paramName = null ;
111
112
if ( argumentOperation is not null )
112
113
{
113
- IFieldInitializerOperation ? fieldInitializer = argumentOperation . GetAncestor < IFieldInitializerOperation > (
114
- OperationKind . FieldInitializer , f => f . InitializedFields . Any ( x => x . IsReadOnly ) ) ;
115
- IPropertyInitializerOperation ? propertyInitializer = argumentOperation . GetAncestor < IPropertyInitializerOperation > (
116
- OperationKind . PropertyInitializer , p => p . InitializedProperties . Any ( x => x . IsReadOnly ) ) ;
117
-
118
- if ( fieldInitializer is not null || propertyInitializer is not null )
114
+ if ( IsInitializingStaticOrReadOnlyFieldOrProperty ( argumentOperation ) )
119
115
{
120
116
return ;
121
117
}
@@ -149,5 +145,40 @@ public override void Initialize(AnalysisContext context)
149
145
OperationKind . Invocation ) ;
150
146
} ) ;
151
147
}
148
+
149
+ private static bool IsInitializingStaticOrReadOnlyFieldOrProperty ( IOperation operation )
150
+ {
151
+ var ancestor = operation ;
152
+ do
153
+ {
154
+ ancestor = ancestor ! . Parent ;
155
+ } while ( ancestor != null && ! ( ancestor . Kind == OperationKind . FieldInitializer || ancestor . Kind == OperationKind . PropertyInitializer ||
156
+ ancestor . Kind == OperationKind . CoalesceAssignment || ancestor . Kind == OperationKind . SimpleAssignment ) ) ;
157
+
158
+ if ( ancestor != null )
159
+ {
160
+ switch ( ancestor )
161
+ {
162
+ case IFieldInitializerOperation fieldInitializer :
163
+ return fieldInitializer . InitializedFields . Any ( x => x . IsStatic || x . IsReadOnly ) ;
164
+ case IPropertyInitializerOperation propertyInitializer :
165
+ return propertyInitializer . InitializedProperties . Any ( x => x . IsStatic || x . IsReadOnly ) ;
166
+ case IAssignmentOperation assignmentOperation :
167
+ if ( assignmentOperation . Target is IFieldReferenceOperation fieldReference && fieldReference . Field . IsStatic )
168
+ {
169
+ return true ;
170
+ }
171
+
172
+ if ( assignmentOperation . Target is IPropertyReferenceOperation propertyReference && propertyReference . Property . IsStatic )
173
+ {
174
+ return true ;
175
+ }
176
+
177
+ break ;
178
+ }
179
+ }
180
+
181
+ return false ;
182
+ }
152
183
}
153
184
}
0 commit comments