Skip to content

Commit 1b379e0

Browse files
authored
PooledObjects cleanup (#78382)
1 parent 0b13d4c commit 1b379e0

25 files changed

+351
-386
lines changed

Roslyn.sln

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,7 @@ Global
21712171
src\RoslynAnalyzers\Utilities\Workspaces\Workspaces.Utilities.projitems*{3f65d29d-ed95-2d6f-b927-47c5cf070aa5}*SharedItemsImports = 5
21722172
src\Dependencies\Contracts\Microsoft.CodeAnalysis.Contracts.projitems*{41ed1bfa-fdad-4fe4-8118-db23fb49b0b0}*SharedItemsImports = 5
21732173
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\CSharp\CSharpWorkspaceExtensions.projitems*{438db8af-f3f0-4ed9-80b5-13fddd5b8787}*SharedItemsImports = 13
2174+
src\Dependencies\Contracts\Microsoft.CodeAnalysis.Contracts.projitems*{49e7c367-181b-499c-ac2e-8e17c81418d6}*SharedItemsImports = 5
21742175
src\Compilers\CSharp\csc\CscCommandLine.projitems*{4b45ca0c-03a0-400f-b454-3d4bcb16af38}*SharedItemsImports = 5
21752176
src\RoslynAnalyzers\Utilities\Refactoring.VisualBasic\Refactoring.VisualBasic.Utilities.projitems*{4c362c30-c4b1-4c4b-a545-dbf67c7e9153}*SharedItemsImports = 13
21762177
src\Analyzers\CSharp\Tests\CSharpAnalyzers.UnitTests.projitems*{5018d049-5870-465a-889b-c742ce1e31cb}*SharedItemsImports = 5
@@ -2207,6 +2208,7 @@ Global
22072208
src\RoslynAnalyzers\Utilities\Compiler\Analyzer.Utilities.projitems*{8ce66034-25e2-8ff2-93a1-0bd3672ad86d}*SharedItemsImports = 5
22082209
src\Dependencies\Collections\Microsoft.CodeAnalysis.Collections.projitems*{8e2a252e-a140-45a6-a81a-2652996ea589}*SharedItemsImports = 5
22092210
src\Dependencies\Contracts\Microsoft.CodeAnalysis.Contracts.projitems*{8e2a252e-a140-45a6-a81a-2652996ea589}*SharedItemsImports = 5
2211+
src\Dependencies\PooledObjects\Microsoft.CodeAnalysis.PooledObjects.projitems*{8e2a252e-a140-45a6-a81a-2652996ea589}*SharedItemsImports = 5
22102212
src\Dependencies\Threading\Microsoft.CodeAnalysis.Threading.projitems*{8e2a252e-a140-45a6-a81a-2652996ea589}*SharedItemsImports = 5
22112213
src\RoslynAnalyzers\Utilities\Compiler\Analyzer.Utilities.projitems*{923e34ba-ca8a-971e-7ff7-51dd346394a1}*SharedItemsImports = 5
22122214
src\RoslynAnalyzers\Utilities\Workspaces\Workspaces.Utilities.projitems*{923e34ba-ca8a-971e-7ff7-51dd346394a1}*SharedItemsImports = 5

src/Analyzers/CSharp/Analyzers/ConvertSwitchStatementToExpression/ConvertSwitchStatementToExpressionDiagnosticAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
6363

6464
var additionalLocations = ArrayBuilder<Location>.GetInstance();
6565
additionalLocations.Add(switchStatement.GetLocation());
66-
additionalLocations.AddOptional(declaratorToRemoveOpt?.GetLocation());
66+
additionalLocations.AddIfNotNull(declaratorToRemoveOpt?.GetLocation());
6767

6868
context.ReportDiagnostic(DiagnosticHelper.Create(Descriptor,
6969
// Report the diagnostic on the "switch" keyword.

src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,7 @@ private ImmutableArray<ISymbol> LookupSymbolsInternal(
16871687
}
16881688

16891689
if (name == null)
1690-
results.RemoveWhere(static (symbol, _, _) => !symbol.CanBeReferencedByName, arg: 0);
1690+
results.RemoveAll(static (symbol, _) => !symbol.CanBeReferencedByName, arg: 0);
16911691

16921692
return results.ToImmutableAndFree();
16931693
}

src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LoweredDynamicOperation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ public static LoweredDynamicOperation Bad(
4242
TypeSymbol resultType)
4343
{
4444
var children = ArrayBuilder<BoundExpression>.GetInstance();
45-
children.AddOptional(loweredReceiver);
45+
children.AddIfNotNull(loweredReceiver);
4646
children.AddRange(loweredArguments);
47-
children.AddOptional(loweredRight);
47+
children.AddIfNotNull(loweredRight);
4848

4949
return LoweredDynamicOperation.Bad(resultType, children.ToImmutableAndFree());
5050
}

src/Compilers/Core/Portable/Collections/ArrayBuilderExtensions.cs

Lines changed: 2 additions & 261 deletions
Original file line numberDiff line numberDiff line change
@@ -2,257 +2,13 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using System;
6-
using System.Collections.Immutable;
7-
using System.Diagnostics.CodeAnalysis;
85
using Microsoft.CodeAnalysis.PooledObjects;
96
using Roslyn.Utilities;
107

118
namespace Microsoft.CodeAnalysis
129
{
1310
internal static class ArrayBuilderExtensions
1411
{
15-
public static bool Any<T>(this ArrayBuilder<T> builder, Func<T, bool> predicate)
16-
{
17-
foreach (var item in builder)
18-
{
19-
if (predicate(item))
20-
{
21-
return true;
22-
}
23-
}
24-
return false;
25-
}
26-
27-
public static bool Any<T, A>(this ArrayBuilder<T> builder, Func<T, A, bool> predicate, A arg)
28-
{
29-
foreach (var item in builder)
30-
{
31-
if (predicate(item, arg))
32-
{
33-
return true;
34-
}
35-
}
36-
return false;
37-
}
38-
39-
public static bool All<T>(this ArrayBuilder<T> builder, Func<T, bool> predicate)
40-
{
41-
foreach (var item in builder)
42-
{
43-
if (!predicate(item))
44-
{
45-
return false;
46-
}
47-
}
48-
return true;
49-
}
50-
51-
public static bool All<T, A>(this ArrayBuilder<T> builder, Func<T, A, bool> predicate, A arg)
52-
{
53-
foreach (var item in builder)
54-
{
55-
if (!predicate(item, arg))
56-
{
57-
return false;
58-
}
59-
}
60-
return true;
61-
}
62-
63-
/// <summary>
64-
/// Maps an array builder to immutable array.
65-
/// </summary>
66-
/// <typeparam name="TItem"></typeparam>
67-
/// <typeparam name="TResult"></typeparam>
68-
/// <param name="items">The array to map</param>
69-
/// <param name="map">The mapping delegate</param>
70-
/// <returns>If the items's length is 0, this will return an empty immutable array</returns>
71-
public static ImmutableArray<TResult> SelectAsArray<TItem, TResult>(this ArrayBuilder<TItem> items, Func<TItem, TResult> map)
72-
{
73-
switch (items.Count)
74-
{
75-
case 0:
76-
return ImmutableArray<TResult>.Empty;
77-
78-
case 1:
79-
return ImmutableArray.Create(map(items[0]));
80-
81-
case 2:
82-
return ImmutableArray.Create(map(items[0]), map(items[1]));
83-
84-
case 3:
85-
return ImmutableArray.Create(map(items[0]), map(items[1]), map(items[2]));
86-
87-
case 4:
88-
return ImmutableArray.Create(map(items[0]), map(items[1]), map(items[2]), map(items[3]));
89-
90-
default:
91-
var builder = ArrayBuilder<TResult>.GetInstance(items.Count);
92-
foreach (var item in items)
93-
{
94-
builder.Add(map(item));
95-
}
96-
97-
return builder.ToImmutableAndFree();
98-
}
99-
}
100-
101-
/// <summary>
102-
/// Maps an array builder to immutable array.
103-
/// </summary>
104-
/// <typeparam name="TItem"></typeparam>
105-
/// <typeparam name="TArg"></typeparam>
106-
/// <typeparam name="TResult"></typeparam>
107-
/// <param name="items">The sequence to map</param>
108-
/// <param name="map">The mapping delegate</param>
109-
/// <param name="arg">The extra input used by mapping delegate</param>
110-
/// <returns>If the items's length is 0, this will return an empty immutable array.</returns>
111-
public static ImmutableArray<TResult> SelectAsArray<TItem, TArg, TResult>(this ArrayBuilder<TItem> items, Func<TItem, TArg, TResult> map, TArg arg)
112-
{
113-
switch (items.Count)
114-
{
115-
case 0:
116-
return ImmutableArray<TResult>.Empty;
117-
118-
case 1:
119-
return ImmutableArray.Create(map(items[0], arg));
120-
121-
case 2:
122-
return ImmutableArray.Create(map(items[0], arg), map(items[1], arg));
123-
124-
case 3:
125-
return ImmutableArray.Create(map(items[0], arg), map(items[1], arg), map(items[2], arg));
126-
127-
case 4:
128-
return ImmutableArray.Create(map(items[0], arg), map(items[1], arg), map(items[2], arg), map(items[3], arg));
129-
130-
default:
131-
var builder = ArrayBuilder<TResult>.GetInstance(items.Count);
132-
foreach (var item in items)
133-
{
134-
builder.Add(map(item, arg));
135-
}
136-
137-
return builder.ToImmutableAndFree();
138-
}
139-
}
140-
141-
/// <summary>
142-
/// Maps an array builder to immutable array.
143-
/// </summary>
144-
/// <typeparam name="TItem"></typeparam>
145-
/// <typeparam name="TArg"></typeparam>
146-
/// <typeparam name="TResult"></typeparam>
147-
/// <param name="items">The sequence to map</param>
148-
/// <param name="map">The mapping delegate</param>
149-
/// <param name="arg">The extra input used by mapping delegate</param>
150-
/// <returns>If the items's length is 0, this will return an empty immutable array.</returns>
151-
public static ImmutableArray<TResult> SelectAsArrayWithIndex<TItem, TArg, TResult>(this ArrayBuilder<TItem> items, Func<TItem, int, TArg, TResult> map, TArg arg)
152-
{
153-
switch (items.Count)
154-
{
155-
case 0:
156-
return ImmutableArray<TResult>.Empty;
157-
158-
case 1:
159-
return ImmutableArray.Create(map(items[0], 0, arg));
160-
161-
case 2:
162-
return ImmutableArray.Create(map(items[0], 0, arg), map(items[1], 1, arg));
163-
164-
case 3:
165-
return ImmutableArray.Create(map(items[0], 0, arg), map(items[1], 1, arg), map(items[2], 2, arg));
166-
167-
case 4:
168-
return ImmutableArray.Create(map(items[0], 0, arg), map(items[1], 1, arg), map(items[2], 2, arg), map(items[3], 3, arg));
169-
170-
default:
171-
var builder = ArrayBuilder<TResult>.GetInstance(items.Count);
172-
foreach (var item in items)
173-
{
174-
builder.Add(map(item, builder.Count, arg));
175-
}
176-
177-
return builder.ToImmutableAndFree();
178-
}
179-
}
180-
181-
public static void AddOptional<T>(this ArrayBuilder<T> builder, T? item)
182-
where T : class
183-
{
184-
if (item != null)
185-
{
186-
builder.Add(item);
187-
}
188-
}
189-
190-
// The following extension methods allow an ArrayBuilder to be used as a stack.
191-
// Note that the order of an IEnumerable from a List is from bottom to top of stack. An IEnumerable
192-
// from the framework Stack is from top to bottom.
193-
public static void Push<T>(this ArrayBuilder<T> builder, T e)
194-
{
195-
builder.Add(e);
196-
}
197-
198-
public static T Pop<T>(this ArrayBuilder<T> builder)
199-
{
200-
var e = builder.Peek();
201-
builder.RemoveAt(builder.Count - 1);
202-
return e;
203-
}
204-
205-
public static bool TryPop<T>(this ArrayBuilder<T> builder, [MaybeNullWhen(false)] out T result)
206-
{
207-
if (builder.Count > 0)
208-
{
209-
result = builder.Pop();
210-
return true;
211-
}
212-
213-
result = default;
214-
return false;
215-
}
216-
217-
public static T Peek<T>(this ArrayBuilder<T> builder)
218-
{
219-
return builder[builder.Count - 1];
220-
}
221-
222-
public static ImmutableArray<T> ToImmutableOrEmptyAndFree<T>(this ArrayBuilder<T>? builder)
223-
{
224-
return builder?.ToImmutableAndFree() ?? ImmutableArray<T>.Empty;
225-
}
226-
227-
public static void AddIfNotNull<T>(this ArrayBuilder<T> builder, T? value)
228-
where T : struct
229-
{
230-
if (value != null)
231-
{
232-
builder.Add(value.Value);
233-
}
234-
}
235-
236-
public static void AddIfNotNull<T>(this ArrayBuilder<T> builder, T? value)
237-
where T : class
238-
{
239-
if (value != null)
240-
{
241-
builder.Add(value);
242-
}
243-
}
244-
245-
public static void FreeAll<T>(this ArrayBuilder<T> builder, Func<T, ArrayBuilder<T>?> getNested)
246-
{
247-
foreach (var item in builder)
248-
{
249-
getNested(item)?.FreeAll(getNested);
250-
}
251-
builder.Free();
252-
}
253-
254-
#if COMPILERCORE
255-
25612
/// <summary>
25713
/// Realizes the OneOrMany and disposes the builder in one operation.
25814
/// </summary>
@@ -270,24 +26,9 @@ public static OneOrMany<T> ToOneOrManyAndFree<T>(this ArrayBuilder<T> builder)
27026
}
27127
}
27228

273-
#endif
274-
275-
public static void RemoveWhere<TItem, TArg>(this ArrayBuilder<TItem> builder, Func<TItem, int, TArg, bool> filter, TArg arg)
29+
public static void AddRange<T>(this ArrayBuilder<T> builder, OneOrMany<T> items)
27630
{
277-
var writeIndex = 0;
278-
for (var i = 0; i < builder.Count; i++)
279-
{
280-
var item = builder[i];
281-
if (!filter(item, i, arg))
282-
{
283-
if (writeIndex != i)
284-
builder[writeIndex] = item;
285-
286-
writeIndex++;
287-
}
288-
}
289-
290-
builder.Count = writeIndex;
31+
items.AddRangeTo(builder);
29132
}
29233
}
29334
}

src/Compilers/Core/Portable/Emit/NoPia/CommonEmbeddedMember.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ private ImmutableArray<TAttributeData> GetAttributes(TPEModuleBuilder moduleBuil
7676
{
7777
if (signatureIndex == 0 && TypeManager.TryGetAttributeArguments(attrData, out var constructorArguments, out var namedArguments, syntaxNodeOpt, diagnostics))
7878
{
79-
builder.AddOptional(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_DispIdAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
79+
builder.AddIfNotNull(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_DispIdAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
8080
}
8181
}
8282
else
8383
{
84-
builder.AddOptional(PortAttributeIfNeedTo(attrData, syntaxNodeOpt, diagnostics));
84+
builder.AddIfNotNull(PortAttributeIfNeedTo(attrData, syntaxNodeOpt, diagnostics));
8585
}
8686
}
8787

src/Compilers/Core/Portable/Emit/NoPia/CommonEmbeddedParameter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,21 @@ private ImmutableArray<TAttributeData> GetAttributes(TPEModuleBuilder moduleBuil
9797
{
9898
if (signatureIndex == 0 && TypeManager.TryGetAttributeArguments(attrData, out constructorArguments, out namedArguments, syntaxNodeOpt, diagnostics))
9999
{
100-
builder.AddOptional(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_ParamArrayAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
100+
builder.AddIfNotNull(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_ParamArrayAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
101101
}
102102
}
103103
else if (IsTargetAttribute(attrData, AttributeDescription.DateTimeConstantAttribute, out signatureIndex))
104104
{
105105
if (signatureIndex == 0 && TypeManager.TryGetAttributeArguments(attrData, out constructorArguments, out namedArguments, syntaxNodeOpt, diagnostics))
106106
{
107-
builder.AddOptional(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_CompilerServices_DateTimeConstantAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
107+
builder.AddIfNotNull(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_CompilerServices_DateTimeConstantAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
108108
}
109109
}
110110
else if (IsTargetAttribute(attrData, AttributeDescription.DecimalConstantAttribute, out signatureIndex))
111111
{
112112
if ((signatureIndex == 0 || signatureIndex == 1) && TypeManager.TryGetAttributeArguments(attrData, out constructorArguments, out namedArguments, syntaxNodeOpt, diagnostics))
113113
{
114-
builder.AddOptional(TypeManager.CreateSynthesizedAttribute(
114+
builder.AddIfNotNull(TypeManager.CreateSynthesizedAttribute(
115115
signatureIndex == 0 ? WellKnownMember.System_Runtime_CompilerServices_DecimalConstantAttribute__ctor :
116116
WellKnownMember.System_Runtime_CompilerServices_DecimalConstantAttribute__ctorByteByteInt32Int32Int32,
117117
constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
@@ -121,7 +121,7 @@ private ImmutableArray<TAttributeData> GetAttributes(TPEModuleBuilder moduleBuil
121121
{
122122
if (signatureIndex == 0 && TypeManager.TryGetAttributeArguments(attrData, out constructorArguments, out namedArguments, syntaxNodeOpt, diagnostics))
123123
{
124-
builder.AddOptional(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_DefaultParameterValueAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
124+
builder.AddIfNotNull(TypeManager.CreateSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_DefaultParameterValueAttribute__ctor, constructorArguments, namedArguments, syntaxNodeOpt, diagnostics));
125125
}
126126
}
127127
}

0 commit comments

Comments
 (0)