From 61627a4e202b1523052ade0abb710c55091b7d4b Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Tue, 27 Sep 2016 18:29:56 -0700 Subject: [PATCH] Use immutable arrays in more places. --- .../FindReferences/DependentTypeFinder.cs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs index e99ea13ac66..1138295a0ac 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs @@ -35,6 +35,9 @@ internal static class DependentTypeFinder private static readonly Func s_isInterfaceOrNonSealedClass = t => t.TypeKind == TypeKind.Interface || s_isNonSealedClass(t); + private static readonly ObjectPool s_setPool = new ObjectPool( + () => new SymbolAndProjectIdSet()); + /// /// Used for implementing the Inherited-By relation for progression. /// @@ -92,7 +95,7 @@ internal static class DependentTypeFinder /// Implementation of for /// s /// - public static async Task>> FindTransitivelyImplementingTypesAsync( + public static async Task>> FindTransitivelyImplementingTypesAsync( INamedTypeSymbol type, Solution solution, IImmutableSet projects, @@ -103,7 +106,7 @@ internal static class DependentTypeFinder transitive: true, cancellationToken: cancellationToken).ConfigureAwait(false); // We only want implementing types here, not derived interfaces. - return derivedAndImplementingTypes.Where(t => t.Symbol.TypeKind == TypeKind.Class).ToList(); + return derivedAndImplementingTypes.WhereAsArray(t => t.Symbol.TypeKind == TypeKind.Class); } /// @@ -214,7 +217,15 @@ internal static class DependentTypeFinder transitive, cancellationToken).ConfigureAwait(false); } - return result.ToImmutableArray(); + return ToImmutableAndFree(result); + } + + private static ImmutableArray> ToImmutableAndFree( + SymbolAndProjectIdSet set) + { + var array = set.ToImmutableArray(); + s_setPool.ClearAndFree(set); + return array; } private static async Task FindTypesInProjectAsync( @@ -389,7 +400,7 @@ internal static class DependentTypeFinder .ToList(); } - private static async Task>> FindAllMatchingMetadataTypesInProjectAsync( + private static async Task>> FindAllMatchingMetadataTypesInProjectAsync( SymbolAndProjectIdSet metadataTypes, Project project, Func metadataTypeMatches, @@ -397,7 +408,7 @@ internal static class DependentTypeFinder { if (metadataTypes.Count == 0) { - return SpecializedCollections.EmptyEnumerable>(); + return ImmutableArray>.Empty; } var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); @@ -425,7 +436,7 @@ internal static class DependentTypeFinder currentTypes = immediateDerivedTypes; } - return result; + return ToImmutableAndFree(result); } private static async Task FindImmediateMatchingMetadataTypesInMetadataReferenceAsync( @@ -506,7 +517,7 @@ internal static class DependentTypeFinder return false; } - private static async Task>> FindSourceTypesInProjectAsync( + private static async Task>> FindSourceTypesInProjectAsync( SymbolAndProjectIdSet sourceAndMetadataTypes, Project project, Func sourceTypeImmediatelyMatches, @@ -566,7 +577,7 @@ internal static class DependentTypeFinder } } - return finalResult; + return ToImmutableAndFree(finalResult); } private static bool ImmediatelyDerivesOrImplementsFrom( @@ -588,7 +599,7 @@ internal static class DependentTypeFinder return false; } - private static async Task>> FindImmediatelyInheritingTypesInDocumentAsync( + private static async Task>> FindImmediatelyInheritingTypesInDocumentAsync( Document document, SymbolAndProjectIdSet typesToSearchFor, InheritanceQuery inheritanceQuery, @@ -610,7 +621,7 @@ internal static class DependentTypeFinder typeImmediatelyMatches, result, cancellationToken).ConfigureAwait(false); } - return result; + return ToImmutableAndFree(result); } private static async Task ProcessSymbolInfo( @@ -712,8 +723,7 @@ public InheritanceQuery(SymbolAndProjectIdSet sourceAndMetadataTypes) private static SymbolAndProjectIdSet CreateSymbolAndProjectIdSet() { - return new SymbolAndProjectIdSet( - SymbolAndProjectIdComparer.SymbolEquivalenceInstance); + return s_setPool.Allocate(); } } } \ No newline at end of file -- GitLab