diff --git a/src/EditorFeatures/CSharpTest/MakeStructFieldsWritable/MakeStructFieldsWritableTests.cs b/src/EditorFeatures/CSharpTest/MakeStructFieldsWritable/MakeStructFieldsWritableTests.cs index 77323a943d71339a2a9a4f94dd60a3c9cf5aeb4a..31eb34465ce44cdccde08dea58b014bb28318bb7 100644 --- a/src/EditorFeatures/CSharpTest/MakeStructFieldsWritable/MakeStructFieldsWritableTests.cs +++ b/src/EditorFeatures/CSharpTest/MakeStructFieldsWritable/MakeStructFieldsWritableTests.cs @@ -167,5 +167,38 @@ public void Test() }", expected: Diagnostic(IDEDiagnosticIds.MakeStructFieldsWritable)); } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsMakeStructFieldsWritable)] + public async Task SingleReadonlyField_InClass() + { + await TestDiagnosticMissingAsync( +@"class MyClass +{ + public readonly int Value; + + public MyClass(int value) + { + Value = value; + } + + public void Test() + { + [|this = new MyClass(5)|]; + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsMakeStructFieldsWritable)] + public async Task StructWithoutField() + { + await TestDiagnosticMissingAsync( +@"struct MyStruct +{ + public void Test() + { + [|this = new MyStruct()|]; + } +}"); + } } } diff --git a/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableCodeFixProvider.cs b/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableCodeFixProvider.cs index f140dd4846ad8cf25d4f1624a935da97e1850c70..f4d0d0b8cf1ae0392bcf8312944a7ca7c8c34b98 100644 --- a/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableCodeFixProvider.cs +++ b/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableCodeFixProvider.cs @@ -51,10 +51,11 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context) { var readonlySyntaxToken = fieldDeclaration.ChildTokens() .FirstOrDefault(token => token.IsKind(SyntaxKind.ReadOnlyKeyword)); + if (readonlySyntaxToken != default) { - var newFieldDeclaration = fieldDeclaration.ReplaceToken(readonlySyntaxToken, emptyToken); - editor.ReplaceNode(fieldDeclaration, newFieldDeclaration); + var fieldWithoutReadonly = fieldDeclaration.ReplaceToken(readonlySyntaxToken, emptyToken); + editor.ReplaceNode(fieldDeclaration, fieldWithoutReadonly); } } } @@ -63,7 +64,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context) private class MyCodeAction : CodeAction.DocumentChangeAction { public MyCodeAction(Func> createChangedDocument) : - base(FeaturesResources.Make_field_readonly, createChangedDocument) + base(FeaturesResources.Make_readonly_fields_writable, createChangedDocument) { } } diff --git a/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableDiagnosticAnalyzer.cs b/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableDiagnosticAnalyzer.cs index f1adb08e8c4ec4d178f6163aeadd0a15070edd2b..76f681d5b9162eb8c1c708b140fa24ed3f8433a7 100644 --- a/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableDiagnosticAnalyzer.cs +++ b/src/Features/CSharp/Portable/MakeStructFieldsWritable/CSharpMakeStructFieldsWritableDiagnosticAnalyzer.cs @@ -10,8 +10,8 @@ internal sealed class CSharpMakeStructFieldsWritableDiagnosticAnalyzer : Abstrac { private static readonly DiagnosticDescriptor s_diagnosticDescriptor = CreateDescriptor( IDEDiagnosticIds.MakeStructFieldsWritable, - new LocalizableResourceString("test", FeaturesResources.ResourceManager, typeof(FeaturesResources)), - new LocalizableResourceString("test", FeaturesResources.ResourceManager, typeof(FeaturesResources)), + new LocalizableResourceString(nameof(FeaturesResources.Make_readonly_fields_writable), FeaturesResources.ResourceManager, typeof(FeaturesResources)), + new LocalizableResourceString(nameof(FeaturesResources.Make_readonly_fields_writable), FeaturesResources.ResourceManager, typeof(FeaturesResources)), isUnneccessary: true); public CSharpMakeStructFieldsWritableDiagnosticAnalyzer() @@ -48,6 +48,7 @@ private void RegisterActions(CompilationStartAnalysisContext context) { context.RegisterSymbolStartAction(symbolStartContext => { + // We are only interested in struct declarations var namedTypeSymbol = (INamedTypeSymbol)symbolStartContext.Symbol; if (namedTypeSymbol.TypeKind != TypeKind.Struct) return; diff --git a/src/Features/Core/Portable/FeaturesResources.Designer.cs b/src/Features/Core/Portable/FeaturesResources.Designer.cs index ed170f4da49adcf8fa37bc3b68ee33aba19431fe..5cd33a5809fe5a363232381d67a90e173eab01c5 100644 --- a/src/Features/Core/Portable/FeaturesResources.Designer.cs +++ b/src/Features/Core/Portable/FeaturesResources.Designer.cs @@ -10,7 +10,6 @@ namespace Microsoft.CodeAnalysis { using System; - using System.Reflection; /// @@ -40,7 +39,7 @@ internal class FeaturesResources { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.CodeAnalysis.FeaturesResources", typeof(FeaturesResources).GetTypeInfo().Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.CodeAnalysis.FeaturesResources", typeof(FeaturesResources).Assembly); resourceMan = temp; } return resourceMan; @@ -2242,6 +2241,15 @@ internal class FeaturesResources { } } + /// + /// Looks up a localized string similar to Make readonly fields writable. + /// + internal static string Make_readonly_fields_writable { + get { + return ResourceManager.GetString("Make_readonly_fields_writable", resourceCulture); + } + } + /// /// Looks up a localized string similar to Member name can be simplified. /// diff --git a/src/Features/Core/Portable/FeaturesResources.resx b/src/Features/Core/Portable/FeaturesResources.resx index a0394bf8c192f0a0c625ae8c445e43da9ef9aa75..94bbf50c90af3a4c5bce5b69778b2d9694b377e4 100644 --- a/src/Features/Core/Portable/FeaturesResources.resx +++ b/src/Features/Core/Portable/FeaturesResources.resx @@ -1481,4 +1481,7 @@ This version used in: {2} {0} can be simplified + + Make readonly fields writable + \ No newline at end of file diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.cs.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.cs.xlf index 350b82c7427bd0a1bb13b7cbc8184f05cf076cda..bc905d3f52dfff726a54a6a57a0322c38f7ad26d 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.cs.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.cs.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.de.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.de.xlf index 7a2d7c234e6bcf1f82c35597b91041be3624e706..cb9b10f018ca51b415fbf2a45573d880f9d35285 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.de.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.de.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.es.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.es.xlf index 2c6b3ecf5893a63b8c595335aea4495fc01099d3..050c7b13d3fe47197291f9c46c49f9f4e14e8650 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.es.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.es.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.fr.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.fr.xlf index fb6a958ad5c2f367f881e68c0ca64235f191f417..284220027dfec5e460bf59aab289bff4bdd67f46 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.fr.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.fr.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.it.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.it.xlf index 9bf4c7c1d116995164f18f065073e40833c9bdfb..4cc2f7e06e98460a1553cdcbf4e82e5841f86705 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.it.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.it.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.ja.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.ja.xlf index 318b087b8c9771e4f5fe239fa4ad988b8e1fd828..439f75dabd9ad57ce411d4cef3ecac8c847f549b 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.ja.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.ja.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.ko.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.ko.xlf index c505b0d557121dfff277bf9fb43058e066c2150e..2fb7a2c0bd50ed2eb2a77b3c076358799c10e919 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.ko.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.ko.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.pl.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.pl.xlf index 4c4134c8493e9ed9e6f22f6ed2dae6a68e392f46..8b7b360388782e88769c975dfefc825d358ea520 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.pl.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.pl.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.pt-BR.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.pt-BR.xlf index 60c14b45236db45b196d7085215b03bb151efb74..463aa3db1c087b8a67bc88fac0276bab9776d7b9 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.pt-BR.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.pt-BR.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.ru.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.ru.xlf index 7ad54e19a70474f335085e3580e34cf8be25da47..306f96639b074a551bc0f72572386b70b2fe8a03 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.ru.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.ru.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.tr.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.tr.xlf index 35bc0d0d1f2911d3cdfd62d7ba03a61cccafb32f..cdbb2f5eb5c9881b46dc02afe0fef3c24dd258da 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.tr.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.tr.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hans.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hans.xlf index 4db50835850b91429d8146863cca3be61a082180..9302a53c017eea72d92ea3bc5f525ad53c27eb61 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hans.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hans.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read. diff --git a/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hant.xlf b/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hant.xlf index 41d9d0204e73f10116e17fd8974fcb4caa9ea49c..21555cb8cf92b8ba5ca5e05c92e637f689885ab4 100644 --- a/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hant.xlf +++ b/src/Features/Core/Portable/xlf/FeaturesResources.zh-Hant.xlf @@ -112,6 +112,11 @@ Introduce query variable + + Make readonly fields writable + Make readonly fields writable + + Private member '{0}' can be removed as the value assigned to it is never read. Private member '{0}' can be removed as the value assigned to it is never read.