提交 3b99904a 编写于 作者: P Petr Houska

Reworked IDisposability of pool projects -> explicit disposer.

上级 87f5f643
......@@ -155,7 +155,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Debug.Assert(originalDefinition.Arity > 0)
Dim current As TypeSubstitution = Me
Dim result = ArrayBuilder(Of TypeSymbol).GetInstance(originalDefinition.Arity, Nothing)
Dim result = ArrayBuilder(Of TypeSymbol).GetInstance(originalDefinition.Arity, fillWithValue:=Nothing)
hasTypeArgumentsCustomModifiers = False
Do
......
......@@ -123,7 +123,7 @@ public static ImmutableArray<short> DecodeUsingRecord(ImmutableArray<byte> bytes
var offset = 0;
var numCounts = ReadInt16(bytes, ref offset);
using var builder = ArrayBuilder<short>.GetInstance(numCounts);
using var builderDisposer = ArrayBuilder<short>.GetInstance(numCounts, out var builder);
for (var i = 0; i < numCounts; i++)
{
builder.Add(ReadInt16(bytes, ref offset));
......@@ -172,7 +172,7 @@ public static ImmutableArray<StateMachineHoistedLocalScope> DecodeStateMachineHo
var bucketCount = ReadInt32(bytes, ref offset);
using var builder = ArrayBuilder<StateMachineHoistedLocalScope>.GetInstance(bucketCount);
using var builderDisposer = ArrayBuilder<StateMachineHoistedLocalScope>.GetInstance(bucketCount, out var builder);
for (var i = 0; i < bucketCount; i++)
{
var startOffset = ReadInt32(bytes, ref offset);
......@@ -234,13 +234,15 @@ public static ImmutableArray<DynamicLocalInfo> DecodeDynamicLocalsRecord(Immutab
{
const int FlagBytesCount = 64;
using var flagsBuilder = ArrayBuilder<bool>.GetInstance(FlagBytesCount);
using var pooledNameBuilder = PooledStringBuilder.GetInstance();
using var flagsBuilderDisposer = ArrayBuilder<bool>.GetInstance(FlagBytesCount, out var flagsBuilder);
using var pooledNameBuilderDisposer = PooledStringBuilder.GetInstance(out var pooledNameBuilder);
var nameBuilder = pooledNameBuilder.Builder;
var offset = 0;
var bucketCount = ReadInt32(bytes, ref offset);
using var builder = ArrayBuilder<DynamicLocalInfo>.GetInstance(bucketCount);
using var builderDisposer = ArrayBuilder<DynamicLocalInfo>.GetInstance(bucketCount, out var builder);
for (var i = 0; i < bucketCount; i++)
{
......@@ -291,7 +293,7 @@ public static ImmutableArray<TupleElementNamesInfo> DecodeTupleElementNamesRecor
{
var offset = 0;
var n = ReadInt32(bytes, ref offset);
using var builder = ArrayBuilder<TupleElementNamesInfo>.GetInstance(n);
using var builderDisposer = ArrayBuilder<TupleElementNamesInfo>.GetInstance(n, out var builder);
for (var i = 0; i < n; i++)
{
builder.Add(DecodeTupleElementNamesInfo(bytes, ref offset));
......@@ -302,7 +304,7 @@ public static ImmutableArray<TupleElementNamesInfo> DecodeTupleElementNamesRecor
private static TupleElementNamesInfo DecodeTupleElementNamesInfo(ImmutableArray<byte> bytes, ref int offset)
{
var n = ReadInt32(bytes, ref offset);
using var builder = ArrayBuilder<string>.GetInstance(n);
using var builderDisposer = ArrayBuilder<string>.GetInstance(n, out var builder);
for (var i = 0; i < n; i++)
{
var value = ReadUtf8String(bytes, ref offset);
......@@ -425,8 +427,8 @@ private static void SkipRecord(byte[] bytes, ref int offset, int size)
var importStrings = getMethodImportStrings(methodToken, arg);
Debug.Assert(!importStrings.IsDefault);
using var resultBuilder = ArrayBuilder<ImmutableArray<string>>.GetInstance(groupSizes.Length);
using var groupBuilder = ArrayBuilder<string>.GetInstance();
using var resultBuilderDisposer = ArrayBuilder<ImmutableArray<string>>.GetInstance(groupSizes.Length, out var resultBuilder);
using var groupBuilderDispoer = ArrayBuilder<string>.GetInstance(out var groupBuilder);
var pos = 0;
foreach (var groupSize in groupSizes)
......
......@@ -9,7 +9,7 @@ namespace Microsoft.CodeAnalysis.PooledObjects
{
[DebuggerDisplay("Count = {Count,nq}")]
[DebuggerTypeProxy(typeof(ArrayBuilder<>.DebuggerProxy))]
internal sealed partial class ArrayBuilder<T> : IReadOnlyCollection<T>, IReadOnlyList<T>, IDisposable
internal sealed partial class ArrayBuilder<T> : IReadOnlyCollection<T>, IReadOnlyList<T>
{
#region DebuggerProxy
......@@ -347,6 +347,12 @@ public static ArrayBuilder<T> GetInstance()
return builder;
}
public static ArrayBuilderDisposer GetInstance(out ArrayBuilder<T> instance)
{
instance = GetInstance();
return new ArrayBuilderDisposer(instance);
}
public static ArrayBuilder<T> GetInstance(int capacity)
{
var builder = GetInstance();
......@@ -354,6 +360,12 @@ public static ArrayBuilder<T> GetInstance(int capacity)
return builder;
}
public static ArrayBuilderDisposer GetInstance(int capacity, out ArrayBuilder<T> instance)
{
instance = GetInstance(capacity);
return new ArrayBuilderDisposer(instance);
}
public static ArrayBuilder<T> GetInstance(int capacity, T fillWithValue)
{
var builder = GetInstance();
......@@ -367,6 +379,12 @@ public static ArrayBuilder<T> GetInstance(int capacity, T fillWithValue)
return builder;
}
public static ArrayBuilderDisposer GetInstance(int capacity, T fillWithValue, out ArrayBuilder<T> instance)
{
instance = GetInstance(capacity, fillWithValue);
return new ArrayBuilderDisposer(instance);
}
public static ObjectPool<ArrayBuilder<T>> CreatePool()
{
return CreatePool(128); // we rarely need more than 10
......@@ -565,7 +583,26 @@ public ImmutableArray<S> SelectDistinct<S>(Func<T, S> selector)
}
#region IDisposable Support
public void Dispose() => Free();
internal struct ArrayBuilderDisposer : IDisposable
{
private bool _disposed;
private readonly ArrayBuilder<T> _pooledObject;
public ArrayBuilderDisposer(ArrayBuilder<T> instance)
{
_disposed = false;
_pooledObject = instance;
}
public void Dispose()
{
if (!_disposed)
{
_disposed = true;
_pooledObject.Free();
}
}
}
#endregion
}
}
......@@ -8,7 +8,7 @@ namespace Microsoft.CodeAnalysis.PooledObjects
{
// HashSet that can be recycled via an object pool
// NOTE: these HashSets always have the default comparer.
internal sealed class PooledHashSet<T> : HashSet<T>, IDisposable
internal sealed class PooledHashSet<T> : HashSet<T>
{
private readonly ObjectPool<PooledHashSet<T>> _pool;
......@@ -42,6 +42,31 @@ public static PooledHashSet<T> GetInstance()
return instance;
}
public void Dispose() => Free();
public static PooledHashSetDisposer GetInstance(out PooledHashSet<T> instance)
{
instance = GetInstance();
return new PooledHashSetDisposer(instance);
}
internal struct PooledHashSetDisposer : IDisposable
{
private bool _disposed;
private readonly PooledHashSet<T> _pooledItem;
public PooledHashSetDisposer(PooledHashSet<T> instance)
{
_disposed = false;
_pooledItem = instance;
}
public void Dispose()
{
if (!_disposed)
{
_disposed = true;
_pooledItem.Free();
}
}
}
}
}
......@@ -14,7 +14,7 @@ namespace Microsoft.CodeAnalysis.PooledObjects
/// ... sb.ToString() ...
/// inst.Free();
/// </summary>
internal class PooledStringBuilder : IDisposable
internal class PooledStringBuilder
{
public readonly StringBuilder Builder = new StringBuilder();
private readonly ObjectPool<PooledStringBuilder> _pool;
......@@ -91,11 +91,36 @@ public static PooledStringBuilder GetInstance()
return builder;
}
public void Dispose() => Free();
public static PooledStringBuilderDisposer GetInstance(out PooledStringBuilder instance)
{
instance = GetInstance();
return new PooledStringBuilderDisposer(instance);
}
public static implicit operator StringBuilder(PooledStringBuilder obj)
{
return obj.Builder;
}
internal struct PooledStringBuilderDisposer : IDisposable
{
private bool _disposed;
private readonly PooledStringBuilder _pooledItem;
public PooledStringBuilderDisposer(PooledStringBuilder instance)
{
_disposed = false;
_pooledItem = instance;
}
public void Dispose()
{
if (!_disposed)
{
_disposed = true;
_pooledItem.Free();
}
}
}
}
}
......@@ -94,7 +94,7 @@ internal static class DefinitionItemExtensions
var displayIfNoReferences = definition.ShouldShowWithNoReferenceLocations(
options, showMetadataSymbolsWithoutReferences: false);
using var sourceLocations = ArrayBuilder<DocumentSpan>.GetInstance();
using var sourceLocationsDisposer = ArrayBuilder<DocumentSpan>.GetInstance(out var sourceLocations);
var properties = GetProperties(definition);
......
......@@ -58,7 +58,7 @@ internal static class GoToDefinitionHelpers
symbol = method.PartialImplementationPart ?? symbol;
}
using var definitions = ArrayBuilder<DefinitionItem>.GetInstance();
using var definitionsDisposer = ArrayBuilder<DefinitionItem>.GetInstance(out var definitions);
// Going to a symbol may end up actually showing the symbol in the Find-Usages window.
// This happens when there is more than one location for the symbol (i.e. for partial
......
......@@ -45,7 +45,7 @@ private ImmutableArray<CodeFixProvider> CreateFixers(string language)
return ImmutableArray<CodeFixProvider>.Empty;
}
using var builder = ArrayBuilder<CodeFixProvider>.GetInstance();
using var builderDisposer = ArrayBuilder<CodeFixProvider>.GetInstance(out var builder);
try
{
......
......@@ -166,7 +166,7 @@ public async Task<ImmutableArray<CodeFixCollection>> GetFixesAsync(Document docu
return ImmutableArray<CodeFixCollection>.Empty;
}
using var result = ArrayBuilder<CodeFixCollection>.GetInstance();
using var resultDisposer = ArrayBuilder<CodeFixCollection>.GetInstance(out var result);
foreach (var spanAndDiagnostic in aggregatedDiagnostics)
{
await AppendFixesAsync(
......@@ -220,7 +220,7 @@ public async Task<CodeFixCollection> GetDocumentFixAllForIdInSpanAsync(Document
return null;
}
using var result = ArrayBuilder<CodeFixCollection>.GetInstance();
using var resultDisposer = ArrayBuilder<CodeFixCollection>.GetInstance(out var result);
await AppendFixesAsync(document, range, diagnostics, fixAllForInSpan: true, result, cancellationToken).ConfigureAwait(false);
// TODO: Just get the first fix for now until we have a way to config user's preferred fix
......@@ -327,7 +327,7 @@ public async Task<Document> ApplyCodeFixesForSpecificDiagnosticIdAsync(Document
Document document, TextSpan span, CodeFixProvider fixer,
ImmutableArray<Diagnostic> diagnostics, CancellationToken cancellationToken)
{
using var fixes = ArrayBuilder<CodeFix>.GetInstance();
using var fixesDisposer = ArrayBuilder<CodeFix>.GetInstance(out var fixes);
var context = new CodeFixContext(document, span, diagnostics,
// TODO: Can we share code between similar lambdas that we pass to this API in BatchFixAllProvider.cs, CodeFixService.cs and CodeRefactoringService.cs?
(action, applicableDiagnostics) =>
......@@ -680,7 +680,7 @@ private static ImmutableArray<string> GetAndTestFixableDiagnosticIds(CodeFixProv
static ImmutableArray<IConfigurationFixProvider> GetConfigurationFixProviders(List<Lazy<IConfigurationFixProvider, CodeChangeProviderMetadata>> languageKindAndFixers)
{
using var builder = ArrayBuilder<IConfigurationFixProvider>.GetInstance();
using var builderDisposer = ArrayBuilder<IConfigurationFixProvider>.GetInstance(out var builder);
var orderedLanguageKindAndFixers = ExtensionOrderer.Order(languageKindAndFixers);
foreach (var languageKindAndFixersValue in orderedLanguageKindAndFixers)
{
......
......@@ -80,9 +80,9 @@ public ImmutableArray<DocumentId> ReportDiagnostics(object errorId, Solution sol
Debug.Assert(projectId != null);
var updateEvent = DiagnosticsUpdated;
using var documentIds = PooledHashSet<DocumentId>.GetInstance();
using var documentDiagnosticData = ArrayBuilder<DiagnosticData>.GetInstance();
using var projectDiagnosticData = ArrayBuilder<DiagnosticData>.GetInstance();
using var documentIdsDisposer = PooledHashSet<DocumentId>.GetInstance(out var documentIds);
using var documentDiagnosticDataDisposer = ArrayBuilder<DiagnosticData>.GetInstance(out var documentDiagnosticData);
using var projectDiagnosticDataDisposer = ArrayBuilder<DiagnosticData>.GetInstance(out var projectDiagnosticData);
foreach (var diagnostic in diagnostics)
{
......
......@@ -132,8 +132,8 @@ void IChainedCommandHandler<TypeCharCommandArgs>.ExecuteCommand(TypeCharCommandA
{
AssertIsForeground();
using var matchedProviders = ArrayBuilder<ISignatureHelpProvider>.GetInstance();
using var unmatchedProviders = ArrayBuilder<ISignatureHelpProvider>.GetInstance();
using var matchedProvidersDisposer = ArrayBuilder<ISignatureHelpProvider>.GetInstance(out var matchedProviders);
using var unmatchedProvidersDisposer = ArrayBuilder<ISignatureHelpProvider>.GetInstance(out var unmatchedProviders);
foreach (var provider in providers)
{
if (provider.IsTriggerCharacter(ch))
......
......@@ -18,7 +18,7 @@ internal abstract class AbstractLoadDirectiveCompletionProvider : AbstractDirect
private static ImmutableArray<char> GetCommitCharacters()
{
using var builder = ArrayBuilder<char>.GetInstance();
using var builderDisposer = ArrayBuilder<char>.GetInstance(out var builder);
builder.Add('"');
if (PathUtilities.IsUnixLikePlatform)
{
......
......@@ -21,7 +21,7 @@ internal abstract class AbstractReferenceDirectiveCompletionProvider : AbstractD
private static ImmutableArray<char> GetCommitCharacters()
{
using var builder = ArrayBuilder<char>.GetInstance();
using var builderDisposer = ArrayBuilder<char>.GetInstance(out var builder);
builder.Add('"');
......
......@@ -35,7 +35,7 @@ public Task<ImmutableArray<CompletionItem>> GetItemsAsync(string directoryPath,
// internal for testing
internal ImmutableArray<CompletionItem> GetItems(string directoryPath, CancellationToken cancellationToken)
{
using var result = ArrayBuilder<CompletionItem>.GetInstance();
using var resultDisposer = ArrayBuilder<CompletionItem>.GetInstance(out var result);
var comma = directoryPath.IndexOf(',');
if (comma >= 0)
......
......@@ -35,7 +35,7 @@ protected override Data TryGetExistingData(Stream stream, Document value, Cancel
var textVersion = VersionStamp.ReadFrom(reader);
var dataVersion = VersionStamp.ReadFrom(reader);
using var list = ArrayBuilder<TodoItem>.GetInstance();
using var listDisposer = ArrayBuilder<TodoItem>.GetInstance(out var list);
AppendItems(reader, value, list, cancellationToken);
return new Data(textVersion, dataVersion, list.ToImmutable());
......
......@@ -22,7 +22,7 @@ public ImmutableArray<IOption> Options
{
get
{
using var result = ArrayBuilder<IOption>.GetInstance();
using var resultDisposer = ArrayBuilder<IOption>.GetInstance(out var result);
foreach (var id in (FunctionId[])Enum.GetValues(typeof(FunctionId)))
{
result.Add(FunctionIdOptions.GetOption(id));
......
......@@ -838,7 +838,7 @@ public ImmutableArray<SyntaxNode> ParseStatements(string statements)
return default;
}
using var list = ArrayBuilder<SyntaxNode>.GetInstance();
using var listDisposer = ArrayBuilder<SyntaxNode>.GetInstance(out var list);
var delimiter = IsVisualBasic ? "\r\n" : ";";
var parts = statements.Split(new[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
foreach (var p in parts)
......
......@@ -474,7 +474,7 @@ public void TryMatchSingleWordPattern_CultureAwareSingleWordPreferCaseSensitiveE
private static ImmutableArray<string> PartListToSubstrings(string identifier, ArrayBuilder<TextSpan> parts)
{
using var result = ArrayBuilder<string>.GetInstance();
using var resultDisposer = ArrayBuilder<string>.GetInstance(out var result);
foreach (var span in parts)
{
result.Add(identifier.Substring(span.Start, span.Length));
......@@ -513,7 +513,7 @@ private static IEnumerable<PatternMatch> TryMatchMultiWordPattern(string candida
{
MarkupTestFile.GetSpans(candidate, out candidate, out ImmutableArray<TextSpan> expectedSpans);
using var matches = ArrayBuilder<PatternMatch>.GetInstance();
using var matchesDisposer = ArrayBuilder<PatternMatch>.GetInstance(out var matches);
PatternMatcher.CreatePatternMatcher(pattern, includeMatchedSpans: true).AddMatches(candidate, matches);
if (matches.Count == 0)
......
......@@ -41,7 +41,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
protected override async Task FixAllAsync(Document document, ImmutableArray<Diagnostic> diagnostics, SyntaxEditor editor, CancellationToken cancellationToken)
{
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
using var spans = ArrayBuilder<TextSpan>.GetInstance(diagnostics.Length);
using var spansDisposer = ArrayBuilder<TextSpan>.GetInstance(diagnostics.Length, out var spans);
foreach (var diagnostic in diagnostics)
{
cancellationToken.ThrowIfCancellationRequested();
......
......@@ -73,7 +73,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
originalNodes,
t =>
{
using var additionalNodesToTrack = ArrayBuilder<SyntaxNode>.GetInstance(2);
using var additionalNodesToTrackDisposer = ArrayBuilder<SyntaxNode>.GetInstance(capacity: 2, out var additionalNodesToTrack);
additionalNodesToTrack.Add(t.identifier);
additionalNodesToTrack.Add(t.declarator);
......
......@@ -120,7 +120,7 @@ private static ExpressionSyntax GenerateTupleDeclaration(ITypeSymbol typeSymbol,
var elements = ((INamedTypeSymbol)typeSymbol).TupleElements;
Debug.Assert(elements.Length == parensDesignation.Variables.Count);
using var builder = ArrayBuilder<SyntaxNode>.GetInstance(elements.Length);
using var builderDisposer = ArrayBuilder<SyntaxNode>.GetInstance(elements.Length, out var builder);
for (var i = 0; i < elements.Length; i++)
{
var designation = parensDesignation.Variables[i];
......
......@@ -230,7 +230,7 @@ private static int NonParamsParameterCount(IMethodSymbol method)
ImmutableArray<CodeAction> NestByOverload()
{
using var builder = ArrayBuilder<CodeAction>.GetInstance(codeFixData.Length);
using var builderDisposer = ArrayBuilder<CodeAction>.GetInstance(codeFixData.Length, out var builder);
foreach (var data in codeFixData)
{
// We create the mandatory data.CreateChangedSolutionNonCascading fix first.
......@@ -264,7 +264,7 @@ ImmutableArray<CodeAction> NestByOverload()
ImmutableArray<CodeAction> NestByCascading()
{
using var builder = ArrayBuilder<CodeAction>.GetInstance(2);
using var builderDisposer = ArrayBuilder<CodeAction>.GetInstance(capacity: 2, out var builder);
var nonCascadingActions = ImmutableArray.CreateRange<CodeFixData, CodeAction>(codeFixData, data =>
{
......@@ -303,7 +303,7 @@ ImmutableArray<CodeAction> NestByCascading()
SeparatedSyntaxList<TArgumentSyntax> arguments,
ImmutableArray<ArgumentInsertPositionData<TArgumentSyntax>> methodsAndArgumentsToAdd)
{
using var builder = ArrayBuilder<CodeFixData>.GetInstance(methodsAndArgumentsToAdd.Length);
using var builderDisposer = ArrayBuilder<CodeFixData>.GetInstance(methodsAndArgumentsToAdd.Length, out var builder);
// Order by the furthest argument index to the nearest argument index. The ones with
// larger argument indexes mean that we matched more earlier arguments (and thus are
......
......@@ -162,7 +162,7 @@ public BatchFixer(AbstractSuppressionCodeFixProvider suppressionFixProvider)
private static async Task<ImmutableArray<SyntaxNode>> GetAttributeNodesToFixAsync(ImmutableArray<AttributeRemoveAction> attributeRemoveFixes, CancellationToken cancellationToken)
{
using var builder = ArrayBuilder<SyntaxNode>.GetInstance(attributeRemoveFixes.Length);
using var builderDisposer = ArrayBuilder<SyntaxNode>.GetInstance(attributeRemoveFixes.Length, out var builder);
foreach (var attributeRemoveFix in attributeRemoveFixes)
{
var attributeToRemove = await attributeRemoveFix.GetAttributeToRemoveAsync(cancellationToken).ConfigureAwait(false);
......
......@@ -208,8 +208,8 @@ await ChangeNamespaceInSingleDocumentAsync(solutionAfterNamespaceChange, documen
// will return false. We use span of namespace declaration found in each document to decide if they are identical.
var documents = ids.SelectAsArray(id => solution.GetDocument(id));
using var containers = ArrayBuilder<(DocumentId, SyntaxNode)>.GetInstance(ids.Length);
using var spanForContainers = PooledHashSet<TextSpan>.GetInstance();
using var containersDisposer = ArrayBuilder<(DocumentId, SyntaxNode)>.GetInstance(ids.Length, out var containers);
using var spanForContainersDisposer = PooledHashSet<TextSpan>.GetInstance(out var spanForContainers);
foreach (var document in documents)
{
......@@ -334,7 +334,7 @@ private static ImmutableArray<string> GetAllNamespaceImportsForDeclaringDocument
private ImmutableArray<SyntaxNode> CreateImports(Document document, ImmutableArray<string> names, bool withFormatterAnnotation)
{
var generator = SyntaxGenerator.GetGenerator(document);
using var builder = ArrayBuilder<SyntaxNode>.GetInstance(names.Length);
using var builderDisposer = ArrayBuilder<SyntaxNode>.GetInstance(names.Length, out var builder);
for (var i = 0; i < names.Length; ++i)
{
builder.Add(CreateImport(generator, names[i], withFormatterAnnotation));
......
......@@ -145,7 +145,7 @@ private LocalizableStringWithArguments(ObjectReader reader)
}
else
{
using var argumentsBuilder = ArrayBuilder<string>.GetInstance(length);
using var argumentsBuilderDisposer = ArrayBuilder<string>.GetInstance(length, out var argumentsBuilder);
for (var i = 0; i < length; i++)
{
argumentsBuilder.Add(reader.ReadString());
......
......@@ -288,10 +288,10 @@ private static bool ShouldConsiderSymbol(ISymbol symbol)
await AddLocationSpan(location, solution, spanSet, tagMap, HighlightSpanKind.Reference, cancellationToken).ConfigureAwait(false);
}
using var list = ArrayBuilder<DocumentHighlights>.GetInstance(tagMap.Count);
using var listDisposer = ArrayBuilder<DocumentHighlights>.GetInstance(tagMap.Count, out var list);
foreach (var kvp in tagMap)
{
using var spans = ArrayBuilder<HighlightSpan>.GetInstance(kvp.Value.Count);
using var spansDisposer = ArrayBuilder<HighlightSpan>.GetInstance(kvp.Value.Count, out var spans);
foreach (var span in kvp.Value)
{
spans.Add(span);
......
......@@ -226,7 +226,7 @@ private async Task<ImmutableArray<ActiveStatementExceptionRegions>> GetBaseActiv
{
var baseActiveStatements = await BaseActiveStatements.GetValueAsync(cancellationToken).ConfigureAwait(false);
var instructionMap = baseActiveStatements.InstructionMap;
using var builder = ArrayBuilder<ActiveStatementExceptionRegions>.GetInstance(instructionMap.Count);
using var builderDisposer = ArrayBuilder<ActiveStatementExceptionRegions>.GetInstance(instructionMap.Count, out var builder);
builder.Count = instructionMap.Count;
foreach (var activeStatement in instructionMap.Values)
......
......@@ -91,7 +91,7 @@ internal new class State :
}
var tupleElements = ((INamedTypeSymbol)targetType).TupleElements;
using var builder = ArrayBuilder<IParameterSymbol>.GetInstance(tupleElements.Length);
using var builderDisposer = ArrayBuilder<IParameterSymbol>.GetInstance(tupleElements.Length, out var builder);
foreach (var element in tupleElements)
{
builder.Add(CodeGenerationSymbolFactory.CreateParameterSymbol(
......
......@@ -69,7 +69,7 @@ private static string RemovePrefixesAndSuffixes(ISymbol symbol, ImmutableArray<N
private static ImmutableArray<string> CreateWords(ArrayBuilder<TextSpan> parts, string name)
{
using var result = ArrayBuilder<string>.GetInstance(parts.Count);
using var resultDisposer = ArrayBuilder<string>.GetInstance(parts.Count, out var result);
foreach (var part in parts)
{
result.Add(name.Substring(part.Start, part.Length));
......
......@@ -234,7 +234,7 @@ private bool IsToken(int tokenKind, ArrayBuilder<SyntaxNodeOrToken> pieces, int
private ImmutableArray<SyntaxNodeOrToken> GetSubRange(
ArrayBuilder<SyntaxNodeOrToken> pieces, int start, int end)
{
using var result = ArrayBuilder<SyntaxNodeOrToken>.GetInstance(end - start);
using var resultDisposer = ArrayBuilder<SyntaxNodeOrToken>.GetInstance(end - start, out var result);
for (var i = start; i < end; i++)
{
result.Add(pieces[i]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册