11namespace StyleChecker . Analyzers . Refactoring . TypeClassParameter ;
22
3+ using System . Collections . Frozen ;
34using System . Collections . Generic ;
45using System . Collections . Immutable ;
56using Microsoft . CodeAnalysis ;
@@ -16,10 +17,6 @@ namespace StyleChecker.Analyzers.Refactoring.TypeClassParameter;
1617/// </remarks>
1718public sealed class MethodInvocationBank
1819{
19- private readonly List < IMethodSymbol > symbols = [ ] ;
20-
21- private readonly List < IInvocationOperation > operations = [ ] ;
22-
2320 /// <summary>
2421 /// Initializes a new instance of the <see cref="MethodInvocationBank"/>
2522 /// class.
@@ -28,6 +25,12 @@ public MethodInvocationBank()
2825 {
2926 }
3027
28+ private List < IMethodSymbol > Symbols { get ; } = [ ] ;
29+
30+ private List < IInvocationOperation > Operations { get ; } = [ ] ;
31+
32+ private HashSet < IMethodSymbol > ReferenceSymbolSet { get ; } = [ ] ;
33+
3134 /// <summary>
3235 /// Adds a collection of method symbols to the bank.
3336 /// </summary>
@@ -36,7 +39,7 @@ public MethodInvocationBank()
3639 /// </param>
3740 public void AddSymbols ( IEnumerable < IMethodSymbol > all )
3841 {
39- AddRange ( symbols , all ) ;
42+ AddRange ( Symbols , all ) ;
4043 }
4144
4245 /// <summary>
@@ -47,7 +50,21 @@ public void AddSymbols(IEnumerable<IMethodSymbol> all)
4750 /// </param>
4851 public void AddOperations ( IEnumerable < IInvocationOperation > all )
4952 {
50- AddRange ( operations , all ) ;
53+ AddRange ( Operations , all ) ;
54+ }
55+
56+ /// <summary>
57+ /// Adds a collection of Method Reference symbols to the bank.
58+ /// </summary>
59+ /// <param name="all">
60+ /// The collection of method reference symbols to add.
61+ /// </param>
62+ public void AddReferenceSymbols ( IEnumerable < IMethodSymbol > all )
63+ {
64+ lock ( ReferenceSymbolSet )
65+ {
66+ ReferenceSymbolSet . UnionWith ( all ) ;
67+ }
5168 }
5269
5370 /// <summary>
@@ -56,9 +73,9 @@ public void AddOperations(IEnumerable<IInvocationOperation> all)
5673 /// <returns>
5774 /// An immutable array of all method symbols in the bank.
5875 /// </returns>
59- public ImmutableArray < IMethodSymbol > GetAllSymbols ( )
76+ public FrozenSet < IMethodSymbol > GetAllSymbols ( )
6077 {
61- return ToImmutableArray ( symbols ) ;
78+ return ToFrozenSet ( Symbols ) ;
6279 }
6380
6481 /// <summary>
@@ -69,7 +86,18 @@ public ImmutableArray<IMethodSymbol> GetAllSymbols()
6986 /// </returns>
7087 public ImmutableArray < IInvocationOperation > GetAllOperations ( )
7188 {
72- return ToImmutableArray ( operations ) ;
89+ return ToImmutableArray ( Operations ) ;
90+ }
91+
92+ /// <summary>
93+ /// Gets all Method Reference symbols in the bank.
94+ /// </summary>
95+ /// <returns>
96+ /// A frozen set of all Method Reference symbols in the bank.
97+ /// </returns>
98+ public FrozenSet < IMethodSymbol > GetAllReferenceSymbols ( )
99+ {
100+ return ToFrozenSet ( ReferenceSymbolSet ) ;
73101 }
74102
75103 private static void AddRange < T > ( List < T > a , IEnumerable < T > all )
@@ -87,4 +115,12 @@ private static ImmutableArray<T> ToImmutableArray<T>(IEnumerable<T> a)
87115 return [ .. a ] ;
88116 }
89117 }
118+
119+ private static FrozenSet < T > ToFrozenSet < T > ( IEnumerable < T > a )
120+ {
121+ lock ( a )
122+ {
123+ return a . ToFrozenSet ( ) ;
124+ }
125+ }
90126}
0 commit comments