提交 acce4097 编写于 作者: C CyrusNajmabadi

Use pooled arrays.

上级 815e7539
......@@ -94,7 +94,7 @@ protected async Task<ImmutableArray<Document>> FindDocumentsAsync(Project projec
return ImmutableArray<Document>.Empty;
}
ImmutableArray<Document>.Builder documents = null;
var documents = ArrayBuilder<Document>.GetInstance();
foreach (var document in project.Documents)
{
if (scope != null && !scope.Contains(document))
......@@ -104,19 +104,11 @@ protected async Task<ImmutableArray<Document>> FindDocumentsAsync(Project projec
if (await predicateAsync(document, cancellationToken).ConfigureAwait(false))
{
documents = documents ?? ImmutableArray.CreateBuilder<Document>();
documents.Add(document);
}
}
if (documents == null)
{
return ImmutableArray<Document>.Empty;
}
else
{
return documents.ToImmutable();
}
return documents.ToImmutableAndFree();
}
/// <summary>
......@@ -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<ReferenceLocation>();
var locations = ArrayBuilder<ReferenceLocation>.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<ImmutableArray<ReferenceLocation>> FindReferencesInDocumentAsync(
......@@ -402,24 +394,17 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n
ImmutableArray<ReferenceLocation> nonAliasReferences,
CancellationToken cancellationToken)
{
ImmutableArray<IAliasSymbol>.Builder aliasSymbols = null;
var aliasSymbols = ArrayBuilder<IAliasSymbol>.GetInstance();
foreach (var r in nonAliasReferences)
{
var symbol = await GetAliasSymbolAsync(document, r, cancellationToken).ConfigureAwait(false);
if (symbol != null)
{
if (aliasSymbols == null)
{
aliasSymbols = ImmutableArray.CreateBuilder<IAliasSymbol>();
}
aliasSymbols.Add(symbol);
}
}
return aliasSymbols != null
? aliasSymbols.Distinct().ToImmutableArray()
: ImmutableArray<IAliasSymbol>.Empty;
return aliasSymbols.ToImmutableAndFree();
}
private static async Task<ImmutableArray<ReferenceLocation>> FindReferencesThroughAliasSymbolsAsync(
......@@ -430,7 +415,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n
CancellationToken cancellationToken)
{
var syntaxFactsService = document.GetLanguageService<ISyntaxFactsService>();
var allAliasReferences = ImmutableArray.CreateBuilder<ReferenceLocation>();
var allAliasReferences = ArrayBuilder<ReferenceLocation>.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<ImmutableArray<ReferenceLocation>> FindReferencesThroughAliasSymbolsAsync(
......@@ -457,7 +442,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n
CancellationToken cancellationToken)
{
var syntaxFactsService = document.GetLanguageService<ISyntaxFactsService>();
var allAliasReferences = ImmutableArray.CreateBuilder<ReferenceLocation>();
var allAliasReferences = ArrayBuilder<ReferenceLocation>.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<ImmutableArray<Document>> FindDocumentsWithForEachStatementsAsync(Project project, IImmutableSet<Document> documents, CancellationToken cancellationToken)
......@@ -497,7 +482,7 @@ protected Task<ImmutableArray<Document>> FindDocumentsWithForEachStatementsAsync
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
var locations = ImmutableArray.CreateBuilder<ReferenceLocation>();
var locations = ArrayBuilder<ReferenceLocation>.GetInstance();
var originalUnreducedSymbolDefinition = symbol.GetOriginalUnreducedDefinition();
......@@ -517,7 +502,7 @@ protected Task<ImmutableArray<Document>> FindDocumentsWithForEachStatementsAsync
}
}
return locations.ToImmutable();
return locations.ToImmutableAndFree();
}
else
{
......
......@@ -25,41 +25,32 @@ protected override bool CanFind(INamedTypeSymbol symbol)
IImmutableSet<Project> projects,
CancellationToken cancellationToken)
{
ImmutableArray<SymbolAndProjectId>.Builder result = null;
var result = ArrayBuilder<SymbolAndProjectId>.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<ImmutableArray<SymbolAndProjectId>>(
result == null
? ImmutableArray<SymbolAndProjectId>.Empty
: result.ToImmutable());
return Task.FromResult(result.ToImmutableAndFree());
}
private ImmutableArray<SymbolAndProjectId>.Builder Add<TSymbol>(
ImmutableArray<SymbolAndProjectId>.Builder result,
private void Add<TSymbol>(
ArrayBuilder<SymbolAndProjectId> result,
SymbolAndProjectId symbolAndProjectId,
ImmutableArray<TSymbol> enumerable) where TSymbol : ISymbol
{
if (enumerable != null)
{
result = result ?? ImmutableArray.CreateBuilder<SymbolAndProjectId>();
result.AddRange(enumerable.Select(
s => symbolAndProjectId.WithSymbol((ISymbol)s)));
}
return result;
}
protected override async Task<ImmutableArray<Document>> DetermineDocumentsToSearchAsync(
INamedTypeSymbol symbol,
Project project,
......
// 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<IParameterSymbol> parameterAndProjectId,
CancellationToken cancellationToken)
{
ImmutableArray<SymbolAndProjectId>.Builder results = null;
var results = ArrayBuilder<SymbolAndProjectId>.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<SymbolAndProjectId>();
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<SymbolAndProjectId>();
}
results.Add(parameterAndProjectId.WithSymbol(
invokeMethod.Parameters[ordinal]));
}
}
}
return results == null
? ImmutableArray<SymbolAndProjectId>.Empty
: results.ToImmutable();
return results.ToImmutableAndFree();
}
private ImmutableArray<SymbolAndProjectId> CascadeBetweenAnonymousFunctionParameters(
......@@ -134,7 +124,7 @@ protected override bool CanFind(IParameterSymbol symbol)
ITypeSymbol convertedType1,
CancellationToken cancellationToken)
{
var result = ImmutableArray.CreateBuilder<SymbolAndProjectId>();
var result = ArrayBuilder<SymbolAndProjectId>.GetInstance();
var parameter = parameterAndProjectId.Symbol;
var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>();
......@@ -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<IParameterSymbol> parameterAndProjectId,
CancellationToken cancellationToken)
{
var results = ImmutableArray.CreateBuilder<SymbolAndProjectId>();
var results = ArrayBuilder<SymbolAndProjectId>.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<SymbolAndProjectId> CascadeBetweenPartialMethodParameters(
SymbolAndProjectId<IParameterSymbol> parameterAndProjectId)
{
var result = ImmutableArray.CreateBuilder<SymbolAndProjectId>();
var result = ArrayBuilder<SymbolAndProjectId>.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
......@@ -135,7 +135,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol)
var elementAccessExpressionsAndIndexerMemberCref = elementAccessExpressions.Concat(indexerMemberCref);
var locations = ImmutableArray.CreateBuilder<ReferenceLocation>();
var locations = ArrayBuilder<ReferenceLocation>.GetInstance();
foreach (var node in elementAccessExpressionsAndIndexerMemberCref)
{
......@@ -172,7 +172,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol)
}
}
return locations.ToImmutable();
return locations.ToImmutableAndFree();
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册