From acce4097dd43571043a65e47700659f2993d2f07 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 23 Sep 2016 20:30:16 -0700 Subject: [PATCH] Use pooled arrays. --- .../Finders/AbstractReferenceFinder.cs | 39 ++++++------------- .../Finders/NamedTypeSymbolReferenceFinder.cs | 27 +++++-------- .../Finders/ParameterSymbolReferenceFinder.cs | 28 +++++-------- .../Finders/PropertySymbolReferenceFinder.cs | 4 +- 4 files changed, 32 insertions(+), 66 deletions(-) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs index 18e0a1169bb..da77970cd08 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs @@ -94,7 +94,7 @@ protected async Task> FindDocumentsAsync(Project projec return ImmutableArray.Empty; } - ImmutableArray.Builder documents = null; + var documents = ArrayBuilder.GetInstance(); foreach (var document in project.Documents) { if (scope != null && !scope.Contains(document)) @@ -104,19 +104,11 @@ protected async Task> FindDocumentsAsync(Project projec if (await predicateAsync(document, cancellationToken).ConfigureAwait(false)) { - documents = documents ?? ImmutableArray.CreateBuilder(); documents.Add(document); } } - if (documents == null) - { - return ImmutableArray.Empty; - } - else - { - return documents.ToImmutable(); - } + return documents.ToImmutableAndFree(); } /// @@ -285,7 +277,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n var syntaxTree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - var locations = ImmutableArray.CreateBuilder(); + var locations = ArrayBuilder.GetInstance(); foreach (var token in tokens) { cancellationToken.ThrowIfCancellationRequested(); @@ -304,7 +296,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return locations.ToImmutable(); + return locations.ToImmutableAndFree(); } protected static Task> FindReferencesInDocumentAsync( @@ -402,24 +394,17 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n ImmutableArray nonAliasReferences, CancellationToken cancellationToken) { - ImmutableArray.Builder aliasSymbols = null; + var aliasSymbols = ArrayBuilder.GetInstance(); foreach (var r in nonAliasReferences) { var symbol = await GetAliasSymbolAsync(document, r, cancellationToken).ConfigureAwait(false); if (symbol != null) { - if (aliasSymbols == null) - { - aliasSymbols = ImmutableArray.CreateBuilder(); - } - aliasSymbols.Add(symbol); } } - return aliasSymbols != null - ? aliasSymbols.Distinct().ToImmutableArray() - : ImmutableArray.Empty; + return aliasSymbols.ToImmutableAndFree(); } private static async Task> FindReferencesThroughAliasSymbolsAsync( @@ -430,7 +415,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n CancellationToken cancellationToken) { var syntaxFactsService = document.GetLanguageService(); - var allAliasReferences = ImmutableArray.CreateBuilder(); + var allAliasReferences = ArrayBuilder.GetInstance(); foreach (var aliasSymbol in aliasSymbols) { var aliasReferences = await FindReferencesInDocumentUsingIdentifierAsync(symbol, aliasSymbol.Name, document, cancellationToken, findParentNode).ConfigureAwait(false); @@ -446,7 +431,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return allAliasReferences.ToImmutable(); + return allAliasReferences.ToImmutableAndFree(); } private static async Task> FindReferencesThroughAliasSymbolsAsync( @@ -457,7 +442,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n CancellationToken cancellationToken) { var syntaxFactsService = document.GetLanguageService(); - var allAliasReferences = ImmutableArray.CreateBuilder(); + var allAliasReferences = ArrayBuilder.GetInstance(); foreach (var aliasSymbol in aliasSymbols) { var aliasReferences = await FindReferencesInDocumentUsingIdentifierAsync(aliasSymbol.Name, document, symbolsMatch, cancellationToken).ConfigureAwait(false); @@ -473,7 +458,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return allAliasReferences.ToImmutable(); + return allAliasReferences.ToImmutableAndFree(); } protected Task> FindDocumentsWithForEachStatementsAsync(Project project, IImmutableSet documents, CancellationToken cancellationToken) @@ -497,7 +482,7 @@ protected Task> FindDocumentsWithForEachStatementsAsync var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - var locations = ImmutableArray.CreateBuilder(); + var locations = ArrayBuilder.GetInstance(); var originalUnreducedSymbolDefinition = symbol.GetOriginalUnreducedDefinition(); @@ -517,7 +502,7 @@ protected Task> FindDocumentsWithForEachStatementsAsync } } - return locations.ToImmutable(); + return locations.ToImmutableAndFree(); } else { diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs index c9a057eb2a0..23fe4546beb 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs @@ -25,39 +25,30 @@ protected override bool CanFind(INamedTypeSymbol symbol) IImmutableSet projects, CancellationToken cancellationToken) { - ImmutableArray.Builder result = null; + var result = ArrayBuilder.GetInstance(); var symbol = symbolAndProjectId.Symbol; if (symbol.AssociatedSymbol != null) { - result = Add(result, symbolAndProjectId, ImmutableArray.Create(symbol.AssociatedSymbol)); + Add(result, symbolAndProjectId, ImmutableArray.Create(symbol.AssociatedSymbol)); } // cascade to constructors - result = Add(result, symbolAndProjectId, symbol.Constructors); + Add(result, symbolAndProjectId, symbol.Constructors); // cascade to destructor - result = Add(result, symbolAndProjectId, symbol.GetMembers(WellKnownMemberNames.DestructorName)); + Add(result, symbolAndProjectId, symbol.GetMembers(WellKnownMemberNames.DestructorName)); - return Task.FromResult>( - result == null - ? ImmutableArray.Empty - : result.ToImmutable()); + return Task.FromResult(result.ToImmutableAndFree()); } - private ImmutableArray.Builder Add( - ImmutableArray.Builder result, + private void Add( + ArrayBuilder result, SymbolAndProjectId symbolAndProjectId, ImmutableArray enumerable) where TSymbol : ISymbol { - if (enumerable != null) - { - result = result ?? ImmutableArray.CreateBuilder(); - result.AddRange(enumerable.Select( - s => symbolAndProjectId.WithSymbol((ISymbol)s))); - } - - return result; + result.AddRange(enumerable.Select( + s => symbolAndProjectId.WithSymbol((ISymbol)s))); } protected override async Task> DetermineDocumentsToSearchAsync( diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs index 6208690e4e7..d2e3bcf9078 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; @@ -8,7 +7,6 @@ using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Utilities; -using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.FindSymbols.Finders { @@ -69,7 +67,7 @@ protected override bool CanFind(IParameterSymbol symbol) SymbolAndProjectId parameterAndProjectId, CancellationToken cancellationToken) { - ImmutableArray.Builder results = null; + var results = ArrayBuilder.GetInstance(); var parameter = parameterAndProjectId.Symbol; if (parameter.ContainingSymbol.IsAnonymousFunction()) @@ -94,7 +92,6 @@ protected override bool CanFind(IParameterSymbol symbol) var container = GetContainer(semanticModel, parameterNode, syntaxFactsService); if (container != null) { - results = ImmutableArray.CreateBuilder(); results.AddRange(CascadeBetweenAnonymousFunctionParameters( document, semanticModel, container, parameterAndProjectId, convertedType, cancellationToken)); } @@ -110,20 +107,13 @@ protected override bool CanFind(IParameterSymbol symbol) int ordinal = parameter.Ordinal; if (invokeMethod != null && ordinal < invokeMethod.Parameters.Length) { - if (results == null) - { - results = ImmutableArray.CreateBuilder(); - } - results.Add(parameterAndProjectId.WithSymbol( invokeMethod.Parameters[ordinal])); } } } - return results == null - ? ImmutableArray.Empty - : results.ToImmutable(); + return results.ToImmutableAndFree(); } private ImmutableArray CascadeBetweenAnonymousFunctionParameters( @@ -134,7 +124,7 @@ protected override bool CanFind(IParameterSymbol symbol) ITypeSymbol convertedType1, CancellationToken cancellationToken) { - var result = ImmutableArray.CreateBuilder(); + var result = ArrayBuilder.GetInstance(); var parameter = parameterAndProjectId.Symbol; var syntaxFacts = document.GetLanguageService(); @@ -159,7 +149,7 @@ protected override bool CanFind(IParameterSymbol symbol) } } - return result.ToImmutable(); + return result.ToImmutableAndFree(); } private bool ParameterNamesMatch(ISyntaxFactsService syntaxFacts, IMethodSymbol methodSymbol1, IMethodSymbol methodSymbol2) @@ -195,7 +185,7 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete SymbolAndProjectId parameterAndProjectId, CancellationToken cancellationToken) { - var results = ImmutableArray.CreateBuilder(); + var results = ArrayBuilder.GetInstance(); var parameter = parameterAndProjectId.Symbol; var ordinal = parameter.Ordinal; @@ -278,13 +268,13 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete } } - return results.ToImmutable(); + return results.ToImmutableAndFree(); } private ImmutableArray CascadeBetweenPartialMethodParameters( SymbolAndProjectId parameterAndProjectId) { - var result = ImmutableArray.CreateBuilder(); + var result = ArrayBuilder.GetInstance(); var parameter = parameterAndProjectId.Symbol; if (parameter.ContainingSymbol is IMethodSymbol) @@ -304,7 +294,7 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete } } - return result.ToImmutable(); + return result.ToImmutableAndFree(); } } -} +} \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs index 3a357114ebb..9596b9ddd09 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs @@ -135,7 +135,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) var elementAccessExpressionsAndIndexerMemberCref = elementAccessExpressions.Concat(indexerMemberCref); - var locations = ImmutableArray.CreateBuilder(); + var locations = ArrayBuilder.GetInstance(); foreach (var node in elementAccessExpressionsAndIndexerMemberCref) { @@ -172,7 +172,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) } } - return locations.ToImmutable(); + return locations.ToImmutableAndFree(); } } } -- GitLab