diff --git a/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs b/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs index 6ffb6c8e9d5a2c81c20d81acfcc16ccb0ed7de0e..e5b5758edadce0f6a2649cfc5c3d2bffe4753058 100644 --- a/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs +++ b/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs @@ -448,6 +448,11 @@ internal static ImmutableArray Concat(this ImmutableArray first, Immuta return first.AddRange(second); } + internal static ImmutableArray Concat(this ImmutableArray first, T second) + { + return first.Add(second); + } + internal static bool HasDuplicates(this ImmutableArray array, IEqualityComparer comparer) { switch (array.Length) diff --git a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/CSharpMoveTypeTestsBase.cs b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/CSharpMoveTypeTestsBase.cs index fe5f03f27cceea39b6ba64e038c3c7c77e25d23c..cab8412ea9cc89aa7e21d5ef9011f04bdd10a105 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/CSharpMoveTypeTestsBase.cs +++ b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/CSharpMoveTypeTestsBase.cs @@ -1,8 +1,6 @@ // 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.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis.CodeRefactorings.MoveType; using Microsoft.CodeAnalysis.Editor.UnitTests.MoveType; using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; @@ -27,4 +25,4 @@ protected override string GetLanguage() return LanguageNames.CSharp; } } -} +} \ No newline at end of file diff --git a/src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs b/src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs index 2528c71bafc0a8c1e325331324d5344432e82299..8ce0060013aedac35efba6f5a501f276dae68384 100644 --- a/src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs +++ b/src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs @@ -46,7 +46,7 @@ private ImmutableArray CreateFixers(string language) } IEnumerable typeInfos = null; - ImmutableArray.Builder builder = null; + var builder = ArrayBuilder.GetInstance(); try { @@ -66,7 +66,6 @@ private ImmutableArray CreateFixers(string language) attribute.Languages.Length == 0 || attribute.Languages.Contains(language)) { - builder = builder ?? ImmutableArray.CreateBuilder(); builder.Add((CodeFixProvider)Activator.CreateInstance(typeInfo.AsType())); } } @@ -83,7 +82,7 @@ private ImmutableArray CreateFixers(string language) // NOTE: We could report "unable to load analyzer" exception here but it should have been already reported by DiagnosticService. } - return builder != null ? builder.ToImmutable() : ImmutableArray.Empty; + return builder.ToImmutableAndFree(); } } } diff --git a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs index 6287844722e2d99752f27936f49b49c615b5f836..910bc0b742734b0e0b3326f42bc8335fbceb7e64 100644 --- a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs +++ b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs @@ -117,7 +117,7 @@ private class AggregatingTagger : ForegroundThreadAffinitizedObject, IAccurateTa // GetDiagnostics returns whatever cached diagnostics in the service which can be stale ones. for example, build error will be most likely stale // diagnostics. so here we make sure we filter out any diagnostics that is not in the text range. - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); var fullSpan = new TextSpan(0, text.Length); foreach (var diagnostic in _owner._diagnosticService.GetDiagnostics( args.Workspace, args.ProjectId, args.DocumentId, args.Id, includeSuppressedDiagnostics: false, cancellationToken: cancellationToken)) @@ -128,7 +128,7 @@ private class AggregatingTagger : ForegroundThreadAffinitizedObject, IAccurateTa } } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } public void OnTaggerCreated() diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/FileSystem/FileSystemCompletionHelper.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/FileSystem/FileSystemCompletionHelper.cs index 30f8b6f47cc8d833686371641adc00da6da7a05d..096f6d9cfbb56ce83b433a11836d71642640a36e 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/FileSystem/FileSystemCompletionHelper.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/FileSystem/FileSystemCompletionHelper.cs @@ -86,7 +86,7 @@ private CompletionItem CreateNetworkRoot(TextSpan textChangeSpan) private ImmutableArray GetFilesAndDirectories(string path, string basePath) { - var result = ImmutableArray.CreateBuilder(); + var result = ArrayBuilder.GetInstance(); var pathKind = PathUtilities.GetPathKind(path); switch (pathKind) { @@ -164,7 +164,7 @@ private ImmutableArray GetFilesAndDirectories(string path, strin throw ExceptionUtilities.Unreachable; } - return result.AsImmutable(); + return result.ToImmutableAndFree(); } private static bool IsDriveRoot(string fullPath) diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Model.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Model.cs index ca916f9445a18b0203500d1701b1609b72bd68a2..12d466747a77f2eba03aa70509fb432f220241b6 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Model.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Model.cs @@ -138,13 +138,13 @@ internal class Model // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. - var totalItemsBuilder = ImmutableArray.CreateBuilder(); + var totalItemsBuilder = ArrayBuilder.GetInstance(); foreach (var item in originalList.Items) { totalItemsBuilder.Add(new DescriptionModifyingPresentationItem(item, completionService)); } - totalItems = totalItemsBuilder.AsImmutable(); + totalItems = totalItemsBuilder.ToImmutableAndFree(); defaultSuggestionModePresentationItem = new DescriptionModifyingPresentationItem( CreateDefaultSuggestionModeItem(), completionService, isSuggestionModeItem: true); suggestionModePresentationItem = suggestionModeItem != null ? new DescriptionModifyingPresentationItem(suggestionModeItem, completionService, isSuggestionModeItem: true) : null; diff --git a/src/EditorFeatures/Core/Implementation/NavigateTo/NavigateToSearchResultProvider.cs b/src/EditorFeatures/Core/Implementation/NavigateTo/NavigateToSearchResultProvider.cs index 257303dc5706d40c1140c16d8682b0fdcdad895a..7214f188f3b215ba54b65457455bcc260d99ba89 100644 --- a/src/EditorFeatures/Core/Implementation/NavigateTo/NavigateToSearchResultProvider.cs +++ b/src/EditorFeatures/Core/Implementation/NavigateTo/NavigateToSearchResultProvider.cs @@ -47,7 +47,7 @@ internal sealed partial class NavigateToSearchResultProvider : INavigateToSearch { using (var patternMatcher = new PatternMatcher(pattern, allowFuzzyMatching: true)) { - var result = ImmutableArray.CreateBuilder>>(); + var result = ArrayBuilder>>.GetInstance(); foreach (var document in project.Documents) { if (searchDocument != null && document != searchDocument) @@ -73,7 +73,7 @@ internal sealed partial class NavigateToSearchResultProvider : INavigateToSearch } } - return result.ToImmutable(); + return result.ToImmutableAndFree(); } } diff --git a/src/EditorFeatures/Core/Implementation/Structure/AbstractStructureTaggerProvider.cs b/src/EditorFeatures/Core/Implementation/Structure/AbstractStructureTaggerProvider.cs index 036890cbbdfd5dc2337c3a223a1850f82cb26b33..da02b9b015a7588a917b43db53b879019ccac4c4 100644 --- a/src/EditorFeatures/Core/Implementation/Structure/AbstractStructureTaggerProvider.cs +++ b/src/EditorFeatures/Core/Implementation/Structure/AbstractStructureTaggerProvider.cs @@ -213,7 +213,7 @@ protected sealed override ITaggerEventSource CreateEventSource(ITextView textVie ImmutableArray regions, ITextSnapshot snapshot) { // Remove any spans that aren't multiline. - var multiLineRegions = ImmutableArray.CreateBuilder(); + var multiLineRegions = ArrayBuilder.GetInstance(); foreach (var region in regions) { if (region != null && region.TextSpan.Length > 0) @@ -254,7 +254,7 @@ protected sealed override ITaggerEventSource CreateEventSource(ITextView textVie // Note we pass a IComparer instead of a Comparison to work around this // issue in ImmutableArray.Builder: https://github.com/dotnet/corefx/issues/11173 multiLineRegions.Sort(s_blockSpanComparer); - return multiLineRegions.ToImmutable(); + return multiLineRegions.ToImmutableAndFree(); } } } \ No newline at end of file diff --git a/src/EditorFeatures/Core/Implementation/Suggestions/CodeFixSuggestedAction.cs b/src/EditorFeatures/Core/Implementation/Suggestions/CodeFixSuggestedAction.cs index ebeb02295904e5f66aa15f1b8549a78c9799b24a..b348993ee574a44185afef846b6821d7465934e8 100644 --- a/src/EditorFeatures/Core/Implementation/Suggestions/CodeFixSuggestedAction.cs +++ b/src/EditorFeatures/Core/Implementation/Suggestions/CodeFixSuggestedAction.cs @@ -64,7 +64,7 @@ internal class CodeFixSuggestedAction : SuggestedActionWithFlavors, ITelemetryDi return null; } - var fixAllSuggestedActions = ImmutableArray.CreateBuilder(); + var fixAllSuggestedActions = ArrayBuilder.GetInstance(); foreach (var scope in supportedScopes) { var fixAllStateForScope = fixAllState.WithScopeAndEquivalenceKey(scope, action.EquivalenceKey); @@ -75,7 +75,9 @@ internal class CodeFixSuggestedAction : SuggestedActionWithFlavors, ITelemetryDi fixAllSuggestedActions.Add(fixAllSuggestedAction); } - return new SuggestedActionSet(fixAllSuggestedActions.ToImmutable(), title: EditorFeaturesResources.Fix_all_occurrences_in); + return new SuggestedActionSet( + fixAllSuggestedActions.ToImmutableAndFree(), + title: EditorFeaturesResources.Fix_all_occurrences_in); } public string GetDiagnosticID() diff --git a/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionWithFlavors.cs b/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionWithFlavors.cs index 5046a911d334b70b9e6d6597ee30671e0de4dbc7..5edc889fb98ff11f8ca7afe2a0d4c92db187d956 100644 --- a/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionWithFlavors.cs +++ b/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionWithFlavors.cs @@ -61,7 +61,7 @@ public async override Task> GetActionSetsAsync(C _actionSets = await extensionManager.PerformFunctionAsync(Provider, async () => { - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); // We use ConfigureAwait(true) to stay on the UI thread. var previewChangesSuggestedActionSet = await GetPreviewChangesSuggestedActionSetAsync(cancellationToken).ConfigureAwait(true); @@ -78,7 +78,7 @@ public async override Task> GetActionSetsAsync(C builder.Add(fixAllSuggestedActionSet); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); // We use ConfigureAwait(true) to stay on the UI thread. }, defaultValue: ImmutableArray.Empty).ConfigureAwait(true); } diff --git a/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionsSourceProvider.cs b/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionsSourceProvider.cs index 63351e1d07e8effd81d54a6ab4bc799a796c710c..feaf5cb6a29c1843b1aa9b8e7dd190ef61f524e3 100644 --- a/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionsSourceProvider.cs +++ b/src/EditorFeatures/Core/Implementation/Suggestions/SuggestedActionsSourceProvider.cs @@ -324,13 +324,13 @@ private CodeRefactoring FilterOnUIThread(CodeRefactoring refactoring, Workspace private IEnumerable OrganizeFixes(Workspace workspace, IEnumerable fixCollections, bool hasSuppressionFixes) { var map = ImmutableDictionary.CreateBuilder>(); - var order = ImmutableArray.CreateBuilder(); + var order = ArrayBuilder.GetInstance(); // First group fixes by diagnostic and priority. GroupFixes(workspace, fixCollections, map, order, hasSuppressionFixes); // Then prioritize between the groups. - return PrioritizeFixGroups(map.ToImmutable(), order.ToImmutable()); + return PrioritizeFixGroups(map.ToImmutable(), order.ToImmutableAndFree()); } /// @@ -340,7 +340,7 @@ private IEnumerable OrganizeFixes(Workspace workspace, IEnum Workspace workspace, IEnumerable fixCollections, IDictionary> map, - IList order, + ArrayBuilder order, bool hasSuppressionFixes) { foreach (var fixCollection in fixCollections) @@ -417,7 +417,10 @@ private IEnumerable OrganizeFixes(Workspace workspace, IEnum } } - private static void AddFix(CodeFix fix, SuggestedAction suggestedAction, IDictionary> map, IList order) + private static void AddFix( + CodeFix fix, SuggestedAction suggestedAction, + IDictionary> map, + ArrayBuilder order) { var diag = fix.GetPrimaryDiagnosticData(); @@ -443,7 +446,7 @@ private static void AddFix(CodeFix fix, SuggestedAction suggestedAction, IDictio /// private static IEnumerable PrioritizeFixGroups(IDictionary> map, IList order) { - var sets = ImmutableArray.CreateBuilder(); + var sets = ArrayBuilder.GetInstance(); foreach (var diag in order) { @@ -459,7 +462,7 @@ private static IEnumerable PrioritizeFixGroups(IDictionary private SuggestedActionSet OrganizeRefactorings(Workspace workspace, CodeRefactoring refactoring) { - var refactoringSuggestedActions = ImmutableArray.CreateBuilder(); + var refactoringSuggestedActions = ArrayBuilder.GetInstance(); foreach (var a in refactoring.Actions) { @@ -536,7 +539,8 @@ private SuggestedActionSet OrganizeRefactorings(Workspace workspace, CodeRefacto a, refactoring.Provider, _owner._listener)); } - return new SuggestedActionSet(refactoringSuggestedActions.ToImmutable(), SuggestedActionSetPriority.Low); + return new SuggestedActionSet( + refactoringSuggestedActions.ToImmutableAndFree(), SuggestedActionSetPriority.Low); } public async Task HasSuggestedActionsAsync(ISuggestedActionCategorySet requestedActionCategories, SnapshotSpan range, CancellationToken cancellationToken) diff --git a/src/EditorFeatures/Core/Implementation/Suggestions/SuppressionSuggestedAction.cs b/src/EditorFeatures/Core/Implementation/Suggestions/SuppressionSuggestedAction.cs index 042e72a45142fda3ee6d62d2f9c0e3b11d57a524..c4c7722686c595bc36ff3b5b6592b07c86b30c03 100644 --- a/src/EditorFeatures/Core/Implementation/Suggestions/SuppressionSuggestedAction.cs +++ b/src/EditorFeatures/Core/Implementation/Suggestions/SuppressionSuggestedAction.cs @@ -66,7 +66,7 @@ public override Task> GetActionSetsAsync(Cancell if (this.CodeAction.GetCodeActions().Any()) { - var nestedSuggestedActions = ImmutableArray.CreateBuilder(); + var nestedSuggestedActions = ArrayBuilder.GetInstance(); var fixCount = this.CodeAction.GetCodeActions().Length; foreach (var c in this.CodeAction.GetCodeActions()) @@ -80,7 +80,7 @@ public override Task> GetActionSetsAsync(Cancell } _actionSets = ImmutableArray.Create( - new SuggestedActionSet(nestedSuggestedActions.ToImmutable())); + new SuggestedActionSet(nestedSuggestedActions.ToImmutableAndFree())); return Task.FromResult(_actionSets); } diff --git a/src/EditorFeatures/Core/Implementation/TodoComment/AbstractTodoCommentIncrementalAnalyzer.cs b/src/EditorFeatures/Core/Implementation/TodoComment/AbstractTodoCommentIncrementalAnalyzer.cs index 72eb7117d49ad1235e8c6967dc95de535248b8cf..a554083c87eff881ba2f5d6f41a1074feeda6778 100644 --- a/src/EditorFeatures/Core/Implementation/TodoComment/AbstractTodoCommentIncrementalAnalyzer.cs +++ b/src/EditorFeatures/Core/Implementation/TodoComment/AbstractTodoCommentIncrementalAnalyzer.cs @@ -95,7 +95,7 @@ public async Task AnalyzeSyntaxAsync(Document document, InvocationReasons reason private async Task> CreateItemsAsync(Document document, IList comments, CancellationToken cancellationToken) { - var items = ImmutableArray.CreateBuilder(); + var items = ArrayBuilder.GetInstance(); if (comments != null) { var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); @@ -107,7 +107,7 @@ private async Task> CreateItemsAsync(Document document, } } - return items.ToImmutable(); + return items.ToImmutableAndFree(); } private TodoItem CreateItem(Document document, SourceText text, SyntaxTree tree, TodoComment comment) diff --git a/src/EditorFeatures/Test/Structure/AbstractSyntaxNodeStructureProviderTests.cs b/src/EditorFeatures/Test/Structure/AbstractSyntaxNodeStructureProviderTests.cs index 5eb925ad4121368489d8aaa71c9e7f307d5d072b..b4b08c83aa548ec4854556b89f275953c479ee31 100644 --- a/src/EditorFeatures/Test/Structure/AbstractSyntaxNodeStructureProviderTests.cs +++ b/src/EditorFeatures/Test/Structure/AbstractSyntaxNodeStructureProviderTests.cs @@ -37,7 +37,7 @@ internal sealed override async Task GetBlockSpansAsync(Document doc } var outliner = CreateProvider(); - var actualRegions = ImmutableArray.CreateBuilder(); + var actualRegions = ArrayBuilder.GetInstance(); outliner.CollectBlockSpans(document, node, actualRegions, CancellationToken.None); // TODO: Determine why we get null outlining spans. diff --git a/src/EditorFeatures/Test/Structure/AbstractSyntaxTriviaStructureProviderTests.cs b/src/EditorFeatures/Test/Structure/AbstractSyntaxTriviaStructureProviderTests.cs index fe2794920eb429a211cdd2cbc3aca1c03e91acab..72415f9fae53cc97c2f7beeda82ebf95464e1d3f 100644 --- a/src/EditorFeatures/Test/Structure/AbstractSyntaxTriviaStructureProviderTests.cs +++ b/src/EditorFeatures/Test/Structure/AbstractSyntaxTriviaStructureProviderTests.cs @@ -19,7 +19,7 @@ internal sealed override async Task GetBlockSpansAsync(Document doc var trivia = root.FindTrivia(position, findInsideTrivia: true); var outliner = CreateProvider(); - var actualRegions = ImmutableArray.CreateBuilder(); + var actualRegions = ArrayBuilder.GetInstance(); outliner.CollectBlockSpans(document, trivia, actualRegions, CancellationToken.None); // TODO: Determine why we get null outlining spans. diff --git a/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs b/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs index 888f5ab04ecba83ee679d0d01957494d1432e257..85725bf85cf8b17b104196822ea0ee10d44cf45b 100644 --- a/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs +++ b/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs @@ -151,13 +151,13 @@ private static string GetCommentBannerText(SyntaxTrivia comment) internal static ImmutableArray CreateCommentBlockSpan( SyntaxTriviaList triviaList) { - var result = ImmutableArray.CreateBuilder(); + var result = ArrayBuilder.GetInstance(); CollectCommentBlockSpans(triviaList, result); - return result.ToImmutable(); + return result.ToImmutableAndFree(); } public static void CollectCommentBlockSpans( - SyntaxTriviaList triviaList, ImmutableArray.Builder spans) + SyntaxTriviaList triviaList, ArrayBuilder spans) { if (triviaList.Count > 0) { @@ -205,7 +205,7 @@ private static string GetCommentBannerText(SyntaxTrivia comment) } public static void CollectCommentBlockSpans( - SyntaxNode node, ImmutableArray.Builder spans) + SyntaxNode node, ArrayBuilder spans) { if (node == null) { diff --git a/src/Features/CSharp/Portable/Structure/Providers/AccessorDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/AccessorDeclarationStructureProvider.cs index 066741cbe823a43a087f0106e02a4c493361b0b6..d353f6f58f3111332478fba2889340a229dba508 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/AccessorDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/AccessorDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class AccessorDeclarationStructureProvider : AbstractSyntaxNodeStructur { protected override void CollectBlockSpans( AccessorDeclarationSyntax accessorDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(accessorDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/AnonymousMethodExpressionStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/AnonymousMethodExpressionStructureProvider.cs index 00a600268d0d5d67e552ff6ebf8d6dbfc439977f..64cdbe2448c09e73d19ea54b44d8179be1307199 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/AnonymousMethodExpressionStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/AnonymousMethodExpressionStructureProvider.cs @@ -11,7 +11,7 @@ internal class AnonymousMethodExpressionStructureProvider : AbstractSyntaxNodeSt { protected override void CollectBlockSpans( AnonymousMethodExpressionSyntax anonymousMethod, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { // fault tolerance diff --git a/src/Features/CSharp/Portable/Structure/Providers/CompilationUnitStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/CompilationUnitStructureProvider.cs index 8ef02d8a72b1d2f0815c159f518490454bb0c149..a3338ca7f0b896eae6eca2075609369ed0e4a8ea 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/CompilationUnitStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/CompilationUnitStructureProvider.cs @@ -12,7 +12,7 @@ internal class CompilationUnitStructureProvider : AbstractSyntaxNodeStructurePro { protected override void CollectBlockSpans( CompilationUnitSyntax compilationUnit, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(compilationUnit, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.cs index 478dbce7bf4aee4faa910e3aec417ee87e2e730e..0afb94f5724d97a87841757e87908e7438d55544 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class ConstructorDeclarationStructureProvider : AbstractSyntaxNodeStruc { protected override void CollectBlockSpans( ConstructorDeclarationSyntax constructorDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(constructorDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/ConversionOperatorDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/ConversionOperatorDeclarationStructureProvider.cs index 39903a474a5839b625e9fcc02942ed3798985435..34d335c3d65835b54cb40d6b4f005042eb71c0c7 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/ConversionOperatorDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/ConversionOperatorDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class ConversionOperatorDeclarationStructureProvider : AbstractSyntaxNo { protected override void CollectBlockSpans( ConversionOperatorDeclarationSyntax operatorDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(operatorDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/DelegateDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/DelegateDeclarationStructureProvider.cs index a5c2f8737936b23a598bbbc0c694b4b3421481c3..73560053edf40bb2f2f5e0008fda4f4a0647584d 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/DelegateDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/DelegateDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class DelegateDeclarationStructureProvider : AbstractSyntaxNodeStructur { protected override void CollectBlockSpans( DelegateDeclarationSyntax delegateDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(delegateDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/DestructorDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/DestructorDeclarationStructureProvider.cs index 10aae6d1ee5f9c8cdd42586bfd7314bca6568b01..ddb44372fff901b6318e8c14cd59ba814e78177b 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/DestructorDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/DestructorDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class DestructorDeclarationStructureProvider : AbstractSyntaxNodeStruct { protected override void CollectBlockSpans( DestructorDeclarationSyntax destructorDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(destructorDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs index ad7983af2794f318755daef4f07e48e04360807e..6c34b1067d0a8539789b2748106f26c3f186f175 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs @@ -12,13 +12,15 @@ internal class DisabledTextTriviaStructureProvider : AbstractSyntaxTriviaStructu public override void CollectBlockSpans( Document document, SyntaxTrivia trivia, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CollectBlockSpans(trivia.SyntaxTree, trivia, spans, cancellationToken); } - public void CollectBlockSpans(SyntaxTree syntaxTree, SyntaxTrivia trivia, ImmutableArray.Builder spans, CancellationToken cancellationToken) + public void CollectBlockSpans( + SyntaxTree syntaxTree, SyntaxTrivia trivia, + ArrayBuilder spans, CancellationToken cancellationToken) { // We'll always be leading trivia of some token. var startPos = trivia.FullSpan.Start; diff --git a/src/Features/CSharp/Portable/Structure/Providers/DocumentationCommentStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/DocumentationCommentStructureProvider.cs index b69fa6532609ef6c8e9a3ad014b402fc8bc1c0a0..7014573f5cc2cd369ab20f709ef48fe01a444baf 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/DocumentationCommentStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/DocumentationCommentStructureProvider.cs @@ -107,7 +107,7 @@ private static void AppendTextTokens(StringBuilder sb, SyntaxTokenList textToken protected override void CollectBlockSpans( DocumentationCommentTriviaSyntax documentationComment, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { var startPos = documentationComment.FullSpan.Start; diff --git a/src/Features/CSharp/Portable/Structure/Providers/EnumDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/EnumDeclarationStructureProvider.cs index d882c33e0f09a66667d16cd374a23e286240b007..3df45697d672851b07525b9bd0a7cbca78297965 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/EnumDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/EnumDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class EnumDeclarationStructureProvider : AbstractSyntaxNodeStructurePro { protected override void CollectBlockSpans( EnumDeclarationSyntax enumDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(enumDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/EventDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/EventDeclarationStructureProvider.cs index c192fef998c0b254c705e78a776d50f266fcf09b..df54395eb6e82b521e853dc789e7f685566f5a3b 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/EventDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/EventDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class EventDeclarationStructureProvider : AbstractSyntaxNodeStructurePr { protected override void CollectBlockSpans( EventDeclarationSyntax eventDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(eventDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/EventFieldDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/EventFieldDeclarationStructureProvider.cs index cbe3c67d7956a846038b91580e29c6631cbcdb1c..da652bcb34935423e0fd934a7cc5ffa6e4a18b97 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/EventFieldDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/EventFieldDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class EventFieldDeclarationStructureProvider : AbstractSyntaxNodeStruct { protected override void CollectBlockSpans( EventFieldDeclarationSyntax eventFieldDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(eventFieldDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/FieldDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/FieldDeclarationStructureProvider.cs index c50094e8c681f9e6d3e971990c8c0b7a798c7669..464d9a28d5cc50ae5b6889c8a9cec3686f278331 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/FieldDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/FieldDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class FieldDeclarationStructureProvider : AbstractSyntaxNodeStructurePr { protected override void CollectBlockSpans( FieldDeclarationSyntax fieldDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(fieldDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/IndexerDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/IndexerDeclarationStructureProvider.cs index c1f523c84109d31c7f6a11fd255e341fc22b8549..9bd2440540836e2953f74a86fb1e14b83c872d32 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/IndexerDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/IndexerDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class IndexerDeclarationStructureProvider : AbstractSyntaxNodeStructure { protected override void CollectBlockSpans( IndexerDeclarationSyntax indexerDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(indexerDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.cs index 691f135d0fac2a1b2ad26b9b389b21b7aca0635e..6113f57d2f9a0bff1ef0fa74f0ea33e02662e5bf 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.cs @@ -12,7 +12,7 @@ internal abstract class AbstractMetadataAsSourceStructureProvider : where TSyntaxNode : SyntaxNode { protected override void CollectBlockSpans( - TSyntaxNode node, ImmutableArray.Builder spans, CancellationToken cancellationToken) + TSyntaxNode node, ArrayBuilder spans, CancellationToken cancellationToken) { var startToken = node.GetFirstToken(); var endToken = GetEndToken(node); diff --git a/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/RegionDirectiveStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/RegionDirectiveStructureProvider.cs index a6bf471d19becd502cebe80ee1de190109af7ebd..2873cc94a2f6c7a4215e097754263f43022ed65b 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/RegionDirectiveStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/MetadataAsSource/RegionDirectiveStructureProvider.cs @@ -29,7 +29,7 @@ private static string GetBannerText(DirectiveTriviaSyntax simpleDirective) protected override void CollectBlockSpans( RegionDirectiveTriviaSyntax regionDirective, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { var match = regionDirective.GetMatchingDirective(cancellationToken); diff --git a/src/Features/CSharp/Portable/Structure/Providers/MethodDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/MethodDeclarationStructureProvider.cs index ce35647efdb98e4998bffd7b058e65904f1f2564..d2f20f913b95a2378951b5d62ae0291627d6a733 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/MethodDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/MethodDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class MethodDeclarationStructureProvider : AbstractSyntaxNodeStructureP { protected override void CollectBlockSpans( MethodDeclarationSyntax methodDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(methodDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.cs index 680fda98e534cf9fd5350a3002b3efd90593232d..b96c3ce7772f99dedd8205c708847402703c9f6d 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.cs @@ -12,7 +12,7 @@ internal class NamespaceDeclarationStructureProvider : AbstractSyntaxNodeStructu { protected override void CollectBlockSpans( NamespaceDeclarationSyntax namespaceDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { // add leading comments @@ -47,7 +47,8 @@ internal class NamespaceDeclarationStructureProvider : AbstractSyntaxNodeStructu // finally, add any leading comments before the end of the namespace block if (!namespaceDeclaration.CloseBraceToken.IsMissing) { - CSharpStructureHelpers.CollectCommentBlockSpans(namespaceDeclaration.CloseBraceToken.LeadingTrivia, spans); + CSharpStructureHelpers.CollectCommentBlockSpans( + namespaceDeclaration.CloseBraceToken.LeadingTrivia, spans); } } diff --git a/src/Features/CSharp/Portable/Structure/Providers/OperatorDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/OperatorDeclarationStructureProvider.cs index 399ecf3f7a733483703ce28b6e234b9f026613bc..2519f90d17d758dd88ecda08d0496bbfdc8acced 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/OperatorDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/OperatorDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class OperatorDeclarationStructureProvider : AbstractSyntaxNodeStructur { protected override void CollectBlockSpans( OperatorDeclarationSyntax operatorDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(operatorDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/ParenthesizedLambdaExpressionStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/ParenthesizedLambdaExpressionStructureProvider.cs index bafacec7435391733d7726f7baae72faf9ae9ca3..14db1c5e50e68bdcea1cc20def6bf8d9b76418c7 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/ParenthesizedLambdaExpressionStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/ParenthesizedLambdaExpressionStructureProvider.cs @@ -11,7 +11,7 @@ internal class ParenthesizedLambdaExpressionStructureProvider : AbstractSyntaxNo { protected override void CollectBlockSpans( ParenthesizedLambdaExpressionSyntax lambdaExpression, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { // fault tolerance diff --git a/src/Features/CSharp/Portable/Structure/Providers/PropertyDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/PropertyDeclarationStructureProvider.cs index f946c9fdda68a4bd15d8bee290b3f55b9efea75a..f5b1f0c20a65a8894842eb87d015d1321f4f4ac6 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/PropertyDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/PropertyDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class PropertyDeclarationStructureProvider : AbstractSyntaxNodeStructur { protected override void CollectBlockSpans( PropertyDeclarationSyntax propertyDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(propertyDeclaration, spans); diff --git a/src/Features/CSharp/Portable/Structure/Providers/RegionDirectiveStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/RegionDirectiveStructureProvider.cs index 35826e051227b0dd0e021feb43f4e8ea9d5940ee..c172efc9e24aac11a93e49af2523501bd9fa87c4 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/RegionDirectiveStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/RegionDirectiveStructureProvider.cs @@ -29,7 +29,7 @@ private static string GetBannerText(DirectiveTriviaSyntax simpleDirective) protected override void CollectBlockSpans( RegionDirectiveTriviaSyntax regionDirective, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { var match = regionDirective.GetMatchingDirective(cancellationToken); diff --git a/src/Features/CSharp/Portable/Structure/Providers/SimpleLambdaExpressionStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/SimpleLambdaExpressionStructureProvider.cs index c7a137d3cf0b622f4748197c80743c048d971721..48c55789ee66c61cd97e7aa51f5b71bf1b2a41f0 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/SimpleLambdaExpressionStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/SimpleLambdaExpressionStructureProvider.cs @@ -11,7 +11,7 @@ internal class SimpleLambdaExpressionStructureProvider : AbstractSyntaxNodeStruc { protected override void CollectBlockSpans( SimpleLambdaExpressionSyntax lambdaExpression, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { // fault tolerance diff --git a/src/Features/CSharp/Portable/Structure/Providers/TypeDeclarationStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/TypeDeclarationStructureProvider.cs index 627d4fe63eb0ab25e15fc64355b8bbee2179a66a..d1aeff07733cd737a20a23b57b5e84af3e14cb00 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/TypeDeclarationStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/TypeDeclarationStructureProvider.cs @@ -11,7 +11,7 @@ internal class TypeDeclarationStructureProvider : AbstractSyntaxNodeStructurePro { protected override void CollectBlockSpans( TypeDeclarationSyntax typeDeclaration, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { CSharpStructureHelpers.CollectCommentBlockSpans(typeDeclaration, spans); diff --git a/src/Features/Core/Portable/ChangeSignature/DelegateInvokeMethodReferenceFinder.cs b/src/Features/Core/Portable/ChangeSignature/DelegateInvokeMethodReferenceFinder.cs index 609d1b8978dd45ca2b743fafce139d5160201415..17415514446717a706092f740786b5c38ea38b19 100644 --- a/src/Features/Core/Portable/ChangeSignature/DelegateInvokeMethodReferenceFinder.cs +++ b/src/Features/Core/Portable/ChangeSignature/DelegateInvokeMethodReferenceFinder.cs @@ -31,13 +31,13 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.DelegateInvoke; } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { - var result = new List(); + var result = ImmutableArray.CreateBuilder(); var symbol = symbolAndProjectId.Symbol; var beginInvoke = symbol.ContainingType.GetMembers(WellKnownMemberNames.DelegateBeginInvokeName).FirstOrDefault(); @@ -57,19 +57,19 @@ protected override bool CanFind(IMethodSymbol symbol) } } - return result; + return result.ToImmutable(); } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) { - return Task.FromResult(project.Documents); + return Task.FromResult(project.Documents.ToImmutableArray()); } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( IMethodSymbol methodSymbol, Document document, CancellationToken cancellationToken) @@ -100,8 +100,10 @@ protected override bool CanFind(IMethodSymbol symbol) var invocations = nodes.Where(n => syntaxFactsService.IsInvocationExpression(n)) .Where(e => semanticModel.GetSymbolInfo(e, cancellationToken).Symbol.OriginalDefinition == methodSymbol); - return invocations.Concat(convertedAnonymousFunctions).Select( + var result = invocations.Concat(convertedAnonymousFunctions).Select( e => new ReferenceLocation(document, null, e.GetLocation(), isImplicit: false, isWrittenTo: false, candidateReason: CandidateReason.None)); + + return result.ToImmutableArray(); } } } diff --git a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.GlobalSuppressMessageFixAllCodeAction.cs b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.GlobalSuppressMessageFixAllCodeAction.cs index 5eb6e257a0aefc717deff98c313a1cfd04d26792..79a37d8535c2323bd0646fde8a69fe4e625e9258 100644 --- a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.GlobalSuppressMessageFixAllCodeAction.cs +++ b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.GlobalSuppressMessageFixAllCodeAction.cs @@ -189,7 +189,7 @@ private static void AddDiagnosticForSymbolIfNeeded(ISymbol targetSymbol, Diagnos private static ImmutableArray GetUniqueDiagnostics(List diagnostics) { var uniqueIds = new HashSet(); - var uniqueDiagnostics = ImmutableArray.CreateBuilder(); + var uniqueDiagnostics = ArrayBuilder.GetInstance(); foreach (var diagnostic in diagnostics) { if (uniqueIds.Add(diagnostic.Id)) @@ -198,7 +198,7 @@ private static ImmutableArray GetUniqueDiagnostics(List } } - return uniqueDiagnostics.ToImmutable(); + return uniqueDiagnostics.ToImmutableAndFree(); } } } diff --git a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.PragmaWarningBatchFixAllProvider.cs b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.PragmaWarningBatchFixAllProvider.cs index f806ed1a07158a8212f94d439ff5eb8370e3f0ba..cb740fc3f77dcf8a2c82e14e3f334de75e106be3 100644 --- a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.PragmaWarningBatchFixAllProvider.cs +++ b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.PragmaWarningBatchFixAllProvider.cs @@ -28,8 +28,8 @@ public PragmaWarningBatchFixAllProvider(AbstractSuppressionCodeFixProvider suppr Document document, ImmutableArray diagnostics, Action addFix, FixAllState fixAllState, CancellationToken cancellationToken) { - var pragmaActionsBuilder = ImmutableArray.CreateBuilder(); - var pragmaDiagnosticsBuilder = ImmutableArray.CreateBuilder(); + var pragmaActionsBuilder = ArrayBuilder.GetInstance(); + var pragmaDiagnosticsBuilder = ArrayBuilder.GetInstance(); foreach (var diagnostic in diagnostics.Where(d => d.Location.IsInSource && !d.IsSuppressed)) { @@ -54,7 +54,8 @@ public PragmaWarningBatchFixAllProvider(AbstractSuppressionCodeFixProvider suppr { var pragmaBatchFix = PragmaBatchFixHelpers.CreateBatchPragmaFix( _suppressionFixProvider, document, - pragmaActionsBuilder.ToImmutable(), pragmaDiagnosticsBuilder.ToImmutable(), + pragmaActionsBuilder.ToImmutableAndFree(), + pragmaDiagnosticsBuilder.ToImmutableAndFree(), fixAllState, cancellationToken); addFix(pragmaBatchFix); diff --git a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.RemoveSuppressionCodeAction.BatchFixer.cs b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.RemoveSuppressionCodeAction.BatchFixer.cs index 51ac9e6128739509ed597949a5965dbe22627b7c..318edced705a52058fe4a4af7dd216762c62df80 100644 --- a/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.RemoveSuppressionCodeAction.BatchFixer.cs +++ b/src/Features/Core/Portable/CodeFixes/Suppression/AbstractSuppressionCodeFixProvider.RemoveSuppressionCodeAction.BatchFixer.cs @@ -37,8 +37,9 @@ public BatchFixer(AbstractSuppressionCodeFixProvider suppressionFixProvider) FixAllState fixAllState, CancellationToken cancellationToken) { // Batch all the pragma remove suppression fixes by executing them sequentially for the document. - var pragmaActionsBuilder = ImmutableArray.CreateBuilder(); - var pragmaDiagnosticsBuilder = ImmutableArray.CreateBuilder(); + var pragmaActionsBuilder = ArrayBuilder.GetInstance(); + var pragmaDiagnosticsBuilder = ArrayBuilder.GetInstance(); + foreach (var diagnostic in diagnostics.Where(d => d.Location.IsInSource && d.IsSuppressed)) { var span = diagnostic.Location.SourceSpan; @@ -74,7 +75,8 @@ public BatchFixer(AbstractSuppressionCodeFixProvider suppressionFixProvider) { var pragmaBatchFix = PragmaBatchFixHelpers.CreateBatchPragmaFix( _suppressionFixProvider, document, - pragmaActionsBuilder.ToImmutable(), pragmaDiagnosticsBuilder.ToImmutable(), + pragmaActionsBuilder.ToImmutableAndFree(), + pragmaDiagnosticsBuilder.ToImmutableAndFree(), fixAllState, cancellationToken); addFix(pragmaBatchFix); @@ -158,14 +160,14 @@ public BatchFixer(AbstractSuppressionCodeFixProvider suppressionFixProvider) private static async Task> GetAttributeNodesToFixAsync(ImmutableArray attributeRemoveFixes, CancellationToken cancellationToken) { - var builder = ImmutableArray.CreateBuilder(attributeRemoveFixes.Length); + var builder = ArrayBuilder.GetInstance(attributeRemoveFixes.Length); foreach (var attributeRemoveFix in attributeRemoveFixes) { var attributeToRemove = await attributeRemoveFix.GetAttributeToRemoveAsync(cancellationToken).ConfigureAwait(false); builder.Add(attributeToRemove); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } } } diff --git a/src/Features/Core/Portable/CodeRefactorings/ConvertToInterpolatedString/AbstractConvertToInterpolatedStringRefactoringProvider.cs b/src/Features/Core/Portable/CodeRefactorings/ConvertToInterpolatedString/AbstractConvertToInterpolatedStringRefactoringProvider.cs index 199f1e6836c8a8fabd6ec7630aa442540c4baea6..5e552c788ac0dfff05616e7f4a5375a853734eb1 100644 --- a/src/Features/Core/Portable/CodeRefactorings/ConvertToInterpolatedString/AbstractConvertToInterpolatedStringRefactoringProvider.cs +++ b/src/Features/Core/Portable/CodeRefactorings/ConvertToInterpolatedString/AbstractConvertToInterpolatedStringRefactoringProvider.cs @@ -150,7 +150,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte SyntaxGenerator syntaxGenerator, ISyntaxFactsService syntaxFactsService) { - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); for (int i = 1; i < arguments.Count; i++) { var argumentExpression = syntaxFactsService.GetExpressionOfArgument(arguments[i]); @@ -166,7 +166,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte } } - var expandedArguments = builder.ToImmutable(); + var expandedArguments = builder.ToImmutableAndFree(); return expandedArguments; } diff --git a/src/Features/Core/Portable/Completion/CompletionService.cs b/src/Features/Core/Portable/Completion/CompletionService.cs index 1eb58e6164869a1e968d621a2b490ba57630a6d6..e5cb5d09c6452207ccef0670e375182d183ddf6a 100644 --- a/src/Features/Core/Portable/Completion/CompletionService.cs +++ b/src/Features/Core/Portable/Completion/CompletionService.cs @@ -142,7 +142,7 @@ public virtual TextSpan GetDefaultCompletionListSpan(SourceText text, int caretP { var helper = CompletionHelper.GetHelper(document); - var bestItems = ImmutableArray.CreateBuilder(); + var bestItems = ArrayBuilder.GetInstance(); foreach (var item in items) { if (bestItems.Count == 0) @@ -171,7 +171,7 @@ public virtual TextSpan GetDefaultCompletionListSpan(SourceText text, int caretP } } - return bestItems.ToImmutable(); + return bestItems.ToImmutableAndFree(); } } } \ No newline at end of file diff --git a/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs b/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs index aef0c31493ad69ae766a29c7e916aff3ae5e57e7..915e9c47ef38c7f9a5bdd64a70819cb523395d9e 100644 --- a/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs +++ b/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs @@ -28,8 +28,8 @@ internal class DefaultDefinitionsAndReferencesFactory : IDefinitionsAndReference public DefinitionsAndReferences CreateDefinitionsAndReferences( Solution solution, IEnumerable referencedSymbols) { - var definitions = ImmutableArray.CreateBuilder(); - var references = ImmutableArray.CreateBuilder(); + var definitions = ArrayBuilder.GetInstance(); + var references = ArrayBuilder.GetInstance(); var uniqueLocations = new HashSet(); @@ -42,7 +42,8 @@ internal class DefaultDefinitionsAndReferencesFactory : IDefinitionsAndReference solution, referencedSymbol, definitions, references, uniqueLocations); } - return new DefinitionsAndReferences(definitions.ToImmutable(), references.ToImmutable()); + return new DefinitionsAndReferences( + definitions.ToImmutableAndFree(), references.ToImmutableAndFree()); } /// @@ -83,8 +84,8 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol) private void ProcessReferencedSymbol( Solution solution, ReferencedSymbol referencedSymbol, - ImmutableArray.Builder definitions, - ImmutableArray.Builder references, + ArrayBuilder definitions, + ArrayBuilder references, HashSet uniqueSpans) { // See if this is a symbol we even want to present to the user. If not, @@ -122,7 +123,7 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol) private static void CreateReferences( ReferencedSymbol referencedSymbol, - ImmutableArray.Builder references, + ArrayBuilder references, DefinitionItem definitionItem, HashSet uniqueSpans) { @@ -155,7 +156,7 @@ internal static class DefinitionItemExtensions var displayIfNoReferences = definition.ShouldShowWithNoReferenceLocations( showMetadataSymbolsWithoutReferences: false); - var sourceLocations = ImmutableArray.CreateBuilder(); + var sourceLocations = ArrayBuilder.GetInstance(); // If it's a namespace, don't create any normal lcoation. Namespaces // come from many different sources, but we'll only show a single @@ -203,7 +204,7 @@ internal static class DefinitionItemExtensions } return DefinitionItem.Create( - tags, displayParts, sourceLocations.ToImmutable(), displayIfNoReferences); + tags, displayParts, sourceLocations.ToImmutableAndFree(), displayIfNoReferences); } public static SourceReferenceItem TryCreateSourceReferenceItem( diff --git a/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.DocCommentFormatter.cs b/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.DocCommentFormatter.cs index 796889ae5a5172d1b16b72a804a9a98b4796850e..e30afb565321ec828afc86e9a476e42364735bc6 100644 --- a/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.DocCommentFormatter.cs +++ b/src/Features/Core/Portable/MetadataAsSource/AbstractMetadataAsSourceService.DocCommentFormatter.cs @@ -24,7 +24,7 @@ internal class DocCommentFormatter internal static ImmutableArray Format(IDocumentationCommentFormattingService docCommentFormattingService, DocumentationComment docComment) { - var formattedCommentLinesBuilder = ImmutableArray.CreateBuilder(); + var formattedCommentLinesBuilder = ArrayBuilder.GetInstance(); var lineBuilder = new StringBuilder(); var formattedSummaryText = docCommentFormattingService.Format(docComment.SummaryText); @@ -149,12 +149,12 @@ internal static ImmutableArray Format(IDocumentationCommentFormattingSer formattedCommentLinesBuilder.RemoveAt(formattedCommentLinesBuilder.Count - 1); } - return formattedCommentLinesBuilder.ToImmutable(); + return formattedCommentLinesBuilder.ToImmutableAndFree(); } private static ImmutableArray CreateWrappedTextFromRawText(string rawText) { - var lines = ImmutableArray.CreateBuilder(); + var lines = ArrayBuilder.GetInstance(); // First split the string into constituent lines. var split = rawText.Split(new[] { "\r\n" }, System.StringSplitOptions.None); @@ -165,10 +165,11 @@ private static ImmutableArray CreateWrappedTextFromRawText(string rawTex SplitRawLineIntoFormattedLines(item, lines); } - return lines.ToImmutable(); + return lines.ToImmutableAndFree(); } - private static void SplitRawLineIntoFormattedLines(string line, ImmutableArray.Builder lines) + private static void SplitRawLineIntoFormattedLines( + string line, ArrayBuilder lines) { var indent = new StringBuilder().Append(' ', s_indentSize * 2).ToString(); diff --git a/src/Features/Core/Portable/Structure/Syntax/AbstractBlockStructureProvider.cs b/src/Features/Core/Portable/Structure/Syntax/AbstractBlockStructureProvider.cs index 912f9f54bc3e0f77101286099b753c32889403b8..239ccd80d435a18b592699953bfa638da73d7930 100644 --- a/src/Features/Core/Portable/Structure/Syntax/AbstractBlockStructureProvider.cs +++ b/src/Features/Core/Portable/Structure/Syntax/AbstractBlockStructureProvider.cs @@ -45,7 +45,7 @@ public override void ProvideBlockStructure(BlockStructureContext context) private void ProvideBlockStructureWorker( BlockStructureContext context, SyntaxNode syntaxRoot) { - var spans = ImmutableArray.CreateBuilder(); + var spans = ArrayBuilder.GetInstance(); BlockSpanCollector.CollectBlockSpans( context.Document, syntaxRoot, _nodeProviderMap, _triviaProviderMap, spans, context.CancellationToken); @@ -53,6 +53,8 @@ public override void ProvideBlockStructure(BlockStructureContext context) { context.AddBlockSpan(region); } + + spans.Free(); } /// diff --git a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxNodeStructureProvider.cs b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxNodeStructureProvider.cs index 3dc7ca6287bee235250688a1d67555452a4463cc..28f20577880c46654415c10b56c2c9f5cfec8256 100644 --- a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxNodeStructureProvider.cs +++ b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxNodeStructureProvider.cs @@ -12,7 +12,7 @@ internal abstract class AbstractSyntaxNodeStructureProvider : Abstr public override void CollectBlockSpans( Document document, SyntaxNode node, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { if (!SupportedInWorkspaceKind(document.Project.Solution.Workspace.Kind)) @@ -26,15 +26,15 @@ internal abstract class AbstractSyntaxNodeStructureProvider : Abstr public sealed override void CollectBlockSpans( Document document, SyntaxTrivia trivia, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { throw new NotSupportedException(); } private void CollectBlockSpans( - SyntaxNode node, - ImmutableArray.Builder spans, + SyntaxNode node, + ArrayBuilder spans, CancellationToken cancellationToken) { if (node is TSyntaxNode) @@ -50,6 +50,6 @@ protected virtual bool SupportedInWorkspaceKind(string kind) } protected abstract void CollectBlockSpans( - TSyntaxNode node, ImmutableArray.Builder spans, CancellationToken cancellationToken); + TSyntaxNode node, ArrayBuilder spans, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxStructureProvider.cs b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxStructureProvider.cs index d32f0acac147683713dd1508206bead1dc967053..33d19077ea305868697b55bea686ef38b598ee8b 100644 --- a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxStructureProvider.cs +++ b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxStructureProvider.cs @@ -10,13 +10,13 @@ internal abstract class AbstractSyntaxStructureProvider public abstract void CollectBlockSpans( Document document, SyntaxNode node, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken); public abstract void CollectBlockSpans( Document document, SyntaxTrivia trivia, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxTriviaStructureProvider.cs b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxTriviaStructureProvider.cs index c6ada6db956835e07cfb805778834a80b5d909df..949b1e13c92edd2370709fc7f3df3f9ae9e3dc4e 100644 --- a/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxTriviaStructureProvider.cs +++ b/src/Features/Core/Portable/Structure/Syntax/AbstractSyntaxTriviaStructureProvider.cs @@ -11,7 +11,7 @@ internal abstract class AbstractSyntaxTriviaStructureProvider : AbstractSyntaxSt public sealed override void CollectBlockSpans( Document document, SyntaxNode node, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { throw new NotSupportedException(); diff --git a/src/Features/Core/Portable/Structure/Syntax/BlockSpanCollector.cs b/src/Features/Core/Portable/Structure/Syntax/BlockSpanCollector.cs index 37c4d2840b5f1c8e8658f2f30025679ff99b96c2..fe4b8f2e4711a14b775b34272de289921221cd53 100644 --- a/src/Features/Core/Portable/Structure/Syntax/BlockSpanCollector.cs +++ b/src/Features/Core/Portable/Structure/Syntax/BlockSpanCollector.cs @@ -11,14 +11,14 @@ internal class BlockSpanCollector private readonly Document _document; private readonly ImmutableDictionary> _nodeProviderMap; private readonly ImmutableDictionary> _triviaProviderMap; - private readonly ImmutableArray.Builder _spans; + private readonly ArrayBuilder _spans; private readonly CancellationToken _cancellationToken; private BlockSpanCollector( Document document, ImmutableDictionary> nodeOutlinerMap, ImmutableDictionary> triviaOutlinerMap, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { _document = document; @@ -33,7 +33,7 @@ internal class BlockSpanCollector SyntaxNode syntaxRoot, ImmutableDictionary> nodeOutlinerMap, ImmutableDictionary> triviaOutlinerMap, - ImmutableArray.Builder spans, + ArrayBuilder spans, CancellationToken cancellationToken) { var collector = new BlockSpanCollector(document, nodeOutlinerMap, triviaOutlinerMap, spans, cancellationToken); diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb index c2976a246cdaca35bf4734364f49cf3aa1aba342..d8979270ec07ca51e4d96237bb255dcc1b89be19 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of AccessorStatementSyntax) Protected Overrides Sub CollectBlockSpans(accessorDeclaration As AccessorStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(accessorDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb index 412fb67b7cfe341eb58049e700750ec672c10fbf..16eae5f7624e990a65c41a731a161e2da5fe0650 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of CompilationUnitSyntax) Protected Overrides Sub CollectBlockSpans(compilationUnit As CompilationUnitSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) Dim regions As New List(Of BlockSpan) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb index f8c6025fafc654846e5b20e7ce1275e25973c2de..fd6093ec03bf0a8662d9ecd07f64180499a6a265 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of SubNewStatementSyntax) Protected Overrides Sub CollectBlockSpans(constructorDeclaration As SubNewStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) Dim regions As New List(Of BlockSpan) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DelegateDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DelegateDeclarationStructureProvider.vb index cf6d7beb35fbf3deae491c838e0449490c243af6..4cac16ad6d4a0f03db59ac1b25335a721205f1c9 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DelegateDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DelegateDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of DelegateStatementSyntax) Protected Overrides Sub CollectBlockSpans(delegateDeclaration As DelegateStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(delegateDeclaration, spans) End Sub diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb index e59a413d8fab2692ec6ae279df281ca0b7952bfb..acf6d8628a9e606f84e64b9e54a8000eb1473a04 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxTriviaStructureProvider Public Overrides Sub CollectBlockSpans(document As Document, trivia As SyntaxTrivia, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) If trivia.Kind = SyntaxKind.DisabledTextTrivia Then ' Don't include trailing line breaks in spanToCollapse diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb index 32e7e8f25551e6b9583f9db65ea206cecaad5de4..8bd9e5f6793d17e4c973d37ea7716ee0585dfe72 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb @@ -71,7 +71,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure End Sub Protected Overrides Sub CollectBlockSpans(documentationComment As DocumentationCommentTriviaSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) Dim firstCommentToken = documentationComment.ChildNodesAndTokens().FirstOrNullable() Dim lastCommentToken = documentationComment.ChildNodesAndTokens().LastOrNullable() diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb index 50d9c05b70d1aa571cb6fbe8b58b1de81eee49ad..c3543eddb427b80c87590a33d4ebe64ae654e433 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of EnumStatementSyntax) Protected Overrides Sub CollectBlockSpans(enumDeclaration As EnumStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(enumDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb index 4a0052d5a712d3b0f927e9954e563351694c785d..822fd7108103c1c86dc0dbc0bd7821c0eff442dd 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of EventStatementSyntax) Protected Overrides Sub CollectBlockSpans(eventDeclaration As EventStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(eventDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/ExternalMethodDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/ExternalMethodDeclarationStructureProvider.vb index f74d5278f11f367e9147fb3e5da401e53a1b3ebc..410e26e1cc579d5cd6184a3e71b00b6e76456d75 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/ExternalMethodDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/ExternalMethodDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of DeclareStatementSyntax) Protected Overrides Sub CollectBlockSpans(externalMethodDeclaration As DeclareStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(externalMethodDeclaration, spans) End Sub diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/FieldDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/FieldDeclarationStructureProvider.vb index 5d460545e758e61872dda800f1b1f54830fbe73f..a2d61fe9ca813762ebf4a70c2528a7741705a716 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/FieldDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/FieldDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of FieldDeclarationSyntax) Protected Overrides Sub CollectBlockSpans(fieldDeclaration As FieldDeclarationSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(fieldDeclaration, spans) End Sub diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.vb index 91cba6f184699dadbfefc5445c96ce765ce223bf..497dbf5d9f978de0d11d3dde3d36714dc159abc2 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/AbstractMetadataAsSourceStructureProvider.vb @@ -11,8 +11,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure.MetadataAsSource Inherits AbstractSyntaxNodeStructureProvider(Of TSyntaxNode) Protected Overrides Sub CollectBlockSpans(node As TSyntaxNode, - spans As ImmutableArray(Of BlockSpan).Builder, - cancellationToken As CancellationToken) + spans As ArrayBuilder(Of BlockSpan), + cancellationToken As CancellationToken) Dim startToken = node.GetFirstToken() Dim endToken = GetEndToken(node) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb index 10a446c674830752cfcb671d00b3966bc2bf40d9..c0a16620b1d6d6e60793067c78bd07574caf85e2 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb @@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure.MetadataAsSource End Function Protected Overrides Sub CollectBlockSpans(regionDirective As RegionDirectiveTriviaSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) Dim match = regionDirective.GetMatchingStartOrEndDirective(cancellationToken) If match IsNot Nothing Then diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb index 48bac9962ad089b26c2e244170d781a02cb64719..e631c24531e66f6bb9264da58d1e857308f54625 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of MethodStatementSyntax) Protected Overrides Sub CollectBlockSpans(methodDeclaration As MethodStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(methodDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb index ee1c270c4585966c860bb8badcdf63de55f01d89..6b3b273920f26ec1b44473c08cdd536f1f978f72 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of MultiLineLambdaExpressionSyntax) Protected Overrides Sub CollectBlockSpans(lambdaExpression As MultiLineLambdaExpressionSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) If Not lambdaExpression.EndSubOrFunctionStatement.IsMissing Then spans.Add(CreateRegionFromBlock( diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb index 70944d7e41400da79cbf0536af50ba2b597a7faf..912dd8c7f15ac284577308b3f72676dcdb5926fa 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of NamespaceStatementSyntax) Protected Overrides Sub CollectBlockSpans(namespaceDeclaration As NamespaceStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(namespaceDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb index ccd5d289175318aea1187e71d75460eb48e0361e..5add0e48a843c1ef900a750319af1743ddbdcb83 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of OperatorStatementSyntax) Protected Overrides Sub CollectBlockSpans(operatorDeclaration As OperatorStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(operatorDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb index 6a928fd0941f39d34dda789e37b37c1d3bac2cd6..bbb187564c3527920ac7ce649f0b04f2f1c56f77 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of PropertyStatementSyntax) Protected Overrides Sub CollectBlockSpans(propertyDeclaration As PropertyStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(propertyDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb index 054207c3f09dc8a12056d69ddfb3ec44b5fa6897..83bc3c1c55ccae5b77c941f7de62307e9716dedb 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb @@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure End Function Protected Overrides Sub CollectBlockSpans(regionDirective As RegionDirectiveTriviaSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) Dim matchingDirective = regionDirective.GetMatchingStartOrEndDirective(cancellationToken) If matchingDirective IsNot Nothing Then diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb index bbf6cfc98a93cc931cb484ca180689e799c75dfd..087360afaeb2e4062aa6d75696a4126ed331184b 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of TypeStatementSyntax) Protected Overrides Sub CollectBlockSpans(typeDeclaration As TypeStatementSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) CollectCommentsRegions(typeDeclaration, spans) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb index b938b5c0887dac750d43107b2f6b906449e94b87..0564d9070b92c317dd8cbe36ce42f30d1a8d5409 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb @@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure Inherits AbstractSyntaxNodeStructureProvider(Of XmlNodeSyntax) Protected Overrides Sub CollectBlockSpans(xmlExpression As XmlNodeSyntax, - spans As ImmutableArray(Of BlockSpan).Builder, + spans As ArrayBuilder(Of BlockSpan), cancellationToken As CancellationToken) ' If this XML expression is inside structured trivia (i.e. an XML doc comment), don't outline. If xmlExpression.HasAncestor(Of DocumentationCommentTriviaSyntax)() Then diff --git a/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb b/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb index 9ff6a571fe24a8c04c142e48692555fee8f78c1b..2526d3f8b13fc93019bddae332047bd898b80a5e 100644 --- a/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb +++ b/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb @@ -29,12 +29,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure ' For testing purposes Friend Function CreateCommentsRegions(triviaList As SyntaxTriviaList) As ImmutableArray(Of BlockSpan) - Dim spans = ImmutableArray.CreateBuilder(Of BlockSpan) + Dim spans = ArrayBuilder(Of BlockSpan).GetInstance() CollectCommentsRegions(triviaList, spans) - Return spans.ToImmutable() + Return spans.ToImmutableAndFree() End Function - Friend Sub CollectCommentsRegions(triviaList As SyntaxTriviaList, spans As ImmutableArray(Of BlockSpan).Builder) + Friend Sub CollectCommentsRegions(triviaList As SyntaxTriviaList, + spans As ArrayBuilder(Of BlockSpan)) If triviaList.Count > 0 Then Dim startComment As SyntaxTrivia? = Nothing Dim endComment As SyntaxTrivia? = Nothing @@ -64,7 +65,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure End Sub Friend Sub CollectCommentsRegions(node As SyntaxNode, - spans As ImmutableArray(Of BlockSpan).Builder) + spans As ArrayBuilder(Of BlockSpan)) If node Is Nothing Then Throw New ArgumentNullException(NameOf(node)) End If diff --git a/src/Scripting/Core/ScriptState.cs b/src/Scripting/Core/ScriptState.cs index aadd1762cafe7bd92ee44dcb739eeb1ccef14f1f..1bb125bfb1d3685d3b730ba8312bb6781e7d8655 100644 --- a/src/Scripting/Core/ScriptState.cs +++ b/src/Scripting/Core/ScriptState.cs @@ -88,7 +88,7 @@ public ScriptVariable GetVariable(string name) private ImmutableArray CreateVariables() { - var result = ImmutableArray.CreateBuilder(); + var result = ArrayBuilder.GetInstance(); var executionState = ExecutionState; @@ -108,7 +108,7 @@ private ImmutableArray CreateVariables() } } - return result.ToImmutable(); + return result.ToImmutableAndFree(); } private IReadOnlyDictionary GetVariableMap() diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs index 389e5747cf235ad39fa46668fc8d5e3bdf39b5df..d5aa59c6dcff462b3c2e152c2afbc7c4463e760e 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs @@ -305,7 +305,7 @@ protected ImmutableArray GetStrongNameKeyPaths() return ImmutableArray.Empty; } - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); if (this.ContainingDirectoryPathOpt != null) { builder.Add(this.ContainingDirectoryPathOpt); @@ -316,7 +316,7 @@ protected ImmutableArray GetStrongNameKeyPaths() builder.Add(Path.GetDirectoryName(outputPath)); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } public ImmutableArray GetCurrentProjectReferences() diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.RecoverableMetadataValueSource.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.RecoverableMetadataValueSource.cs index 09166878d71833b808823f319382f1a30129fcf3..3c3891d0d87a3cdb90541112f8ef02cd679b8ed8 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.RecoverableMetadataValueSource.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.RecoverableMetadataValueSource.cs @@ -47,14 +47,14 @@ public override AssemblyMetadata GetValue(CancellationToken cancellationToken) private AssemblyMetadata RecoverMetadata() { - var moduleBuilder = ImmutableArray.CreateBuilder(_storages.Count); + var moduleBuilder = ArrayBuilder.GetInstance(_storages.Count); foreach (var storage in _storages) { moduleBuilder.Add(GetModuleMetadata(storage)); } - var metadata = AssemblyMetadata.Create(moduleBuilder.ToImmutable()); + var metadata = AssemblyMetadata.Create(moduleBuilder.ToImmutableAndFree()); _weakValue.SetTarget(metadata); return metadata; diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.cs index e5feffc583368f3d5e21c93ea9f8d80fffe3c618..f8dd8f52e8fa37f24346d2f5c42e1dd5d63f990f 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MetadataReferences/VisualStudioMetadataReferenceManager.cs @@ -318,14 +318,13 @@ private bool TryGetFileMappingFromMetadataImporter(FileKey fileKey, out IMetaDat FileKey fileKey, ModuleMetadata manifestModule, List storages, Func, ModuleMetadata> moduleMetadataFactory) { - ImmutableArray.Builder moduleBuilder = null; + var moduleBuilder = ArrayBuilder.GetInstance(); string assemblyDir = null; foreach (string moduleName in manifestModule.GetModuleNames()) { - if (moduleBuilder == null) + if (moduleBuilder.Count == 0) { - moduleBuilder = ImmutableArray.CreateBuilder(); moduleBuilder.Add(manifestModule); assemblyDir = Path.GetDirectoryName(fileKey.FullPath); } @@ -336,8 +335,8 @@ private bool TryGetFileMappingFromMetadataImporter(FileKey fileKey, out IMetaDat moduleBuilder.Add(metadata); } - var modules = (moduleBuilder != null) ? moduleBuilder.ToImmutable() : ImmutableArray.Create(manifestModule); + var modules = moduleBuilder.ToImmutableAndFree(); return AssemblyMetadata.Create(modules); } } -} +} \ No newline at end of file diff --git a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Extensions.cs b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Extensions.cs index 426f00fa23299c7bacfddbf85a02d00a35f72927..cdf184317cb87d8f934a1fea9bd9ac0b4eedce02 100644 --- a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Extensions.cs +++ b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Extensions.cs @@ -19,24 +19,24 @@ internal static class Extensions { public static ImmutableArray ToImmutableArray(this IList list, Func selector) { - var builder = ImmutableArray.CreateBuilder(list.Count); + var builder = ArrayBuilder.GetInstance(list.Count); for (var i = 0; i < list.Count; i++) { builder.Add(selector(list[i])); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } public static ImmutableArray> MergeDuplicatesOrderedBy(this IEnumerable>> groupedItems, Func>, IEnumerable>> orderer) { - var builder = ImmutableArray.CreateBuilder>(); + var builder = ArrayBuilder>.GetInstance(); foreach (var item in orderer(groupedItems.Select(g => g.Deduplicate()))) { builder.Add(item); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } private static TableItem Deduplicate(this IList> duplicatedItems) diff --git a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioDiagnosticListSuppressionStateService.cs b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioDiagnosticListSuppressionStateService.cs index 5ba858e23f0e69bc2d82de94895b3592a249dcac..68fc69af92b91a5b95edf372e25139927e8461ac 100644 --- a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioDiagnosticListSuppressionStateService.cs +++ b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioDiagnosticListSuppressionStateService.cs @@ -215,7 +215,8 @@ private static AbstractTableEntriesSnapshot GetEntriesSnapshot(I /// public async Task> GetSelectedItemsAsync(bool isAddSuppression, CancellationToken cancellationToken) { - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); + Dictionary projectNameToProjectMapOpt = null; Dictionary> filePathToDocumentMapOpt = null; @@ -331,7 +332,7 @@ public async Task> GetSelectedItemsAsync(bool isA } } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } private static async Task> GetFilePathToDocumentMapAsync(Project project, CancellationToken cancellationToken) diff --git a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioSuppressionFixService.cs b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioSuppressionFixService.cs index 904701272dc40708df51f79193ae31f52ba38731..9d5fb53241badba7c931e6990f0c84692e9b9e91 100644 --- a/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioSuppressionFixService.cs +++ b/src/VisualStudio/Core/Def/Implementation/TableDataSource/Suppression/VisualStudioSuppressionFixService.cs @@ -128,7 +128,8 @@ public bool RemoveSuppressions(bool selectedErrorListEntriesOnly, IVsHierarchy p private async Task> GetAllBuildDiagnosticsAsync(Func shouldFixInProject, CancellationToken cancellationToken) { - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); + var buildDiagnostics = _buildErrorDiagnosticService.GetBuildErrors().Where(d => d.ProjectId != null && d.Severity != DiagnosticSeverity.Hidden); var solution = _workspace.CurrentSolution; foreach (var diagnosticsByProject in buildDiagnostics.GroupBy(d => d.ProjectId)) @@ -171,7 +172,7 @@ private async Task> GetAllBuildDiagnosticsAsync(F } } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } private static string GetFixTitle(bool isAddSuppression) diff --git a/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentTrackingService.cs b/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentTrackingService.cs index 459dba371ed4d874b62eb11ae8b90de715d1eda3..d391555f0f4df153c7c12fdbf2d18da64d6d7b0f 100644 --- a/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentTrackingService.cs +++ b/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentTrackingService.cs @@ -72,13 +72,13 @@ public ImmutableArray GetVisibleDocuments() return ImmutableArray.Create(); } - ImmutableArray.Builder ids = ImmutableArray.CreateBuilder(snapshot.Count); + var ids = ArrayBuilder.GetInstance(snapshot.Count); foreach (var frame in snapshot) { ids.Add(frame.Id); } - return ids.ToImmutable(); + return ids.ToImmutableAndFree(); } /// diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/CodeElementSnapshot.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/CodeElementSnapshot.cs index 804c790b8f0d9201975ffc93b53c1039a4b018ae..6b3c3a4e4c619863ce280590af6f613aecd41549 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/CodeElementSnapshot.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/CodeElementSnapshot.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Immutable; +using Microsoft.CodeAnalysis; using Microsoft.VisualStudio; using Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.Interop; @@ -14,7 +15,7 @@ internal class CodeElementSnapshot : Snapshot public CodeElementSnapshot(ICodeElements codeElements) { var count = codeElements.Count; - var elementsBuilder = ImmutableArray.CreateBuilder(count); + var elementsBuilder = ArrayBuilder.GetInstance(count); for (int i = 0; i < count; i++) { @@ -26,7 +27,7 @@ public CodeElementSnapshot(ICodeElements codeElements) } } - _elements = elementsBuilder.ToImmutable(); + _elements = elementsBuilder.ToImmutableAndFree(); } public CodeElementSnapshot(ImmutableArray elements) diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalMemberCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalMemberCollection.cs index 5aec5c55801b5a2057f8f1f55868c190219c9a68..0f37b792b67754d9c427a3268893039676269c76 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalMemberCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalMemberCollection.cs @@ -51,7 +51,7 @@ private ImmutableArray GetChildren() throw Exceptions.ThrowEFail(); } - var childrenBuilder = ImmutableArray.CreateBuilder(); + var childrenBuilder = ArrayBuilder.GetInstance(); foreach (var member in typeSymbol.GetMembers()) { @@ -66,7 +66,7 @@ private ImmutableArray GetChildren() childrenBuilder.Add(this.State.CodeModelService.CreateExternalCodeElement(this.State, _projectId, typeMember)); } - _children = childrenBuilder.ToImmutable(); + _children = childrenBuilder.ToImmutableAndFree(); } return _children; diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalNamespaceCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalNamespaceCollection.cs index 9bdea4ee314186a1feca4ac5ede7618287894508..2aefd759b6050c908283a09dc25d276bfd5646e9 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalNamespaceCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalNamespaceCollection.cs @@ -39,14 +39,14 @@ private ImmutableArray GetChildren() { if (_children == null) { - var childrenBuilder = ImmutableArray.CreateBuilder(); + var childrenBuilder = ArrayBuilder.GetInstance(); foreach (var child in ExternalNamespaceEnumerator.ChildrenOfNamespace(this.State, _projectId, _namespaceSymbolId)) { childrenBuilder.Add(child); } - _children = childrenBuilder.ToImmutable(); + _children = childrenBuilder.ToImmutableAndFree(); } return _children; diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalOverloadsCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalOverloadsCollection.cs index 0798d8894b998d140b5323ad878769e3b430d37b..d7c94f981b3680500be2862b8c492d7e2ceab7b7 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalOverloadsCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/ExternalOverloadsCollection.cs @@ -51,7 +51,7 @@ private ImmutableArray EnumerateOverloads() return ImmutableArray.Create((EnvDTE.CodeElement)Parent); } - var overloadsBuilder = ImmutableArray.CreateBuilder(); + var overloadsBuilder = ArrayBuilder.GetInstance(); foreach (var method in symbol.ContainingType.GetMembers(symbol.Name)) { if (method.Kind != SymbolKind.Method) @@ -66,7 +66,7 @@ private ImmutableArray EnumerateOverloads() } } - return overloadsBuilder.ToImmutable(); + return overloadsBuilder.ToImmutableAndFree(); } public override int Count diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/InheritsImplementsCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/InheritsImplementsCollection.cs index 789c3848d2118339348277cb0de7af63cdc062f5..19570b9535eba3a52409aa7c807af80b2f07e5d5 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/InheritsImplementsCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/InheritsImplementsCollection.cs @@ -56,11 +56,12 @@ internal override Snapshot CreateSnapshot() var node = LookupNode(); var parentElement = (AbstractCodeElement)this.Parent; - var nodesBuilder = ImmutableArray.CreateBuilder(); + var nodesBuilder = ArrayBuilder.GetInstance(); nodesBuilder.AddRange(CodeModelService.GetInheritsNodes(node)); nodesBuilder.AddRange(CodeModelService.GetImplementsNodes(node)); - return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, nodesBuilder.ToImmutable()); + return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, + nodesBuilder.ToImmutableAndFree()); } protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element) diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/NamespaceCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/NamespaceCollection.cs index 9f4bc426ac275f39e2c85e2fdbeff1c9e7276fe3..42e00be89a146463a5e0788e97ccf0b7c98bd184 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/NamespaceCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/NamespaceCollection.cs @@ -95,13 +95,14 @@ internal override Snapshot CreateSnapshot() ? (AbstractCodeElement)this.Parent : null; - var nodesBuilder = ImmutableArray.CreateBuilder(); + var nodesBuilder = ArrayBuilder.GetInstance(); nodesBuilder.AddRange(CodeModelService.GetOptionNodes(node)); nodesBuilder.AddRange(CodeModelService.GetImportNodes(node)); nodesBuilder.AddRange(CodeModelService.GetAttributeNodes(node)); nodesBuilder.AddRange(CodeModelService.GetLogicalSupportedMemberNodes(node)); - return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, nodesBuilder.ToImmutable()); + return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, + nodesBuilder.ToImmutableAndFree()); } protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element) diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/OverloadsCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/OverloadsCollection.cs index 6ce268b434b7f1894f55c718a69b1ef70bb1c881..568355a756b0b71aec479aaeee96c563ab97adf5 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/OverloadsCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/OverloadsCollection.cs @@ -55,7 +55,7 @@ private ImmutableArray GetOverloads() var solution = this.Workspace.CurrentSolution; - var overloadsBuilder = ImmutableArray.CreateBuilder(); + var overloadsBuilder = ArrayBuilder.GetInstance(); foreach (var method in symbol.ContainingType.GetMembers(symbol.Name)) { if (method.Kind != SymbolKind.Method) @@ -84,7 +84,7 @@ private ImmutableArray GetOverloads() } } - _overloads = overloadsBuilder.ToImmutable(); + _overloads = overloadsBuilder.ToImmutableAndFree(); } return _overloads; diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/PartialTypeCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/PartialTypeCollection.cs index 704a0fb4bf4eccb8645957e1e43ac1317d18f3cb..c5bb88343439d22ed1c5d80679540ab03c3307d8 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/PartialTypeCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/PartialTypeCollection.cs @@ -3,6 +3,7 @@ using System.Collections.Immutable; using System.Linq; using System.Runtime.InteropServices; +using Microsoft.CodeAnalysis; using Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.InternalElements; using Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.Interop; using Microsoft.VisualStudio.LanguageServices.Implementation.Interop; @@ -43,7 +44,7 @@ private ImmutableArray GetParts() // property is accessed on CodeClass, CodeStruct or CodeInterface, consumers would hit this behavior rarely. if (_parts == null) { - var partsBuilder = ImmutableArray.CreateBuilder(); + var partsBuilder = ArrayBuilder.GetInstance(); var solution = this.Workspace.CurrentSolution; var symbol = ParentType.LookupSymbol(); @@ -67,7 +68,7 @@ private ImmutableArray GetParts() } } - _parts = partsBuilder.ToImmutable(); + _parts = partsBuilder.ToImmutableAndFree(); } return _parts; diff --git a/src/VisualStudio/Core/Impl/CodeModel/Collections/TypeCollection.cs b/src/VisualStudio/Core/Impl/CodeModel/Collections/TypeCollection.cs index 40b48106d1bac9f67844127847e5751fc94a1127..d71b54768c5783c5b27c3735103a080ca4396124 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/Collections/TypeCollection.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/Collections/TypeCollection.cs @@ -57,10 +57,11 @@ internal override Snapshot CreateSnapshot() var node = LookupNode(); var parentElement = (AbstractCodeElement)this.Parent; - var nodesBuilder = ImmutableArray.CreateBuilder(); + var nodesBuilder = ArrayBuilder.GetInstance(); nodesBuilder.AddRange(CodeModelService.GetLogicalSupportedMemberNodes(node)); - return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, nodesBuilder.ToImmutable()); + return new NodeSnapshot(this.State, _fileCodeModel, node, parentElement, + nodesBuilder.ToImmutableAndFree()); } protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element) diff --git a/src/VisualStudio/Core/Impl/CodeModel/ExternalElements/AbstractExternalCodeType.cs b/src/VisualStudio/Core/Impl/CodeModel/ExternalElements/AbstractExternalCodeType.cs index 4f59a796e51ca76ba924f85bd00fd2d733bf9cfa..29e2a697bb4d49870266276aec4282aca1da088b 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/ExternalElements/AbstractExternalCodeType.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/ExternalElements/AbstractExternalCodeType.cs @@ -55,7 +55,7 @@ public EnvDTE.CodeElements Bases { get { - var builder = ImmutableArray.CreateBuilder(); + var builder = ArrayBuilder.GetInstance(); var typeSymbol = TypeSymbol; if (typeSymbol.TypeKind == TypeKind.Interface) @@ -67,7 +67,8 @@ public EnvDTE.CodeElements Bases builder.Add(typeSymbol.BaseType); } - return ExternalTypeCollection.Create(this.State, this, this.ProjectId, builder.ToImmutable()); + return ExternalTypeCollection.Create(this.State, this, this.ProjectId, + builder.ToImmutableAndFree()); } } diff --git a/src/VisualStudio/Core/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs b/src/VisualStudio/Core/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs index 012b36d18eda79cd5234d63ac351123b2d69ce4a..a61e3812dd92b1996ffa13dfb8d5da815d7cc675 100644 --- a/src/VisualStudio/Core/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs +++ b/src/VisualStudio/Core/Next/FindReferences/StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs @@ -426,7 +426,7 @@ private void Order(List syntaxSpans) // Take all the syntax parts. However, if any have been overridden by a // semantic part, then choose that one. - var finalParts = ImmutableArray.CreateBuilder(); + var finalParts = ArrayBuilder.GetInstance(); var lastReplacementIndex = 0; for (int i = 0, n = syntaxParts.Count; i < n; i++) { @@ -453,7 +453,7 @@ private void Order(List syntaxSpans) } } - return finalParts.ToImmutable(); + return finalParts.ToImmutableAndFree(); } private bool IsClassifiedAsText(ClassifiedSpan partAndSpan) diff --git a/src/VisualStudio/Core/SolutionExplorerShim/AnalyzerItem/AnalyzerItemSource.cs b/src/VisualStudio/Core/SolutionExplorerShim/AnalyzerItem/AnalyzerItemSource.cs index ca3e697d1a4a48b5aba91f5ee11390741b4b92e5..8d78309743ced0e84cdba9eb2c6be4a3776ac964 100644 --- a/src/VisualStudio/Core/SolutionExplorerShim/AnalyzerItem/AnalyzerItemSource.cs +++ b/src/VisualStudio/Core/SolutionExplorerShim/AnalyzerItem/AnalyzerItemSource.cs @@ -201,7 +201,7 @@ private ImmutableArray GetFilteredAnalyzers(IEnumerable(); + var builder = ArrayBuilder.GetInstance(); foreach (var analyzerReference in analyzerReferences) { // Analyzer dependency: @@ -220,7 +220,7 @@ private ImmutableArray GetFilteredAnalyzers(IEnumerable GetInheritanceNames(BaseListSyntax baseList) return ImmutableArray.Empty; } - var builder = ImmutableArray.CreateBuilder(baseList.Types.Count); + var builder = ArrayBuilder.GetInstance(baseList.Types.Count); // It's not sufficient to just store the textual names we see in the inheritance list // of a type. For example if we have: @@ -937,7 +937,7 @@ private ImmutableArray GetInheritanceNames(BaseListSyntax baseList) AddInheritanceName(builder, baseType.Type, aliasMaps); } - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } finally { @@ -988,7 +988,7 @@ private void ProcessUsings(List> aliasMaps, SyntaxLis } private void AddInheritanceName( - ImmutableArray.Builder builder, TypeSyntax type, + ArrayBuilder builder, TypeSyntax type, List> aliasMaps) { var name = GetTypeName(type); diff --git a/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/FixAllState.FixMultipleDiagnosticProvider.cs b/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/FixAllState.FixMultipleDiagnosticProvider.cs index fcd7d8f66086030f3e8f1adc6e9f12812774675e..03c7341693792a439e5b95be7d25df145c200a79 100644 --- a/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/FixAllState.FixMultipleDiagnosticProvider.cs +++ b/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/FixAllState.FixMultipleDiagnosticProvider.cs @@ -46,7 +46,7 @@ public FixMultipleDiagnosticProvider(ImmutableDictionary> GetAllDiagnosticsAsync(Project project, CancellationToken cancellationToken) { - ImmutableArray.Builder allDiagnosticsBuilder = null; + var allDiagnosticsBuilder = ArrayBuilder.GetInstance(); ImmutableArray diagnostics; if (!_documentDiagnosticsMap.IsEmpty) { @@ -54,7 +54,6 @@ public override Task> GetAllDiagnosticsAsync(Project pro { if (_documentDiagnosticsMap.TryGetValue(document, out diagnostics)) { - allDiagnosticsBuilder = allDiagnosticsBuilder ?? ImmutableArray.CreateBuilder(diagnostics.Length); allDiagnosticsBuilder.AddRange(diagnostics); } } @@ -62,12 +61,10 @@ public override Task> GetAllDiagnosticsAsync(Project pro if (_projectDiagnosticsMap.TryGetValue(project, out diagnostics)) { - allDiagnosticsBuilder = allDiagnosticsBuilder ?? ImmutableArray.CreateBuilder(diagnostics.Length); allDiagnosticsBuilder.AddRange(diagnostics); } - IEnumerable allDiagnostics = allDiagnosticsBuilder != null ? allDiagnosticsBuilder.ToImmutable() : ImmutableArray.Empty; - return Task.FromResult(allDiagnostics); + return Task.FromResult>(allDiagnosticsBuilder.ToImmutableAndFree()); } public override Task> GetDocumentDiagnosticsAsync(Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/Execution/Asset.cs b/src/Workspaces/Core/Portable/Execution/Asset.cs index 3b43b8df6532f56d7da2d47d667f6c31b309f6a5..a4126768848242fc538bc6661416ec28a0d29f28 100644 --- a/src/Workspaces/Core/Portable/Execution/Asset.cs +++ b/src/Workspaces/Core/Portable/Execution/Asset.cs @@ -18,11 +18,29 @@ namespace Microsoft.CodeAnalysis.Execution /// internal abstract class Asset : ChecksumObject { + public static readonly Asset Null = new NullAsset(); + public Asset(Checksum checksum, string kind) : base(checksum, kind) { // TODO: find out a way to reduce number of asset implementations. // tried once but couldn't figure out } + + /// + /// null asset indicating things that doesn't actually exist + /// + private sealed class NullAsset : Asset + { + public NullAsset() : + base(Checksum.Null, WellKnownChecksumObjects.Null) + { + } + + public override Task WriteObjectToAsync(ObjectWriter writer, CancellationToken cancellationToken) + { + return SpecializedTasks.EmptyTask; + } + } } /// diff --git a/src/Workspaces/Core/Portable/Execution/Checksum.cs b/src/Workspaces/Core/Portable/Execution/Checksum.cs index 09fc0c7c447ea2ff3e15ad4a40968ede8156a2df..592b18783decd0e3382b3bef7ce966bc4e4cf760 100644 --- a/src/Workspaces/Core/Portable/Execution/Checksum.cs +++ b/src/Workspaces/Core/Portable/Execution/Checksum.cs @@ -14,6 +14,8 @@ namespace Microsoft.CodeAnalysis.Execution /// internal sealed partial class Checksum : IObjectWritable, IEquatable { + public static readonly Checksum Null = new Checksum(ImmutableArray.Empty); + private readonly ImmutableArray _checkSum; private int _lazyHash; diff --git a/src/Workspaces/Core/Portable/Execution/ChecksumObject.cs b/src/Workspaces/Core/Portable/Execution/ChecksumObject.cs index 70a452ce010f8741237f2d8a82ca99bee4fc68c7..96854d413df1f3ad8a9e55be6f31fcd8730c8b58 100644 --- a/src/Workspaces/Core/Portable/Execution/ChecksumObject.cs +++ b/src/Workspaces/Core/Portable/Execution/ChecksumObject.cs @@ -73,6 +73,8 @@ private static Checksum CreateChecksum(string kind, object[] children) // TODO: Kind might not actually needed. see whether we can get rid of this internal static class WellKnownChecksumObjects { + public const string Null = nameof(Null); + public const string Projects = nameof(Projects); public const string Documents = nameof(Documents); public const string TextDocuments = nameof(TextDocuments); diff --git a/src/Workspaces/Core/Portable/Execution/ChecksumTreeBuilder.cs b/src/Workspaces/Core/Portable/Execution/ChecksumTreeBuilder.cs index 31c8f1786bae8ae43cee452e0fa4f1aecdc9d959..4d5128cab754332f5b0bea6137de1275d98de651 100644 --- a/src/Workspaces/Core/Portable/Execution/ChecksumTreeBuilder.cs +++ b/src/Workspaces/Core/Portable/Execution/ChecksumTreeBuilder.cs @@ -89,8 +89,12 @@ private async Task CreateProjectChecksumObjectAsync(Proje var additionalDocuments = await subSnapshotBuilder.BuildAsync(projectState.AdditionalDocumentStates, projectState.AdditionalDocumentIds.Select(id => projectState.AdditionalDocumentStates[id]), WellKnownChecksumObjects.TextDocuments, cancellationToken).ConfigureAwait(false); var subAssetBuilder = new AssetBuilder(subTreeNode); - var compilationOptions = subAssetBuilder.Build(projectState, projectState.CompilationOptions, cancellationToken); - var parseOptions = subAssetBuilder.Build(projectState, projectState.ParseOptions, cancellationToken); + + // set Asset.Null if this particular project doesn't support compiler options. + // this one is really bit wierd since project state has both compilation/parse options but only has support compilation. + // for now, we use support compilation for both options + var compilationOptions = projectState.SupportsCompilation ? subAssetBuilder.Build(projectState, projectState.CompilationOptions, cancellationToken) : Asset.Null; + var parseOptions = projectState.SupportsCompilation ? subAssetBuilder.Build(projectState, projectState.ParseOptions, cancellationToken) : Asset.Null; return new ProjectChecksumObject( _serializer, info.Checksum, compilationOptions.Checksum, parseOptions.Checksum, diff --git a/src/Workspaces/Core/Portable/Execution/ChecksumTreeCollection.cs b/src/Workspaces/Core/Portable/Execution/ChecksumTreeCollection.cs index 95ad279e0dfb07f615a267e4c9cb0f610b02318f..fbb9775ba96ecb02ad31fb6cc770e48a15f05f93 100644 --- a/src/Workspaces/Core/Portable/Execution/ChecksumTreeCollection.cs +++ b/src/Workspaces/Core/Portable/Execution/ChecksumTreeCollection.cs @@ -73,6 +73,12 @@ public IRootChecksumTreeNode CreateRootTreeNode(SolutionState solutionState) public ChecksumObject GetChecksumObject(Checksum checksum, CancellationToken cancellationToken) { + if (checksum == Checksum.Null) + { + // check nil case + return Asset.Null; + } + // search snapshots we have foreach (var kv in _rootTreeNodes) { @@ -105,7 +111,13 @@ public ChecksumObject GetChecksumObject(Checksum checksum, CancellationToken can using (var searchingChecksumsLeft = Creator.CreateChecksumSet(checksums)) { var numberOfChecksumsToSearch = searchingChecksumsLeft.Object.Count; - var result = new Dictionary(); + var result = new Dictionary(numberOfChecksumsToSearch); + + // check nil case + if (searchingChecksumsLeft.Object.Remove(Checksum.Null)) + { + result[Checksum.Null] = Asset.Null; + } // search checksum trees we have foreach (var kv in _rootTreeNodes) diff --git a/src/Workspaces/Core/Portable/Execution/Serializer.cs b/src/Workspaces/Core/Portable/Execution/Serializer.cs index eb6a881b04dfe32c02a38d72e35bf2849aa919d5..6b602a9bef6fedcc6ce2c7fb2307eec2dec29f19 100644 --- a/src/Workspaces/Core/Portable/Execution/Serializer.cs +++ b/src/Workspaces/Core/Portable/Execution/Serializer.cs @@ -43,6 +43,9 @@ public T Deserialize(string kind, ObjectReader reader, CancellationToken canc switch (kind) { + case WellKnownChecksumObjects.Null: + return default(T); + case SolutionChecksumObject.Name: return (T)(object)DeserializeChecksumObjectWithChildren(reader, cancellationToken); case ProjectChecksumObject.Name: diff --git a/src/Workspaces/Core/Portable/FindSymbols/Extensions.cs b/src/Workspaces/Core/Portable/FindSymbols/Extensions.cs index c8fa1b9275224db9edbb79eaea53d25aaca16c5c..5c5b645a95f7a02f2c1489dcbefed09391be1703 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/Extensions.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/Extensions.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.LanguageServices; @@ -33,14 +34,14 @@ public static async Task> GetConstructorInitializerToke return FindReferenceCache.GetConstructorInitializerTokens(syntaxFacts, model, root, cancellationToken); } - internal static async Task> GetIdentifierOrGlobalNamespaceTokensWithTextAsync( + internal static async Task> GetIdentifierOrGlobalNamespaceTokensWithTextAsync( this Document document, string identifier, CancellationToken cancellationToken) { // model should exist already SemanticModel model; if (!document.TryGetSemanticModel(out model)) { - return Contract.FailWithReturn>("we should never reach here"); + return Contract.FailWithReturn>("we should never reach here"); } // It's very costly to walk an entire tree. So if the tree is simple and doesn't contain @@ -48,13 +49,13 @@ public static async Task> GetConstructorInitializerToke var info = await SyntaxTreeInfo.GetIdentifierInfoAsync(document, cancellationToken).ConfigureAwait(false); if (!info.ProbablyContainsIdentifier(identifier)) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } var syntaxFacts = document.GetLanguageService(); if (syntaxFacts == null) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferenceCache.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferenceCache.cs index 040e18a7b6c8559f866bd6c349d3067c8cc7b291..c76a6b4dc48058f4c8f59a135ded17d1e20bb3d1 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferenceCache.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferenceCache.cs @@ -58,7 +58,7 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can return null; } - public static IEnumerable GetIdentifierOrGlobalNamespaceTokensWithText( + public static ImmutableArray GetIdentifierOrGlobalNamespaceTokensWithText( ISyntaxFactsService syntaxFacts, Document document, VersionStamp version, SemanticModel model, SyntaxNode root, SourceText sourceText, string text, CancellationToken cancellationToken) { @@ -70,10 +70,12 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can return GetIdentifierOrGlobalNamespaceTokensWithText(syntaxFacts, document, version, root, sourceText, normalized, cancellationToken); } - return entry.IdentifierCache.GetOrAdd(normalized, key => GetIdentifierOrGlobalNamespaceTokensWithText(syntaxFacts, document, version, root, sourceText, key, cancellationToken)); + return entry.IdentifierCache.GetOrAdd(normalized, + key => GetIdentifierOrGlobalNamespaceTokensWithText( + syntaxFacts, document, version, root, sourceText, key, cancellationToken)); } - private static IList GetIdentifierOrGlobalNamespaceTokensWithText( + private static ImmutableArray GetIdentifierOrGlobalNamespaceTokensWithText( ISyntaxFactsService syntaxFacts, Document document, VersionStamp version, SyntaxNode root, SourceText sourceText, string text, CancellationToken cancellationToken) { @@ -87,10 +89,10 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can } // identifier is escaped - return root.DescendantTokens(descendIntoTrivia: true).Where(candidate).ToList(); + return root.DescendantTokens(descendIntoTrivia: true).Where(candidate).ToImmutableArray(); } - private static IList GetTokensFromText( + private static ImmutableArray GetTokensFromText( ISyntaxFactsService syntaxFacts, Document document, VersionStamp version, SyntaxNode root, SourceText content, string text, Func candidate, CancellationToken cancellationToken) { @@ -100,19 +102,20 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can { if (SyntaxTreeIdentifierInfo.TryGetIdentifierLocations(document, version, text, positions.Object, cancellationToken)) { - return GetTokensFromText(root, positions.Object, text, candidate, cancellationToken).ToList(); + return GetTokensFromText(root, positions.Object, text, candidate, cancellationToken); } } - return GetTokensFromText(syntaxFacts, root, content, text, candidate, cancellationToken).ToList(); + return GetTokensFromText(syntaxFacts, root, content, text, candidate, cancellationToken); } - return SpecializedCollections.EmptyList(); + return ImmutableArray.Empty; } - private static IEnumerable GetTokensFromText( + private static ImmutableArray GetTokensFromText( SyntaxNode root, List positions, string text, Func candidate, CancellationToken cancellationToken) { + var result = ImmutableArray.CreateBuilder(); foreach (var index in positions) { cancellationToken.ThrowIfCancellationRequested(); @@ -122,14 +125,18 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can var span = token.Span; if (!token.IsMissing && span.Start == index && span.Length == text.Length && candidate(token)) { - yield return token; + result.Add(token); } } + + return result.ToImmutable(); } - private static IEnumerable GetTokensFromText( + private static ImmutableArray GetTokensFromText( ISyntaxFactsService syntaxFacts, SyntaxNode root, SourceText content, string text, Func candidate, CancellationToken cancellationToken) { + var result = ImmutableArray.CreateBuilder(); + var index = 0; while ((index = content.IndexOf(text, index, syntaxFacts.IsCaseSensitive)) >= 0) { @@ -141,12 +148,14 @@ public static SymbolInfo GetSymbolInfo(SemanticModel model, SyntaxNode node, Can var span = token.Span; if (!token.IsMissing && span.Start == index && span.Length == text.Length && candidate(token)) { - yield return token; + result.Add(token); } nextIndex = Math.Max(nextIndex, token.SpanStart); index = nextIndex; } + + return result.ToImmutable(); } public static IEnumerable GetConstructorInitializerTokens( @@ -256,7 +265,7 @@ private class Entry public ImmutableHashSet AliasNameSet; public List ConstructorInitializerCache; - public readonly ConcurrentDictionary> IdentifierCache = new ConcurrentDictionary>(); + public readonly ConcurrentDictionary> IdentifierCache = new ConcurrentDictionary>(); public readonly ConcurrentDictionary SymbolInfoCache = new ConcurrentDictionary(); } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_DocumentProcessing.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_DocumentProcessing.cs index 9a2ae38b2a421c32d4e87302bfda9c563412ceb6..c74e4325f9fb59cf9372b308d0f770981186ca74 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_DocumentProcessing.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_DocumentProcessing.cs @@ -70,7 +70,7 @@ internal partial class FindReferencesSearchEngine { try { - var references = await finder.FindReferencesInDocumentAsync(symbolAndProjectId, document, _cancellationToken).ConfigureAwait(false) ?? SpecializedCollections.EmptyEnumerable(); + var references = await finder.FindReferencesInDocumentAsync(symbolAndProjectId, document, _cancellationToken).ConfigureAwait(false); foreach (var location in references) { await HandleLocationAsync(symbolAndProjectId, location).ConfigureAwait(false); diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_MapCreation.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_MapCreation.cs index 7065932129f513ca2a67fb3479e79c454d52b90c..4c174668a384c56841350a4bd3be539721120507 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_MapCreation.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/FindReferencesSearchEngine_MapCreation.cs @@ -63,7 +63,7 @@ internal partial class FindReferencesSearchEngine var symbol = symbolAndProjectId.Symbol; var finder = symbolAndFinder.Item2; - var documents = await finder.DetermineDocumentsToSearchAsync(symbol, project, _documents, _cancellationToken).ConfigureAwait(false) ?? SpecializedCollections.EmptyEnumerable(); + var documents = await finder.DetermineDocumentsToSearchAsync(symbol, project, _documents, _cancellationToken).ConfigureAwait(false); foreach (var document in documents.Distinct().WhereNotNull()) { if (_documents == null || _documents.Contains(document)) @@ -114,7 +114,7 @@ internal partial class FindReferencesSearchEngine { _cancellationToken.ThrowIfCancellationRequested(); - var projects = await f.DetermineProjectsToSearchAsync(s.Symbol, _solution, scope, _cancellationToken).ConfigureAwait(false) ?? SpecializedCollections.EmptyEnumerable(); + var projects = await f.DetermineProjectsToSearchAsync(s.Symbol, _solution, scope, _cancellationToken).ConfigureAwait(false); foreach (var project in projects.Distinct().WhereNotNull()) { if (scope == null || scope.Contains(project)) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMemberScopedReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMemberScopedReferenceFinder.cs index 90231972128865acaef5c7fbbfa42118d56f54f8..66ae2677a0d4379c8a59f89b8f32b4584b03db91 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMemberScopedReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMemberScopedReferenceFinder.cs @@ -20,7 +20,7 @@ protected sealed override bool CanFind(TSymbol symbol) return true; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( TSymbol symbol, Project project, IImmutableSet documents, @@ -29,24 +29,24 @@ protected sealed override bool CanFind(TSymbol symbol) var location = symbol.Locations.FirstOrDefault(); if (location == null || !location.IsInSource) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } var document = project.GetDocument(location.SourceTree); if (document == null) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } if (documents != null && !documents.Contains(document)) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - return Task.FromResult(SpecializedCollections.SingletonEnumerable(document)); + return Task.FromResult(ImmutableArray.Create(document)); } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( TSymbol symbol, Document document, CancellationToken cancellationToken) @@ -64,10 +64,11 @@ protected sealed override bool CanFind(TSymbol symbol) var root = await syntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var tokens = root.DescendantTokens(); - return await FindReferencesInTokensWithSymbolNameAsync(symbol, document, tokens, cancellationToken).ConfigureAwait(false); + return await FindReferencesInTokensWithSymbolNameAsync( + symbol, document, tokens, cancellationToken).ConfigureAwait(false); } - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } private static ISymbol GetContainer(ISymbol symbol) @@ -89,7 +90,7 @@ private static ISymbol GetContainer(ISymbol symbol) return null; } - protected Task> FindReferencesInTokensWithSymbolNameAsync( + protected Task> FindReferencesInTokensWithSymbolNameAsync( TSymbol symbol, Document document, IEnumerable tokens, @@ -108,7 +109,7 @@ private static ISymbol GetContainer(ISymbol symbol) cancellationToken); } - private Task> FindReferencesInContainerAsync( + private Task> FindReferencesInContainerAsync( TSymbol symbol, ISymbol container, Document document, diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMethodOrPropertyOrEventSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMethodOrPropertyOrEventSymbolReferenceFinder.cs index cd580e4cf6fe386f3bc440981ac7d79c4e2ec8be..1fd025efff44066566e13e14a0237177c11b0819 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMethodOrPropertyOrEventSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractMethodOrPropertyOrEventSymbolReferenceFinder.cs @@ -17,7 +17,7 @@ protected AbstractMethodOrPropertyOrEventSymbolReferenceFinder() { } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -37,23 +37,28 @@ protected AbstractMethodOrPropertyOrEventSymbolReferenceFinder() { // We have a normal method. Find any interface methods that it implicitly or // explicitly implements and cascade down to those. - var interfaceMembersImplemented = await SymbolFinder.FindImplementedInterfaceMembersAsync( + var interfaceMembersImplementedStream = await SymbolFinder.FindImplementedInterfaceMembersAsync( symbolAndProjectId, solution, projects, cancellationToken).ConfigureAwait(false); + var interfaceMembersImplemented = interfaceMembersImplementedStream.ToImmutableArray(); // Finally, methods can cascade through virtual/override inheritance. NOTE(cyrusn): // We only need to go up or down one level. Then, when we're finding references on // those members, we'll end up traversing the entire hierarchy. - var overrides = await SymbolFinder.FindOverridesAsync( + var overridesStream = await SymbolFinder.FindOverridesAsync( symbolAndProjectId, solution, projects, cancellationToken).ConfigureAwait(false); + var overrides = overridesStream.ToImmutableArray(); var overriddenMember = symbolAndProjectId.WithSymbol(symbol.OverriddenMember()); - return overriddenMember.Symbol == null - ? interfaceMembersImplemented.Concat(overrides) - : interfaceMembersImplemented.Concat(overrides).Concat(overriddenMember); + if (overriddenMember.Symbol == null) + { + return interfaceMembersImplemented.Concat(overrides); + } + + return interfaceMembersImplemented.Concat(overrides).Concat(overriddenMember); } } - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs index 7753bd6f697f7ba67979430070d5a3df4ee697d5..da77970cd08495db7046731c04819d81ce7e852d 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/AbstractReferenceFinder.cs @@ -18,33 +18,33 @@ internal abstract partial class AbstractReferenceFinder : IReferenceFin where TSymbol : ISymbol { protected abstract bool CanFind(TSymbol symbol); - protected abstract Task> DetermineDocumentsToSearchAsync(TSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken); - protected abstract Task> FindReferencesInDocumentAsync(TSymbol symbol, Document document, CancellationToken cancellationToken); + protected abstract Task> DetermineDocumentsToSearchAsync(TSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken); + protected abstract Task> FindReferencesInDocumentAsync(TSymbol symbol, Document document, CancellationToken cancellationToken); - public Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) + public Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { return symbol is TSymbol && CanFind((TSymbol)symbol) ? DetermineProjectsToSearchAsync((TSymbol)symbol, solution, projects, cancellationToken) - : SpecializedTasks.EmptyEnumerable(); + : SpecializedTasks.EmptyImmutableArray(); } - public Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) + public Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) { return symbol is TSymbol && CanFind((TSymbol)symbol) ? DetermineDocumentsToSearchAsync((TSymbol)symbol, project, documents, cancellationToken) - : SpecializedTasks.EmptyEnumerable(); + : SpecializedTasks.EmptyImmutableArray(); } - public Task> FindReferencesInDocumentAsync( + public Task> FindReferencesInDocumentAsync( SymbolAndProjectId symbolAndProjectId, Document document, CancellationToken cancellationToken) { var symbol = symbolAndProjectId.Symbol; return symbol is TSymbol && CanFind((TSymbol)symbol) ? FindReferencesInDocumentAsync((TSymbol)symbol, document, cancellationToken) - : SpecializedTasks.EmptyEnumerable(); + : SpecializedTasks.EmptyImmutableArray(); } - public Task> DetermineCascadedSymbolsAsync( + public Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { var symbol = symbolAndProjectId.Symbol; @@ -55,18 +55,21 @@ public Task> DetermineDocumentsToSearchAsync(ISymbol symbo solution, projects, cancellationToken); } - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - protected virtual Task> DetermineProjectsToSearchAsync(TSymbol symbol, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) + protected virtual async Task> DetermineProjectsToSearchAsync( + TSymbol symbol, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { - return DependentProjectsFinder.GetDependentProjectsAsync(symbol, solution, projects, cancellationToken); + var result = await DependentProjectsFinder.GetDependentProjectsAsync( + symbol, solution, projects, cancellationToken).ConfigureAwait(false); + return result.ToImmutableArray(); } - protected virtual Task> DetermineCascadedSymbolsAsync( + protected virtual Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProject, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } protected static bool TryGetNameWithoutAttributeSuffix( @@ -77,7 +80,7 @@ protected virtual Task> DetermineProjectsToSearchAsync(TSym return name.TryGetWithoutAttributeSuffix(syntaxFacts.IsCaseSensitive, out result); } - protected async Task> FindDocumentsAsync(Project project, IImmutableSet scope, Func> predicateAsync, CancellationToken cancellationToken) + protected async Task> FindDocumentsAsync(Project project, IImmutableSet scope, Func> predicateAsync, CancellationToken cancellationToken) { // special case for HR if (scope != null && scope.Count == 1) @@ -85,13 +88,13 @@ protected async Task> FindDocumentsAsync(Project project, var document = scope.First(); if (document.Project == project) { - return scope; + return scope.ToImmutableArray(); } - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } - List documents = null; + var documents = ArrayBuilder.GetInstance(); foreach (var document in project.Documents) { if (scope != null && !scope.Contains(document)) @@ -101,26 +104,18 @@ protected async Task> FindDocumentsAsync(Project project, if (await predicateAsync(document, cancellationToken).ConfigureAwait(false)) { - documents = documents ?? new List(); documents.Add(document); } } - if (documents == null) - { - return SpecializedCollections.EmptyEnumerable(); - } - else - { - return documents; - } + return documents.ToImmutableAndFree(); } /// /// Finds all the documents in the provided project that contain the requested string /// values /// - protected Task> FindDocumentsAsync(Project project, IImmutableSet documents, CancellationToken cancellationToken, params string[] values) + protected Task> FindDocumentsAsync(Project project, IImmutableSet documents, CancellationToken cancellationToken, params string[] values) { return FindDocumentsAsync(project, documents, async (d, c) => { @@ -137,7 +132,7 @@ protected Task> FindDocumentsAsync(Project project, IImmut }, cancellationToken); } - protected Task> FindDocumentsAsync( + protected Task> FindDocumentsAsync( Project project, IImmutableSet documents, PredefinedType predefinedType, @@ -150,7 +145,7 @@ protected Task> FindDocumentsAsync(Project project, IImmut }, cancellationToken); } - protected async Task> FindDocumentsAsync( + protected async Task> FindDocumentsAsync( Project project, IImmutableSet documents, PredefinedOperator op, @@ -158,7 +153,7 @@ protected Task> FindDocumentsAsync(Project project, IImmut { if (op == PredefinedOperator.None) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } return await FindDocumentsAsync(project, documents, async (d, c) => @@ -173,7 +168,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n return syntaxFacts.IsIdentifier(token) && syntaxFacts.TextMatch(token.ValueText, name); } - protected static Task> FindReferencesInDocumentUsingSymbolNameAsync( + protected static Task> FindReferencesInDocumentUsingSymbolNameAsync( TSymbol symbol, Document document, CancellationToken cancellationToken) @@ -181,7 +176,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n return FindReferencesInDocumentUsingIdentifierAsync(symbol, symbol.Name, document, cancellationToken); } - protected static Task> FindReferencesInDocumentUsingIdentifierAsync( + protected static Task> FindReferencesInDocumentUsingIdentifierAsync( ISymbol symbol, string identifier, Document document, @@ -194,7 +189,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n identifier, document, symbolsMatch, cancellationToken); } - protected static async Task> FindReferencesInDocumentUsingIdentifierAsync( + protected static async Task> FindReferencesInDocumentUsingIdentifierAsync( string identifier, Document document, Func> symbolsMatch, @@ -252,7 +247,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n return symbolsMatch; } - protected Task> FindReferencesInTokensAsync( + protected Task> FindReferencesInTokensAsync( TSymbol symbol, Document document, IEnumerable tokens, @@ -270,7 +265,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n cancellationToken); } - protected static async Task> FindReferencesInTokensAsync( + protected static async Task> FindReferencesInTokensAsync( Document document, IEnumerable tokens, Func tokensMatch, @@ -282,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 = new List(); + var locations = ArrayBuilder.GetInstance(); foreach (var token in tokens) { cancellationToken.ThrowIfCancellationRequested(); @@ -301,10 +296,10 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return locations; + return locations.ToImmutableAndFree(); } - protected static Task> FindReferencesInDocumentAsync( + protected static Task> FindReferencesInDocumentAsync( TSymbol symbol, Document document, Func tokensMatch, @@ -315,7 +310,7 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n return FindReferencesInDocumentAsync(symbol, document, tokensMatch, symbolsMatch, cancellationToken); } - protected static async Task> FindReferencesInDocumentAsync( + protected static async Task> FindReferencesInDocumentAsync( TSymbol symbol, Document document, Func tokensMatch, @@ -362,24 +357,24 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n return null; } - protected static async Task> FindAliasReferencesAsync( - IEnumerable nonAliasReferences, + protected static async Task> FindAliasReferencesAsync( + ImmutableArray nonAliasReferences, ISymbol symbol, Document document, CancellationToken cancellationToken, Func findParentNode = null) { - var aliasSymbols = await GetAliasSymbolsAsync(document, nonAliasReferences.ToList(), cancellationToken).ConfigureAwait(false); + var aliasSymbols = await GetAliasSymbolsAsync(document, nonAliasReferences, cancellationToken).ConfigureAwait(false); if (aliasSymbols == null) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } return await FindReferencesThroughAliasSymbolsAsync(symbol, document, aliasSymbols, findParentNode, cancellationToken).ConfigureAwait(false); } - protected static async Task> FindAliasReferencesAsync( - IEnumerable nonAliasReferences, + protected static async Task> FindAliasReferencesAsync( + ImmutableArray nonAliasReferences, ISymbol symbol, Document document, Func> symbolsMatch, @@ -388,46 +383,39 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n var aliasSymbols = await GetAliasSymbolsAsync(document, nonAliasReferences, cancellationToken).ConfigureAwait(false); if (aliasSymbols == null) { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } return await FindReferencesThroughAliasSymbolsAsync(symbol, document, aliasSymbols, symbolsMatch, cancellationToken).ConfigureAwait(false); } - private static async Task> GetAliasSymbolsAsync( + private static async Task> GetAliasSymbolsAsync( Document document, - IEnumerable nonAliasReferences, + ImmutableArray nonAliasReferences, CancellationToken cancellationToken) { - List 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 = new List(); - } - aliasSymbols.Add(symbol); } } - return aliasSymbols != null ? aliasSymbols.Distinct() : null; + return aliasSymbols.ToImmutableAndFree(); } - private static async Task> FindReferencesThroughAliasSymbolsAsync( + private static async Task> FindReferencesThroughAliasSymbolsAsync( ISymbol symbol, Document document, - IEnumerable aliasSymbols, + ImmutableArray aliasSymbols, Func findParentNode, CancellationToken cancellationToken) { - Contract.ThrowIfNull(aliasSymbols); - var syntaxFactsService = document.GetLanguageService(); - var allAliasReferences = new List(); + var allAliasReferences = ArrayBuilder.GetInstance(); foreach (var aliasSymbol in aliasSymbols) { var aliasReferences = await FindReferencesInDocumentUsingIdentifierAsync(symbol, aliasSymbol.Name, document, cancellationToken, findParentNode).ConfigureAwait(false); @@ -443,20 +431,18 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return allAliasReferences; + return allAliasReferences.ToImmutableAndFree(); } - private static async Task> FindReferencesThroughAliasSymbolsAsync( + private static async Task> FindReferencesThroughAliasSymbolsAsync( ISymbol symbol, Document document, - IEnumerable aliasSymbols, + ImmutableArray aliasSymbols, Func> symbolsMatch, CancellationToken cancellationToken) { - Contract.ThrowIfNull(aliasSymbols); - var syntaxFactsService = document.GetLanguageService(); - var allAliasReferences = new List(); + var allAliasReferences = ArrayBuilder.GetInstance(); foreach (var aliasSymbol in aliasSymbols) { var aliasReferences = await FindReferencesInDocumentUsingIdentifierAsync(aliasSymbol.Name, document, symbolsMatch, cancellationToken).ConfigureAwait(false); @@ -472,10 +458,10 @@ protected static bool IdentifiersMatch(ISyntaxFactsService syntaxFacts, string n } } - return allAliasReferences; + return allAliasReferences.ToImmutableAndFree(); } - protected Task> FindDocumentsWithForEachStatementsAsync(Project project, IImmutableSet documents, CancellationToken cancellationToken) + protected Task> FindDocumentsWithForEachStatementsAsync(Project project, IImmutableSet documents, CancellationToken cancellationToken) { return FindDocumentsAsync(project, documents, async (d, c) => { @@ -484,7 +470,7 @@ protected Task> FindDocumentsWithForEachStatementsAsync(Pr }, cancellationToken); } - protected async Task> FindReferencesInForEachStatementsAsync( + protected async Task> FindReferencesInForEachStatementsAsync( ISymbol symbol, Document document, CancellationToken cancellationToken) @@ -496,7 +482,7 @@ protected Task> FindDocumentsWithForEachStatementsAsync(Pr var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - var locations = new List(); + var locations = ArrayBuilder.GetInstance(); var originalUnreducedSymbolDefinition = symbol.GetOriginalUnreducedDefinition(); @@ -516,11 +502,11 @@ protected Task> FindDocumentsWithForEachStatementsAsync(Pr } } - return locations; + return locations.ToImmutableAndFree(); } else { - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorInitializerSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorInitializerSymbolReferenceFinder.cs index b09f7074d0d2767173cd7c2369ba417f63dcaef3..5c0a126558f695771b9d686a560ec125909a3e76 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorInitializerSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorInitializerSymbolReferenceFinder.cs @@ -19,7 +19,7 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.Constructor; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, @@ -51,7 +51,7 @@ protected override bool CanFind(IMethodSymbol symbol) }, cancellationToken); } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( IMethodSymbol methodSymbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorSymbolReferenceFinder.cs index d98d197b99bb33e646f5e923901850a0f7e5b725..77442ffcba63e0e04f5b067c8b9dd1b08edd9345 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ConstructorSymbolReferenceFinder.cs @@ -19,7 +19,7 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.Constructor; } - protected override async Task> DetermineDocumentsToSearchAsync( + protected override async Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, @@ -35,7 +35,9 @@ protected override bool CanFind(IMethodSymbol symbol) : SpecializedCollections.EmptyEnumerable(); return documentsWithName.Concat(documentsWithType) - .Concat(documentsWithAttribute).Distinct(); + .Concat(documentsWithAttribute) + .Distinct() + .ToImmutableArray(); } private static bool IsPotentialReference( @@ -50,7 +52,7 @@ protected override bool CanFind(IMethodSymbol symbol) predefinedType == actualType; } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( IMethodSymbol methodSymbol, Document document, CancellationToken cancellationToken) @@ -69,7 +71,7 @@ protected override bool CanFind(IMethodSymbol symbol) return t => syntaxFacts.GetBindableParent(t); } - private async Task> FindReferencesInDocumentWorkerAsync( + private async Task> FindReferencesInDocumentWorkerAsync( IMethodSymbol symbol, Document document, Func findParentNode, @@ -82,7 +84,7 @@ protected override bool CanFind(IMethodSymbol symbol) return ordinaryRefs.Concat(attributeRefs).Concat(predefinedTypeRefs); } - private Task> FindOrdinaryReferencesAsync( + private Task> FindOrdinaryReferencesAsync( IMethodSymbol symbol, Document document, Func findParentNode, @@ -92,7 +94,7 @@ protected override bool CanFind(IMethodSymbol symbol) return FindReferencesInDocumentUsingIdentifierAsync(symbol, name, document, cancellationToken, findParentNode); } - private Task> FindPredefinedTypeReferencesAsync( + private Task> FindPredefinedTypeReferencesAsync( IMethodSymbol symbol, Document document, CancellationToken cancellationToken) @@ -100,7 +102,7 @@ protected override bool CanFind(IMethodSymbol symbol) var predefinedType = symbol.ContainingType.SpecialType.ToPredefinedType(); if (predefinedType == PredefinedType.None) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } var syntaxFacts = document.GetLanguageService(); @@ -109,7 +111,7 @@ protected override bool CanFind(IMethodSymbol symbol) cancellationToken); } - private Task> FindAttributeReferencesAsync( + private Task> FindAttributeReferencesAsync( IMethodSymbol symbol, Document document, CancellationToken cancellationToken) @@ -119,7 +121,7 @@ protected override bool CanFind(IMethodSymbol symbol) string simpleName; return TryGetNameWithoutAttributeSuffix(symbol.ContainingType.Name, syntaxFacts, out simpleName) ? FindReferencesInDocumentUsingIdentifierAsync(symbol, simpleName, document, cancellationToken) - : SpecializedTasks.EmptyEnumerable(); + : SpecializedTasks.EmptyImmutableArray(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/DestructorSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/DestructorSymbolReferenceFinder.cs index 9971cc5f0717fe7201aacb65751cc382c1a1964f..c08de25cd3c3a355850e53e43abf1d185e83ddc5 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/DestructorSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/DestructorSymbolReferenceFinder.cs @@ -15,30 +15,30 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.Destructor; } - protected override Task> DetermineCascadedSymbolsAsync( + protected override Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbol, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IMethodSymbol methodSymbol, Document document, CancellationToken cancellationToken) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/EventSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/EventSymbolReferenceFinder.cs index 9f4816ee0ec404cc9aec9d90c16fdb6d1785596d..95822f868ce118c44d588beca97ea9ca54b8b899 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/EventSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/EventSymbolReferenceFinder.cs @@ -17,30 +17,31 @@ protected override bool CanFind(IEventSymbol symbol) return true; } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { var baseSymbols = await base.DetermineCascadedSymbolsAsync(symbolAndProjectId, solution, projects, cancellationToken).ConfigureAwait(false); - baseSymbols = baseSymbols ?? SpecializedCollections.EmptyEnumerable(); var symbol = symbolAndProjectId.Symbol; var backingFields = symbol.ContainingType.GetMembers() .OfType() .Where(f => symbol.Equals(f.AssociatedSymbol)) - .Select(s => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(s)); + .Select(s => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(s)) + .ToImmutableArray(); var associatedNamedTypes = symbol.ContainingType.GetTypeMembers() .Where(n => symbol.Equals(n.AssociatedSymbol)) - .Select(s => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(s)); + .Select(s => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(s)) + .ToImmutableArray(); return baseSymbols.Concat(backingFields) .Concat(associatedNamedTypes); } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IEventSymbol symbol, Project project, IImmutableSet documents, @@ -49,7 +50,7 @@ protected override bool CanFind(IEventSymbol symbol) return FindDocumentsAsync(project, documents, cancellationToken, symbol.Name); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IEventSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ExplicitInterfaceMethodReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ExplicitInterfaceMethodReferenceFinder.cs index c28a51d54be232d3774e2219de06ca8d35cc89be..9112c383b66a7894f2d6ad6fa189a8afea1b15db 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ExplicitInterfaceMethodReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ExplicitInterfaceMethodReferenceFinder.cs @@ -16,7 +16,7 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.ExplicitInterfaceImplementation; } - protected override Task> DetermineCascadedSymbolsAsync( + protected override Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -25,26 +25,26 @@ protected override bool CanFind(IMethodSymbol symbol) // An explicit interface method will cascade to all the methods that it implements. return Task.FromResult( symbolAndProjectId.Symbol.ExplicitInterfaceImplementations.Select( - ei => symbolAndProjectId.WithSymbol((ISymbol)ei))); + ei => symbolAndProjectId.WithSymbol((ISymbol)ei)).ToImmutableArray()); } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) { // An explicit method can't be referenced anywhere. - return SpecializedTasks.Default>(); + return SpecializedTasks.EmptyImmutableArray(); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IMethodSymbol symbol, Document document, CancellationToken cancellationToken) { // An explicit method can't be referenced anywhere. - return SpecializedTasks.Default>(); + return SpecializedTasks.EmptyImmutableArray(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/FieldSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/FieldSymbolReferenceFinder.cs index 4139b8796c4c738ece7a152fc1fafb53e3992445..22ef79cc4c97a7387d0a91dd1d21fa289ecd9cfa 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/FieldSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/FieldSymbolReferenceFinder.cs @@ -15,7 +15,7 @@ protected override bool CanFind(IFieldSymbol symbol) return true; } - protected override Task> DetermineCascadedSymbolsAsync( + protected override Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -25,16 +25,15 @@ protected override bool CanFind(IFieldSymbol symbol) if (symbol.AssociatedSymbol != null) { return Task.FromResult( - SpecializedCollections.SingletonEnumerable( - symbolAndProjectId.WithSymbol(symbol.AssociatedSymbol))); + ImmutableArray.Create(symbolAndProjectId.WithSymbol(symbol.AssociatedSymbol))); } else { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IFieldSymbol symbol, Project project, IImmutableSet documents, @@ -43,7 +42,7 @@ protected override bool CanFind(IFieldSymbol symbol) return FindDocumentsAsync(project, documents, cancellationToken, symbol.Name); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IFieldSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ILanguageServiceReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ILanguageServiceReferenceFinder.cs index 2fa23e546d320f03e5405679b5273a9cfc9d6b81..93f536dcd501ba0bf3738d0182a4fe4f4620ed13 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ILanguageServiceReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ILanguageServiceReferenceFinder.cs @@ -1,6 +1,7 @@ // 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.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Host; @@ -14,7 +15,7 @@ namespace Microsoft.CodeAnalysis.FindSymbols.Finders /// internal interface ILanguageServiceReferenceFinder : ILanguageService { - Task> DetermineCascadedSymbolsAsync( + Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Project project, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/IReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/IReferenceFinder.cs index 6ba302b1c06227a44d639ba94406d11441cef9b3..26909367b65697b3e01dedcea8bc4572a43b413a 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/IReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/IReferenceFinder.cs @@ -28,7 +28,7 @@ internal interface IReferenceFinder /// /// Implementations of this method must be thread-safe. /// - Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)); + Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)); /// /// Called by the find references search engine to determine which documents in the supplied @@ -42,7 +42,7 @@ internal interface IReferenceFinder /// /// Implementations of this method must be thread-safe. /// - Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken = default(CancellationToken)); + Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken = default(CancellationToken)); /// /// Called by the find references search engine to determine the set of reference locations @@ -51,7 +51,7 @@ internal interface IReferenceFinder /// /// Implementations of this method must be thread-safe. /// - Task> FindReferencesInDocumentAsync( + Task> FindReferencesInDocumentAsync( SymbolAndProjectId symbolAndProjectId, Document document, CancellationToken cancellationToken = default(CancellationToken)); /// @@ -62,7 +62,7 @@ internal interface IReferenceFinder /// /// Implementations of this method must be thread-safe. /// - Task> DetermineCascadedSymbolsAsync( + Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProject, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)); } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/LinkedFileReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/LinkedFileReferenceFinder.cs index 6ad77c2821f3460e1025b89cd903ee5837e2bf6e..96517b4d24d72af302ce064c2eb2aa89d3b18ec8 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/LinkedFileReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/LinkedFileReferenceFinder.cs @@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.FindSymbols.Finders { internal class LinkedFileReferenceFinder : IReferenceFinder { - public async Task> DetermineCascadedSymbolsAsync( + public async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)) { var linkedSymbols = new HashSet(); @@ -59,23 +59,23 @@ internal class LinkedFileReferenceFinder : IReferenceFinder } } - return linkedSymbols; + return linkedSymbols.ToImmutableArray(); } - public Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken = default(CancellationToken)) + public Task> DetermineDocumentsToSearchAsync(ISymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken = default(CancellationToken)) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - public Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)) + public Task> DetermineProjectsToSearchAsync(ISymbol symbol, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - public Task> FindReferencesInDocumentAsync( + public Task> FindReferencesInDocumentAsync( SymbolAndProjectId symbolAndProjectId, Document document, CancellationToken cancellationToken = default(CancellationToken)) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/MethodTypeParameterSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/MethodTypeParameterSymbolReferenceFinder.cs index dab16527843f2a421d8d9b46a2428dae8ea529d0..7c2d3982e82d4333d490a80c3ae395d7393ce3ef 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/MethodTypeParameterSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/MethodTypeParameterSymbolReferenceFinder.cs @@ -15,7 +15,7 @@ protected override bool CanFind(ITypeParameterSymbol symbol) return symbol.TypeParameterKind == TypeParameterKind.Method; } - protected override Task> DetermineCascadedSymbolsAsync( + protected override Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -29,21 +29,21 @@ protected override bool CanFind(ITypeParameterSymbol symbol) { if (method.PartialDefinitionPart != null && ordinal < method.PartialDefinitionPart.TypeParameters.Length) { - return Task.FromResult(SpecializedCollections.SingletonEnumerable( + return Task.FromResult(ImmutableArray.Create( symbolAndProjectId.WithSymbol((ISymbol)method.PartialDefinitionPart.TypeParameters[ordinal]))); } if (method.PartialImplementationPart != null && ordinal < method.PartialImplementationPart.TypeParameters.Length) { - return Task.FromResult(SpecializedCollections.SingletonEnumerable( + return Task.FromResult(ImmutableArray.Create( symbolAndProjectId.WithSymbol((ISymbol)method.PartialImplementationPart.TypeParameters[ordinal]))); } } - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( ITypeParameterSymbol symbol, Project project, IImmutableSet documents, @@ -72,7 +72,7 @@ private static string GetMemberNameWithoutInterfaceName(string fullName) : fullName; } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( ITypeParameterSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs index 59addc4840b190cc1c3b34f7b20bc9e7b155f61e..23fe4546bebceb7da930093c23cda9762053e3e3 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamedTypeSymbolReferenceFinder.cs @@ -19,45 +19,39 @@ protected override bool CanFind(INamedTypeSymbol symbol) return symbol.TypeKind != TypeKind.Error; } - protected override Task> DetermineCascadedSymbolsAsync( + protected override Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { - List result = null; + var result = ArrayBuilder.GetInstance(); var symbol = symbolAndProjectId.Symbol; if (symbol.AssociatedSymbol != null) { - result = Add(result, symbolAndProjectId, SpecializedCollections.SingletonEnumerable(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 ?? SpecializedCollections.EmptyList()); + return Task.FromResult(result.ToImmutableAndFree()); } - private List Add( - List result, + private void Add( + ArrayBuilder result, SymbolAndProjectId symbolAndProjectId, - IEnumerable enumerable) + ImmutableArray enumerable) where TSymbol : ISymbol { - if (enumerable != null) - { - result = result ?? new List(); - result.AddRange(enumerable.Select(s => symbolAndProjectId.WithSymbol(s))); - } - - return result; + result.AddRange(enumerable.Select( + s => symbolAndProjectId.WithSymbol((ISymbol)s))); } - protected override async Task> DetermineDocumentsToSearchAsync( + protected override async Task> DetermineDocumentsToSearchAsync( INamedTypeSymbol symbol, Project project, IImmutableSet documents, @@ -69,9 +63,10 @@ protected override bool CanFind(INamedTypeSymbol symbol) string simpleName; var documentsWithAttribute = TryGetNameWithoutAttributeSuffix(symbol.Name, project.LanguageServices.GetService(), out simpleName) ? await FindDocumentsAsync(project, documents, cancellationToken, simpleName).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; - return documentsWithName.Concat(documentsWithType).Concat(documentsWithAttribute); + return documentsWithName.Concat(documentsWithType) + .Concat(documentsWithAttribute); } private static bool IsPotentialReference( @@ -86,7 +81,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) predefinedType == actualType; } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( INamedTypeSymbol namedType, Document document, CancellationToken cancellationToken) @@ -97,7 +92,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) return nonAliasReferences.Concat(aliasReferences); } - internal static async Task> FindNonAliasReferencesAsync( + internal static async Task> FindNonAliasReferencesAsync( INamedTypeSymbol symbol, Document document, CancellationToken cancellationToken) @@ -108,7 +103,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) return ordinaryRefs.Concat(attributeRefs).Concat(predefinedTypeRefs); } - private static Task> FindOrdinaryReferencesAsync( + private static Task> FindOrdinaryReferencesAsync( INamedTypeSymbol namedType, Document document, CancellationToken cancellationToken) @@ -119,7 +114,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) namedType.Name, document, symbolsMatch, cancellationToken); } - private static Task> FindPredefinedTypeReferencesAsync( + private static Task> FindPredefinedTypeReferencesAsync( INamedTypeSymbol symbol, Document document, CancellationToken cancellationToken) @@ -127,7 +122,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) var predefinedType = symbol.SpecialType.ToPredefinedType(); if (predefinedType == PredefinedType.None) { - return SpecializedTasks.EmptyEnumerable(); + return SpecializedTasks.EmptyImmutableArray(); } var syntaxFacts = document.GetLanguageService(); @@ -137,7 +132,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) cancellationToken); } - private static Task> FindAttributeReferencesAsync( + private static Task> FindAttributeReferencesAsync( INamedTypeSymbol namedType, Document document, CancellationToken cancellationToken) @@ -148,7 +143,7 @@ protected override bool CanFind(INamedTypeSymbol symbol) string simpleName; return TryGetNameWithoutAttributeSuffix(namedType.Name, syntaxFacts, out simpleName) ? FindReferencesInDocumentUsingIdentifierAsync(simpleName, document, symbolsMatch, cancellationToken) - : SpecializedTasks.EmptyEnumerable(); + : SpecializedTasks.EmptyImmutableArray(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamespaceSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamespaceSymbolReferenceFinder.cs index e960618fadfdb0d23236d9f8e5488875c4cca8c8..b36f5221c2bb5a299d8d6c24c589c47f6cfbc8b3 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamespaceSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/NamespaceSymbolReferenceFinder.cs @@ -19,7 +19,7 @@ protected override bool CanFind(INamespaceSymbol symbol) return true; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( INamespaceSymbol symbol, Project project, IImmutableSet documents, @@ -35,7 +35,7 @@ private static string GetNamespaceIdentifierName(INamespaceSymbol symbol, Projec : symbol.Name; } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( INamespaceSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OperatorSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OperatorSymbolReferenceFinder.cs index 982609c704c0f65f6c7ba3d58fd201cc10695054..ffac974399c8cdb1a4c2a4f0fb5fd4a223be2dc9 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OperatorSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OperatorSymbolReferenceFinder.cs @@ -16,7 +16,7 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind == MethodKind.UserDefinedOperator; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IMethodSymbol symbol, Project project, IImmutableSet documents, @@ -26,7 +26,7 @@ protected override bool CanFind(IMethodSymbol symbol) return FindDocumentsAsync(project, documents, op, cancellationToken); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IMethodSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OrdinaryMethodReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OrdinaryMethodReferenceFinder.cs index ee5470cf7d384bee84fbc1a6f1b4ce9856d821d1..bd58b3acc7d6bed921ffc8b1a59d0841e7afe7ba 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OrdinaryMethodReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/OrdinaryMethodReferenceFinder.cs @@ -23,7 +23,7 @@ protected override bool CanFind(IMethodSymbol symbol) symbol.MethodKind == MethodKind.LocalFunction; } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -34,7 +34,7 @@ protected override bool CanFind(IMethodSymbol symbol) var symbol = symbolAndProjectId.Symbol; if (symbol.ContainingType.TypeKind == TypeKind.Delegate) { - return SpecializedCollections.SingletonEnumerable( + return ImmutableArray.Create( symbolAndProjectId.WithSymbol((ISymbol)symbol.ContainingType)); } else @@ -44,36 +44,33 @@ protected override bool CanFind(IMethodSymbol symbol) if (otherPartsOfPartial == null && baseCascadedSymbols == null) { - return null; + return ImmutableArray.Empty; } - otherPartsOfPartial = otherPartsOfPartial ?? SpecializedCollections.EmptyEnumerable(); - baseCascadedSymbols = baseCascadedSymbols ?? SpecializedCollections.EmptyEnumerable(); - return otherPartsOfPartial.Concat(baseCascadedSymbols); } } - private IEnumerable GetOtherPartsOfPartial( + private ImmutableArray GetOtherPartsOfPartial( SymbolAndProjectId symbolAndProjectId) { var symbol = symbolAndProjectId.Symbol; if (symbol.PartialDefinitionPart != null) { - return SpecializedCollections.SingletonEnumerable( + return ImmutableArray.Create( symbolAndProjectId.WithSymbol((ISymbol)symbol.PartialDefinitionPart)); } if (symbol.PartialImplementationPart != null) { - return SpecializedCollections.SingletonEnumerable( + return ImmutableArray.Create( symbolAndProjectId.WithSymbol((ISymbol)symbol.PartialImplementationPart)); } - return null; + return ImmutableArray.Empty; } - protected override async Task> DetermineDocumentsToSearchAsync( + protected override async Task> DetermineDocumentsToSearchAsync( IMethodSymbol methodSymbol, Project project, IImmutableSet documents, @@ -97,7 +94,7 @@ protected override bool CanFind(IMethodSymbol symbol) var ordinaryDocuments = await FindDocumentsAsync(project, documents, cancellationToken, methodSymbol.Name).ConfigureAwait(false); var forEachDocuments = IsForEachMethod(methodSymbol) ? await FindDocumentsWithForEachStatementsAsync(project, documents, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; return ordinaryDocuments.Concat(forEachDocuments); } @@ -109,7 +106,7 @@ private bool IsForEachMethod(IMethodSymbol methodSymbol) methodSymbol.Name == WellKnownMemberNames.MoveNextMethodName; } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( IMethodSymbol symbol, Document document, CancellationToken cancellationToken) @@ -122,7 +119,7 @@ private bool IsForEachMethod(IMethodSymbol methodSymbol) var forEachMatches = IsForEachMethod(symbol) ? await FindReferencesInForEachStatementsAsync(symbol, document, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; return nameMatches.Concat(forEachMatches); } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/ParameterSymbolReferenceFinder.cs index 63013cf8d00ceb18be50e2195ca0bcdabd5fa0ca..d2e3bcf90786a3db56ff9a3c2285fe470aa98a67 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 { @@ -19,7 +17,7 @@ protected override bool CanFind(IParameterSymbol symbol) return true; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( IParameterSymbol symbol, Project project, IImmutableSet documents, @@ -33,7 +31,7 @@ protected override bool CanFind(IParameterSymbol symbol) return FindDocumentsAsync(project, documents, cancellationToken, symbol.Name); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( IParameterSymbol symbol, Document document, CancellationToken cancellationToken) @@ -41,7 +39,7 @@ protected override bool CanFind(IParameterSymbol symbol) return FindReferencesInDocumentUsingSymbolNameAsync(symbol, document, cancellationToken); } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId parameterAndProjectId, Solution solution, IImmutableSet projects, @@ -50,7 +48,7 @@ protected override bool CanFind(IParameterSymbol symbol) var parameter = parameterAndProjectId.Symbol; if (parameter.IsThis) { - return null; + return ImmutableArray.Empty; } var anonymousFunctionParameterCascades = await CascadeBetweenAnonymousFunctionParametersAsync( @@ -64,12 +62,12 @@ protected override bool CanFind(IParameterSymbol symbol) CascadeBetweenPartialMethodParameters(parameterAndProjectId)); } - private async Task> CascadeBetweenAnonymousFunctionParametersAsync( + private async Task> CascadeBetweenAnonymousFunctionParametersAsync( Solution solution, SymbolAndProjectId parameterAndProjectId, CancellationToken cancellationToken) { - List 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 = new List(); results.AddRange(CascadeBetweenAnonymousFunctionParameters( document, semanticModel, container, parameterAndProjectId, convertedType, cancellationToken)); } @@ -110,21 +107,16 @@ protected override bool CanFind(IParameterSymbol symbol) int ordinal = parameter.Ordinal; if (invokeMethod != null && ordinal < invokeMethod.Parameters.Length) { - if (results == null) - { - results = new List(); - } - results.Add(parameterAndProjectId.WithSymbol( invokeMethod.Parameters[ordinal])); } } } - return results ?? SpecializedCollections.EmptyEnumerable(); + return results.ToImmutableAndFree(); } - private IEnumerable CascadeBetweenAnonymousFunctionParameters( + private ImmutableArray CascadeBetweenAnonymousFunctionParameters( Document document, SemanticModel semanticModel, SyntaxNode container, @@ -132,6 +124,8 @@ protected override bool CanFind(IParameterSymbol symbol) ITypeSymbol convertedType1, CancellationToken cancellationToken) { + var result = ArrayBuilder.GetInstance(); + var parameter = parameterAndProjectId.Symbol; var syntaxFacts = document.GetLanguageService(); foreach (var token in container.DescendantTokens()) @@ -149,11 +143,13 @@ protected override bool CanFind(IParameterSymbol symbol) if (convertedType1.Equals(convertedType2)) { - yield return parameterAndProjectId.WithSymbol(symbol); + result.Add(parameterAndProjectId.WithSymbol(symbol)); } } } } + + return result.ToImmutableAndFree(); } private bool ParameterNamesMatch(ISyntaxFactsService syntaxFacts, IMethodSymbol methodSymbol1, IMethodSymbol methodSymbol2) @@ -184,12 +180,12 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete return syntaxFactsService.GetContainingVariableDeclaratorOfFieldDeclaration(parameterNode); } - private async Task> CascadeBetweenPropertyOrEventAndAccessorParameterAsync( + private async Task> CascadeBetweenPropertyOrEventAndAccessorParameterAsync( Solution solution, SymbolAndProjectId parameterAndProjectId, CancellationToken cancellationToken) { - var results = new List(); + var results = ArrayBuilder.GetInstance(); var parameter = parameterAndProjectId.Symbol; var ordinal = parameter.Ordinal; @@ -272,12 +268,14 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete } } - return results; + return results.ToImmutableAndFree(); } - private IEnumerable CascadeBetweenPartialMethodParameters( + private ImmutableArray CascadeBetweenPartialMethodParameters( SymbolAndProjectId parameterAndProjectId) { + var result = ArrayBuilder.GetInstance(); + var parameter = parameterAndProjectId.Symbol; if (parameter.ContainingSymbol is IMethodSymbol) { @@ -285,14 +283,18 @@ private SyntaxNode GetContainer(SemanticModel semanticModel, SyntaxNode paramete var method = (IMethodSymbol)parameter.ContainingSymbol; if (method.PartialDefinitionPart != null && ordinal < method.PartialDefinitionPart.Parameters.Length) { - yield return parameterAndProjectId.WithSymbol(method.PartialDefinitionPart.Parameters[ordinal]); + result.Add( + parameterAndProjectId.WithSymbol(method.PartialDefinitionPart.Parameters[ordinal])); } if (method.PartialImplementationPart != null && ordinal < method.PartialImplementationPart.Parameters.Length) { - yield return parameterAndProjectId.WithSymbol(method.PartialImplementationPart.Parameters[ordinal]); + result.Add( + parameterAndProjectId.WithSymbol(method.PartialImplementationPart.Parameters[ordinal])); } } + + return result.ToImmutableAndFree(); } } -} +} \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertyAccessorSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertyAccessorSymbolReferenceFinder.cs index 9430ddeeb161f33547b3e16d9cbcbf1ad3567c75..a9c1ede34ae894379f8759525cc1b61776e1cff2 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertyAccessorSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertyAccessorSymbolReferenceFinder.cs @@ -16,7 +16,7 @@ protected override bool CanFind(IMethodSymbol symbol) return symbol.MethodKind.IsPropertyAccessor(); } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, @@ -28,18 +28,18 @@ protected override bool CanFind(IMethodSymbol symbol) var symbol = symbolAndProjectId.Symbol; if (symbol.AssociatedSymbol != null) { - result = result.Concat(symbolAndProjectId.WithSymbol(symbol.AssociatedSymbol)); + result = result.Add(symbolAndProjectId.WithSymbol(symbol.AssociatedSymbol)); } return result; } - protected override Task> DetermineDocumentsToSearchAsync(IMethodSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) + protected override Task> DetermineDocumentsToSearchAsync(IMethodSymbol symbol, Project project, IImmutableSet documents, CancellationToken cancellationToken) { return FindDocumentsAsync(project, documents, cancellationToken, symbol.Name); } - protected override Task> FindReferencesInDocumentAsync(IMethodSymbol symbol, Document document, CancellationToken cancellationToken) + protected override Task> FindReferencesInDocumentAsync(IMethodSymbol symbol, Document document, CancellationToken cancellationToken) { return FindReferencesInDocumentUsingSymbolNameAsync(symbol, document, cancellationToken); } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs index 6075174ace8035399fa5311f68bfb4cf1ff82f40..9596b9ddd09f322b95a865caca762fcac0d487e3 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/PropertySymbolReferenceFinder.cs @@ -19,37 +19,37 @@ protected override bool CanFind(IPropertySymbol symbol) return true; } - protected override async Task> DetermineCascadedSymbolsAsync( + protected override async Task> DetermineCascadedSymbolsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects, CancellationToken cancellationToken) { var baseSymbols = await base.DetermineCascadedSymbolsAsync(symbolAndProjectId, solution, projects, cancellationToken).ConfigureAwait(false); - baseSymbols = baseSymbols ?? SpecializedCollections.EmptyEnumerable(); var symbol = symbolAndProjectId.Symbol; var backingFields = symbol.ContainingType.GetMembers() .OfType() .Where(f => symbol.Equals(f.AssociatedSymbol)) - .Select(f => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(f)); + .Select(f => (SymbolAndProjectId)symbolAndProjectId.WithSymbol(f)) + .ToImmutableArray(); var result = baseSymbols.Concat(backingFields); if (symbol.GetMethod != null) { - result = result.Concat(symbolAndProjectId.WithSymbol(symbol.GetMethod)); + result = result.Add(symbolAndProjectId.WithSymbol(symbol.GetMethod)); } if (symbol.SetMethod != null) { - result = result.Concat(symbolAndProjectId.WithSymbol(symbol.SetMethod)); + result = result.Add(symbolAndProjectId.WithSymbol(symbol.SetMethod)); } return result; } - protected override async Task> DetermineDocumentsToSearchAsync( + protected override async Task> DetermineDocumentsToSearchAsync( IPropertySymbol symbol, Project project, IImmutableSet documents, @@ -59,17 +59,19 @@ protected override bool CanFind(IPropertySymbol symbol) var forEachDocuments = IsForEachProperty(symbol) ? await FindDocumentsWithForEachStatementsAsync(project, documents, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; var elementAccessDocument = symbol.IsIndexer ? await FindDocumentWithElementAccessExpressionsAsync(project, documents, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; var indexerMemberCrefDocument = symbol.IsIndexer ? await FindDocumentWithIndexerMemberCrefAsync(project, documents, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; - return ordinaryDocuments.Concat(forEachDocuments).Concat(elementAccessDocument).Concat(indexerMemberCrefDocument); + return ordinaryDocuments.Concat(forEachDocuments) + .Concat(elementAccessDocument) + .Concat(indexerMemberCrefDocument); } private static bool IsForEachProperty(IPropertySymbol symbol) @@ -77,7 +79,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) return symbol.Name == WellKnownMemberNames.CurrentPropertyName; } - protected override async Task> FindReferencesInDocumentAsync( + protected override async Task> FindReferencesInDocumentAsync( IPropertySymbol symbol, Document document, CancellationToken cancellationToken) @@ -86,16 +88,17 @@ private static bool IsForEachProperty(IPropertySymbol symbol) var forEachReferences = IsForEachProperty(symbol) ? await FindReferencesInForEachStatementsAsync(symbol, document, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; var elementAccessReferences = symbol.IsIndexer ? await FindElementAccessReferencesAndIndexerMemberCrefReferencesAsync(symbol, document, cancellationToken).ConfigureAwait(false) - : SpecializedCollections.EmptyEnumerable(); + : ImmutableArray.Empty; - return nameReferences.Concat(forEachReferences).Concat(elementAccessReferences); + return nameReferences.Concat(forEachReferences) + .Concat(elementAccessReferences); } - private Task> FindDocumentWithElementAccessExpressionsAsync( + private Task> FindDocumentWithElementAccessExpressionsAsync( Project project, IImmutableSet documents, CancellationToken cancellationToken) { return FindDocumentsAsync(project, documents, async (d, c) => @@ -105,7 +108,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) }, cancellationToken); } - private Task> FindDocumentWithIndexerMemberCrefAsync( + private Task> FindDocumentWithIndexerMemberCrefAsync( Project project, IImmutableSet documents, CancellationToken cancellationToken) { return FindDocumentsAsync(project, documents, async (d, c) => @@ -115,7 +118,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) }, cancellationToken); } - private async Task> FindElementAccessReferencesAndIndexerMemberCrefReferencesAsync( + private async Task> FindElementAccessReferencesAndIndexerMemberCrefReferencesAsync( IPropertySymbol symbol, Document document, CancellationToken cancellationToken) @@ -132,7 +135,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) var elementAccessExpressionsAndIndexerMemberCref = elementAccessExpressions.Concat(indexerMemberCref); - var locations = new List(); + var locations = ArrayBuilder.GetInstance(); foreach (var node in elementAccessExpressionsAndIndexerMemberCref) { @@ -169,7 +172,7 @@ private static bool IsForEachProperty(IPropertySymbol symbol) } } - return locations; + return locations.ToImmutableAndFree(); } } } diff --git a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/TypeParameterSymbolReferenceFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/TypeParameterSymbolReferenceFinder.cs index 17f61eda8df7cd772098fcbd95876ee2d5946f3c..d39ee725963beb17a0ed14ffa8c886fc1f58fd8a 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/TypeParameterSymbolReferenceFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/FindReferences/Finders/TypeParameterSymbolReferenceFinder.cs @@ -14,7 +14,7 @@ protected override bool CanFind(ITypeParameterSymbol symbol) return symbol.TypeParameterKind != TypeParameterKind.Method; } - protected override Task> DetermineDocumentsToSearchAsync( + protected override Task> DetermineDocumentsToSearchAsync( ITypeParameterSymbol symbol, Project project, IImmutableSet documents, @@ -30,7 +30,7 @@ protected override bool CanFind(ITypeParameterSymbol symbol) return FindDocumentsAsync(project, documents, cancellationToken, symbol.Name, symbol.ContainingType.Name); } - protected override Task> FindReferencesInDocumentAsync( + protected override Task> FindReferencesInDocumentAsync( ITypeParameterSymbol symbol, Document document, CancellationToken cancellationToken) diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Hierarchy.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Hierarchy.cs index 3644f1dbfb4ec18d6058fae6ee70bf8ac974c2df..600430442b76dcaaca8a08b2bf6c16c00a8bd901 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Hierarchy.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolFinder_Hierarchy.cs @@ -218,7 +218,7 @@ public static partial class SymbolFinder return result.Select(s => s.Symbol).ToList(); } - internal static async Task> FindImplementationsAsync( + internal static async Task> FindImplementationsAsync( SymbolAndProjectId symbolAndProjectId, Solution solution, IImmutableSet projects = null, CancellationToken cancellationToken = default(CancellationToken)) { // A symbol can only have implementations if it's an interface or a @@ -230,14 +230,14 @@ public static partial class SymbolFinder var implementingTypes = await DependentTypeFinder.FindTransitivelyImplementingTypesAsync(namedTypeSymbol, solution, projects, cancellationToken).ConfigureAwait(false); return implementingTypes.Select(s => (SymbolAndProjectId)s) .Where(IsAccessible) - .ToList(); + .ToImmutableArray(); } else if (symbol.IsImplementableMember()) { var containingType = symbol.ContainingType.OriginalDefinition; var allTypes = await DependentTypeFinder.FindTransitivelyImplementingTypesAsync(containingType, solution, projects, cancellationToken).ConfigureAwait(false); - List results = null; + ImmutableArray.Builder results = null; foreach (var t in allTypes.Convert()) { foreach (var m in t.FindImplementationsForInterfaceMember(symbol, solution.Workspace, cancellationToken)) @@ -246,7 +246,7 @@ public static partial class SymbolFinder var bestDef = sourceDef.Symbol != null ? sourceDef : m; if (IsAccessible(bestDef)) { - results = results ?? new List(); + results = results ?? ImmutableArray.CreateBuilder(); results.Add(bestDef.WithSymbol(bestDef.Symbol.OriginalDefinition)); } } @@ -254,11 +254,12 @@ public static partial class SymbolFinder if (results != null) { - return results.Distinct(SymbolAndProjectIdComparer.SymbolEquivalenceInstance); + return results.Distinct(SymbolAndProjectIdComparer.SymbolEquivalenceInstance) + .ToImmutableArray(); } } - return SpecializedCollections.EmptyEnumerable(); + return ImmutableArray.Empty; } private static bool IsAccessible(SymbolAndProjectId symbolAndProjectId) @@ -278,7 +279,8 @@ private static bool IsAccessible(SymbolAndProjectId symbolAndProjectId) /// /// Finds all the callers of a specified symbol. /// - public static Task> FindCallersAsync(ISymbol symbol, Solution solution, CancellationToken cancellationToken = default(CancellationToken)) + public static Task> FindCallersAsync( + ISymbol symbol, Solution solution, CancellationToken cancellationToken = default(CancellationToken)) { return FindCallersAsync(symbol, solution, documents: null, cancellationToken: cancellationToken); } @@ -322,7 +324,7 @@ public static async Task> FindCallersAsync(ISymbol return results ?? SpecializedCollections.EmptyEnumerable(); } - private static Task> FindCallReferencesAsync( + private static async Task> FindCallReferencesAsync( Solution solution, ISymbol symbol, IImmutableSet documents, @@ -334,11 +336,13 @@ public static async Task> FindCallersAsync(ISymbol symbol.Kind == SymbolKind.Method || symbol.Kind == SymbolKind.Property) { - return SymbolFinder.FindReferencesAsync(symbol, solution, documents, cancellationToken); + var result = await FindReferencesAsync( + symbol, solution, documents, cancellationToken).ConfigureAwait(false); + return result.ToImmutableArray(); } } - return SpecializedTasks.EmptyEnumerable(); + return ImmutableArray.Empty; } private static bool OriginalSymbolsMatch( diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs index 58578a48c15946f214aeab138c6fb8989b26b64f..b537ebfaef161756a0b9d1f6e429f3ea23e433aa 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Metadata.cs @@ -583,16 +583,16 @@ private void EnsureParentsAndChildren(List simpleNames) private ImmutableArray GenerateUnsortedNodes() { - var unsortedNodes = ImmutableArray.CreateBuilder(); + var unsortedNodes = ArrayBuilder.GetInstance(); unsortedNodes.Add(new BuilderNode(name: "", parentIndex: RootNodeParentIndex)); AddUnsortedNodes(unsortedNodes, parentNode: _rootNode, parentIndex: 0); - return unsortedNodes.ToImmutable(); + return unsortedNodes.ToImmutableAndFree(); } private void AddUnsortedNodes( - ImmutableArray.Builder unsortedNodes, MetadataNode parentNode, int parentIndex) + ArrayBuilder unsortedNodes, MetadataNode parentNode, int parentIndex) { foreach (var child in _parentToChildren[parentNode]) { diff --git a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs index 10940f9412bade7fc05032c993bf391db29979ed..0139233a6bba86805abd9f209be5372721c7d551 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/SymbolTree/SymbolTreeInfo_Source.cs @@ -43,20 +43,20 @@ private static void FreeSymbolMap(MultiDictionary symbolMap) return null; } - var unsortedNodes = ImmutableArray.CreateBuilder(); + var unsortedNodes = ArrayBuilder.GetInstance(); unsortedNodes.Add(new BuilderNode(assembly.GlobalNamespace.Name, RootNodeParentIndex)); GenerateSourceNodes(assembly.GlobalNamespace, unsortedNodes, s_getMembersNoPrivate); return CreateSymbolTreeInfo( - solution, version, filePath, unsortedNodes.ToImmutable(), + solution, version, filePath, unsortedNodes.ToImmutableAndFree(), inheritanceMap: new OrderPreservingMultiDictionary()); } // generate nodes for the global namespace an all descendants private static void GenerateSourceNodes( INamespaceSymbol globalNamespace, - ImmutableArray.Builder list, + ArrayBuilder list, Action> lookup) { // Add all child members @@ -89,7 +89,7 @@ private static void FreeSymbolMap(MultiDictionary symbolMap) string name, int parentIndex, MultiDictionary.ValueSet symbolsWithSameName, - ImmutableArray.Builder list, + ArrayBuilder list, Action> lookup) { var node = new BuilderNode(name, parentIndex); diff --git a/src/Workspaces/Core/Portable/Shared/Extensions/ISymbolExtensions.cs b/src/Workspaces/Core/Portable/Shared/Extensions/ISymbolExtensions.cs index 3bacd49a8fcfaea96d89ed75c63d0c26b2b3753a..8319608bcb6300b23f90996d91ba98ea57a0d848 100644 --- a/src/Workspaces/Core/Portable/Shared/Extensions/ISymbolExtensions.cs +++ b/src/Workspaces/Core/Portable/Shared/Extensions/ISymbolExtensions.cs @@ -416,7 +416,7 @@ public static ImmutableArray GetTypeArguments(this ISymbol symbol) public static ImmutableArray GetAllTypeArguments(this ISymbol symbol) { - var results = ImmutableArray.CreateBuilder(); + var results = ArrayBuilder.GetInstance(); results.AddRange(symbol.GetTypeArguments()); var containingType = symbol.ContainingType; @@ -426,7 +426,7 @@ public static ImmutableArray GetAllTypeArguments(this ISymbol symbo containingType = containingType.ContainingType; } - return results.AsImmutable(); + return results.ToImmutableAndFree(); } public static bool IsAttribute(this ISymbol symbol) diff --git a/src/Workspaces/Core/Portable/Shared/Extensions/SymbolInfoExtensions.cs b/src/Workspaces/Core/Portable/Shared/Extensions/SymbolInfoExtensions.cs index b815444e5a7a730d622764e3ffc2b8c4e7009b04..5cec3f1f3985664d24e08baf4857efb0cd8b53be 100644 --- a/src/Workspaces/Core/Portable/Shared/Extensions/SymbolInfoExtensions.cs +++ b/src/Workspaces/Core/Portable/Shared/Extensions/SymbolInfoExtensions.cs @@ -21,10 +21,10 @@ private static ImmutableArray GetAllSymbolsWorker(this SymbolInfo info) } else { - var builder = ImmutableArray.CreateBuilder(info.CandidateSymbols.Length + 1); + var builder = ArrayBuilder.GetInstance(info.CandidateSymbols.Length + 1); builder.Add(info.Symbol); builder.AddRange(info.CandidateSymbols); - return builder.ToImmutable(); + return builder.ToImmutableAndFree(); } } diff --git a/src/Workspaces/CoreTest/Execution/SnapshotSerializationTests.cs b/src/Workspaces/CoreTest/Execution/SnapshotSerializationTests.cs index d24eae4b4b58782425476cef532aad4d9b29afdd..f71b57d31ef6e89858ef5bedc7cb4c40102d998a 100644 --- a/src/Workspaces/CoreTest/Execution/SnapshotSerializationTests.cs +++ b/src/Workspaces/CoreTest/Execution/SnapshotSerializationTests.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Composition; using System.IO; using System.Linq; using System.Reflection; @@ -11,6 +12,7 @@ using Microsoft.CodeAnalysis.CSharp.CodeStyle; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Execution; +using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Text; @@ -493,6 +495,23 @@ public async Task SnapshotWithMissingReferencesTest() } } + [Fact] + public async Task UnknownLanguageTest() + { + var hostServices = MefHostServices.Create(MefHostServices.DefaultAssemblies.Add(typeof(NullLanguageService).Assembly)); + + var solution = new AdhocWorkspace(hostServices).CurrentSolution; + + var project1 = solution.AddProject("Project", "Project.dll", NullLanguageService.TestLanguage); + + var snapshotService = (new SolutionChecksumServiceFactory()).CreateService(solution.Workspace.Services) as ISolutionChecksumService; + using (var snapshot = await snapshotService.CreateChecksumAsync(project1.Solution, CancellationToken.None).ConfigureAwait(false)) + { + // this shouldn't throw + var recovered = await GetSolutionAsync(snapshotService, snapshot).ConfigureAwait(false); + } + } + private static async Task VerifyOptionSetsAsync(Workspace workspace, string language) { var assetBuilder = new AssetBuilder(workspace.CurrentSolution); @@ -522,12 +541,17 @@ private static async Task VerifyOptionSetsAsync(Workspace workspace, string lang private async Task GetSolutionAsync(ISolutionChecksumService service, ChecksumScope snapshot) { var workspace = new AdhocWorkspace(); - var solutionInfo = await GetValueAsync(service, snapshot.SolutionChecksum.Info, WellKnownChecksumObjects.SolutionChecksumObjectInfo).ConfigureAwait(false); var projects = new List(); foreach (var projectSnapshot in snapshot.SolutionChecksum.Projects.ToProjectObjects(service)) { + var projectInfo = await GetValueAsync(service, projectSnapshot.Info, WellKnownChecksumObjects.ProjectChecksumObjectInfo).ConfigureAwait(false); + if (!workspace.Services.IsSupported(projectInfo.Language)) + { + continue; + } + var documents = new List(); foreach (var documentSnapshot in projectSnapshot.Documents.ToDocumentObjects(service)) { @@ -584,7 +608,6 @@ private async Task GetSolutionAsync(ISolutionChecksumService service, documentInfo.IsGenerated)); } - var projectInfo = await GetValueAsync(service, projectSnapshot.Info, WellKnownChecksumObjects.ProjectChecksumObjectInfo).ConfigureAwait(false); var compilationOptions = await GetValueAsync(service, projectSnapshot.CompilationOptions, WellKnownChecksumObjects.CompilationOptions).ConfigureAwait(false); var parseOptions = await GetValueAsync(service, projectSnapshot.ParseOptions, WellKnownChecksumObjects.ParseOptions).ConfigureAwait(false); @@ -631,6 +654,16 @@ private static Asset BuildAsset(AssetBuilder builder, string kind, object value) } } + private interface INullLanguageService : ILanguageService { } + + [ExportLanguageService(typeof(INullLanguageService), TestLanguage), Shared] + private class NullLanguageService : INullLanguageService + { + public const string TestLanguage = nameof(TestLanguage); + + // do nothing + } + private class MissingAnalyzerLoader : AnalyzerAssemblyLoader { protected override Assembly LoadFromPathImpl(string fullPath) diff --git a/src/Workspaces/Remote/Core/Services/SolutionService.cs b/src/Workspaces/Remote/Core/Services/SolutionService.cs index 1bc721cb87f2ede4838774ae7d05560df64a676e..21a3f87420f0d90552602598d47b9ab2782d8225 100644 --- a/src/Workspaces/Remote/Core/Services/SolutionService.cs +++ b/src/Workspaces/Remote/Core/Services/SolutionService.cs @@ -79,6 +79,14 @@ private async Task CreateSolutionAsync(Checksum solutionChecksum, Canc { var projectSnapshot = await RoslynServices.AssetService.GetAssetAsync(projectChecksum, cancellationToken).ConfigureAwait(false); + var projectInfo = await RoslynServices.AssetService.GetAssetAsync(projectSnapshot.Info, cancellationToken).ConfigureAwait(false); + if (!workspace.Services.IsSupported(projectInfo.Language)) + { + // only add project our workspace supports. + // workspace doesn't allow creating project with unknown languages + continue; + } + var documents = new List(); foreach (var documentChecksum in projectSnapshot.Documents) { @@ -146,7 +154,6 @@ private async Task CreateSolutionAsync(Checksum solutionChecksum, Canc documentInfo.IsGenerated)); } - var projectInfo = await RoslynServices.AssetService.GetAssetAsync(projectSnapshot.Info, cancellationToken).ConfigureAwait(false); var compilationOptions = await RoslynServices.AssetService.GetAssetAsync(projectSnapshot.CompilationOptions, cancellationToken).ConfigureAwait(false); var parseOptions = await RoslynServices.AssetService.GetAssetAsync(projectSnapshot.ParseOptions, cancellationToken).ConfigureAwait(false); diff --git a/src/Workspaces/VisualBasic/Portable/FindSymbols/VisualBasicReferenceFinder.vb b/src/Workspaces/VisualBasic/Portable/FindSymbols/VisualBasicReferenceFinder.vb index 01146226c857c94706ea5ee9dc93f4c22229ee52..35d537831e909b479016e18eb961327b6192e864 100644 --- a/src/Workspaces/VisualBasic/Portable/FindSymbols/VisualBasicReferenceFinder.vb +++ b/src/Workspaces/VisualBasic/Portable/FindSymbols/VisualBasicReferenceFinder.vb @@ -1,5 +1,6 @@ ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +Imports System.Collections.Immutable Imports System.Composition Imports System.Threading Imports System.Threading.Tasks @@ -14,47 +15,48 @@ Namespace Microsoft.CodeAnalysis.FindSymbols Public Function DetermineCascadedSymbolsAsync(symbolAndProjectId As SymbolAndProjectId, project As Project, - cancellationToken As CancellationToken) As Task(Of IEnumerable(Of SymbolAndProjectId)) Implements ILanguageServiceReferenceFinder.DetermineCascadedSymbolsAsync + cancellationToken As CancellationToken) As Task(Of ImmutableArray(Of SymbolAndProjectId)) Implements ILanguageServiceReferenceFinder.DetermineCascadedSymbolsAsync Dim symbol = symbolAndProjectId.Symbol - If Symbol.Kind = SymbolKind.Property Then + If symbol.Kind = SymbolKind.Property Then Return DetermineCascadedSymbolsAsync( symbolAndProjectId.WithSymbol(DirectCast(symbol, IPropertySymbol)), project, cancellationToken) - ElseIf Symbol.Kind = SymbolKind.NamedType Then + ElseIf symbol.Kind = SymbolKind.NamedType Then Return DetermineCascadedSymbolsAsync( symbolAndProjectId.WithSymbol(DirectCast(symbol, INamedTypeSymbol)), project, cancellationToken) Else - Return Task.FromResult(Of IEnumerable(Of SymbolAndProjectId))(Nothing) + Return Task.FromResult(ImmutableArray(Of SymbolAndProjectId).Empty) End If End Function Private Async Function DetermineCascadedSymbolsAsync( [propertyAndProjectId] As SymbolAndProjectId(Of IPropertySymbol), project As Project, - cancellationToken As CancellationToken) As Task(Of IEnumerable(Of SymbolAndProjectId)) + cancellationToken As CancellationToken) As Task(Of ImmutableArray(Of SymbolAndProjectId)) Dim [property] = propertyAndProjectId.Symbol Dim compilation = Await project.GetCompilationAsync(cancellationToken).ConfigureAwait(False) Dim relatedSymbol = [property].FindRelatedExplicitlyDeclaredSymbol(compilation) Return If([property].Equals(relatedSymbol), - SpecializedCollections.EmptyEnumerable(Of SymbolAndProjectId), - SpecializedCollections.SingletonEnumerable( + ImmutableArray(Of SymbolAndProjectId).Empty, + ImmutableArray.Create( SymbolAndProjectId.Create(relatedSymbol, project.Id))) End Function Private Async Function DetermineCascadedSymbolsAsync( namedType As SymbolAndProjectId(Of INamedTypeSymbol), project As Project, - cancellationToken As CancellationToken) As Task(Of IEnumerable(Of SymbolAndProjectId)) + cancellationToken As CancellationToken) As Task(Of ImmutableArray(Of SymbolAndProjectId)) Dim compilation = Await project.GetCompilationAsync(cancellationToken).ConfigureAwait(False) ' If this is a WinForms project, then the VB 'my' feature may have synthesized ' a property that would return an instance of the main Form type for the project. ' Search for such properties and cascade to them as well. - Return GetMatchingMyPropertySymbols(namedType, project.Id, compilation, cancellationToken).Distinct().ToList() + Return GetMatchingMyPropertySymbols(namedType, project.Id, compilation, cancellationToken). + Distinct().ToImmutableArray() End Function Private Function GetMatchingMyPropertySymbols( diff --git a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb index b4d8caedb0c0d4a6a7d08b4a5a977e559d4d6e61..e67942a185e6d47fd474923b37b43ba39e3eee7e 100644 --- a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb +++ b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb @@ -925,7 +925,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Function Private Function GetInheritanceNames(typeBlock As TypeBlockSyntax) As ImmutableArray(Of String) - Dim builder = ImmutableArray.CreateBuilder(Of String) + Dim builder = ArrayBuilder(Of String).GetInstance() Dim aliasMap = GetAliasMap(typeBlock) Try @@ -937,7 +937,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic AddInheritanceNames(builder, implementsStatement.Types, aliasMap) Next - Return builder.ToImmutable() + Return builder.ToImmutableAndFree() Finally FreeAliasMap(aliasMap) End Try @@ -966,7 +966,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Function Private Sub AddInheritanceNames( - builder As ImmutableArray(Of String).Builder, + builder As ArrayBuilder(Of String), types As SeparatedSyntaxList(Of TypeSyntax), aliasMap As Dictionary(Of String, String)) @@ -976,7 +976,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Sub Private Sub AddInheritanceName( - builder As ImmutableArray(Of String).Builder, + builder As ArrayBuilder(Of String), typeSyntax As TypeSyntax, aliasMap As Dictionary(Of String, String)) Dim name = GetTypeName(typeSyntax)