Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions src/CSharp/CodeCracker/Usage/ReadonlyFieldCodeFixProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting;
using System;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
Expand Down Expand Up @@ -44,10 +45,13 @@ private async static Task<Document> MakeFieldReadonlyAsync(Document document, Di

private static SyntaxNode MakeSingleFieldReadonly(SyntaxNode root, FieldDeclarationSyntax fieldDeclaration)
{
var newFieldDeclaration = fieldDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))
.WithTrailingTrivia(fieldDeclaration.GetTrailingTrivia())
.WithLeadingTrivia(fieldDeclaration.GetLeadingTrivia())
.WithAdditionalAnnotations(Formatter.Annotation);

var newFieldDeclaration = fieldDeclaration
.WithoutLeadingTrivia()
.AddModifiers(SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))
.WithTrailingTrivia(fieldDeclaration.GetTrailingTrivia())
.WithLeadingTrivia(fieldDeclaration.GetLeadingTrivia())
.WithAdditionalAnnotations(Formatter.Annotation);
var newRoot = root.ReplaceNode(fieldDeclaration, newFieldDeclaration);
return newRoot;
}
Expand All @@ -57,8 +61,8 @@ private static SyntaxNode MakeMultipleFieldsReadonly(SyntaxNode root, FieldDecla
var newFieldDeclaration = fieldDeclaration.WithDeclaration(newDeclaration);
var newReadonlyFieldDeclaration = fieldDeclaration.WithDeclaration(SyntaxFactory.VariableDeclaration(fieldDeclaration.Declaration.Type, SyntaxFactory.SeparatedList(new[] { variableToMakeReadonly })))
.WithoutLeadingTrivia()
.WithTrailingTrivia(SyntaxFactory.ParseTrailingTrivia("\n"))
.AddModifiers(SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))
.WithTrailingTrivia(SyntaxFactory.ParseTrailingTrivia(Environment.NewLine))
.WithAdditionalAnnotations(Formatter.Annotation);
var newRoot = root.ReplaceNode(fieldDeclaration, new[] { newFieldDeclaration, newReadonlyFieldDeclaration });
return newRoot;
Expand Down
71 changes: 71 additions & 0 deletions test/CSharp/CodeCracker.Test/Usage/ReadonlyFieldTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,77 @@ class TypeName
await VerifyCSharpFixAsync(source, fixtest);
}


[Fact]
public async Task DoesNotDuplicateLeadingDirectivesOnFixSingle()
{
const string source = @"
namespace ConsoleApplication1
{
public class Foo
{
#region standard
Foo foo1 = new Foo();
#endregion

#region withAccessModifier
private Foo foo2 = new Foo();
#endregion

#region withStatic
private static Foo foo3 = new Foo();
#endregion
}
}";
const string fixtest = @"
namespace ConsoleApplication1
{
public class Foo
{
#region standard
readonly Foo foo1 = new Foo();
#endregion

#region withAccessModifier
private readonly Foo foo2 = new Foo();
#endregion

#region withStatic
private static readonly Foo foo3 = new Foo();
#endregion
}
}";
await VerifyCSharpFixAsync(source, fixtest);
}


[Fact]
public async Task DoesNotDuplicateLeadingDirectivesOnFixAll()
{
const string source = @"
namespace ConsoleApplication1
{
public class Foo
{
#region standard
Foo foo1, foo2 = new Foo(), foo3;
#endregion
}
}";
const string fixtest = @"
namespace ConsoleApplication1
{
public class Foo
{
#region standard
Foo foo1, foo3;
readonly Foo foo2 = new Foo();
#endregion
}
}";
await VerifyCSharpFixAsync(source, fixtest);
}

[Fact]
public async Task FieldsWithAssignmentOnDeclarationWithSingleDeclarationCreatesDiagnostic()
{
Expand Down