提交 0542b844 编写于 作者: C CyrusNajmabadi

Move to immutable arrays in tests.

上级 5961e610
......@@ -8,6 +8,7 @@
using Roslyn.Test.Utilities;
using Xunit;
using System.Collections.Generic;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.UnitTests.Diagnostics
{
......@@ -1285,10 +1286,8 @@ private static void VerifyNoMemberResolution(string markup, string language, boo
private static void VerifyResolution(string markup, string[] fxCopFullyQualifiedNames, SuppressMessageAttributeState.TargetScope scope, string language, string rootNamespace)
{
// Parse out the span containing the declaration of the expected symbol
string source;
int? pos;
IDictionary<string, IList<TextSpan>> spans;
MarkupTestFile.GetPositionAndSpans(markup, out source, out pos, out spans);
MarkupTestFile.GetPositionAndSpans(markup,
out var source, out var pos, out IDictionary<string, ImmutableArray<TextSpan>> spans);
Assert.True(pos != null || spans.Count > 0, "Must specify a position or spans marking expected symbols for resolution");
......
......@@ -647,7 +647,7 @@ Friend Module CompilationUtils
Public Function CreateParseTreeAndSpans(programElement As XElement, Optional parseOptions As VisualBasicParseOptions = Nothing) As (tree As SyntaxTree, spans As IList(Of TextSpan))
Dim codeWithMarker As String = FilterString(programElement.Value)
Dim codeWithoutMarker As String = Nothing
Dim spans As IList(Of TextSpan) = Nothing
Dim spans As ImmutableArray(Of TextSpan) = Nothing
MarkupTestFile.GetSpans(codeWithMarker, codeWithoutMarker, spans)
Dim text = SourceText.From(codeWithoutMarker, Encoding.UTF8)
......
// 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.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Formatting;
using Roslyn.Test.Utilities;
......@@ -84,7 +85,7 @@ class Class2 { }
await TestMoveTypeToNewFileAsync(
code, codeAfterMove, expectedDocumentName,
destinationDocumentText, destinationDocumentContainers: new [] {"A", "B"});
destinationDocumentText, destinationDocumentContainers: ImmutableArray.Create("A", "B"));
}
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
......
......@@ -45,10 +45,8 @@ protected override TestWorkspace CreateWorkspaceFromFile(string initialMarkup, T
return (null, new CSharpAddImportCodeFixProvider(data.Item1, data.Item2));
}
protected override IList<CodeAction> MassageActions(IList<CodeAction> actions)
{
return FlattenActions(actions);
}
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> FlattenActions(actions);
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddImport)]
public async Task TestSearchPackageSingleName()
......
// 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.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
......@@ -17,7 +18,7 @@ public class FullyQualifyTests : AbstractCSharpDiagnosticProviderBasedUserDiagno
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new CSharpFullyQualifyCodeFixProvider());
protected override IList<CodeAction> MassageActions(IList<CodeAction> actions)
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> FlattenActions(actions);
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsFullyQualify)]
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
......@@ -19,7 +20,7 @@ public partial class GenerateTypeTests : AbstractCSharpDiagnosticProviderBasedUs
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new GenerateTypeCodeFixProvider());
protected override IList<CodeAction> MassageActions(IList<CodeAction> codeActions)
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> codeActions)
=> FlattenActions(codeActions);
#region Generate Class
......@@ -212,7 +213,7 @@ public async Task TestGenerateClassFromFieldDeclarationIntoGlobalNamespace()
await TestAddDocumentInRegularAndScriptAsync(
@"class Program { void Main ( ) { [|Foo|] f ; } } ",
@"internal class Foo { } ",
expectedContainers: Array.Empty<string>(),
expectedContainers: ImmutableArray<string>.Empty,
expectedDocumentName: "Foo.cs");
}
......@@ -222,7 +223,7 @@ public async Task TestGenerateClassFromFieldDeclarationIntoCustomNamespace()
await TestAddDocumentInRegularAndScriptAsync(
@"class Class { [|TestNamespace|].Foo f; }",
@"namespace TestNamespace { internal class Foo { } }",
expectedContainers: new List<string> { "TestNamespace" },
expectedContainers: ImmutableArray.Create("TestNamespace"),
expectedDocumentName: "Foo.cs");
}
......@@ -916,7 +917,7 @@ public async Task TestGenerateClassFromIntoNewNamespace()
await TestAddDocumentInRegularAndScriptAsync(
@"class Class { static void Main(string[] args) { [|N|].C c; } }",
@"namespace N { internal class C { } }",
expectedContainers: new List<string> { "N" },
expectedContainers: ImmutableArray.Create("N"),
expectedDocumentName: "C.cs");
}
......@@ -2904,7 +2905,7 @@ public async Task TestGenerateIntoNewFile()
await TestAddDocumentInRegularAndScriptAsync(
@"class Class { void F() { new [|Foo|].Bar(); } }",
@"namespace Foo { internal class Bar { public Bar() { } } }",
expectedContainers: new List<string> { "Foo" },
expectedContainers: ImmutableArray.Create("Foo"),
expectedDocumentName: "Bar.cs");
}
......@@ -4178,7 +4179,7 @@ public async Task TestAddDocumentForGlobalNamespace()
await TestAddDocumentInRegularAndScriptAsync(
@"class C : [|Foo|]",
"internal class Foo { }",
Array.Empty<string>(),
ImmutableArray<string>.Empty,
"Foo.cs");
}
......@@ -4372,7 +4373,7 @@ public class ClassB
await TestAddDocumentInRegularAndScriptAsync(code,
expected,
expectedContainers: Array.Empty<string>(),
expectedContainers: ImmutableArray<string>.Empty,
expectedDocumentName: "ClassB.cs",
ignoreTrivia: false);
}
......@@ -4403,7 +4404,7 @@ public class ClassB
await TestAddDocumentInRegularAndScriptAsync(code,
expected,
expectedContainers: new List<string> { "Namespace1", "Namespace2" },
expectedContainers: ImmutableArray.Create("Namespace1", "Namespace2"),
expectedDocumentName: "ClassB.cs",
ignoreTrivia: false);
}
......@@ -4788,7 +4789,7 @@ public partial class GenerateTypeWithUnboundAnalyzerTests : AbstractCSharpDiagno
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (new CSharpUnboundIdentifiersDiagnosticAnalyzer(), new GenerateTypeCodeFixProvider());
protected override IList<CodeAction> MassageActions(IList<CodeAction> codeActions)
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> codeActions)
=> FlattenActions(codeActions);
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateType)]
......
// 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;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.GenerateType;
using Roslyn.Test.Utilities;
......@@ -692,7 +693,7 @@ public interface Foo
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
newFileName: "Test2.cs");
}
......@@ -732,7 +733,7 @@ public interface Foo
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
newFileName: "Test2.cs");
}
......@@ -775,7 +776,7 @@ void Main()
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
newFileName: "Test2.cs");
}
......@@ -812,7 +813,7 @@ public interface Foo
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
newFileName: "Test2.cs");
}
......@@ -856,7 +857,7 @@ void Main()
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
newFileName: "Test2.cs");
}
......@@ -904,7 +905,7 @@ void Main()
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer" },
newFileFolderContainers: ImmutableArray.Create("outer"),
newFileName: "Test2.cs");
}
......@@ -954,7 +955,7 @@ namespace A.B
accessibility: Accessibility.Public,
typeKind: TypeKind.Interface,
isNewFile: true,
newFileFolderContainers: new string[] { "outer" },
newFileFolderContainers: ImmutableArray.Create("outer"),
newFileName: "Test2.cs");
}
......@@ -1011,7 +1012,7 @@ void Main()
typeKind: TypeKind.Interface,
isNewFile: true,
areFoldersValidIdentifiers: false,
newFileFolderContainers: new string[] { "123", "456" },
newFileFolderContainers: ImmutableArray.Create("123", "456"),
newFileName: "Test2.cs");
}
......@@ -1205,7 +1206,7 @@ public interface Foo
typeKind: TypeKind.Interface,
isNewFile: true,
newFileName: "Test2.cs",
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
projectName: "Assembly2");
}
......@@ -1251,7 +1252,7 @@ void Main()
typeKind: TypeKind.Interface,
isNewFile: true,
newFileName: "Test2.cs",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1291,7 +1292,7 @@ public interface Foo
typeKind: TypeKind.Interface,
isNewFile: true,
newFileName: "Test2.cs",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1338,7 +1339,7 @@ void Main()
typeKind: TypeKind.Interface,
isNewFile: true,
newFileName: "Test2.cs",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1379,7 +1380,7 @@ public interface Foo
typeKind: TypeKind.Interface,
isNewFile: true,
newFileName: "Test2.cs",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
#endregion
......@@ -1418,7 +1419,7 @@ End Namespace
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
projectName: "Assembly2");
}
......@@ -1463,7 +1464,7 @@ void Main()
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1502,7 +1503,7 @@ End Namespace
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1548,7 +1549,7 @@ void Main()
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1588,7 +1589,7 @@ End Namespace
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1634,7 +1635,7 @@ End Namespace
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test3.vb",
newFileFolderContainers: new string[] { "outer", "inner" },
newFileFolderContainers: ImmutableArray.Create("outer", "inner"),
projectName: "Assembly2");
}
......@@ -1672,7 +1673,7 @@ End Namespace
typeKind: TypeKind.Class,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
projectName: "Assembly2");
}
......@@ -1892,7 +1893,7 @@ End Namespace
typeKind: TypeKind.Module,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
projectName: "Assembly2",
assertGenerateTypeDialogOptions: new GenerateTypeDialogOptions(false, TypeKindOptions.Class | TypeKindOptions.Structure | TypeKindOptions.Module));
}
......@@ -2919,7 +2920,7 @@ End Namespace
typeKind: TypeKind.Delegate,
isNewFile: true,
newFileName: "Test2.vb",
newFileFolderContainers: Array.Empty<string>(),
newFileFolderContainers: ImmutableArray<string>.Empty,
projectName: "Assembly2");
}
......
// 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.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
......@@ -35,10 +36,8 @@ internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProvider
return options;
}
protected override IList<CodeAction> MassageActions(IList<CodeAction> actions)
{
return FlattenActions(actions);
}
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> FlattenActions(actions);
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateVariable)]
public async Task TestSimpleLowercaseIdentifier1()
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
......@@ -17,7 +18,7 @@ public class SpellCheckTests : AbstractCSharpDiagnosticProviderBasedUserDiagnost
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new CSharpSpellCheckCodeFixProvider());
protected override IList<CodeAction> MassageActions(IList<CodeAction> actions)
protected override ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> FlattenActions(actions);
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsSpellcheck)]
......
// 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;
using Microsoft.CodeAnalysis;
......@@ -61,10 +62,8 @@ private void Test(string markup, bool isMissing, bool isLine, ParseOptions optio
private void TestAll(string markup)
{
int position;
IList<TextSpan> expectedSpans;
string source;
MarkupTestFile.GetPositionAndSpans(markup, out source, out position, out expectedSpans);
MarkupTestFile.GetPositionAndSpans(markup,
out var source, out var position, out ImmutableArray<TextSpan> expectedSpans);
var tree = SyntaxFactory.ParseSyntaxTree(source);
var root = tree.GetRoot();
......
......@@ -10,6 +10,7 @@
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using System.Collections.Generic;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.SplitStringLiteral
{
......@@ -31,7 +32,8 @@ public class SplitStringLiteralCommandHandlerTests
if (expectedOutputMarkup != null)
{
MarkupTestFile.GetSpans(expectedOutputMarkup, out var expectedOutput, out IList<TextSpan> expectedSpans);
MarkupTestFile.GetSpans(expectedOutputMarkup,
out var expectedOutput, out ImmutableArray<TextSpan> expectedSpans);
Assert.Equal(expectedOutput, view.TextBuffer.CurrentSnapshot.AsText().ToString());
Assert.Equal(expectedSpans.Single().Start, view.Caret.Position.BufferPosition.Position);
......
......@@ -359,10 +359,10 @@ private ImmutableArray<CodeRefactoring> FilterOnUIThread(ImmutableArray<CodeRefa
private CodeRefactoring FilterOnUIThread(CodeRefactoring refactoring, Workspace workspace)
{
var actions = refactoring.Actions.Where(a => IsApplicable(a, workspace)).ToList();
return actions.Count == 0
var actions = refactoring.Actions.WhereAsArray(a => IsApplicable(a, workspace));
return actions.Length == 0
? null
: actions.Count == refactoring.Actions.Count
: actions.Length == refactoring.Actions.Length
? refactoring
: new CodeRefactoring(refactoring.Provider, actions);
}
......
......@@ -43,7 +43,7 @@ public async Task TestCodeActionPreviewAndApply()
workspace,
expectedText: expectedCode,
index: 0,
actions: codeIssueOrRefactoring.Actions.ToList(),
actions: codeIssueOrRefactoring.Actions,
expectedPreviewContents: expectedCode);
}
}
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Globalization;
using System.Linq;
using System.Threading;
......@@ -741,13 +742,13 @@ private static IList<string> BreakIntoWordParts(string identifier)
private static PatternMatch? TryMatchSingleWordPattern(string candidate, string pattern)
{
MarkupTestFile.GetSpans(candidate, out candidate, out IList<TextSpan> spans);
MarkupTestFile.GetSpans(candidate, out candidate, out ImmutableArray<TextSpan> spans);
var match = new PatternMatcher(pattern).MatchSingleWordPattern_ForTestingOnly(candidate);
if (match == null)
{
Assert.True(spans == null || spans.Count == 0);
Assert.True(spans.Length == 0);
}
else
{
......@@ -759,13 +760,13 @@ private static IList<string> BreakIntoWordParts(string identifier)
private static IEnumerable<PatternMatch> TryMatchMultiWordPattern(string candidate, string pattern)
{
MarkupTestFile.GetSpans(candidate, out candidate, out IList<TextSpan> expectedSpans);
MarkupTestFile.GetSpans(candidate, out candidate, out ImmutableArray<TextSpan> expectedSpans);
var matches = new PatternMatcher(pattern).GetMatches(candidate, includeMatchSpans: true);
if (matches.IsDefaultOrEmpty)
{
Assert.True(expectedSpans == null || expectedSpans.Count == 0);
Assert.True(expectedSpans.Length == 0);
return null;
}
else
......
' 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 Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
......@@ -36,7 +37,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.Simplification
End Function
Private Async Function TestAsync(workspace As Workspace,
listOfLabelToAddSimplifierAnnotationSpans As IEnumerable(Of KeyValuePair(Of String, IList(Of TextSpan))),
listOfLabelToAddSimplifierAnnotationSpans As IEnumerable(Of KeyValuePair(Of String, ImmutableArray(Of TextSpan))),
explicitSpansToSimplifyWithin As IEnumerable(Of TextSpan),
expected As XElement,
simplificationOptions As Dictionary(Of OptionKey, Object)) As System.Threading.Tasks.Task
......
......@@ -79,7 +79,7 @@ internal abstract class AbstractCommandHandlerTestState : IDisposable
|| cursorPosition == lastSpan.Start || cursorPosition == lastSpan.End,
"cursorPosition wasn't at an endpoint of the 'Selection' annotated span");
_textView.Selection.Mode = selectionSpanList.Count > 1
_textView.Selection.Mode = selectionSpanList.Length > 1
? TextSelectionMode.Box
: TextSelectionMode.Stream;
......
// 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;
using System.Threading.Tasks;
......@@ -31,7 +31,7 @@ protected async Task TestAsync(string markup, string expectedCode, ParseOptions
var braceMatcher = workspace.GetService<IBraceMatchingService>();
var foundSpan = await braceMatcher.FindMatchingSpanAsync(document, position, CancellationToken.None);
MarkupTestFile.GetSpans(expectedCode, out var parsedExpectedCode, out IList<TextSpan> expectedSpans);
MarkupTestFile.GetSpans(expectedCode, out var parsedExpectedCode, out ImmutableArray<TextSpan> expectedSpans);
if (expectedSpans.Any())
{
......
......@@ -38,8 +38,10 @@ protected override ParseOptions GetScriptOptions()
optionsService.UpdatedSignature = updatedSignature;
var codeIssueOrRefactoring = await GetCodeRefactoringAsync(workspace, testOptions);
await TestActionsAsync(workspace, expectedCode, index, codeIssueOrRefactoring.Actions.ToList(),
conflictSpans: null, renameSpans: null, warningSpans: null, ignoreTrivia: true);
await TestActionsAsync(workspace, expectedCode, index, codeIssueOrRefactoring.Actions,
conflictSpans: ImmutableArray<Text.TextSpan>.Empty,
renameSpans: ImmutableArray<Text.TextSpan>.Empty,
warningSpans: ImmutableArray<Text.TextSpan>.Empty, ignoreTrivia: true);
}
}
else
......
......@@ -86,17 +86,17 @@ public TestParameters WithFixProviderData(object fixProviderData)
using (var workspace = CreateWorkspaceFromOptions(initialMarkup, parameters))
{
var actions = await GetCodeActionsAsync(workspace, parameters);
Assert.True(actions == null || actions.Count == 0);
Assert.True(actions.Length == 0);
}
}
protected async Task<IList<CodeAction>> GetCodeActionsAsync(
protected async Task<ImmutableArray<CodeAction>> GetCodeActionsAsync(
TestWorkspace workspace, TestParameters parameters)
{
return MassageActions(await GetCodeActionsWorkerAsync(workspace, parameters));
}
protected abstract Task<IList<CodeAction>> GetCodeActionsWorkerAsync(
protected abstract Task<ImmutableArray<CodeAction>> GetCodeActionsWorkerAsync(
TestWorkspace workspace, TestParameters parameters);
protected async Task TestSmartTagTextAsync(
......@@ -143,7 +143,7 @@ public TestParameters WithFixProviderData(object fixProviderData)
protected async Task TestAddDocumentInRegularAndScriptAsync(
string initialMarkup, string expectedMarkup,
IList<string> expectedContainers,
ImmutableArray<string> expectedContainers,
string expectedDocumentName,
int index = 0,
bool ignoreTrivia = true,
......@@ -167,7 +167,7 @@ public TestParameters WithFixProviderData(object fixProviderData)
string expectedMarkup,
int index,
string expectedDocumentName,
IList<string> expectedContainers,
ImmutableArray<string> expectedContainers,
bool ignoreTrivia = true)
{
var codeActions = await GetCodeActionsAsync(workspace, parameters);
......@@ -179,7 +179,7 @@ public TestParameters WithFixProviderData(object fixProviderData)
protected async Task TestAddDocument(
string initialMarkup,
string expectedMarkup,
IList<string> expectedContainers,
ImmutableArray<string> expectedContainers,
string expectedDocumentName,
int index = 0,
bool ignoreTrivia = true,
......@@ -198,9 +198,9 @@ public TestParameters WithFixProviderData(object fixProviderData)
TestWorkspace workspace,
string expectedMarkup,
int index,
IList<string> expectedFolders,
ImmutableArray<string> expectedFolders,
string expectedDocumentName,
IList<CodeAction> actions,
ImmutableArray<CodeAction> actions,
bool ignoreTrivia)
{
var operations = await VerifyInputsAndGetOperationsAsync(index, actions);
......@@ -221,7 +221,7 @@ public TestParameters WithFixProviderData(object fixProviderData)
ImmutableArray<CodeActionOperation> operations,
bool hasProjectChange,
ProjectId modifiedProjectId,
IList<string> expectedFolders,
ImmutableArray<string> expectedFolders,
string expectedDocumentName,
bool ignoreTrivia)
{
......@@ -268,7 +268,7 @@ public TestParameters WithFixProviderData(object fixProviderData)
{
// If there are more changes than just the document we need to browse all the changes and get the document change
var contents = editHandler.GetPreviews(workspace, operations, CancellationToken.None);
bool hasPreview = false;
var hasPreview = false;
var previews = await contents.GetPreviewsAsync();
if (previews != null)
{
......@@ -347,11 +347,12 @@ public TestParameters WithFixProviderData(object fixProviderData)
CodeActionPriority? priority,
TestParameters parameters)
{
MarkupTestFile.GetSpans(expectedMarkup.NormalizeLineEndings(), out var expected, out IDictionary<string, IList<TextSpan>> spanMap);
MarkupTestFile.GetSpans(
expectedMarkup.NormalizeLineEndings(), out var expected, out IDictionary<string, ImmutableArray<TextSpan>> spanMap);
var conflictSpans = spanMap.GetOrAdd("Conflict", _ => new List<TextSpan>());
var renameSpans = spanMap.GetOrAdd("Rename", _ => new List<TextSpan>());
var warningSpans = spanMap.GetOrAdd("Warning", _ => new List<TextSpan>());
var conflictSpans = spanMap.GetOrAdd("Conflict", _ => ImmutableArray<TextSpan>.Empty);
var renameSpans = spanMap.GetOrAdd("Rename", _ => ImmutableArray<TextSpan>.Empty);
var warningSpans = spanMap.GetOrAdd("Warning", _ => ImmutableArray<TextSpan>.Empty);
using (var workspace = CreateWorkspaceFromOptions(initialMarkup, parameters))
{
......@@ -368,23 +369,25 @@ public TestParameters WithFixProviderData(object fixProviderData)
internal async Task<Tuple<Solution, Solution>> TestActionsAsync(
TestWorkspace workspace, string expected,
int index, IList<CodeAction> actions,
IList<TextSpan> conflictSpans, IList<TextSpan> renameSpans, IList<TextSpan> warningSpans,
int index, ImmutableArray<CodeAction> actions,
ImmutableArray<TextSpan> conflictSpans,
ImmutableArray<TextSpan> renameSpans,
ImmutableArray<TextSpan> warningSpans,
bool ignoreTrivia,
ParseOptions parseOptions = null,
CodeActionPriority? priority = null)
{
var operations = await VerifyInputsAndGetOperationsAsync(index, actions, priority);
return await TestOperationsAsync(workspace, expected, operations.ToList(), conflictSpans, renameSpans, warningSpans, ignoreTrivia, expectedChangedDocumentId: null, parseOptions: parseOptions);
return await TestOperationsAsync(workspace, expected, operations, conflictSpans, renameSpans, warningSpans, ignoreTrivia, expectedChangedDocumentId: null, parseOptions: parseOptions);
}
protected async Task<Tuple<Solution, Solution>> TestOperationsAsync(
TestWorkspace workspace,
string expectedText,
IList<CodeActionOperation> operations,
IList<TextSpan> conflictSpans,
IList<TextSpan> renameSpans,
IList<TextSpan> warningSpans,
ImmutableArray<CodeActionOperation> operations,
ImmutableArray<TextSpan> conflictSpans,
ImmutableArray<TextSpan> renameSpans,
ImmutableArray<TextSpan> warningSpans,
bool ignoreTrivia,
DocumentId expectedChangedDocumentId,
ParseOptions parseOptions = null)
......@@ -419,14 +422,13 @@ public TestParameters WithFixProviderData(object fixProviderData)
return Tuple.Create(oldSolution, newSolution);
void TestAnnotations(IList<TextSpan> expectedSpans, string annotationKind)
void TestAnnotations(ImmutableArray<TextSpan> expectedSpans, string annotationKind)
{
expectedSpans = expectedSpans ?? new List<TextSpan>();
var annotatedTokens = fixedRoot.GetAnnotatedNodesAndTokens(annotationKind).Select(n => (SyntaxToken)n).ToList();
Assert.Equal(expectedSpans.Count, annotatedTokens.Count);
Assert.Equal(expectedSpans.Length, annotatedTokens.Count);
if (expectedSpans.Count > 0)
if (expectedSpans.Length > 0)
{
var expectedTokens = TokenUtilities.GetTokens(TokenUtilities.GetSyntaxRoot(expectedText, GetLanguage(), parseOptions));
var actualTokens = TokenUtilities.GetTokens(fixedRoot);
......@@ -487,19 +489,18 @@ private static async Task VerifyAgainstWorkspaceDefinitionAsync(string expectedT
}
internal static async Task<ImmutableArray<CodeActionOperation>> VerifyInputsAndGetOperationsAsync(
int index, IList<CodeAction> actions, CodeActionPriority? priority = null)
int index, ImmutableArray<CodeAction> actions, CodeActionPriority? priority = null)
{
Assert.NotNull(actions);
if (actions.Count == 1)
if (actions.Length == 1)
{
var suppressionAction = actions.Single() as TopLevelSuppressionCodeAction;
if (suppressionAction != null)
if (actions.Single() is TopLevelSuppressionCodeAction suppressionAction)
{
actions = suppressionAction.NestedCodeActions.ToList();
actions = suppressionAction.NestedCodeActions;
}
}
Assert.InRange(index, 0, actions.Count - 1);
Assert.InRange(index, 0, actions.Length - 1);
var action = actions[index];
if (priority != null)
......@@ -539,16 +540,14 @@ private static async Task VerifyAgainstWorkspaceDefinitionAsync(string expectedT
return result;
}
protected virtual IList<CodeAction> MassageActions(IList<CodeAction> actions)
{
return actions;
}
protected virtual ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> actions;
protected static IList<CodeAction> FlattenActions(IEnumerable<CodeAction> codeActions)
protected static ImmutableArray<CodeAction> FlattenActions(ImmutableArray<CodeAction> codeActions)
{
return codeActions?.SelectMany(a => a.NestedCodeActions.Length > 0
? a.NestedCodeActions.ToArray()
: new[] { a }).ToList();
return codeActions.SelectMany(a => a.NestedCodeActions.Length > 0
? a.NestedCodeActions
: ImmutableArray.Create(a)).ToImmutableArray();
}
protected (OptionKey, object) SingleOption(Option<bool> option, bool enabled)
......
......@@ -26,10 +26,13 @@ public abstract class AbstractCodeActionTest : AbstractCodeActionOrUserDiagnosti
protected abstract CodeRefactoringProvider CreateCodeRefactoringProvider(
Workspace workspace, TestParameters parameters);
protected override async Task<IList<CodeAction>> GetCodeActionsWorkerAsync(
protected override async Task<ImmutableArray<CodeAction>> GetCodeActionsWorkerAsync(
TestWorkspace workspace, TestParameters parameters)
{
return (await GetCodeRefactoringAsync(workspace, parameters))?.Actions?.ToList();
var refactoring = await GetCodeRefactoringAsync(workspace, parameters);
return refactoring == null
? ImmutableArray<CodeAction>.Empty
: refactoring.Actions;
}
internal async Task<CodeRefactoring> GetCodeRefactoringAsync(
......@@ -52,17 +55,20 @@ public abstract class AbstractCodeActionTest : AbstractCodeActionOrUserDiagnosti
{
var document = GetDocument(workspace);
var span = workspace.Documents.Single(d => !d.IsLinkFile && d.SelectedSpans.Count == 1).SelectedSpans.Single();
var actions = new List<CodeAction>();
var context = new CodeRefactoringContext(document, span, (a) => actions.Add(a), CancellationToken.None);
var actions = ArrayBuilder<CodeAction>.GetInstance();
var context = new CodeRefactoringContext(document, span, actions.Add, CancellationToken.None);
await provider.ComputeRefactoringsAsync(context);
return actions.Count > 0 ? new CodeRefactoring(provider, actions) : null;
var result = actions.Count > 0 ? new CodeRefactoring(provider, actions.ToImmutable()) : null;
actions.Free();
return result;
}
protected async Task TestActionsOnLinkedFiles(
TestWorkspace workspace,
string expectedText,
int index,
IList<CodeAction> actions,
ImmutableArray<CodeAction> actions,
string expectedPreviewContents = null,
bool ignoreTrivia = true)
{
......
......@@ -32,11 +32,11 @@ public abstract class AbstractUserDiagnosticTest : AbstractCodeActionOrUserDiagn
internal abstract Task<IEnumerable<Diagnostic>> GetDiagnosticsAsync(
TestWorkspace workspace, TestParameters parameters);
protected override async Task<IList<CodeAction>> GetCodeActionsWorkerAsync(
protected override async Task<ImmutableArray<CodeAction>> GetCodeActionsWorkerAsync(
TestWorkspace workspace, TestParameters parameters)
{
var diagnostics = await GetDiagnosticAndFixAsync(workspace, parameters);
return diagnostics?.Item2?.Fixes.Select(f => f.Action).ToList();
return (diagnostics?.Item2?.Fixes.Select(f => f.Action).ToImmutableArray()).GetValueOrDefault().NullToEmpty();
}
internal async Task<Tuple<Diagnostic, CodeFixCollection>> GetDiagnosticAndFixAsync(
......@@ -270,7 +270,7 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
string diagnosticId = null,
TestParameters parameters = default(TestParameters))
{
MarkupTestFile.GetSpans(initialMarkup, out var unused, out IList<TextSpan> spansList);
MarkupTestFile.GetSpans(initialMarkup, out var unused, out ImmutableArray<TextSpan> spansList);
var expectedTextSpans = spansList.ToSet();
using (var workspace = CreateWorkspaceFromOptions(initialMarkup, parameters))
......@@ -303,7 +303,7 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
string projectName = null,
bool isNewFile = false,
string existingFilename = null,
IList<string> newFileFolderContainers = null,
ImmutableArray<string> newFileFolderContainers = default(ImmutableArray<string>),
string fullFilePath = null,
string newFileName = null,
string assertClassName = null,
......@@ -349,7 +349,7 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
var fixes = generateTypeDiagFixes.Item2.Fixes;
Assert.NotNull(fixes);
var fixActions = MassageActions(fixes.Select(f => f.Action).ToList());
var fixActions = MassageActions(fixes.SelectAsArray(f => f.Action));
Assert.NotNull(fixActions);
// Since the dialog option is always fed as the last CodeAction
......@@ -364,7 +364,9 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
{
oldSolutionAndNewSolution = await TestOperationsAsync(
testState.Workspace, expected, operations,
conflictSpans: null, renameSpans: null, warningSpans: null,
conflictSpans: ImmutableArray<TextSpan>.Empty,
renameSpans: ImmutableArray<TextSpan>.Empty,
warningSpans: ImmutableArray<TextSpan>.Empty,
ignoreTrivia: false, expectedChangedDocumentId: testState.ExistingDocument.Id);
}
else
......@@ -384,7 +386,9 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
{
Assert.NotNull(expectedTextWithUsings);
await TestOperationsAsync(testState.Workspace, expectedTextWithUsings, operations,
conflictSpans: null, renameSpans: null, warningSpans: null, ignoreTrivia: false,
conflictSpans: ImmutableArray<TextSpan>.Empty,
renameSpans: ImmutableArray<TextSpan>.Empty,
warningSpans: ImmutableArray<TextSpan>.Empty, ignoreTrivia: false,
expectedChangedDocumentId: testState.InvocationDocument.Id);
}
......
......@@ -12,6 +12,7 @@
using Microsoft.CodeAnalysis.UnitTests;
using Roslyn.Test.Utilities;
using Xunit;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.Editor.UnitTests.MoveType
{
......@@ -133,9 +134,9 @@ protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspa
return await TestOperationsAsync(workspace,
expectedText: expectedCode,
operations: operations,
conflictSpans: null,
renameSpans: null,
warningSpans: null,
conflictSpans: ImmutableArray<TextSpan>.Empty,
renameSpans: ImmutableArray<TextSpan>.Empty,
warningSpans: ImmutableArray<TextSpan>.Empty,
ignoreTrivia: ignoreTrivia,
expectedChangedDocumentId: null);
}
......@@ -145,7 +146,7 @@ protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspa
string expectedSourceTextAfterRefactoring,
string expectedDocumentName,
string destinationDocumentText,
IList<string> destinationDocumentContainers = null,
ImmutableArray<string> destinationDocumentContainers = default(ImmutableArray<string>),
bool expectedCodeAction = true,
int index = 0,
bool ignoreTrivia = true,
......@@ -159,10 +160,7 @@ protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspa
onAfterWorkspaceCreated?.Invoke(workspace);
// replace with default values on null.
if (destinationDocumentContainers == null)
{
destinationDocumentContainers = Array.Empty<string>();
}
destinationDocumentContainers = destinationDocumentContainers.NullToEmpty();
var sourceDocumentId = workspace.Documents[0].Id;
......
// 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.Security;
using System.Threading;
......@@ -10,8 +11,6 @@
using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.SignatureHelp.Presentation;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.SignatureHelp;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Test.Utilities;
......@@ -74,15 +73,12 @@ public override void Dispose()
{
markupWithPositionAndOptSpan = markupWithPositionAndOptSpan.NormalizeLineEndings();
string code;
int cursorPosition;
IList<TextSpan> textSpans;
TextSpan? textSpan = null;
MarkupTestFile.GetPositionAndSpans(
markupWithPositionAndOptSpan,
out code,
out cursorPosition,
out textSpans);
out var code,
out var cursorPosition,
out ImmutableArray<TextSpan> textSpans);
if (textSpans.Any())
{
......
......@@ -73,7 +73,9 @@ protected async Task VerifyNoBlockSpansAsync(string markupCode)
return Tuple.Create(textSpanName, textSpanName, bannerText, autoCollapse, isDefaultCollapsed);
}
private static BlockSpan CreateBlockSpan(Tuple<string, string, string, bool, bool> regionData, IDictionary<string, IList<TextSpan>> spans)
private static BlockSpan CreateBlockSpan(
Tuple<string, string, string, bool, bool> regionData,
IDictionary<string, ImmutableArray<TextSpan>> spans)
{
var textSpanName = regionData.Item1;
var hintSpanName = regionData.Item2;
......@@ -81,8 +83,8 @@ private static BlockSpan CreateBlockSpan(Tuple<string, string, string, bool, boo
var autoCollapse = regionData.Item4;
var isDefaultCollapsed = regionData.Item5;
Assert.True(spans.ContainsKey(textSpanName) && spans[textSpanName].Count == 1, $"Test did not specify '{textSpanName}' span.");
Assert.True(spans.ContainsKey(hintSpanName) && spans[hintSpanName].Count == 1, $"Test did not specify '{hintSpanName}' span.");
Assert.True(spans.ContainsKey(textSpanName) && spans[textSpanName].Length == 1, $"Test did not specify '{textSpanName}' span.");
Assert.True(spans.ContainsKey(hintSpanName) && spans[hintSpanName].Length == 1, $"Test did not specify '{hintSpanName}' span.");
var textSpan = spans[textSpanName][0];
var hintSpan = spans[hintSpanName][0];
......
......@@ -92,7 +92,7 @@ public TextLoader Loader
public int? CursorPosition { get; }
public IList<TextSpan> SelectedSpans { get; }
public IDictionary<string, IList<TextSpan>> AnnotatedSpans { get; }
public IDictionary<string, ImmutableArray<TextSpan>> AnnotatedSpans { get; }
/// <summary>
/// If a file exists in ProjectA and is added to ProjectB as a link, then this returns
......@@ -106,7 +106,7 @@ public TextLoader Loader
ITextBuffer textBuffer,
string filePath,
int? cursorPosition,
IDictionary<string, IList<TextSpan>> spans,
IDictionary<string, ImmutableArray<TextSpan>> spans,
SourceCodeKind sourceCodeKind = SourceCodeKind.Regular,
IReadOnlyList<string> folders = null,
bool isLinkFile = false)
......@@ -131,7 +131,7 @@ public TextLoader Loader
this.SelectedSpans = spans[string.Empty];
}
this.AnnotatedSpans = new Dictionary<string, IList<TextSpan>>();
this.AnnotatedSpans = new Dictionary<string, ImmutableArray<TextSpan>>();
foreach (var namedSpanList in spans.Where(s => s.Key != string.Empty))
{
this.AnnotatedSpans.Add(namedSpanList);
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Reflection;
using System.Threading;
......@@ -399,11 +400,8 @@ internal override void SetDocumentContext(DocumentId documentId)
/// <returns></returns>
public TestHostDocument CreateProjectionBufferDocument(string markup, IList<TestHostDocument> baseDocuments, string languageName, string path = "projectionbufferdocumentpath", ProjectionBufferOptions options = ProjectionBufferOptions.None, IProjectionEditResolver editResolver = null)
{
IList<object> projectionBufferSpans;
Dictionary<string, IList<TextSpan>> mappedSpans;
int? mappedCaretLocation;
GetSpansAndCaretFromSurfaceBufferMarkup(markup, baseDocuments, out projectionBufferSpans, out mappedSpans, out mappedCaretLocation);
GetSpansAndCaretFromSurfaceBufferMarkup(markup, baseDocuments,
out var projectionBufferSpans, out Dictionary<string, ImmutableArray<TextSpan>> mappedSpans, out var mappedCaretLocation);
var projectionBufferFactory = this.GetService<IProjectionBufferFactoryService>();
var projectionBuffer = projectionBufferFactory.CreateProjectionBuffer(editResolver, projectionBufferSpans, options);
......@@ -411,7 +409,9 @@ public TestHostDocument CreateProjectionBufferDocument(string markup, IList<Test
// Add in mapped spans from each of the base documents
foreach (var document in baseDocuments)
{
mappedSpans[string.Empty] = mappedSpans.ContainsKey(string.Empty) ? mappedSpans[string.Empty] : new List<TextSpan>();
mappedSpans[string.Empty] = mappedSpans.ContainsKey(string.Empty)
? mappedSpans[string.Empty]
: ImmutableArray<TextSpan>.Empty;
foreach (var span in document.SelectedSpans)
{
var snapshotSpan = span.ToSnapshotSpan(document.TextBuffer.CurrentSnapshot);
......@@ -421,11 +421,13 @@ public TestHostDocument CreateProjectionBufferDocument(string markup, IList<Test
// Order unnamed spans as they would be ordered by the normal span finding
// algorithm in MarkupTestFile
mappedSpans[string.Empty] = mappedSpans[string.Empty].OrderBy(s => s.End).ThenBy(s => -s.Start).ToList();
mappedSpans[string.Empty] = mappedSpans[string.Empty].OrderBy(s => s.End).ThenBy(s => -s.Start).ToImmutableArray();
foreach (var kvp in document.AnnotatedSpans)
{
mappedSpans[kvp.Key] = mappedSpans.ContainsKey(kvp.Key) ? mappedSpans[kvp.Key] : new List<TextSpan>();
mappedSpans[kvp.Key] = mappedSpans.ContainsKey(kvp.Key)
? mappedSpans[kvp.Key]
: ImmutableArray<TextSpan>.Empty;
foreach (var span in kvp.Value)
{
......@@ -450,16 +452,19 @@ public TestHostDocument CreateProjectionBufferDocument(string markup, IList<Test
return projectionDocument;
}
private void GetSpansAndCaretFromSurfaceBufferMarkup(string markup, IList<TestHostDocument> baseDocuments, out IList<object> projectionBufferSpans, out Dictionary<string, IList<TextSpan>> mappedMarkupSpans, out int? mappedCaretLocation)
private void GetSpansAndCaretFromSurfaceBufferMarkup(
string markup, IList<TestHostDocument> baseDocuments,
out IList<object> projectionBufferSpans,
out Dictionary<string, ImmutableArray<TextSpan>> mappedMarkupSpans, out int? mappedCaretLocation)
{
IDictionary<string, IList<TextSpan>> markupSpans;
projectionBufferSpans = new List<object>();
var projectionBufferSpanStartingPositions = new List<int>();
mappedCaretLocation = null;
string inertText;
int? markupCaretLocation;
MarkupTestFile.GetPositionAndSpans(markup, out inertText, out markupCaretLocation, out markupSpans);
MarkupTestFile.GetPositionAndSpans(markup,
out inertText, out markupCaretLocation, out var markupSpans);
var namedSpans = markupSpans.Where(kvp => kvp.Key != string.Empty);
var sortedAndNamedSpans = namedSpans.OrderBy(kvp => kvp.Value.Single().Start)
......@@ -546,13 +551,16 @@ private void GetSpansAndCaretFromSurfaceBufferMarkup(string markup, IList<TestHo
MapMarkupSpans(markupSpans, out mappedMarkupSpans, projectionBufferSpans, projectionBufferSpanStartingPositions);
}
private void MapMarkupSpans(IDictionary<string, IList<TextSpan>> markupSpans, out Dictionary<string, IList<TextSpan>> mappedMarkupSpans, IList<object> projectionBufferSpans, IList<int> projectionBufferSpanStartingPositions)
private void MapMarkupSpans(
IDictionary<string, ImmutableArray<TextSpan>> markupSpans,
out Dictionary<string, ImmutableArray<TextSpan>> mappedMarkupSpans,
IList<object> projectionBufferSpans, IList<int> projectionBufferSpanStartingPositions)
{
mappedMarkupSpans = new Dictionary<string, IList<TextSpan>>();
var tempMappedMarkupSpans = new Dictionary<string, ArrayBuilder<TextSpan>>();
foreach (string key in markupSpans.Keys)
{
mappedMarkupSpans[key] = new List<TextSpan>();
tempMappedMarkupSpans[key] = ArrayBuilder<TextSpan>.GetInstance();
foreach (var markupSpan in markupSpans[key])
{
var positionInMarkup = 0;
......@@ -587,9 +595,12 @@ private void MapMarkupSpans(IDictionary<string, IList<TextSpan>> markupSpans, ou
spanIndex++;
}
mappedMarkupSpans[key].Add(new TextSpan(spanStartLocation.Value, spanEndLocationExclusive.Value - spanStartLocation.Value));
tempMappedMarkupSpans[key].Add(new TextSpan(spanStartLocation.Value, spanEndLocationExclusive.Value - spanStartLocation.Value));
}
}
mappedMarkupSpans = tempMappedMarkupSpans.ToDictionary(
kvp => kvp.Key, kvp => kvp.Value.ToImmutableAndFree());
}
public override void OpenDocument(DocumentId documentId, bool activate = true)
......
......@@ -198,10 +198,8 @@ public static TestWorkspace Create(string xmlDefinition, bool completed = true,
// The document
var markupCode = submissionElement.NormalizedValue();
string code;
int? cursorPosition;
IDictionary<string, IList<TextSpan>> spans;
MarkupTestFile.GetPositionAndSpans(markupCode, out code, out cursorPosition, out spans);
MarkupTestFile.GetPositionAndSpans(markupCode,
out var code, out var cursorPosition, out IDictionary<string, ImmutableArray<TextSpan>> spans);
var languageServices = workspace.Services.GetLanguageServices(languageName);
var contentTypeLanguageService = languageServices.GetService<IContentTypeLanguageService>();
......@@ -619,10 +617,8 @@ private static CompilationOptions CreateCompilationOptions(TestWorkspace workspa
var contentTypeLanguageService = languageServiceProvider.GetService<IContentTypeLanguageService>();
var contentType = contentTypeLanguageService.GetDefaultContentType();
string code;
int? cursorPosition;
IDictionary<string, IList<TextSpan>> spans;
MarkupTestFile.GetPositionAndSpans(markupCode, out code, out cursorPosition, out spans);
MarkupTestFile.GetPositionAndSpans(markupCode,
out var code, out var cursorPosition, out IDictionary<string, ImmutableArray<TextSpan>> spans);
// For linked files, use the same ITextBuffer for all linked documents
ITextBuffer textBuffer;
......@@ -672,7 +668,7 @@ private static MetadataReference CreateMetadataReferenceFromSource(TestWorkspace
{
var compilation = CreateCompilation(workspace, referencedSource);
var aliasElement = referencedSource.Attribute("Aliases") != null ? referencedSource.Attribute("Aliases").Value : null;
var aliasElement = referencedSource.Attribute("Aliases")?.Value;
var aliases = aliasElement != null ? aliasElement.Split(',').Select(s => s.Trim()).ToImmutableArray() : default(ImmutableArray<string>);
bool includeXmlDocComments = false;
......
' 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.Xml.Linq
Imports Microsoft.CodeAnalysis.CodeRefactorings
Imports Microsoft.CodeAnalysis.CodeRefactorings.MoveType
......@@ -57,7 +58,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.M
expectedSourceTextAfterRefactoring As XElement,
expectedDocumentName As String,
destinationDocumentText As XElement,
Optional destinationDocumentContainers As IList(Of String) = Nothing,
Optional destinationDocumentContainers As ImmutableArray(Of String) = Nothing,
Optional expectedCodeAction As Boolean = True,
Optional index As Integer = 0,
Optional ignoreTrivia As Boolean = True
......
' 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 Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.Implementation.CommentSelection
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Utilities
......@@ -71,7 +72,7 @@ End Module</code>
expected = expected.Replace(vbLf, vbCrLf)
Dim codeWithoutMarkup As String = Nothing
Dim spans As IList(Of TextSpan) = Nothing
Dim spans As ImmutableArray(Of TextSpan) = Nothing
MarkupTestFile.GetSpans(code, codeWithoutMarkup, spans)
......
......@@ -35,7 +35,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeActions.AddImp
Return (Nothing, New VisualBasicAddImportCodeFixProvider(data.Item1, data.Item2))
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......
' 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 Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
......@@ -14,7 +15,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.FullyQ
Return (Nothing, New VisualBasicFullyQualifyCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......
' 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 Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.CodeStyle
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.CodeFixes.GenerateType
Imports Microsoft.CodeAnalysis.VisualBasic.Diagnostics
......@@ -16,7 +18,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Genera
Return (Nothing, New GenerateTypeCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......@@ -459,7 +461,7 @@ End Class",
End Sub
End Class
End Namespace",
expectedContainers:={"Foo"},
expectedContainers:=ImmutableArray.Create("Foo"),
expectedDocumentName:="Bar.vb")
End Function
......@@ -476,7 +478,7 @@ Module Program
End Module",
"Friend Class Foo
End Class",
expectedContainers:=Array.Empty(Of String)(),
expectedContainers:=ImmutableArray(Of String).Empty,
expectedDocumentName:="Foo.vb")
End Function
......@@ -688,7 +690,7 @@ End Class",
Public Sub New()
End Sub
End Class",
expectedContainers:=Array.Empty(Of String)(),
expectedContainers:=ImmutableArray(Of String).Empty,
expectedDocumentName:="Derived.vb")
End Function
......@@ -1690,7 +1692,7 @@ index:=2)
New GenerateTypeCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......
Option Strict Off
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Option Strict Off
Imports System.Collections.Immutable
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.GenerateType
......@@ -426,7 +427,7 @@ End Namespace
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
newFileName:="Test2.vb")
End Function
......@@ -460,7 +461,7 @@ checkIfUsingsNotIncluded:=True,
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
newFileName:="Test2.vb")
End Function
......@@ -492,7 +493,7 @@ checkIfUsingsNotIncluded:=True,
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String() {"@@@@@", "#####"},
newFileFolderContainers:=ImmutableArray.Create("@@@@@", "#####"),
areFoldersValidIdentifiers:=False,
newFileName:="Test2.vb")
End Function
......@@ -533,7 +534,7 @@ End Class</Text>.NormalizedValue,
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
newFileName:="Test2.vb")
End Function
......@@ -574,7 +575,7 @@ End Class</Text>.NormalizedValue,
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String() {"outer"},
newFileFolderContainers:=ImmutableArray.Create("outer"),
newFileName:="Test2.vb")
End Function
......@@ -606,7 +607,7 @@ End Namespace
accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
newFileName:="Test2.vb")
End Function
#End Region
......@@ -781,7 +782,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileName:="Test2.vb",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
......@@ -824,7 +825,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileName:="Test2.vb",
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
projectName:="Assembly2")
End Function
......@@ -862,7 +863,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileName:="Test2.vb",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
......@@ -905,7 +906,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Interface,
isNewFile:=True,
newFileName:="Test3.vb",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
#End Region
......@@ -942,7 +943,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
......@@ -992,7 +993,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
projectName:="Assembly2")
End Function
......@@ -1029,7 +1030,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
projectName:="Assembly2")
End Function
......@@ -1079,7 +1080,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
projectName:="Assembly2")
End Function
......@@ -1118,7 +1119,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String() {"outer", "inner"},
newFileFolderContainers:=ImmutableArray.Create("outer", "inner"),
projectName:="Assembly2")
End Function
......@@ -1320,7 +1321,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Class,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
#End Region
......@@ -2113,7 +2114,7 @@ accessibility:=Accessibility.Public,
typeKind:=TypeKind.Delegate,
isNewFile:=True,
newFileName:="Test2.cs",
newFileFolderContainers:=New String(0) {},
newFileFolderContainers:=ImmutableArray(Of String).Empty,
projectName:="Assembly2")
End Function
......
' 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 Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
......@@ -13,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Genera
Return (Nothing, New GenerateVariableCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......
' 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 Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
......@@ -15,7 +16,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Spellc
Return (Nothing, New VisualBasicSpellCheckCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Protected Overrides Function MassageActions(actions As ImmutableArray(Of CodeAction)) As ImmutableArray(Of CodeAction)
Return FlattenActions(actions)
End Function
......
' 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.Threading
Imports System.Xml.Linq
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
......@@ -64,7 +65,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EditAndContinue.UnitTests
Private Sub TestAll(markup As String)
Dim position As Integer = Nothing
Dim expectedSpans As IList(Of TextSpan) = Nothing
Dim expectedSpans As ImmutableArray(Of TextSpan) = Nothing
Dim source As String = Nothing
MarkupTestFile.GetPositionAndSpans(markup, source, position, expectedSpans)
......
' 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.Threading
Imports System.Xml.Linq
Imports Microsoft.CodeAnalysis
......@@ -122,7 +123,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.ExtractMethod
Private Shared Async Function TestSelectionAsync(codeWithMarker As XElement, Optional ByVal expectedFail As Boolean = False) As Tasks.Task
Dim codeWithoutMarker As String = Nothing
Dim namedSpans = CType(New Dictionary(Of String, IList(Of TextSpan))(), IDictionary(Of String, IList(Of TextSpan)))
Dim namedSpans = CType(New Dictionary(Of String, ImmutableArray(Of TextSpan))(), IDictionary(Of String, ImmutableArray(Of TextSpan)))
MarkupTestFile.GetSpans(codeWithMarker.NormalizedValue, codeWithoutMarker, namedSpans)
......
' 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.Threading
Imports System.Xml.Linq
Imports Microsoft.CodeAnalysis
......@@ -175,7 +176,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.TodoComment
Private Shared Async Function TestAsync(codeWithMarker As XElement, remote As Boolean) As Task
Dim code As String = Nothing
Dim list As IList(Of TextSpan) = Nothing
Dim list As ImmutableArray(Of TextSpan) = Nothing
MarkupTestFile.GetSpans(codeWithMarker.NormalizedValue, code, list)
Using workspace = TestWorkspace.CreateVisualBasic(code, openDocuments:=False)
......
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CodeActions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CodeRefactorings
{
......@@ -17,14 +16,14 @@ internal class CodeRefactoring
/// <summary>
/// List of possible actions that can be used to transform the code.
/// </summary>
public IReadOnlyList<CodeAction> Actions { get; }
public ImmutableArray<CodeAction> Actions { get; }
public CodeRefactoring(CodeRefactoringProvider provider, IEnumerable<CodeAction> actions)
public CodeRefactoring(CodeRefactoringProvider provider, ImmutableArray<CodeAction> actions)
{
Provider = provider;
Actions = actions.ToImmutableArrayOrEmpty();
Actions = actions.NullToEmpty();
if (Actions.Count == 0)
if (Actions.Length == 0)
{
throw new ArgumentException(FeaturesResources.Actions_can_not_be_empty, nameof(actions));
}
......
......@@ -124,7 +124,7 @@ private IEnumerable<CodeRefactoringProvider> GetProviders(Document document)
try
{
var actions = new List<CodeAction>();
var actions = ArrayBuilder<CodeAction>.GetInstance();
var context = new CodeRefactoringContext(document, state,
// TODO: Can we share code between similar lambdas that we pass to this API in BatchFixAllProvider.cs, CodeFixService.cs and CodeRefactoringService.cs?
......@@ -140,10 +140,14 @@ private IEnumerable<CodeRefactoringProvider> GetProviders(Document document)
var task = provider.ComputeRefactoringsAsync(context) ?? SpecializedTasks.EmptyTask;
await task.ConfigureAwait(false);
if (actions.Count > 0)
{
return new CodeRefactoring(provider, actions);
}
var result = actions.Count > 0
? new CodeRefactoring(provider, actions.ToImmutable())
: null;
actions.Free();
return result;
}
catch (OperationCanceledException)
{
......
......@@ -2,12 +2,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.VisualBasic;
using Roslyn.Test.Utilities;
using Xunit;
......@@ -1213,10 +1212,8 @@ protected Task VerifyTokenDiagnosticsBasicAsync(string markup, params Diagnostic
// Generate a diagnostic on every token in the specified spans, and verify that only the specified diagnostics are not suppressed
private Task VerifyTokenDiagnosticsAsync(string markup, string language, DiagnosticDescription[] diagnostics)
{
string source;
IList<TextSpan> spans;
MarkupTestFile.GetSpans(markup, out source, out spans);
Assert.True(spans.Count > 0, "Must specify a span within which to generate diagnostics on each token");
MarkupTestFile.GetSpans(markup, out var source, out ImmutableArray<TextSpan> spans);
Assert.True(spans.Length > 0, "Must specify a span within which to generate diagnostics on each token");
return VerifyAsync(source, language, new DiagnosticAnalyzer[] { new WarningOnTokenAnalyzer(spans) }, diagnostics);
}
......@@ -1225,8 +1222,10 @@ private Task VerifyTokenDiagnosticsAsync(string markup, string language, Diagnos
protected DiagnosticDescription Diagnostic(string id, string squiggledText)
{
var arguments = (this.ConsiderArgumentsForComparingDiagnostics && squiggledText != null) ? new[] { squiggledText } : null;
var arguments = this.ConsiderArgumentsForComparingDiagnostics && squiggledText != null
? new[] { squiggledText }
: null;
return new DiagnosticDescription(id, false, squiggledText, arguments, null, null, false);
}
}
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
......@@ -43,10 +44,11 @@ public static class MarkupTestFile
private static readonly Regex s_namedSpanStartRegex = new Regex(@"\{\| ([-_.A-Za-z0-9]+) \:",
RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
private static void Parse(string input, out string output, out int? position, out IDictionary<string, IList<TextSpan>> spans)
private static void Parse(
string input, out string output, out int? position, out IDictionary<string, ArrayBuilder<TextSpan>> spans)
{
position = null;
spans = new Dictionary<string, IList<TextSpan>>();
var tempSpans = new Dictionary<string, ArrayBuilder<TextSpan>>();
var outputBuilder = new StringBuilder();
......@@ -134,7 +136,7 @@ private static void Parse(string input, out string output, out int? position, ou
throw new ArgumentException(string.Format("Saw {0} without matching {1}", NamedSpanStartString, NamedSpanEndString));
}
PopSpan(spanStartStack, spans, matchIndexInOutput);
PopSpan(spanStartStack, tempSpans, matchIndexInOutput);
break;
case NamedSpanStartString:
......@@ -153,7 +155,7 @@ private static void Parse(string input, out string output, out int? position, ou
throw new ArgumentException(string.Format("Saw {0} without matching {1}", SpanStartString, SpanEndString));
}
PopSpan(spanStartStack, spans, matchIndexInOutput);
PopSpan(spanStartStack, tempSpans, matchIndexInOutput);
break;
default:
......@@ -169,12 +171,12 @@ private static void Parse(string input, out string output, out int? position, ou
// Append the remainder of the string.
outputBuilder.Append(input.Substring(currentIndexInInput));
output = outputBuilder.ToString();
spans = tempSpans.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}
private static V GetOrAdd<K, V>(IDictionary<K, V> dictionary, K key, Func<K, V> function)
{
V value;
if (!dictionary.TryGetValue(key, out value))
if (!dictionary.TryGetValue(key, out var value))
{
value = function(key);
dictionary.Add(key, value);
......@@ -185,13 +187,13 @@ private static void Parse(string input, out string output, out int? position, ou
private static void PopSpan(
Stack<Tuple<int, string>> spanStartStack,
IDictionary<string, IList<TextSpan>> spans,
IDictionary<string, ArrayBuilder<TextSpan>> spans,
int finalIndex)
{
var spanStartTuple = spanStartStack.Pop();
var span = TextSpan.FromBounds(spanStartTuple.Item1, finalIndex);
GetOrAdd(spans, spanStartTuple.Item2, _ => new List<TextSpan>()).Add(span);
GetOrAdd(spans, spanStartTuple.Item2, _ => ArrayBuilder<TextSpan>.GetInstance()).Add(span);
}
private static void AddMatch(string input, string value, int currentIndex, List<Tuple<int, string>> matches)
......@@ -203,67 +205,58 @@ private static void AddMatch(string input, string value, int currentIndex, List<
}
}
private static void GetPositionAndSpans(string input, out string output, out int? cursorPositionOpt, out IList<TextSpan> spans)
private static void GetPositionAndSpans(
string input, out string output, out int? cursorPositionOpt, out ImmutableArray<TextSpan> spans)
{
IDictionary<string, IList<TextSpan>> dictionary;
Parse(input, out output, out cursorPositionOpt, out dictionary);
Parse(input, out output, out cursorPositionOpt, out var dictionary);
spans = GetOrAdd(dictionary, string.Empty, _ => new List<TextSpan>());
var builder = GetOrAdd(dictionary, string.Empty, _ => ArrayBuilder<TextSpan>.GetInstance());
spans = builder.ToImmutableAndFree();
}
public static void GetPositionAndSpans(string input, out string output, out int? cursorPositionOpt, out IDictionary<string, IList<TextSpan>> spans)
public static void GetPositionAndSpans(
string input, out string output, out int? cursorPositionOpt, out IDictionary<string, ImmutableArray<TextSpan>> spans)
{
Parse(input, out output, out cursorPositionOpt, out spans);
Parse(input, out output, out cursorPositionOpt, out var dictionary);
spans = dictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableAndFree());
}
public static void GetSpans(string input, out string output, out IDictionary<string, IList<TextSpan>> spans)
{
int? cursorPositionOpt;
GetPositionAndSpans(input, out output, out cursorPositionOpt, out spans);
}
public static void GetSpans(string input, out string output, out IDictionary<string, ImmutableArray<TextSpan>> spans)
=> GetPositionAndSpans(input, out output, out var cursorPositionOpt, out spans);
public static void GetPositionAndSpans(string input, out string output, out int cursorPosition, out IList<TextSpan> spans)
public static void GetPositionAndSpans(string input, out string output, out int cursorPosition, out ImmutableArray<TextSpan> spans)
{
int? pos;
GetPositionAndSpans(input, out output, out pos, out spans);
GetPositionAndSpans(input, out output, out int? pos, out spans);
cursorPosition = pos.Value;
}
public static void GetPosition(string input, out string output, out int? cursorPosition)
=> GetPositionAndSpans(input, out output, out cursorPosition, out IList<TextSpan> spans);
=> GetPositionAndSpans(input, out output, out cursorPosition, out ImmutableArray<TextSpan> spans);
public static void GetPosition(string input, out string output, out int cursorPosition)
=> GetPositionAndSpans(input, out output, out cursorPosition, out var spans);
public static void GetPositionAndSpan(string input, out string output, out int? cursorPosition, out TextSpan? textSpan)
{
IList<TextSpan> spans;
GetPositionAndSpans(input, out output, out cursorPosition, out spans);
textSpan = spans.Count == 0 ? null : (TextSpan?)spans.Single();
GetPositionAndSpans(input, out output, out cursorPosition, out ImmutableArray<TextSpan> spans);
textSpan = spans.Length == 0 ? null : (TextSpan?)spans.Single();
}
public static void GetPositionAndSpan(string input, out string output, out int cursorPosition, out TextSpan textSpan)
{
IList<TextSpan> spans;
GetPositionAndSpans(input, out output, out cursorPosition, out spans);
GetPositionAndSpans(input, out output, out cursorPosition, out var spans);
textSpan = spans.Single();
}
public static void GetSpans(string input, out string output, out IList<TextSpan> spans)
public static void GetSpans(string input, out string output, out ImmutableArray<TextSpan> spans)
{
int? pos;
GetPositionAndSpans(input, out output, out pos, out spans);
GetPositionAndSpans(input, out output, out int? pos, out spans);
}
public static void GetSpan(string input, out string output, out TextSpan textSpan)
{
IList<TextSpan> spans;
GetSpans(input, out output, out spans);
GetSpans(input, out output, out ImmutableArray<TextSpan> spans);
textSpan = spans.Single();
}
}
}
}
\ No newline at end of file
// 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.Tasks;
using Microsoft.CodeAnalysis.CodeCleanup;
......@@ -2834,7 +2835,8 @@ End Sub
private async Task VerifyAsync(string codeWithMarker, string expectedResult)
{
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out IList<TextSpan> textSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out ImmutableArray<TextSpan> textSpans);
var document = CreateDocument(codeWithoutMarker, LanguageNames.VisualBasic);
var codeCleanups = CodeCleaner.GetDefaultProviders(document).Where(p => p.Name == PredefinedCodeCleanupProviderNames.AddMissingTokens || p.Name == PredefinedCodeCleanupProviderNames.Format || p.Name == PredefinedCodeCleanupProviderNames.Simplification);
......
// 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;
using System.Threading.Tasks;
......@@ -304,9 +305,8 @@ public static CSharp.Syntax.MethodDeclarationSyntax CreateCSharpMethod(string re
private void VerifyRange(string codeWithMarker, string language = LanguageNames.CSharp)
{
var namedSpans = (IDictionary<string, IList<TextSpan>>)new Dictionary<string, IList<TextSpan>>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out namedSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out IDictionary<string, ImmutableArray<TextSpan>> namedSpans);
var expectedResult = namedSpans.ContainsKey("r") ? namedSpans["r"] as IEnumerable<TextSpan> : SpecializedCollections.EmptyEnumerable<TextSpan>();
......@@ -315,9 +315,8 @@ private void VerifyRange(string codeWithMarker, string language = LanguageNames.
private void VerifyRange(string codeWithMarker, ICodeCleanupProvider transformer, ref IEnumerable<TextSpan> expectedResult, string language = LanguageNames.CSharp)
{
var namedSpans = (IDictionary<string, IList<TextSpan>>)new Dictionary<string, IList<TextSpan>>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out namedSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out IDictionary<string, ImmutableArray<TextSpan>> namedSpans);
VerifyRange(codeWithoutMarker, SpecializedCollections.SingletonEnumerable(transformer), namedSpans["b"], ref expectedResult, language);
}
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -782,8 +783,9 @@ private static async Task VerifyAsync(string codeWithMarker, string expectedResu
{
codeWithMarker = FixLineEndings(codeWithMarker);
expectedResult = FixLineEndings(expectedResult);
var textSpans = (IList<TextSpan>)new List<TextSpan>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out textSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out ImmutableArray<TextSpan> textSpans);
var document = CreateDocument(codeWithoutMarker, LanguageNames.VisualBasic);
var codeCleanups = CodeCleaner.GetDefaultProviders(document).Where(p => p.Name == PredefinedCodeCleanupProviderNames.FixIncorrectTokens || p.Name == PredefinedCodeCleanupProviderNames.Format);
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -1072,8 +1073,8 @@ End Sub
private async Task VerifyAsync(string codeWithMarker, string expectedResult)
{
var textSpans = (IList<TextSpan>)new List<TextSpan>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out textSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out ImmutableArray<TextSpan> textSpans);
var document = CreateDocument(codeWithoutMarker, LanguageNames.VisualBasic);
var codeCleanups = CodeCleaner.GetDefaultProviders(document).Where(p => p.Name == PredefinedCodeCleanupProviderNames.NormalizeModifiersOrOperators || p.Name == PredefinedCodeCleanupProviderNames.Format);
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Globalization;
using System.Linq;
using System.Text;
......@@ -2042,8 +2043,8 @@ End Module
private static async Task VerifyAsync(string codeWithMarker, string expectedResult)
{
var textSpans = (IList<TextSpan>)new List<TextSpan>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out textSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out ImmutableArray<TextSpan> textSpans);
var document = CreateDocument(codeWithoutMarker, LanguageNames.VisualBasic);
var codeCleanups = CodeCleaner.GetDefaultProviders(document).Where(p => p.Name == PredefinedCodeCleanupProviderNames.ReduceTokens || p.Name == PredefinedCodeCleanupProviderNames.CaseCorrection || p.Name == PredefinedCodeCleanupProviderNames.Format);
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -1455,8 +1456,8 @@ End Sub
private async Task VerifyAsync(string codeWithMarker, string expectedResult, LanguageVersion langVersion = LanguageVersion.VisualBasic14)
{
var textSpans = (IList<TextSpan>)new List<TextSpan>();
MarkupTestFile.GetSpans(codeWithMarker, out var codeWithoutMarker, out textSpans);
MarkupTestFile.GetSpans(codeWithMarker,
out var codeWithoutMarker, out ImmutableArray<TextSpan> textSpans);
var document = CreateDocument(codeWithoutMarker, LanguageNames.VisualBasic, langVersion);
var codeCleanups = CodeCleaner.GetDefaultProviders(document).Where(p => p.Name == PredefinedCodeCleanupProviderNames.RemoveUnnecessaryLineContinuation || p.Name == PredefinedCodeCleanupProviderNames.Format);
......
' 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.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Formatting
......@@ -69,7 +70,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Formatting
Protected Function AssertFormatSpanAsync(markupCode As String, expected As String) As Task
Dim code As String = Nothing
Dim cursorPosition As Integer? = Nothing
Dim spans As IList(Of TextSpan) = Nothing
Dim spans As ImmutableArray(Of TextSpan) = Nothing
MarkupTestFile.GetSpans(markupCode, code, spans)
Return AssertFormatAsync(expected, code, spans)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册