|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable disable
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Formatting;
using Microsoft.CodeAnalysis.CSharp.Indentation;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Editor.UnitTests.Utilities;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Indentation;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Roslyn.Test.Utilities;
using Xunit;
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Formatting.Indentation;
[UseExportProvider]
[Trait(Traits.Feature, Traits.Features.Formatting)]
[Trait(Traits.Feature, Traits.Features.SmartTokenFormatting)]
public class SmartTokenFormatterFormatRangeTests
{
[Fact]
public async Task BeginningOfFile()
{
var code = @" using System;$$";
var expected = @" using System;";
Assert.NotNull(await Record.ExceptionAsync(() => AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.None)));
}
[WpfFact]
public async Task Namespace1()
{
var code = @"using System;
namespace NS
{
}$$";
var expected = @"using System;
namespace NS
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace2()
{
var code = @"using System;
namespace NS
{
class Class
{
}
}$$";
var expected = @"using System;
namespace NS
{
class Class
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace3()
{
var code = @"using System;
namespace NS { }$$";
var expected = @"using System;
namespace NS { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace4()
{
var code = @"using System;
namespace NS {
}$$";
var expected = @"using System;
namespace NS
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace5()
{
var code = @"using System;
namespace NS
{
class Class { }
}$$";
var expected = @"using System;
namespace NS
{
class Class { }
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace6()
{
var code = @"using System;
namespace NS
{
class Class {
}
}$$";
var expected = @"using System;
namespace NS
{
class Class
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace7()
{
var code = @"using System;
namespace NS
{
class Class {
}
namespace NS2
{}
}$$";
var expected = @"using System;
namespace NS
{
class Class
{
}
namespace NS2
{ }
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Namespace8()
{
var code = @"using System;
namespace NS { class Class { } namespace NS2 { } }$$";
var expected = @"using System;
namespace NS { class Class { } namespace NS2 { } }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Class1()
{
var code = @"using System;
class Class {
}$$";
var expected = @"using System;
class Class
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Class2()
{
var code = @"using System;
class Class
{
void Method(int i) {
}
}$$";
var expected = @"using System;
class Class
{
void Method(int i)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Class3()
{
var code = @"using System;
class Class
{
void Method(int i) { }
}$$";
var expected = @"using System;
class Class
{
void Method(int i) { }
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Class4()
{
var code = @"using System;
class Class
{
delegate void Test(int i);
}$$";
var expected = @"using System;
class Class
{
delegate void Test(int i);
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Class5()
{
var code = @"using System;
class Class
{
delegate void Test(int i);
void Method()
{
}
}$$";
var expected = @"using System;
class Class
{
delegate void Test(int i);
void Method()
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Interface1()
{
var code = @"using System;
interface II
{
delegate void Test(int i);
int Prop { get; set; }
}$$";
var expected = @"using System;
interface II
{
delegate void Test(int i);
int Prop { get; set; }
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Struct1()
{
var code = @"using System;
struct Struct
{
Struct(int i)
{
}
}$$";
var expected = @"using System;
struct Struct
{
Struct(int i)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Enum1()
{
var code = @"using System;
enum Enum
{
A = 1, B = 2,
C = 3
}$$";
var expected = @"using System;
enum Enum
{
A = 1, B = 2,
C = 3
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task AccessorList1()
{
var code = @"using System;
class Class
{
int Prop { get { return 1; }$$";
var expected = @"using System;
class Class
{
int Prop { get { return 1; }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task AccessorList2()
{
var code = @"using System;
class Class
{
int Prop { get { return 1; } }$$";
var expected = @"using System;
class Class
{
int Prop { get { return 1; } }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.IntKeyword);
}
[WpfFact]
public async Task AccessorList3()
{
var code = @"using System;
class Class
{
int Prop { get { return 1; }
}$$";
var expected = @"using System;
class Class
{
int Prop
{
get { return 1; }
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.IntKeyword);
}
[WpfFact]
public async Task AccessorList4()
{
var code = @"using System;
class Class
{
int Prop { get { return 1;
}$$";
var expected = @"using System;
class Class
{
int Prop { get
{
return 1;
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.GetKeyword);
}
[WpfFact]
public async Task AccessorList5()
{
var code = @"using System;
class Class
{
int Prop {
get { return 1;
}$$";
var expected = @"using System;
class Class
{
int Prop {
get { return 1;
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/16984")]
public async Task AccessorList5b()
{
var code = @"using System;
class Class
{
int Prop {
get { return 1;
}$$
}
}";
var expected = @"using System;
class Class
{
int Prop {
get
{
return 1;
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task AccessorList6()
{
var code = @"using System;
class Class
{
int Prop
{
get { return 1;
} }$$";
var expected = @"using System;
class Class
{
int Prop
{
get
{
return 1;
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.IntKeyword);
}
[WpfFact]
public async Task AccessorList7()
{
var code = @"using System;
class Class
{
int Prop
{
get
{
return 1;$$
}
}";
var expected = @"using System;
class Class
{
int Prop
{
get
{
return 1;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/16984")]
public async Task AccessorList8()
{
var code = @"class C
{
int Prop
{
get
{
return 0;
}$$
}
}";
var expected = @"class C
{
int Prop
{
get
{
return 0;
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfTheory, WorkItem("https://github.com/dotnet/roslyn/issues/16984")]
[InlineData("get")]
[InlineData("set")]
[InlineData("init")]
public async Task AccessorList9(string accessor)
{
var code = $@"class C
{{
int Prop
{{
{accessor}
{{
;
}}$$
}}
}}";
var expected = $@"class C
{{
int Prop
{{
{accessor}
{{
;
}}
}}
}}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/16984")]
public async Task AccessorList10()
{
var code = @"class C
{
event EventHandler E
{
add
{
}$$
remove
{
}
}
}";
var expected = @"class C
{
event EventHandler E
{
add
{
}
remove
{
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/16984")]
public async Task AccessorList11()
{
var code = @"class C
{
event EventHandler E
{
add
{
}
remove
{
}$$
}
}";
var expected = @"class C
{
event EventHandler E
{
add
{
}
remove
{
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.CloseBraceToken);
}
[WpfFact]
public async Task Block1()
{
var code = @"using System;
class Class
{
public int Method()
{ }$$";
var expected = @"using System;
class Class
{
public int Method()
{ }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block2()
{
var code = @"using System;
class Class
{
public int Method() { }$$";
var expected = @"using System;
class Class
{
public int Method() { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block3()
{
var code = @"using System;
class Class
{
public int Method() {
}$$
}";
var expected = @"using System;
class Class
{
public int Method()
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block4()
{
var code = @"using System;
class Class
{
public static Class operator +(Class c1, Class c2) {
}$$
}";
var expected = @"using System;
class Class
{
public static Class operator +(Class c1, Class c2)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block5()
{
var code = @"using System;
class Class
{
void Method()
{
{ }$$";
var expected = @"using System;
class Class
{
void Method()
{
{ }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block6()
{
var code = @"using System;
class Class
{
void Method()
{
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block7()
{
var code = @"using System;
class Class
{
void Method()
{
{ { }$$";
var expected = @"using System;
class Class
{
void Method()
{
{ { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Block8()
{
var code = @"using System;
class Class
{
void Method()
{
{ {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
{
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task SwitchStatement1()
{
var code = @"using System;
class Class
{
void Method()
{
switch (a) {
case 1:
break;
}$$
}
}";
var expected = @"using System;
class Class
{
void Method()
{
switch (a)
{
case 1:
break;
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task SwitchStatement2()
{
var code = @"using System;
class Class
{
void Method()
{
switch (true) { }$$";
var expected = @"using System;
class Class
{
void Method()
{
switch (true) { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task SwitchStatement3()
{
var code = @"using System;
class Class
{
void Method()
{
switch (true)
{
case 1: { }$$";
var expected = @"using System;
class Class
{
void Method()
{
switch (true)
{
case 1: { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.ColonToken);
}
[WpfFact]
public async Task SwitchStatement4()
{
var code = @"using System;
class Class
{
void Method()
{
switch (true)
{
case 1: {
}$$";
var expected = @"using System;
class Class
{
void Method()
{
switch (true)
{
case 1:
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.ColonToken);
}
[WpfFact]
public async Task Initializer1()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new int[] { }$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new int[] { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task Initializer2()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new int[] {
}$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new int[] {
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task Initializer3()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new { A = 1, B = 2
}$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new
{
A = 1,
B = 2
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task Initializer4()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new { A = 1, B = 2 }$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new { A = 1, B = 2 }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task Initializer5()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new[] {
1, 2, 3, 4,
5 }$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new[] {
1, 2, 3, 4,
5 }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task Initializer6()
{
var code = @"using System;
class Class
{
void Method()
{
var arr = new int[] {
1, 2, 3, 4,
5 }$$";
var expected = @"using System;
class Class
{
void Method()
{
var arr = new int[] {
1, 2, 3, 4,
5 }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task EmbeddedStatement1()
{
var code = @"using System;
class Class
{
void Method()
{
if (true) { }$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true) { }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement2()
{
var code = @"using System;
class Class
{
void Method()
{
if (true) {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement3()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
{ }$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
{ }";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement4()
{
var code = @"using System;
class Class
{
void Method()
{
while (true) {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
while (true)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/8413")]
public async Task EmbeddedStatementDoBlockAlone()
{
var code = @"using System;
class Class
{
void Method()
{
do {
}$$
}
}";
var expected = @"using System;
class Class
{
void Method()
{
do
{
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement5()
{
var code = @"using System;
class Class
{
void Method()
{
do {
} while(true);$$
}
}";
var expected = @"using System;
class Class
{
void Method()
{
do
{
} while (true);
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement6()
{
var code = @"using System;
class Class
{
void Method()
{
for (int i = 0; i < 10; i++) {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
for (int i = 0; i < 10; i++)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement7()
{
var code = @"using System;
class Class
{
void Method()
{
foreach (var i in collection) {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
foreach (var i in collection)
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement8()
{
var code = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource()) {
}$$
}";
var expected = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource())
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement9()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
int i = 10;$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
int i = 10;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task FieldlInitializer()
{
var code = @"using System;
class Class
{
string str = Console.Title;$$
";
var expected = @"using System;
class Class
{
string str = Console.Title;
";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task ArrayFieldlInitializer()
{
var code = @"using System;
namespace NS
{
class Class
{
string[] strArr = { ""1"", ""2"" };$$
";
var expected = @"using System;
namespace NS
{
class Class
{
string[] strArr = { ""1"", ""2"" };
";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task ExpressionValuedPropertyInitializer()
{
var code = @"using System;
class Class
{
public int Three => 1+2;$$
";
var expected = @"using System;
class Class
{
public int Three => 1 + 2;
";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement10()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
int i = 10;$$
}";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
int i = 10;
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement11()
{
var code = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource()) resource.Do();$$";
var expected = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource()) resource.Do();";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement12()
{
var code = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource())
resource.Do();$$";
var expected = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource())
resource.Do();";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement13()
{
var code = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource())
resource.Do();$$
}";
var expected = @"using System;
class Class
{
void Method()
{
using (var resource = GetResource())
resource.Do();
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement14()
{
var code = @"using System;
class Class
{
void Method()
{
do i = 10;$$";
var expected = @"using System;
class Class
{
void Method()
{
do i = 10;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement15()
{
var code = @"using System;
class Class
{
void Method()
{
do
i = 10;$$";
var expected = @"using System;
class Class
{
void Method()
{
do
i = 10;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement16()
{
var code = @"using System;
class Class
{
void Method()
{
do
i = 10;$$
}";
var expected = @"using System;
class Class
{
void Method()
{
do
i = 10;
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task EmbeddedStatement17()
{
var code = @"using System;
class Class
{
void Method()
{
do
i = 10;
while (true);$$
}";
var expected = @"using System;
class Class
{
void Method()
{
do
i = 10;
while (true);
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task FollowPreviousElement1()
{
var code = @"using System;
class Class
{
int i = 10;
int i2 = 10;$$";
var expected = @"using System;
class Class
{
int i = 10;
int i2 = 10;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task FollowPreviousElement2()
{
var code = @"using System;
class Class
{
void Method(int i)
{
}
void Method2()
{
}$$
}";
var expected = @"using System;
class Class
{
void Method(int i)
{
}
void Method2()
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.CloseBraceToken);
}
[WpfFact]
public async Task FollowPreviousElement3()
{
var code = @"using System;
class Class
{
void Method(int i)
{
}
A a = new A
{
Prop = 1,
Prop2 = 2
};$$
}";
var expected = @"using System;
class Class
{
void Method(int i)
{
}
A a = new A
{
Prop = 1,
Prop2 = 2
};
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.CloseBraceToken);
}
[WpfFact]
public async Task FollowPreviousElement4()
{
var code = @"using System;
class Class
{
void Method(int i)
{
int i = 10;
int i2 = 10;$$";
var expected = @"using System;
class Class
{
void Method(int i)
{
int i = 10;
int i2 = 10;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task FollowPreviousElement5()
{
var code = @"using System;
class Class
{
void Method(int i)
{
int i = 10;
if (true)
i = 50;$$";
var expected = @"using System;
class Class
{
void Method(int i)
{
int i = 10;
if (true)
i = 50;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task FollowPreviousElement6()
{
var code = @" using System;
using System.Linq;$$";
var expected = @" using System;
using System.Linq;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task FollowPreviousElement7()
{
var code = @" using System;
namespace NS
{
}
namespace NS2
{
}$$";
var expected = @" using System;
namespace NS
{
}
namespace NS2
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.CloseBraceToken);
}
[WpfFact]
public async Task FollowPreviousElement8()
{
var code = @"using System;
namespace NS
{
class Class
{
}
class Class1
{
}$$
}";
var expected = @"using System;
namespace NS
{
class Class
{
}
class Class1
{
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.CloseBraceToken);
}
[WpfFact]
public async Task IfStatement1()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task IfStatement2()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
{
}
else
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
{
}
else
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task IfStatement3()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
{
}
else if (false)
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
{
}
else if (false)
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task IfStatement4()
{
var code = @"using System;
class Class
{
void Method()
{
if (true)
return ;
else if (false)
return ;$$";
var expected = @"using System;
class Class
{
void Method()
{
if (true)
return;
else if (false)
return;";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task TryStatement1()
{
var code = @"using System;
class Class
{
void Method()
{
try
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
try
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task TryStatement2()
{
var code = @"using System;
class Class
{
void Method()
{
try
{
}
catch ( Exception ex)
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
try
{
}
catch (Exception ex)
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task TryStatement3()
{
var code = @"using System;
class Class
{
void Method()
{
try
{
}
catch ( Exception ex)
{
}
catch (Exception ex2)
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
try
{
}
catch (Exception ex)
{
}
catch (Exception ex2)
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task TryStatement4()
{
var code = @"using System;
class Class
{
void Method()
{
try
{
}
finally
{
}$$";
var expected = @"using System;
class Class
{
void Method()
{
try
{
}
finally
{
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/6645")]
public async Task TryStatement5()
{
var code = @"using System;
class Class
{
void Method()
{
try {
}$$
}
}";
var expected = @"using System;
class Class
{
void Method()
{
try
{
}
}
}";
await AutoFormatOnCloseBraceAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537555")]
public async Task SingleLine()
{
var code = @"class C { void M() { C.M( );$$ } }";
var expected = @"class C { void M() { C.M(); } }";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[Fact]
public async Task StringLiterals()
{
var code = @"class C { void M() { C.M(""Test {0}$$";
var expected = string.Empty;
await AutoFormatOnMarkerAsync(code, expected, SyntaxKind.StringLiteralToken, SyntaxKind.None);
}
[Fact]
public async Task CharLiterals()
{
var code = @"class C { void M() { C.M('}$$";
var expected = string.Empty;
await AutoFormatOnMarkerAsync(code, expected, SyntaxKind.CharacterLiteralToken, SyntaxKind.None);
}
[Fact, WorkItem("https://github.com/dotnet/roslyn/issues/44423")]
public async Task CharLiterals1()
{
var code = @"';$$";
var expected = string.Empty;
await AutoFormatOnMarkerAsync(code, expected, SyntaxKind.CharacterLiteralToken, SyntaxKind.None);
}
[Fact]
public async Task Comments()
{
var code = @"class C { void M() { // { }$$";
var expected = string.Empty;
await AutoFormatOnMarkerAsync(code, expected, SyntaxKind.OpenBraceToken, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task FirstLineInFile()
{
var code = @"using System;$$";
await AutoFormatOnSemicolonAsync(code, "using System;", SyntaxKind.UsingKeyword);
}
[WpfFact]
public async Task Label1()
{
var code = @"class C
{
void Method()
{
L : int i = 20;$$
}
}";
var expected = @"class C
{
void Method()
{
L: int i = 20;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Label2()
{
var code = @"class C
{
void Method()
{
L :
int i = 20;$$
}
}";
var expected = @"class C
{
void Method()
{
L:
int i = 20;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact]
public async Task Label3()
{
var code = @"class C
{
void Method()
{
int base = 10;
L :
int i = 20;$$
}
}";
var expected = @"class C
{
void Method()
{
int base = 10;
L:
int i = 20;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Label4()
{
var code = @"class C
{
void Method()
{
int base = 10;
L:
int i = 20;
int nextLine = 30 ;$$
}
}";
var expected = @"class C
{
void Method()
{
int base = 10;
L:
int i = 20;
int nextLine = 30;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.SemicolonToken);
}
[WpfFact]
public async Task Label6()
{
var code = @"class C
{
void Method()
{
L:
int i = 20;
int nextLine = 30 ;$$
}
}";
var expected = @"class C
{
void Method()
{
L:
int i = 20;
int nextLine = 30;
}
}";
await AutoFormatOnSemicolonAsync(code, expected, SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537776")]
public async Task DisappearedTokens()
{
var code = @"class Class1
{
int goo()
return 0;
}$$
}";
var expected = @"class Class1
{
int goo()
return 0;
}
}";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.ClassKeyword);
}
[Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537779")]
public async Task DisappearedTokens2()
{
var code = """
class Class1
{
void Goo()
{
Object o=new Object);$$
}
}
""";
var expected = """
class Class1
{
void Goo()
{
Object o = new Object);
}
}
""";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537793")]
public async Task Delegate1()
{
var code = @"delegate void MyDelegate(int a,int b);$$";
var expected = @"delegate void MyDelegate(int a, int b);";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.DelegateKeyword);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537827")]
public async Task DoubleInitializer()
{
var code = @"class C
{
void Method()
{
int[,] a ={{ 1 , 1 }$$
}
}";
var expected = @"class C
{
void Method()
{
int[,] a ={{ 1 , 1 }
}
}";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537825")]
public async Task MissingToken1()
{
var code = @"public class Class1
{
int a = 1}$$;
}";
var expected = @"public class Class1
{
int a = 1};
}";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.PublicKeyword);
}
[WpfFact]
public async Task ArrayInitializer1()
{
var code = @"public class Class1
{
var a = new []
{
1, 2, 3, 4
}$$
}";
var expected = @"public class Class1
{
var a = new[]
{
1, 2, 3, 4
}
}";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.NewKeyword);
}
[WpfFact]
public async Task ArrayInitializer2()
{
var code = @"public class Class1
{
var a = new []
{
1, 2, 3, 4
} ;$$
}";
var expected = @"public class Class1
{
var a = new[]
{
1, 2, 3, 4
};
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537825")]
public async Task MalformedCode()
{
var code = @"namespace ClassLibrary1
{
public class Class1
{
int a}$$;
}
}";
var expected = @"namespace ClassLibrary1
{
public class Class1
{
int a};
}
}";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537804")]
public async Task Colon_SwitchLabel()
{
var code = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
case 1 :$$
}
}
}
}";
var expected = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
case 1:
}
}
}
}";
await AutoFormatOnColonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/584599")]
public async Task Colon_SwitchLabel_Comment()
{
var code = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
// test
case 1 :$$
}
}
}
}";
var expected = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
// test
case 1:
}
}
}
}";
await AutoFormatOnColonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/584599")]
public async Task Colon_SwitchLabel_Comment2()
{
var code = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
case 2:
// test
case 1 :$$
}
}
}
}";
var expected = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
switch(E.Type)
{
case 2:
// test
case 1:
}
}
}
}";
await AutoFormatOnColonAsync(
code,
expected,
SyntaxKind.ColonToken);
}
[Fact]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537804")]
[WorkItem("https://github.com/dotnet/roslyn/issues/13981")]
public async Task Colon_Label()
{
var code = """
namespace ClassLibrary1
{
public class Class1
{
void Test()
{
label :$$
}
}
}
""";
var expected = """
namespace ClassLibrary1
{
public class Class1
{
void Test()
{
label:
}
}
}
""";
await AutoFormatOnColonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538793")]
public async Task Colon_Label2()
{
var code = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
label : Console.WriteLine(10) ;$$
}
}
}";
var expected = @"namespace ClassLibrary1
{
public class Class1
{
void Test()
{
label: Console.WriteLine(10);
}
}
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem(3186, "DevDiv_Projects/Roslyn")]
public async Task SemicolonInElseIfStatement()
{
var code = @"using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int a = 0;
if (a == 0)
a = 1;
else if (a == 1)
a=2;$$
else
a = 3;
}
}";
var expected = @"using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int a = 0;
if (a == 0)
a = 1;
else if (a == 1)
a = 2;
else
a = 3;
}
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.SemicolonToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538391")]
public async Task SemicolonInElseIfStatement2()
{
var code = @"public class Class1
{
void Method()
{
int a = 1;
if (a == 0)
a = 8;$$
else
a = 10;
}
}";
var expected = @"public class Class1
{
void Method()
{
int a = 1;
if (a == 0)
a = 8;
else
a = 10;
}
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.SemicolonToken);
}
[WpfFact, WorkItem(8385, "DevDiv_Projects/Roslyn")]
public async Task NullCoalescingOperator()
{
var code = @"class C
{
void M()
{
object o2 = null??null;$$
}
}";
var expected = @"class C
{
void M()
{
object o2 = null ?? null;
}
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/541517")]
public async Task SwitchDefault()
{
var code = @"using System;
class Program
{
static void Main()
{
switch (DayOfWeek.Monday)
{
case DayOfWeek.Monday:
case DayOfWeek.Tuesday:
break;
case DayOfWeek.Wednesday:
break;
default:$$
}
}
}";
var expected = @"using System;
class Program
{
static void Main()
{
switch (DayOfWeek.Monday)
{
case DayOfWeek.Monday:
case DayOfWeek.Tuesday:
break;
case DayOfWeek.Wednesday:
break;
default:
}
}
}";
await AutoFormatOnColonAsync(
code,
expected,
SyntaxKind.SemicolonToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542538")]
public async Task MissingTokens1()
{
var code = @"class Program
{
static void Main(string[] args)
{
gl::$$
}
}";
var expected = @"class Program
{
static void Main(string[] args)
{
gl::
}
}";
await AutoFormatOnMarkerAsync(
code,
expected,
SyntaxKind.ColonColonToken,
SyntaxKind.OpenBraceToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542538")]
public async Task MissingTokens2()
{
var code = @"class C { void M() { M(() => { }$$ } }";
var expected = @"class C { void M() { M(() => { } } }";
await AutoFormatOnCloseBraceAsync(
code,
expected,
SyntaxKind.EqualsGreaterThanToken);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542953")]
public async Task UsingAlias()
{
var code = @"using Alias=System;$$";
var expected = @"using Alias = System;";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.UsingKeyword);
}
[WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542953")]
public async Task NoLineChangeWithSyntaxError()
{
var code = @"struct Goo { public int member; }
class Program{
void Main()
{
var f = new Goo { member;$$ }
}
}";
var expected = @"struct Goo { public int member; }
class Program{
void Main()
{
var f = new Goo { member; }
}
}";
await AutoFormatOnSemicolonAsync(
code,
expected,
SyntaxKind.None);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/620568")]
public void SkippedTokens1(bool useTabs)
{
var code = @";$$*";
var expected = @";*";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530830")]
public void AutoPropertyAccessor(bool useTabs)
{
var code = @"class C
{
int Prop { get ;$$
}";
var expected = @"class C
{
int Prop { get;
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530830")]
public void AutoPropertyAccessor2(bool useTabs)
{
var code = @"class C
{
int Prop { get; set ;$$
}";
var expected = @"class C
{
int Prop { get; set;
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530830")]
public void AutoPropertyAccessor3(bool useTabs)
{
var code = @"class C
{
int Prop { get; set ; }$$
}";
var expected = @"class C
{
int Prop { get; set; }
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/784674")]
public void AutoPropertyAccessor4(bool useTabs)
{
var code = @"class C
{
int Prop { get;$$ }
}";
var expected = @"class C
{
int Prop { get; }
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/924469")]
public void AutoPropertyAccessor5(bool useTabs)
{
var code = @"class C
{
int Prop { get; set ;$$ }
}";
var expected = @"class C
{
int Prop { get; set; }
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/924469")]
public void AutoPropertyAccessor6(bool useTabs)
{
var code = @"class C
{
int Prop { get;set;$$}
}";
var expected = @"class C
{
int Prop { get; set; }
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/924469")]
public void AutoPropertyAccessor7(bool useTabs)
{
var code = @"class C
{
int Prop { get;set;$$}
}";
var expected = @"class C
{
int Prop { get; set; }
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/912965")]
public void NestedUsingStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
using (null)
using(null)$$
}
}";
var expected = @"class C
{
public void M()
{
using (null)
using (null)
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/912965")]
public void NestedNotUsingStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
using (null)
for(;;)$$
}
}";
var expected = @"class C
{
public void M()
{
using (null)
for(;;)
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void UsingStatementWithNestedFixedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
using (null)
fixed (void* ptr = &i)
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
using (null)
fixed (void* ptr = &i)
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void UsingStatementWithNestedCheckedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
using (null)
checked
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
using (null)
checked
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void UsingStatementWithNestedUncheckedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
using (null)
unchecked
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
using (null)
unchecked
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void FixedStatementWithNestedUsingStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
fixed (void* ptr = &i)
using (null)$$
}
}";
var expected = @"class C
{
public void M()
{
fixed (void* ptr = &i)
using (null)
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void FixedStatementWithNestedFixedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
fixed (void* ptr1 = &i)
fixed (void* ptr2 = &i)
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
fixed (void* ptr1 = &i)
fixed (void* ptr2 = &i)
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void FixedStatementWithNestedNotFixedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
fixed (void* ptr = &i)
if (false)
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
fixed (void* ptr = &i)
if (false)
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
public void NotFixedStatementWithNestedFixedStatement(bool useTabs)
{
var code = @"class C
{
public void M()
{
if (false)
fixed (void* ptr = &i)
{
}$$
}
}";
var expected = @"class C
{
public void M()
{
if (false)
fixed (void* ptr = &i)
{
}
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954386")]
public void FormattingRangeForFirstStatementOfBlock(bool useTabs)
{
var code = @"class C
{
public void M()
{int s;$$
}
}";
var expected = @"class C
{
public void M()
{
int s;
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954386")]
public void FormattingRangeForFirstMemberofType(bool useTabs)
{
var code = @"class C
{int s;$$
public void M()
{
}
}";
var expected = @"class C
{
int s;
public void M()
{
}
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954386")]
public void FormattingRangeForFirstMethodMemberofType(bool useTabs)
{
var code = @"interface C
{void s();$$
}";
var expected = @"interface C
{
void s();
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("https://github.com/dotnet/roslyn/issues/17257")]
public void FormattingRangeForConstructor(bool useTabs)
{
var code = @"class C
{public C()=>f=1;$$
}";
var expected = @"class C
{
public C() => f = 1;
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("https://github.com/dotnet/roslyn/issues/17257")]
public void FormattingRangeForDestructor(bool useTabs)
{
var code = @"class C
{~C()=>f=1;$$
}";
var expected = @"class C
{
~C() => f = 1;
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("https://github.com/dotnet/roslyn/issues/17257")]
public void FormattingRangeForOperator(bool useTabs)
{
var code = @"class C
{public static C operator +(C left, C right)=>field=1;$$
static int field;
}";
var expected = @"class C
{
public static C operator +(C left, C right) => field = 1;
static int field;
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/954386")]
public void FormattingRangeForFirstMemberOfNamespace(bool useTabs)
{
var code = @"namespace C
{delegate void s();$$
}";
var expected = @"namespace C
{
delegate void s();
}";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/981821")]
public void FormatDirectiveTriviaAlwaysToColumnZero(bool useTabs)
{
var code = @"class Program
{
static void Main(string[] args)
{
#if
#$$
}
}
";
var expected = @"class Program
{
static void Main(string[] args)
{
#if
#
}
}
";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/981821")]
public void FormatDirectiveTriviaAlwaysToColumnZeroWithCode(bool useTabs)
{
var code = @"class Program
{
static void Main(string[] args)
{
#if
int s = 10;
#$$
}
}
";
var expected = @"class Program
{
static void Main(string[] args)
{
#if
int s = 10;
#
}
}
";
AutoFormatToken(code, expected, useTabs);
}
[WpfTheory]
[CombinatorialData]
[WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/981821")]
public void FormatDirectiveTriviaAlwaysToColumnZeroWithBrokenElseDirective(bool useTabs)
{
var code = @"class Program
{
static void Main(string[] args)
{
#else
#$$
}
}
";
var expected = @"class Program
{
static void Main(string[] args)
{
#else
#
}
}
";
AutoFormatToken(code, expected, useTabs);
}
internal static void AutoFormatToken(string markup, string expected, bool useTabs)
{
if (useTabs)
{
markup = markup.Replace(" ", "\t");
expected = expected.Replace(" ", "\t");
}
using var workspace = EditorTestWorkspace.CreateCSharp(markup);
var subjectDocument = workspace.Documents.Single();
var textBuffer = subjectDocument.GetTextBuffer();
var optionsService = workspace.GetService<EditorOptionsService>();
var editorOptions = optionsService.Factory.GetOptions(textBuffer);
editorOptions.SetOptionValue(DefaultOptions.ConvertTabsToSpacesOptionId, !useTabs);
var commandHandler = workspace.GetService<FormatCommandHandler>();
var typedChar = textBuffer.CurrentSnapshot.GetText(subjectDocument.CursorPosition.Value - 1, 1);
commandHandler.ExecuteCommand(new TypeCharCommandArgs(subjectDocument.GetTextView(), textBuffer, typedChar[0]), () => { }, TestCommandExecutionContext.Create());
var newSnapshot = textBuffer.CurrentSnapshot;
Assert.Equal(expected, newSnapshot.GetText());
}
private static Task AutoFormatOnColonAsync(string codeWithMarker, string expected, SyntaxKind startTokenKind)
=> AutoFormatOnMarkerAsync(codeWithMarker, expected, SyntaxKind.ColonToken, startTokenKind);
private static Task AutoFormatOnSemicolonAsync(string codeWithMarker, string expected, SyntaxKind startTokenKind)
=> AutoFormatOnMarkerAsync(codeWithMarker, expected, SyntaxKind.SemicolonToken, startTokenKind);
private static Task AutoFormatOnCloseBraceAsync(string codeWithMarker, string expected, SyntaxKind startTokenKind)
=> AutoFormatOnMarkerAsync(codeWithMarker, expected, SyntaxKind.CloseBraceToken, startTokenKind);
private static async Task AutoFormatOnMarkerAsync(string initialMarkup, string expected, SyntaxKind tokenKind, SyntaxKind startTokenKind)
{
await AutoFormatOnMarkerAsync(initialMarkup, expected, useTabs: false, tokenKind, startTokenKind).ConfigureAwait(false);
await AutoFormatOnMarkerAsync(initialMarkup.Replace(" ", "\t"), expected.Replace(" ", "\t"), useTabs: true, tokenKind, startTokenKind).ConfigureAwait(false);
}
private static async Task AutoFormatOnMarkerAsync(string initialMarkup, string expected, bool useTabs, SyntaxKind tokenKind, SyntaxKind startTokenKind)
{
using var workspace = EditorTestWorkspace.CreateCSharp(initialMarkup);
var testDocument = workspace.Documents.Single();
var buffer = testDocument.GetTextBuffer();
var position = testDocument.CursorPosition.Value;
var document = workspace.CurrentSolution.GetDocument(testDocument.Id);
var documentSyntax = await ParsedDocument.CreateAsync(document, CancellationToken.None);
var rules = Formatter.GetDefaultFormattingRules(document);
var root = (CompilationUnitSyntax)await document.GetSyntaxRootAsync();
var endToken = root.FindToken(position);
if (position == endToken.SpanStart && !endToken.GetPreviousToken().IsKind(SyntaxKind.None))
{
endToken = endToken.GetPreviousToken();
}
Assert.Equal(tokenKind, endToken.Kind());
var options = new IndentationOptions(
new CSharpSyntaxFormattingOptions() { LineFormatting = new() { UseTabs = useTabs } });
var formatter = new CSharpSmartTokenFormatter(options, rules, (CompilationUnitSyntax)documentSyntax.Root, documentSyntax.Text);
var tokenRange = FormattingRangeHelper.FindAppropriateRange(endToken);
if (tokenRange == null)
{
Assert.Equal(SyntaxKind.None, startTokenKind);
return;
}
Assert.Equal(startTokenKind, tokenRange.Value.Item1.Kind());
if (tokenRange.Value.Item1.Equals(tokenRange.Value.Item2))
{
return;
}
var changes = formatter.FormatRange(tokenRange.Value.Item1, tokenRange.Value.Item2, CancellationToken.None);
var actual = GetFormattedText(buffer, changes);
Assert.Equal(expected, actual);
}
private static string GetFormattedText(ITextBuffer buffer, IList<TextChange> changes)
{
using (var edit = buffer.CreateEdit())
{
foreach (var change in changes)
{
edit.Replace(change.Span.ToSpan(), change.NewText);
}
edit.Apply();
}
return buffer.CurrentSnapshot.GetText();
}
}
|