From d41e2a978885b15612be1d555f3a734c993fe7e7 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Tue, 5 Jun 2018 22:00:09 +0100 Subject: [PATCH 1/7] Mark readonly serialized fields as redudant Also adds quickfixes to remove the attribute, or make one or all fields non-readonly Fixes #503 --- ...tSerializeFieldAttributeProblemAnalyzer.cs | 4 +- ...moveReadonlyFromSerializedFieldQuickFix.cs | 103 ++++++++++++++++++ .../RedundantSerializeFieldAttribute.cs | 1 + .../RedundantSerializeFieldAttribute.cs.gold | 2 + .../Availability/Test02.cs | 7 ++ .../Availability/Test02.cs.gold | 30 +++++ .../Test02.cs | 7 ++ .../Test02.cs.gold | 7 ++ .../Availability/Test01.cs | 7 ++ .../Availability/Test01.cs.gold | 21 ++++ .../Availability/Test02.cs | 7 ++ .../Availability/Test02.cs.gold | 30 +++++ .../Test01.cs | 7 ++ .../Test01.cs.gold | 7 ++ .../Test02.cs | 7 ++ .../Test02.cs.gold | 7 ++ .../Test03.cs | 8 ++ .../Test03.cs.gold | 10 ++ ...antSerializeFieldAttributeQuickFixTests.cs | 4 +- ...eadonlyFromSerializedFieldQuickFixTests.cs | 25 +++++ resharper/test/src/tests.rider.csproj | 2 +- 21 files changed, 299 insertions(+), 4 deletions(-) create mode 100644 resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs.gold create mode 100644 resharper/test/src/Intentions/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFixTests.cs diff --git a/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantSerializeFieldAttributeProblemAnalyzer.cs b/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantSerializeFieldAttributeProblemAnalyzer.cs index 2c7e57f037..685ac28660 100644 --- a/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantSerializeFieldAttributeProblemAnalyzer.cs +++ b/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantSerializeFieldAttributeProblemAnalyzer.cs @@ -26,8 +26,8 @@ protected override void Analyze(IAttribute attribute, ElementProblemAnalyzerData var fieldDeclarations = FieldDeclarationNavigator.GetByAttribute(attribute); foreach (var fieldDeclaration in fieldDeclarations) { - if (fieldDeclaration.DeclaredElement.HasAttributeInstance(PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS, - false)) + if (fieldDeclaration.DeclaredElement?.HasAttributeInstance(PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS, + false) == true || fieldDeclaration.IsReadonly) { consumer.AddHighlighting(new RedundantSerializeFieldAttributeWarning(attribute)); return; diff --git a/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs new file mode 100644 index 0000000000..3935e788cc --- /dev/null +++ b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using JetBrains.Annotations; +using JetBrains.Application.Progress; +using JetBrains.Application.UI.Controls.BulbMenu.Anchors; +using JetBrains.ProjectModel; +using JetBrains.ReSharper.Feature.Services.Bulbs; +using JetBrains.ReSharper.Feature.Services.Intentions; +using JetBrains.ReSharper.Feature.Services.QuickFixes; +using JetBrains.ReSharper.Plugins.Unity.CSharp.Daemon.Errors; +using JetBrains.ReSharper.Psi.CSharp.Impl; +using JetBrains.ReSharper.Psi.CSharp.Tree; +using JetBrains.ReSharper.Psi.Tree; +using JetBrains.TextControl; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.QuickFixes +{ + [QuickFix] + public class RemoveReadonlyFromSerializedFieldQuickFix : IQuickFix + { + [NotNull] private static readonly SubmenuAnchor ourSubmenuAnchor = + new SubmenuAnchor(IntentionsAnchors.QuickFixesAnchor, SubmenuBehavior.Executable); + + private readonly IAttribute myAttribute; + private readonly TreeNodeCollection myFieldDeclarations; + private readonly IMultipleFieldDeclaration myMultipleFieldDeclaration; + + public RemoveReadonlyFromSerializedFieldQuickFix(RedundantSerializeFieldAttributeWarning highlighting) + { + myAttribute = highlighting.Attribute; + var attributeSectionList = AttributeSectionListNavigator.GetByAttribute(myAttribute); + myMultipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByAttributes(attributeSectionList); + myFieldDeclarations = FieldDeclarationNavigator.GetByAttribute(myAttribute); + } + + public IEnumerable CreateBulbItems() + { + var readonlyCount = myFieldDeclarations.Count(fd => fd.IsReadonly); + switch (readonlyCount) + { + case 0: + return EmptyList.Enumerable; + + case 1: + return new RemoveAllReadonly(myMultipleFieldDeclaration).ToQuickFixIntentions(); + + default: + var list = new List(); + list.Add(new RemoveAllReadonly(myMultipleFieldDeclaration).ToQuickFixIntention(ourSubmenuAnchor)); + foreach (var fieldDeclaration in myFieldDeclarations) + { + if (fieldDeclaration.IsReadonly) + list.Add(new RemoveOneReadonly(fieldDeclaration).ToQuickFixIntention(ourSubmenuAnchor)); + } + + return list; + } + } + + public bool IsAvailable(IUserDataHolder cache) + { + return myAttribute.IsValid() && myFieldDeclarations.Any(fd => fd.IsReadonly); + } + + private class RemoveAllReadonly : BulbActionBase + { + private readonly IMultipleFieldDeclaration myFieldDeclarations; + + public RemoveAllReadonly(IMultipleFieldDeclaration fieldDeclarations) + { + myFieldDeclarations = fieldDeclarations; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + ModifiersUtil.SetReadonly(myFieldDeclarations, false); + return null; + } + + public override string Text => "Remove readonly modifier"; + } + + private class RemoveOneReadonly : BulbActionBase + { + private readonly IFieldDeclaration myFieldDeclaration; + + public RemoveOneReadonly(IFieldDeclaration fieldDeclaration) + { + myFieldDeclaration = fieldDeclaration; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + myFieldDeclaration.SetReadonly(false); + return null; + } + + public override string Text => $"Make '{myFieldDeclaration.DeclaredName}' non-readonly"; + } + } +} \ No newline at end of file diff --git a/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs b/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs index 83f421c4e3..02c8aab00a 100644 --- a/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs +++ b/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs @@ -7,4 +7,5 @@ public class Test : MonoBehaviour [SerializeField] private int NotRedundant2; [SerializeField] [NonSerialized] public int Redundant1; [SerializeField] [NonSerialized] private int Redundant1; + [SerializeField] private readonly int ReadonlyFieldsAreNotSerialized; } diff --git a/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs.gold b/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs.gold index c046a3a85a..1de96617c6 100644 --- a/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs.gold +++ b/resharper/test/data/daemon/Stages/Analysis/RedundantSerializeFieldAttribute.cs.gold @@ -7,6 +7,7 @@ public class |Test|(0) : MonoBehaviour [SerializeField] private int |NotRedundant2|(2); [|SerializeField|(3)] [NonSerialized] public int Redundant1; [|SerializeField|(4)] [NonSerialized] private int Redundant1; + [|SerializeField|(5)] private readonly int ReadonlyFieldsAreNotSerialized; } --------------------------------------------------------- @@ -15,3 +16,4 @@ public class |Test|(0) : MonoBehaviour (2): Unity Gutter Icon: This field is initialised by Unity (3): ReSharper Dead Code: Redundant 'SerializeField' attribute (4): ReSharper Dead Code: Redundant 'SerializeField' attribute +(5): ReSharper Dead Code: Redundant 'SerializeField' attribute diff --git a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs new file mode 100644 index 0000000000..ccbd0a2c95 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold new file mode 100644 index 0000000000..2cc1590d68 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold @@ -0,0 +1,30 @@ +|using System;|(0) +using UnityEngine; + +public class Test +{ + [|SerializeField|(1)] public readonly int |Value1|(2), |Value2|(3), |Value3|(4); +} + +------------------------------------------------ +0: Using directive is not required by the code and can be safely removed +QUICKFIXES: +Remove unused directives in file +--Remove unused directives in project +--Remove unused directives in solution +1: Redundant 'SerializeField' attribute +QUICKFIXES: +Remove redundant attribute +Remove readonly modifier +--Make 'Value1' non-readonly +--Make 'Value2' non-readonly +--Make 'Value3' non-readonly +2: Readonly field 'Value1' is never assigned +QUICKFIXES: +Initialize field from constructor +3: Readonly field 'Value2' is never assigned +QUICKFIXES: +Initialize field from constructor +4: Readonly field 'Value3' is never assigned +QUICKFIXES: +Initialize field from constructor diff --git a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs new file mode 100644 index 0000000000..ccbd0a2c95 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs.gold new file mode 100644 index 0000000000..2a8663a2bf --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Test02.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + {caret} public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs new file mode 100644 index 0000000000..ed3082e06e --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold new file mode 100644 index 0000000000..a235b2aac1 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold @@ -0,0 +1,21 @@ +|using System;|(0) +using UnityEngine; + +public class Test +{ + [|SerializeField|(1)] public readonly int |Value|(2); +} + +------------------------------------------------ +0: Using directive is not required by the code and can be safely removed +QUICKFIXES: +Remove unused directives in file +--Remove unused directives in project +--Remove unused directives in solution +1: Redundant 'SerializeField' attribute +QUICKFIXES: +Remove redundant attribute +Remove readonly modifier +2: Readonly field 'Value' is never assigned +QUICKFIXES: +Initialize field from constructor diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs new file mode 100644 index 0000000000..ccbd0a2c95 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold new file mode 100644 index 0000000000..2cc1590d68 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold @@ -0,0 +1,30 @@ +|using System;|(0) +using UnityEngine; + +public class Test +{ + [|SerializeField|(1)] public readonly int |Value1|(2), |Value2|(3), |Value3|(4); +} + +------------------------------------------------ +0: Using directive is not required by the code and can be safely removed +QUICKFIXES: +Remove unused directives in file +--Remove unused directives in project +--Remove unused directives in solution +1: Redundant 'SerializeField' attribute +QUICKFIXES: +Remove redundant attribute +Remove readonly modifier +--Make 'Value1' non-readonly +--Make 'Value2' non-readonly +--Make 'Value3' non-readonly +2: Readonly field 'Value1' is never assigned +QUICKFIXES: +Initialize field from constructor +3: Readonly field 'Value2' is never assigned +QUICKFIXES: +Initialize field from constructor +4: Readonly field 'Value3' is never assigned +QUICKFIXES: +Initialize field from constructor diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs new file mode 100644 index 0000000000..ed3082e06e --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs.gold new file mode 100644 index 0000000000..adfb92506c --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test01.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs new file mode 100644 index 0000000000..ccbd0a2c95 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs.gold new file mode 100644 index 0000000000..346b909218 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test02.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs new file mode 100644 index 0000000000..48376db826 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs @@ -0,0 +1,8 @@ +// ${RUN:2} +using System; +using UnityEngine; + +public class Test +{ + [Serialize{caret}Field] public readonly int Value1, Value2, Value3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs.gold new file mode 100644 index 0000000000..1e2a9d9b0e --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Test03.cs.gold @@ -0,0 +1,10 @@ +// ${RUN:2} +using System; +using UnityEngine; + +public class Test +{ + [SerializeField] public readonly int Value1; + [Serialize{caret}Field] public int Value2; + [SerializeField] public readonly int Value3; +} diff --git a/resharper/test/src/Intentions/QuickFixes/RedundantSerializeFieldAttributeQuickFixTests.cs b/resharper/test/src/Intentions/QuickFixes/RedundantSerializeFieldAttributeQuickFixTests.cs index 4978b0dd4a..969bb8762a 100644 --- a/resharper/test/src/Intentions/QuickFixes/RedundantSerializeFieldAttributeQuickFixTests.cs +++ b/resharper/test/src/Intentions/QuickFixes/RedundantSerializeFieldAttributeQuickFixTests.cs @@ -10,13 +10,15 @@ public class RedundantSerializeFieldAttributeQuickFixAvailabilityTests : QuickFi protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RedundantSerializeFieldAttribute\Availability"; [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } } [TestUnity] - public class RedundantSerializeFieldAttributeQuickFixRemoveTests : CSharpQuickFixTestBase + public class RedundantSerializeFieldAttributeQuickFixTests : CSharpQuickFixTestBase { protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RedundantSerializeFieldAttribute"; [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } } } \ No newline at end of file diff --git a/resharper/test/src/Intentions/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFixTests.cs b/resharper/test/src/Intentions/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFixTests.cs new file mode 100644 index 0000000000..56cdf3742d --- /dev/null +++ b/resharper/test/src/Intentions/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFixTests.cs @@ -0,0 +1,25 @@ +using JetBrains.ReSharper.FeaturesTestFramework.Intentions; +using JetBrains.ReSharper.Plugins.Unity.Feature.Services.QuickFixes; +using NUnit.Framework; + +namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.QuickFixes +{ + [TestUnity] + public class RemoveReadonlyFromSerializedFieldQuickFixAvailabilityTests : QuickFixAvailabilityTestBase + { + protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RemoveReadonlyFromSerializedField\Availability"; + + [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } + } + + [TestUnity] + public class RemoveReadonlyFromSerializedFieldQuickFixTests : CSharpQuickFixTestBase + { + protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RemoveReadonlyFromSerializedField"; + + [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } + [Test] public void Test03() { DoNamedTest(); } + } +} \ No newline at end of file diff --git a/resharper/test/src/tests.rider.csproj b/resharper/test/src/tests.rider.csproj index 62d645daae..7db25f3f85 100644 --- a/resharper/test/src/tests.rider.csproj +++ b/resharper/test/src/tests.rider.csproj @@ -16,4 +16,4 @@ - + \ No newline at end of file From ef31a49027037627e8584f986bfeef9609906164 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Wed, 6 Jun 2018 08:51:28 +0100 Subject: [PATCH 2/7] Update Rider SDK version --- resharper/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resharper/Directory.Build.props b/resharper/Directory.Build.props index f8b43f212d..3f8f02986a 100644 --- a/resharper/Directory.Build.props +++ b/resharper/Directory.Build.props @@ -24,7 +24,7 @@ - 182-SNAPSHOT* + 2018.2.0-* 2018.1-SNAPSHOT* From 034888f65d74d2bd2ce3dd5b73c6a9715ecd5907 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Wed, 6 Jun 2018 22:54:47 +0100 Subject: [PATCH 3/7] Add context actions to toggle HideInInspector Fixes #494 --- .../ToggleHideInInspectorAttributeAction.cs | 175 ++++++++++++++++++ resharper/src/resharper-unity/UnityApi.cs | 4 +- .../AddAttribute.cs | 6 + .../AddAttribute.cs.gold | 6 + .../AddAttributeToAllFields.cs | 6 + .../AddAttributeToAllFields.cs.gold | 6 + .../AddToExistingAttributes.cs | 6 + .../AddToExistingAttributes.cs.gold | 6 + .../AddToOneOfMultipleFields.cs | 6 + .../AddToOneOfMultipleFields.cs.gold | 8 + .../Availability01.cs | 23 +++ .../RemoveAttribute01.cs | 6 + .../RemoveAttribute01.cs.gold | 6 + .../RemoveAttribute02.cs | 6 + .../RemoveAttribute02.cs.gold | 6 + .../RemoveAttribute03.cs | 6 + .../RemoveAttribute03.cs.gold | 6 + .../RemoveAttributeFromAllFields.cs | 6 + .../RemoveAttributeFromAllFields.cs.gold | 6 + .../RemoveAttributeFromOneOfMultipleFields.cs | 6 + ...veAttributeFromOneOfMultipleFields.cs.gold | 8 + ...ggleHideInInspectorAttributeActionTests.cs | 32 ++++ 22 files changed, 344 insertions(+), 2 deletions(-) create mode 100644 resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/Availability01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs.gold create mode 100644 resharper/test/src/Intentions/ContextActions/ToggleHideInInspectorAttributeActionTests.cs diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs new file mode 100644 index 0000000000..e3531a049b --- /dev/null +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using JetBrains.Application.Progress; +using JetBrains.Application.UI.Controls.BulbMenu.Anchors; +using JetBrains.ProjectModel; +using JetBrains.ReSharper.Feature.Services.Bulbs; +using JetBrains.ReSharper.Feature.Services.ContextActions; +using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs; +using JetBrains.ReSharper.Feature.Services.Intentions; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.CSharp; +using JetBrains.ReSharper.Psi.CSharp.Impl; +using JetBrains.ReSharper.Psi.CSharp.Tree; +using JetBrains.ReSharper.Psi.Modules; +using JetBrains.TextControl; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions +{ + [ContextAction(Group = UnityContextActions.GroupID, + Name = "Toggle 'HideInInspector' attribute on field", + Description = + "Adds or removes the 'HideInInspector' attribute on a Unity serialized field, removing the field from the Inspector window")] + public class ToggleHideInInspectorAttributeAction : IContextAction + { + [NotNull] private static readonly SubmenuAnchor ourSubmenuAnchor = + new SubmenuAnchor(IntentionsAnchors.ContextActionsAnchor, SubmenuBehavior.Executable); + + private readonly ICSharpContextActionDataProvider myDataProvider; + + public ToggleHideInInspectorAttributeAction(ICSharpContextActionDataProvider dataProvider) + { + myDataProvider = dataProvider; + } + + public IEnumerable CreateBulbItems() + { + if (!myDataProvider.Project.IsUnityProject()) + return EmptyList.Enumerable; + + var fieldDeclaration = myDataProvider.GetSelectedElement(); + var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration); + var unityApi = myDataProvider.Solution.GetComponent(); + + if (!unityApi.IsUnityField(fieldDeclaration?.DeclaredElement) || multipleFieldDeclaration == null) + return EmptyList.Enumerable; + + var existingAttribute = GetExistingAttribute(fieldDeclaration); + + if (multipleFieldDeclaration.Declarators.Count == 1) + { + return new ToggleHideInInspectorAll(multipleFieldDeclaration, myDataProvider.PsiModule, + myDataProvider.ElementFactory, existingAttribute).ToContextActionIntentions(); + } + + return new[] + { + new ToggleHideInInspectorOne(fieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory, + existingAttribute).ToContextActionIntention(ourSubmenuAnchor), + new ToggleHideInInspectorAll(multipleFieldDeclaration, myDataProvider.PsiModule, + myDataProvider.ElementFactory, existingAttribute).ToContextActionIntention(ourSubmenuAnchor) + }; + } + + public bool IsAvailable(IUserDataHolder cache) + { + if (!myDataProvider.Project.IsUnityProject()) + return false; + + var unityApi = myDataProvider.Solution.GetComponent(); + var fieldDeclaration = myDataProvider.GetSelectedElement(); + return unityApi.IsUnityField(fieldDeclaration?.DeclaredElement); + } + + [CanBeNull] + private static IAttribute GetExistingAttribute(IAttributesOwnerDeclaration attributesOwnerDeclaration) + { + foreach (var attribute in attributesOwnerDeclaration.AttributesEnumerable) + { + if (attribute.TypeReference?.Resolve().DeclaredElement is ITypeElement element) + { + var attributeName = element.GetClrName(); + if (Equals(attributeName, KnownTypes.HideInInspector)) + return attribute; + } + } + + return null; + } + + private class ToggleHideInInspectorAll : BulbActionBase + { + private readonly IMultipleFieldDeclaration myMultipleFieldDeclaration; + private readonly IPsiModule myModule; + private readonly CSharpElementFactory myElementFactory; + private readonly IAttribute myExistingAttribute; + + public ToggleHideInInspectorAll(IMultipleFieldDeclaration multipleFieldDeclaration, IPsiModule module, + CSharpElementFactory elementFactory, IAttribute existingAttribute) + { + myMultipleFieldDeclaration = multipleFieldDeclaration; + myModule = module; + myElementFactory = elementFactory; + myExistingAttribute = existingAttribute; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + var fieldDeclaration = (IFieldDeclaration) myMultipleFieldDeclaration.Declarators[0]; + if (myExistingAttribute != null) + CSharpSharedImplUtil.RemoveAttribute(fieldDeclaration, myExistingAttribute); + else + AddAttribute(fieldDeclaration); + + return null; + } + + private void AddAttribute(IFieldDeclaration fieldDeclaration) + { + var attributeTypeElement = TypeFactory.CreateTypeByCLRName(KnownTypes.HideInInspector, myModule).GetTypeElement(); + if (attributeTypeElement != null) + { + var attribute = myElementFactory.CreateAttribute(attributeTypeElement); + CSharpSharedImplUtil.AddAttributeAfter(fieldDeclaration, attribute, null); + } + } + + public override string Text + { + get + { + if (myExistingAttribute != null) + { + return myMultipleFieldDeclaration.Declarators.Count > 1 + ? "Remove 'HideInInspector' attribute from all fields" + : "Remove 'HideInInspector' attribute"; + } + var targetDescription = myMultipleFieldDeclaration.Declarators.Count > 1 ? "all fields" : "field"; + return $"Annotate {targetDescription} with 'HideInInspector' attribute"; + } + } + } + + private class ToggleHideInInspectorOne : BulbActionBase + { + private readonly IFieldDeclaration myFieldDeclaration; + private readonly IPsiModule myPsiModule; + private readonly CSharpElementFactory myElementFactory; + private readonly IAttribute myExistingAttribute; + + public ToggleHideInInspectorOne(IFieldDeclaration fieldDeclaration, IPsiModule psiModule, + CSharpElementFactory elementFactory, IAttribute existingAttribute) + { + myFieldDeclaration = fieldDeclaration; + myPsiModule = psiModule; + myElementFactory = elementFactory; + myExistingAttribute = existingAttribute; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + if (myExistingAttribute != null) + myFieldDeclaration.RemoveAttribute(myExistingAttribute); + else + AttributeUtil.AddAttribute(myFieldDeclaration, KnownTypes.HideInInspector, myPsiModule, myElementFactory); + return null; + } + + public override string Text => myExistingAttribute != null + ? $"Remove 'HideInInspector' attribute from '{myFieldDeclaration.DeclaredName}'" + : $"Annotate field '{myFieldDeclaration.DeclaredName}' with 'HideInInspector' attribute"; + } + } +} \ No newline at end of file diff --git a/resharper/src/resharper-unity/UnityApi.cs b/resharper/src/resharper-unity/UnityApi.cs index a316b13690..538da442ac 100644 --- a/resharper/src/resharper-unity/UnityApi.cs +++ b/resharper/src/resharper-unity/UnityApi.cs @@ -54,9 +54,9 @@ public bool IsEventFunction([NotNull] IMethod method) return GetUnityEventFunction(method) != null; } - public bool IsUnityField([NotNull] IField field) + public bool IsUnityField([CanBeNull] IField field) { - if (field.IsStatic || field.IsConstant || field.IsReadonly) + if (field == null || field.IsStatic || field.IsConstant || field.IsReadonly) return false; var containingType = field.GetContainingType(); diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs new file mode 100644 index 0000000000..2928a7dd73 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs.gold new file mode 100644 index 0000000000..6e1d13e9ba --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttribute.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs new file mode 100644 index 0000000000..40d46f6740 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret:Annotate:all:fields:with:'HideInInspector':attribute}Value, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs.gold new file mode 100644 index 0000000000..689d540f60 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddAttributeToAllFields.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] private int my{caret}Value, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs new file mode 100644 index 0000000000..48e115ea21 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs.gold new file mode 100644 index 0000000000..64e5a23f6e --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToExistingAttributes.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs new file mode 100644 index 0000000000..6be30783cf --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret:Annotate:field:'myValue2':with:'HideInInspector':attribute}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs.gold new file mode 100644 index 0000000000..263d815f05 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/AddToOneOfMultipleFields.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue; + [HideInInspector] [SerializeField] private int my{caret}Value2; + [SerializeField] private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/Availability01.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/Availability01.cs new file mode 100644 index 0000000000..b6a2cf34c9 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/Availability01.cs @@ -0,0 +1,23 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{on}Value; + private int my{off}Value2; + [SerializeField] private int my{on}Value3; + [NonSerialized] public int my{off}Value4; + // Valid. NonSerialized wins - this is not serialized + [SerializeField] [NonSerialized] private int my{off}Value5; + [SerializeField] [NonSerialized] public int my{off}Value6; + + public int my{on:Annotate:field:'myValue7':with:'HideInInspector':attribute}Value7, my{on:Annotate:field:'myValue8':with:'HideInInspector':attribute}Value8, my{on:Annotate:field:'myValue9':with:'HideInInspector':attribute}Value9; + + public int my{on:Annotate:all:fields:with:'HideInInspector':attribute}value10, my{on:Annotate:all:fields:with:'HideInInspector':attribute}Value10; + + pub{off}lic sta{off}tic i{off}nt my{off}Value11; + + [HideInInspector] public string my{on:Remove:'HideInInspector':attribute}Value12; + [HideInInspector] public string my{on:Remove:'HideInInspector':attribute:from:'myValue13'}Value13, my{on:Remove:'HideInInspector':attribute:from:'myValue14'}Value14; + [HideInInspector] public string my{on:Remove:'HideInInspector':attribute:from:all:fields}Value15, my{on:Remove:'HideInInspector':attribute:from:all:fields}Value16; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs new file mode 100644 index 0000000000..c240b881c5 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs.gold new file mode 100644 index 0000000000..3f84deb17f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs new file mode 100644 index 0000000000..de20a1b3c5 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector, SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs new file mode 100644 index 0000000000..a36acdf0d2 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttribute03.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs new file mode 100644 index 0000000000..31c805b77f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] private int my{caret:Remove:'HideInInspector':attribute:from:all:fields}Value, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs.gold new file mode 100644 index 0000000000..547c9eca4d --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromAllFields.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs new file mode 100644 index 0000000000..8e23a796f4 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] private int myValue, my{caret:Remove:'HideInInspector':attribute:from:'myValue2'}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs.gold new file mode 100644 index 0000000000..08b15c6c98 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleHideInInspectorAttribute/RemoveAttributeFromOneOfMultipleFields.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [HideInInspector] [SerializeField] private int myValue; + [SerializeField] private int my{caret}Value2; + [HideInInspector] [SerializeField] private int myValue3; +} diff --git a/resharper/test/src/Intentions/ContextActions/ToggleHideInInspectorAttributeActionTests.cs b/resharper/test/src/Intentions/ContextActions/ToggleHideInInspectorAttributeActionTests.cs new file mode 100644 index 0000000000..e03bd66183 --- /dev/null +++ b/resharper/test/src/Intentions/ContextActions/ToggleHideInInspectorAttributeActionTests.cs @@ -0,0 +1,32 @@ +using JetBrains.ReSharper.FeaturesTestFramework.Intentions; +using JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions; +using NUnit.Framework; + +namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.ContextActions +{ + [TestUnity] + public class ToggleHideInInspectorAttributeActionAvailabilityTest + : ContextActionAvailabilityTestBase + { + protected override string ExtraPath => @"ToggleHideInInspectorAttribute"; + + [Test] public void TestAvailability01() { DoNamedTest2(); } + } + + [TestUnity] + public class ToggleHideInInspectorAttributeActionExecutionTest + : ContextActionExecuteTestBase + { + protected override string ExtraPath => "ToggleHideInInspectorAttribute"; + + [Test] public void TestAddAttribute() { DoNamedTest2(); } + [Test] public void TestAddToExistingAttributes() { DoNamedTest2(); } + [Test] public void TestAddAttributeToAllFields() { DoNamedTest2(); } + [Test] public void TestAddToOneOfMultipleFields() { DoNamedTest2(); } + [Test] public void TestRemoveAttribute01() { DoNamedTest2(); } + [Test] public void TestRemoveAttribute02() { DoNamedTest2(); } + [Test] public void TestRemoveAttribute03() { DoNamedTest2(); } + [Test] public void TestRemoveAttributeFromAllFields() { DoNamedTest2(); } + [Test] public void TestRemoveAttributeFromOneOfMultipleFields() { DoNamedTest2(); } + } +} \ No newline at end of file From 82ef13facf8ffe03dc27990eaf070a0b99c43260 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Wed, 6 Jun 2018 23:08:41 +0100 Subject: [PATCH 4/7] Minor refactoring --- .../ToggleHideInInspectorAttributeAction.cs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs index e3531a049b..037cf9f721 100644 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs @@ -111,19 +111,12 @@ protected override Action ExecutePsiTransaction(ISolution solution if (myExistingAttribute != null) CSharpSharedImplUtil.RemoveAttribute(fieldDeclaration, myExistingAttribute); else - AddAttribute(fieldDeclaration); - - return null; - } - - private void AddAttribute(IFieldDeclaration fieldDeclaration) - { - var attributeTypeElement = TypeFactory.CreateTypeByCLRName(KnownTypes.HideInInspector, myModule).GetTypeElement(); - if (attributeTypeElement != null) { - var attribute = myElementFactory.CreateAttribute(attributeTypeElement); - CSharpSharedImplUtil.AddAttributeAfter(fieldDeclaration, attribute, null); + AttributeUtil.AddAttribute(fieldDeclaration, KnownTypes.HideInInspector, myModule, + myElementFactory); } + + return null; } public override string Text From 9250ef9d90f9f27eb31a1cb705971d09773d9163 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Wed, 6 Jun 2018 23:09:11 +0100 Subject: [PATCH 5/7] Tweak wording of context action --- .../QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs | 4 +++- .../Availability/Test02.cs.gold | 2 +- .../Availability/Test01.cs.gold | 2 +- .../Availability/Test02.cs.gold | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs index 3935e788cc..2493cb1ce5 100644 --- a/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs +++ b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RemoveReadonlyFromSerializedFieldQuickFix.cs @@ -79,7 +79,9 @@ protected override Action ExecutePsiTransaction(ISolution solution return null; } - public override string Text => "Remove readonly modifier"; + public override string Text => myFieldDeclarations.Declarators.Count > 1 + ? "Make all fields non-readonly" + : "Make field non-readonly"; } private class RemoveOneReadonly : BulbActionBase diff --git a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold index 2cc1590d68..175b0483c0 100644 --- a/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold +++ b/resharper/test/data/intentions/QuickFixes/RedundantSerializeFieldAttribute/Availability/Test02.cs.gold @@ -15,7 +15,7 @@ Remove unused directives in file 1: Redundant 'SerializeField' attribute QUICKFIXES: Remove redundant attribute -Remove readonly modifier +Make all fields non-readonly --Make 'Value1' non-readonly --Make 'Value2' non-readonly --Make 'Value3' non-readonly diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold index a235b2aac1..e7f674c0e7 100644 --- a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test01.cs.gold @@ -15,7 +15,7 @@ Remove unused directives in file 1: Redundant 'SerializeField' attribute QUICKFIXES: Remove redundant attribute -Remove readonly modifier +Make field non-readonly 2: Readonly field 'Value' is never assigned QUICKFIXES: Initialize field from constructor diff --git a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold index 2cc1590d68..175b0483c0 100644 --- a/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold +++ b/resharper/test/data/intentions/QuickFixes/RemoveReadonlyFromSerializedField/Availability/Test02.cs.gold @@ -15,7 +15,7 @@ Remove unused directives in file 1: Redundant 'SerializeField' attribute QUICKFIXES: Remove redundant attribute -Remove readonly modifier +Make all fields non-readonly --Make 'Value1' non-readonly --Make 'Value2' non-readonly --Make 'Value3' non-readonly From 00e2baaf1850b207ca141adae1414d51732cd9c0 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Thu, 7 Jun 2018 14:06:39 +0100 Subject: [PATCH 6/7] Rework make serialize/non-serialize field actions Now works like a toggle to make a field serializable/not serializable, adding and removing 'SerializeField' and 'NonSerialized' attributes as appropriate. Handles multiple field declarations, and will also optionally remove static and readonly. Fixes #583 --- .../Services/ContextActions/AttributeUtil.cs | 71 +++++- ...oPropertyToSerializedBackingFieldAction.cs | 4 +- .../MarkFieldNonSerializedAction.cs | 52 ----- .../MarkSerializeFieldAction.cs | 75 ------ .../ToggleHideInInspectorAttributeAction.cs | 39 +--- .../ToggleSerializedFieldAction.cs | 214 ++++++++++++++++++ resharper/src/resharper-unity/UnityApi.cs | 6 +- .../MarkFieldNonSerialized/Availability01.cs | 15 -- .../MarkSerializeField/Availability01.cs | 15 -- .../MarkSerializeField/Test01.cs | 14 -- .../MarkSerializeField/Test01.cs.gold | 14 -- .../MarkSerializeField/Test02.cs | 15 -- .../MarkSerializeField/Test02.cs.gold | 15 -- .../AllToNonSerialized01.cs | 6 + .../AllToNonSerialized01.cs.gold | 7 + .../AllToNonSerialized02.cs | 7 + .../AllToNonSerialized02.cs.gold | 7 + .../AllToNonSerialized03.cs | 7 + .../AllToNonSerialized03.cs.gold | 7 + .../AllToNonSerialized04.cs | 7 + .../AllToNonSerialized04.cs.gold | 7 + .../AllToNonSerialized05.cs | 7 + .../AllToNonSerialized05.cs.gold | 8 + .../AllToSerialized01.cs | 6 + .../AllToSerialized01.cs.gold | 6 + .../AllToSerialized02.cs | 7 + .../AllToSerialized02.cs.gold} | 2 +- .../AllToSerialized03.cs | 6 + .../AllToSerialized03.cs.gold | 6 + .../AllToSerializedRemoveReadonly01.cs | 6 + .../AllToSerializedRemoveReadonly01.cs.gold | 6 + .../AllToSerializedRemoveReadonly02.cs | 6 + .../AllToSerializedRemoveReadonly02.cs.gold | 6 + .../AllToSerializedRemoveReadonlyStatic01.cs | 6 + ...ToSerializedRemoveReadonlyStatic01.cs.gold | 6 + .../AllToSerializedRemoveReadonlyStatic02.cs | 6 + ...ToSerializedRemoveReadonlyStatic02.cs.gold | 6 + .../AllToSerializedRemoveStatic01.cs | 6 + .../AllToSerializedRemoveStatic01.cs.gold | 6 + .../AllToSerializedRemoveStatic02.cs | 6 + .../AllToSerializedRemoveStatic02.cs.gold | 6 + .../ToggleSerializedField/Availability01.cs | 58 +++++ .../JustOneToNonSerialized01.cs | 6 + .../JustOneToNonSerialized01.cs.gold | 9 + .../JustOneToNonSerialized02.cs | 7 + .../JustOneToNonSerialized02.cs.gold | 9 + .../JustOneToNonSerialized03.cs | 7 + .../JustOneToNonSerialized03.cs.gold | 9 + .../JustOneToNonSerialized04.cs | 7 + .../JustOneToNonSerialized04.cs.gold | 9 + .../JustOneToNonSerialized05.cs | 7 + .../JustOneToNonSerialized05.cs.gold | 10 + .../JustOneToSerialized01.cs | 6 + .../JustOneToSerialized01.cs.gold | 8 + .../JustOneToSerialized02.cs | 7 + .../JustOneToSerialized02.cs.gold | 9 + .../JustOneToSerialized03.cs | 6 + .../JustOneToSerialized03.cs.gold | 8 + .../JustOneToSerializedRemoveReadonly01.cs | 6 + ...ustOneToSerializedRemoveReadonly01.cs.gold | 8 + .../JustOneToSerializedRemoveReadonly02.cs | 6 + ...ustOneToSerializedRemoveReadonly02.cs.gold | 8 + ...stOneToSerializedRemoveReadonlyStatic01.cs | 6 + ...ToSerializedRemoveReadonlyStatic01.cs.gold | 8 + ...stOneToSerializedRemoveReadonlyStatic02.cs | 6 + ...ToSerializedRemoveReadonlyStatic02.cs.gold | 8 + .../JustOneToSerializedRemoveStatic01.cs | 6 + .../JustOneToSerializedRemoveStatic01.cs.gold | 8 + .../JustOneToSerializedRemoveStatic02.cs | 6 + .../JustOneToSerializedRemoveStatic02.cs.gold | 8 + .../ToNonSerialized01.cs} | 0 .../ToNonSerialized01.cs.gold} | 0 .../ToNonSerialized02.cs | 7 + .../ToNonSerialized02.cs.gold | 7 + .../ToNonSerialized03.cs | 7 + .../ToNonSerialized03.cs.gold | 7 + .../ToNonSerialized04.cs | 7 + .../ToNonSerialized04.cs.gold | 7 + .../ToNonSerialized05.cs | 7 + .../ToNonSerialized05.cs.gold | 8 + .../ToSerialized01.cs} | 2 +- .../ToSerialized01.cs.gold | 6 + .../ToggleSerializedField/ToSerialized02.cs | 7 + .../ToSerialized02.cs.gold} | 2 +- .../ToggleSerializedField/ToSerialized03.cs | 6 + .../ToSerialized03.cs.gold | 6 + .../ToSerializedRemoveReadonly01.cs | 6 + .../ToSerializedRemoveReadonly01.cs.gold | 6 + .../ToSerializedRemoveReadonly02.cs | 6 + .../ToSerializedRemoveReadonly02.cs.gold | 6 + .../ToSerializedRemoveReadonly03.cs | 6 + .../ToSerializedRemoveReadonly03.cs.gold} | 0 .../ToSerializedRemoveReadonlyStatic01.cs | 6 + ...ToSerializedRemoveReadonlyStatic01.cs.gold | 6 + .../ToSerializedRemoveReadonlyStatic02.cs | 6 + ...ToSerializedRemoveReadonlyStatic02.cs.gold | 6 + .../ToSerializedRemoveReadonlyStatic03.cs | 6 + ...ToSerializedRemoveReadonlyStatic03.cs.gold | 6 + .../ToSerializedRemoveStatic01.cs | 6 + .../ToSerializedRemoveStatic01.cs.gold | 6 + .../ToSerializedRemoveStatic02.cs | 6 + .../ToSerializedRemoveStatic02.cs.gold | 6 + .../ToSerializedRemoveStatic03.cs | 6 + .../ToSerializedRemoveStatic03.cs.gold | 6 + .../MarkFieldNonSerializedActionTests.cs | 26 --- .../MarkSerializeFieldActionTests.cs | 25 -- .../ToggleSerializedFieldActionTests.cs | 76 +++++++ 107 files changed, 998 insertions(+), 307 deletions(-) delete mode 100644 resharper/src/resharper-unity/Feature/Services/ContextActions/MarkFieldNonSerializedAction.cs delete mode 100644 resharper/src/resharper-unity/Feature/Services/ContextActions/MarkSerializeFieldAction.cs create mode 100644 resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleSerializedFieldAction.cs delete mode 100644 resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Availability01.cs delete mode 100644 resharper/test/data/intentions/ContextActions/MarkSerializeField/Availability01.cs delete mode 100644 resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs delete mode 100644 resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs.gold delete mode 100644 resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs delete mode 100644 resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test02.cs.gold => ToggleSerializedField/AllToSerialized02.cs.gold} (53%) create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/Availability01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs.gold rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test01.cs => ToggleSerializedField/ToNonSerialized01.cs} (100%) rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test01.cs.gold => ToggleSerializedField/ToNonSerialized01.cs.gold} (100%) create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs.gold rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test02.cs => ToggleSerializedField/ToSerialized01.cs} (54%) create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test03.cs.gold => ToggleSerializedField/ToSerialized02.cs.gold} (53%) create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs rename resharper/test/data/intentions/ContextActions/{MarkFieldNonSerialized/Test03.cs => ToggleSerializedField/ToSerializedRemoveReadonly03.cs.gold} (100%) create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs.gold create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs create mode 100644 resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs.gold delete mode 100644 resharper/test/src/Intentions/ContextActions/MarkFieldNonSerializedActionTests.cs delete mode 100644 resharper/test/src/Intentions/ContextActions/MarkSerializeFieldActionTests.cs create mode 100644 resharper/test/src/Intentions/ContextActions/ToggleSerializedFieldActionTests.cs diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/AttributeUtil.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/AttributeUtil.cs index 20ad66e346..451015595a 100644 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/AttributeUtil.cs +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/AttributeUtil.cs @@ -2,6 +2,7 @@ using JetBrains.Metadata.Reader.API; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.CSharp; +using JetBrains.ReSharper.Psi.CSharp.Impl; using JetBrains.ReSharper.Psi.CSharp.Tree; using JetBrains.ReSharper.Psi.Modules; @@ -9,17 +10,75 @@ namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions { public static class AttributeUtil { - public static void AddAttribute([CanBeNull] IFieldDeclaration fieldDeclaration, IClrTypeName attributeTypeName, - IPsiModule psiModule, CSharpElementFactory elementFactory) + public static void AddAttributeToSingleDeclaration([CanBeNull] IFieldDeclaration fieldDeclaration, + IClrTypeName attributeTypeName, IPsiModule psiModule, CSharpElementFactory elementFactory) { if (fieldDeclaration == null) return; - var typeElement = TypeFactory.CreateTypeByCLRName(attributeTypeName, psiModule).GetTypeElement(); - if (typeElement != null) - { - var attribute = elementFactory.CreateAttribute(typeElement); + var existingAttribute = GetAttribute(fieldDeclaration, attributeTypeName); + if (existingAttribute != null) + return; + + var attribute = CreateAttribute(attributeTypeName, psiModule, elementFactory); + if (attribute != null) fieldDeclaration.AddAttributeAfter(attribute, null); + } + + public static void AddAttributeToAllDeclarations([CanBeNull] IFieldDeclaration fieldDeclaration, + IClrTypeName attributeTypeName, IPsiModule psiModule, CSharpElementFactory elementFactory) + { + if (fieldDeclaration == null) return; + + var existingAttribute = GetAttribute(fieldDeclaration, attributeTypeName); + if (existingAttribute != null) + return; + + var attribute = CreateAttribute(attributeTypeName, psiModule, elementFactory); + if (attribute != null) + CSharpSharedImplUtil.AddAttributeAfter(fieldDeclaration, attribute, null); + } + + [CanBeNull] + private static IAttribute CreateAttribute(IClrTypeName attributeTypeName, IPsiModule module, + CSharpElementFactory elementFactory) + { + var typeElement = TypeFactory.CreateTypeByCLRName(attributeTypeName, module).GetTypeElement(); + return typeElement != null ? elementFactory.CreateAttribute(typeElement) : null; + } + + public static void RemoveAttributeFromSingleDeclaration([CanBeNull] IFieldDeclaration fieldDeclaration, + IClrTypeName attributeTypeName) + { + var attribute = GetAttribute(fieldDeclaration, attributeTypeName); + if (attribute != null) + fieldDeclaration.RemoveAttribute(attribute); + } + + public static void RemoveAttributeFromAllDeclarations([CanBeNull] IFieldDeclaration fieldDeclaration, + IClrTypeName attributeTypeName) + { + var attribute = GetAttribute(fieldDeclaration, attributeTypeName); + if (attribute != null) + CSharpSharedImplUtil.RemoveAttribute(fieldDeclaration, attribute); + } + + [CanBeNull, ContractAnnotation("attributesOwner:null => null")] + public static IAttribute GetAttribute([CanBeNull] IAttributesOwnerDeclaration attributesOwner, + IClrTypeName requiredAttributeTypeName) + { + if (attributesOwner == null) return null; + + foreach (var attribute in attributesOwner.AttributesEnumerable) + { + if (attribute.TypeReference?.Resolve().DeclaredElement is ITypeElement typeElement) + { + var attributeTypeName = typeElement.GetClrName(); + if (Equals(attributeTypeName, requiredAttributeTypeName)) + return attribute; + } } + + return null; } } } \ No newline at end of file diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/AutoPropertyToSerializedBackingFieldAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/AutoPropertyToSerializedBackingFieldAction.cs index dbdf840e22..74fc043f81 100644 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/AutoPropertyToSerializedBackingFieldAction.cs +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/AutoPropertyToSerializedBackingFieldAction.cs @@ -16,7 +16,7 @@ namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions { [ContextAction(Group = UnityContextActions.GroupID, Name = "Replace auto-property with property and serialized backing field", - Description = "Replaces auto-property in a Unity type with a property that utilizes a backing field that is marked with the 'UnityEngine.SerializeField' attribute.", + Description = "Replaces an auto-property in a Unity type with a property that utilizes a backing field that is marked with the 'UnityEngine.SerializeField' attribute.", Priority = 2)] public class AutoPropertyToSerializedBackingFieldAction : ContextActionBase { @@ -74,7 +74,7 @@ public static Action Execute([CanBeNull] IPropertyDeclaration prop return null; var fieldDeclaration = AutomaticToBackingFieldAction.Execute(propertyDeclaration); - AttributeUtil.AddAttribute(fieldDeclaration, KnownTypes.SerializeField, propertyDeclaration.GetPsiModule(), elementFactory); + AttributeUtil.AddAttributeToSingleDeclaration(fieldDeclaration, KnownTypes.SerializeField, propertyDeclaration.GetPsiModule(), elementFactory); return AutomaticToBackingFieldAction.PostExecute(propertyDeclaration, fieldDeclaration, solution); } } diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkFieldNonSerializedAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkFieldNonSerializedAction.cs deleted file mode 100644 index 288887a093..0000000000 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkFieldNonSerializedAction.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using JetBrains.Application.Progress; -using JetBrains.ProjectModel; -using JetBrains.ReSharper.Feature.Services.ContextActions; -using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs; -using JetBrains.ReSharper.Psi; -using JetBrains.ReSharper.Psi.CSharp.Tree; -using JetBrains.TextControl; -using JetBrains.Util; - -namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions -{ - [ContextAction(Group = UnityContextActions.GroupID, - Name = "Annotate field with 'NonSerialized' attribute", - Description = - "Adds 'NonSerializedAttribute' to a field in a known Unity type, marking the field as not serialized by Unity")] - public class MarkFieldNonSerializedAction : ContextActionBase - { - private readonly ICSharpContextActionDataProvider myDataProvider; - - public MarkFieldNonSerializedAction(ICSharpContextActionDataProvider dataProvider) - { - myDataProvider = dataProvider; - } - - public override string Text => "Annotate field with 'NonSerialized' attribute"; - - public override bool IsAvailable(IUserDataHolder cache) - { - if (!myDataProvider.Project.IsUnityProject()) - return false; - - var fieldDeclaration = myDataProvider.GetSelectedElement(); - if (fieldDeclaration == null) - return false; - - var unityApi = myDataProvider.Solution.GetComponent(); - - var field = fieldDeclaration.DeclaredElement; - return field != null && unityApi.IsUnityField(field); - } - - protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) - { - var fieldDeclaration = myDataProvider.GetSelectedElement(); - AttributeUtil.AddAttribute(fieldDeclaration, PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS, - myDataProvider.PsiModule, myDataProvider.ElementFactory); - - return null; - } - } -} \ No newline at end of file diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkSerializeFieldAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkSerializeFieldAction.cs deleted file mode 100644 index 45411f66d1..0000000000 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/MarkSerializeFieldAction.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using JetBrains.Application.Progress; -using JetBrains.ProjectModel; -using JetBrains.ReSharper.Feature.Services.ContextActions; -using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs; -using JetBrains.ReSharper.Psi; -using JetBrains.ReSharper.Psi.CSharp.Tree; -using JetBrains.TextControl; -using JetBrains.Util; - -namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions -{ - [ContextAction(Group = UnityContextActions.GroupID, - Name = "Annotate field with 'SerializeField' attribute", - Description = "Adds 'UnityEngine.SerializeField' attribute to a field in a known Unity type, marking the field as serialized by Unity")] - public class MarkSerializeFieldAction : ContextActionBase - { - private readonly ICSharpContextActionDataProvider myDataProvider; - - public MarkSerializeFieldAction(ICSharpContextActionDataProvider dataProvider) - { - myDataProvider = dataProvider; - } - - public override string Text => "Annotate field with 'SerializeField' attribute"; - - public override bool IsAvailable(IUserDataHolder cache) - { - if (!myDataProvider.Project.IsUnityProject()) - return false; - - var fieldDeclaration = myDataProvider.GetSelectedElement(); - if (fieldDeclaration == null) - return false; - - // We can only apply the attribute to non-static, non-public fields - // (private, protected, internal) - if (fieldDeclaration.IsStatic || fieldDeclaration.GetAccessRights() == AccessRights.PUBLIC) - return false; - - foreach (var attribute in fieldDeclaration.Attributes) - { - if (attribute.TypeReference?.Resolve().DeclaredElement is ITypeElement element) - { - var attributName = element.GetClrName(); - if (Equals(attributName, KnownTypes.SerializeField)) - return false; - - // TODO: Perhaps we should remove the NonSerialized attribute instead? - // Add a CA to convert to serialized field? - if (Equals(attributName, PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS)) - return false; - } - } - - var typeDeclaration = fieldDeclaration.GetContainingTypeDeclaration(); - var typeElement = typeDeclaration?.DeclaredElement; - if (typeElement == null) - return false; - - // Is the type a Unity type? - var unityApi = myDataProvider.Solution.GetComponent(); - return unityApi.IsUnityType(typeElement); - } - - protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) - { - var fieldDeclaration = myDataProvider.GetSelectedElement(); - AttributeUtil.AddAttribute(fieldDeclaration, KnownTypes.SerializeField, - myDataProvider.PsiModule, myDataProvider.ElementFactory); - - return null; - } - } -} \ No newline at end of file diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs index 037cf9f721..308db967cf 100644 --- a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleHideInInspectorAttributeAction.cs @@ -8,7 +8,6 @@ using JetBrains.ReSharper.Feature.Services.ContextActions; using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs; using JetBrains.ReSharper.Feature.Services.Intentions; -using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.CSharp; using JetBrains.ReSharper.Psi.CSharp.Impl; using JetBrains.ReSharper.Psi.CSharp.Tree; @@ -19,9 +18,9 @@ namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions { [ContextAction(Group = UnityContextActions.GroupID, - Name = "Toggle 'HideInInspector' attribute on field", + Name = "Toggle 'HideInInspector' attribute on fields", Description = - "Adds or removes the 'HideInInspector' attribute on a Unity serialized field, removing the field from the Inspector window")] + "Adds or removes the 'HideInInspector' attribute on a Unity serialized field, removing the field from the Inspector window.")] public class ToggleHideInInspectorAttributeAction : IContextAction { [NotNull] private static readonly SubmenuAnchor ourSubmenuAnchor = @@ -36,9 +35,6 @@ public ToggleHideInInspectorAttributeAction(ICSharpContextActionDataProvider dat public IEnumerable CreateBulbItems() { - if (!myDataProvider.Project.IsUnityProject()) - return EmptyList.Enumerable; - var fieldDeclaration = myDataProvider.GetSelectedElement(); var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration); var unityApi = myDataProvider.Solution.GetComponent(); @@ -46,7 +42,7 @@ public IEnumerable CreateBulbItems() if (!unityApi.IsUnityField(fieldDeclaration?.DeclaredElement) || multipleFieldDeclaration == null) return EmptyList.Enumerable; - var existingAttribute = GetExistingAttribute(fieldDeclaration); + var existingAttribute = AttributeUtil.GetAttribute(fieldDeclaration, KnownTypes.HideInInspector); if (multipleFieldDeclaration.Declarators.Count == 1) { @@ -73,22 +69,6 @@ public bool IsAvailable(IUserDataHolder cache) return unityApi.IsUnityField(fieldDeclaration?.DeclaredElement); } - [CanBeNull] - private static IAttribute GetExistingAttribute(IAttributesOwnerDeclaration attributesOwnerDeclaration) - { - foreach (var attribute in attributesOwnerDeclaration.AttributesEnumerable) - { - if (attribute.TypeReference?.Resolve().DeclaredElement is ITypeElement element) - { - var attributeName = element.GetClrName(); - if (Equals(attributeName, KnownTypes.HideInInspector)) - return attribute; - } - } - - return null; - } - private class ToggleHideInInspectorAll : BulbActionBase { private readonly IMultipleFieldDeclaration myMultipleFieldDeclaration; @@ -112,8 +92,8 @@ protected override Action ExecutePsiTransaction(ISolution solution CSharpSharedImplUtil.RemoveAttribute(fieldDeclaration, myExistingAttribute); else { - AttributeUtil.AddAttribute(fieldDeclaration, KnownTypes.HideInInspector, myModule, - myElementFactory); + AttributeUtil.AddAttributeToSingleDeclaration(fieldDeclaration, KnownTypes.HideInInspector, + myModule, myElementFactory); } return null; @@ -151,12 +131,17 @@ public ToggleHideInInspectorOne(IFieldDeclaration fieldDeclaration, IPsiModule p myExistingAttribute = existingAttribute; } - protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + protected override Action ExecutePsiTransaction(ISolution solution, + IProgressIndicator progress) { if (myExistingAttribute != null) myFieldDeclaration.RemoveAttribute(myExistingAttribute); else - AttributeUtil.AddAttribute(myFieldDeclaration, KnownTypes.HideInInspector, myPsiModule, myElementFactory); + { + AttributeUtil.AddAttributeToSingleDeclaration(myFieldDeclaration, KnownTypes.HideInInspector, + myPsiModule, myElementFactory); + } + return null; } diff --git a/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleSerializedFieldAction.cs b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleSerializedFieldAction.cs new file mode 100644 index 0000000000..9eb586cd30 --- /dev/null +++ b/resharper/src/resharper-unity/Feature/Services/ContextActions/ToggleSerializedFieldAction.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using JetBrains.Application.Progress; +using JetBrains.Application.UI.Controls.BulbMenu.Anchors; +using JetBrains.ProjectModel; +using JetBrains.ReSharper.Feature.Services.Bulbs; +using JetBrains.ReSharper.Feature.Services.ContextActions; +using JetBrains.ReSharper.Feature.Services.CSharp.Analyses.Bulbs; +using JetBrains.ReSharper.Feature.Services.Intentions; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.CSharp; +using JetBrains.ReSharper.Psi.CSharp.Impl; +using JetBrains.ReSharper.Psi.CSharp.Tree; +using JetBrains.ReSharper.Psi.Modules; +using JetBrains.TextControl; +using JetBrains.Util; + +namespace JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions +{ + [ContextAction(Group = UnityContextActions.GroupID, + Name = "Toggle 'SerializeField' and 'NonSerialized' attributes on fields", + Description = "Toggles a field in a Unity type between serialized and non-serialized. If the field is non-public, the 'UnityEngine.SerializeField' attribute is added. If the field is already serialized, the attribute is removed, and for public fields, the 'NonSerialized' field is added.")] + public class ToggleSerializedFieldAction : IContextAction + { + [NotNull] private static readonly SubmenuAnchor ourSubmenuAnchor = + new SubmenuAnchor(IntentionsAnchors.ContextActionsAnchor, SubmenuBehavior.Executable); + + private readonly ICSharpContextActionDataProvider myDataProvider; + + public ToggleSerializedFieldAction(ICSharpContextActionDataProvider dataProvider) + { + myDataProvider = dataProvider; + } + + public IEnumerable CreateBulbItems() + { + var fieldDeclaration = myDataProvider.GetSelectedElement(); + var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration); + if (multipleFieldDeclaration == null) + return EmptyList.Enumerable; + + var unityApi = myDataProvider.Solution.GetComponent(); + var isSerialized = unityApi.IsUnityField(fieldDeclaration.DeclaredElement); + + if (multipleFieldDeclaration.Declarators.Count == 1) + { + return new ToggleSerializedFieldAll(multipleFieldDeclaration, myDataProvider.PsiModule, + myDataProvider.ElementFactory, isSerialized).ToContextActionIntentions(); + } + + return new[] + { + new ToggleSerializedFieldOne(fieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory, + isSerialized).ToContextActionIntention(ourSubmenuAnchor), + new ToggleSerializedFieldAll(multipleFieldDeclaration, myDataProvider.PsiModule, + myDataProvider.ElementFactory, isSerialized).ToContextActionIntention(ourSubmenuAnchor) + }; + } + + public bool IsAvailable(IUserDataHolder cache) + { + if (!myDataProvider.Project.IsUnityProject()) + return false; + + var fieldDeclaration = myDataProvider.GetSelectedElement(); + if (fieldDeclaration == null) + return false; + + var unityApi = myDataProvider.Solution.GetComponent(); + return unityApi.IsUnityType(fieldDeclaration.GetContainingTypeDeclaration()?.DeclaredElement); + } + + private class ToggleSerializedFieldAll : BulbActionBase + { + private readonly IFieldDeclaration myFieldDeclaration; + private readonly IMultipleFieldDeclaration myMultipleFieldDeclaration; + private readonly IPsiModule myModule; + private readonly CSharpElementFactory myElementFactory; + private readonly bool myIsSerialized; + + public ToggleSerializedFieldAll(IMultipleFieldDeclaration multipleFieldDeclaration, IPsiModule module, + CSharpElementFactory elementFactory, bool isSerialized) + { + myMultipleFieldDeclaration = multipleFieldDeclaration; + myFieldDeclaration = (IFieldDeclaration) multipleFieldDeclaration.Declarators[0]; + myModule = module; + myElementFactory = elementFactory; + myIsSerialized = isSerialized; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + if (myIsSerialized) + { + AttributeUtil.RemoveAttributeFromAllDeclarations(myFieldDeclaration, KnownTypes.SerializeField); + if (myFieldDeclaration.GetAccessRights() == AccessRights.PUBLIC) + { + AttributeUtil.AddAttributeToAllDeclarations(myFieldDeclaration, + PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS, myModule, myElementFactory); + } + } + else + { + if (myFieldDeclaration.IsStatic) + ModifiersUtil.SetStatic(myMultipleFieldDeclaration, false); + if (myFieldDeclaration.IsReadonly) + ModifiersUtil.SetReadonly(myMultipleFieldDeclaration, false); + + AttributeUtil.RemoveAttributeFromAllDeclarations(myFieldDeclaration, + PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS); + if (myFieldDeclaration.GetAccessRights() != AccessRights.PUBLIC) + { + AttributeUtil.AddAttributeToAllDeclarations(myFieldDeclaration, KnownTypes.SerializeField, + myModule, myElementFactory); + } + } + + return null; + } + + public override string Text + { + get + { + var targetDescription = myMultipleFieldDeclaration.Declarators.Count > 1 ? "all fields" : "field"; + + if (myFieldDeclaration.IsStatic && myFieldDeclaration.IsReadonly) + return $"Make {targetDescription} serialized (remove static and readonly)"; + if (myFieldDeclaration.IsStatic) + return $"Make {targetDescription} serialized (remove static)"; + if (myFieldDeclaration.IsReadonly) + return $"Make {targetDescription} serialized (remove readonly)"; + + if (!myIsSerialized && myMultipleFieldDeclaration.Declarators.Count == 1) + return "To serialized field"; + + return myIsSerialized + ? $"Make {targetDescription} non-serialized" + : $"Make {targetDescription} serialized"; + } + } + } + + private class ToggleSerializedFieldOne : BulbActionBase + { + private readonly IFieldDeclaration myFieldDeclaration; + private readonly IPsiModule myModule; + private readonly CSharpElementFactory myElementFactory; + private readonly bool myIsSerialized; + + public ToggleSerializedFieldOne(IFieldDeclaration fieldDeclaration, IPsiModule module, + CSharpElementFactory elementFactory, bool isSerialized) + { + myFieldDeclaration = fieldDeclaration; + myModule = module; + myElementFactory = elementFactory; + myIsSerialized = isSerialized; + } + + protected override Action ExecutePsiTransaction(ISolution solution, IProgressIndicator progress) + { + if (myIsSerialized) + { + AttributeUtil.RemoveAttributeFromSingleDeclaration(myFieldDeclaration, KnownTypes.SerializeField); + if (myFieldDeclaration.GetAccessRights() == AccessRights.PUBLIC) + { + AttributeUtil.AddAttributeToSingleDeclaration(myFieldDeclaration, + PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS, myModule, myElementFactory); + } + } + else + { + if (myFieldDeclaration.IsStatic) + myFieldDeclaration.SetStatic(false); + + if (myFieldDeclaration.IsReadonly) + myFieldDeclaration.SetReadonly(false); + + AttributeUtil.RemoveAttributeFromSingleDeclaration(myFieldDeclaration, + PredefinedType.NONSERIALIZED_ATTRIBUTE_CLASS); + if (myFieldDeclaration.GetAccessRights() != AccessRights.PUBLIC) + { + AttributeUtil.AddAttributeToSingleDeclaration(myFieldDeclaration, KnownTypes.SerializeField, + myModule, myElementFactory); + } + } + + return null; + } + + public override string Text + { + get + { + if (myFieldDeclaration.IsStatic && myFieldDeclaration.IsReadonly) + { + return + $"Make field '{myFieldDeclaration.DeclaredName}' serialized (remove static and readonly)"; + } + + if (myFieldDeclaration.IsStatic) + return $"Make field '{myFieldDeclaration.DeclaredName}' serialized (remove static)"; + if (myFieldDeclaration.IsReadonly) + return $"Make field '{myFieldDeclaration.DeclaredName}' serialized (remove readonly)"; + + return myIsSerialized + ? $"Make field '{myFieldDeclaration.DeclaredName}' non-serialized" + : $"Make field '{myFieldDeclaration.DeclaredName}' serialized"; + } + } + } + } +} \ No newline at end of file diff --git a/resharper/src/resharper-unity/UnityApi.cs b/resharper/src/resharper-unity/UnityApi.cs index 538da442ac..c709137483 100644 --- a/resharper/src/resharper-unity/UnityApi.cs +++ b/resharper/src/resharper-unity/UnityApi.cs @@ -26,9 +26,9 @@ public UnityApi(UnityVersion unityVersion) } [NotNull] - public IEnumerable GetBaseUnityTypes([NotNull] ITypeElement type) + public IEnumerable GetBaseUnityTypes([CanBeNull] ITypeElement type) { - if (type.Module is IProjectPsiModule projectPsiModule) + if (type?.Module is IProjectPsiModule projectPsiModule) { var unityVersion = myUnityVersion.GetActualVersion(projectPsiModule.Project); return GetBaseUnityTypes(type, unityVersion); @@ -44,7 +44,7 @@ public IEnumerable GetBaseUnityTypes([NotNull] ITypeElement type, Ver return GetBaseUnityTypes(types, type, unityVersion); } - public bool IsUnityType([NotNull] ITypeElement type) + public bool IsUnityType([CanBeNull] ITypeElement type) { return GetBaseUnityTypes(type).Any(); } diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Availability01.cs b/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Availability01.cs deleted file mode 100644 index b8f20c001e..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Availability01.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using UnityEngine; - -public class Foo : MonoBehaviour -{ - public int my{on}Value; - private int my{off}Value2; - [SerializeField] private int my{on}Value3; - [NonSerialized] public int my{off}Value4; - // Valid. NonSerialized wins - this is not serialized - [SerializeField] [NonSerialized] private int my{off}Value5; - [SerializeField] [NonSerialized] public int my{off}Value6; - - public static int my{off}Value7; -} diff --git a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Availability01.cs b/resharper/test/data/intentions/ContextActions/MarkSerializeField/Availability01.cs deleted file mode 100644 index b73fab79cf..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Availability01.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using UnityEngine; - -public class Foo : MonoBehaviour -{ - private int my{on}Value1; - [NonSerialized] private int my{off}Value2; - [SerializeField] private int my{off}Value3; - public int my{off}Value4; - protected int my{on}Value5; - internal int my{on}Value6; - - public static int my{off}Value7; - private static int my{off}Value8; -} diff --git a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs b/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs deleted file mode 100644 index 6dc943f159..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs +++ /dev/null @@ -1,14 +0,0 @@ -using UnityEngine; - -public class Foo : MonoBehaviour -{ - private int my{caret}Value; - - private void Update() - { - if (myValue > 0) - { - // Do something... - } - } -} diff --git a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs.gold b/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs.gold deleted file mode 100644 index 52c0cb37fe..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test01.cs.gold +++ /dev/null @@ -1,14 +0,0 @@ -using UnityEngine; - -public class Foo : MonoBehaviour -{ - [SerializeField] private int my{caret}Value; - - private void Update() - { - if (myValue > 0) - { - // Do something... - } - } -} diff --git a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs b/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs deleted file mode 100644 index e4496471b3..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UnityEngine; -using JetBrains.Annotations; - -public class Foo : MonoBehaviour -{ - [NotNull] private int my{caret}Value; - - private void Update() - { - if (myValue > 0) - { - // Do something... - } - } -} diff --git a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs.gold b/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs.gold deleted file mode 100644 index a7ce10c739..0000000000 --- a/resharper/test/data/intentions/ContextActions/MarkSerializeField/Test02.cs.gold +++ /dev/null @@ -1,15 +0,0 @@ -using UnityEngine; -using JetBrains.Annotations; - -public class Foo : MonoBehaviour -{ - [SerializeField] [NotNull] private int my{caret}Value; - - private void Update() - { - if (myValue > 0) - { - // Do something... - } - } -} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs new file mode 100644 index 0000000000..0ba40b7e91 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue, my{caret:Make:all:fields:non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs.gold new file mode 100644 index 0000000000..ebcec535db --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized01.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [NonSerialized] public int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs new file mode 100644 index 0000000000..3d845e5e3a --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret:Make:all:fields:non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs.gold new file mode 100644 index 0000000000..87519bde8d --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized02.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs new file mode 100644 index 0000000000..957f80e44f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField, NotNull] private int myValue, my{caret:Make:all:fields:non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs.gold new file mode 100644 index 0000000000..bee4d9e428 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized03.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs new file mode 100644 index 0000000000..fc10f8151a --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] [NotNull] private int myValue, my{caret:Make:all:fields:non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs.gold new file mode 100644 index 0000000000..bee4d9e428 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized04.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs new file mode 100644 index 0000000000..3e5ab3c630 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] public int myValue, my{caret:Make:all:fields:non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs.gold new file mode 100644 index 0000000000..a0c76f6b40 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToNonSerialized05.cs.gold @@ -0,0 +1,8 @@ +using System; +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NonSerialized] [NotNull] public int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs new file mode 100644 index 0000000000..dc6e843281 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private int myValue, my{caret:Make:all:fields:serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs.gold new file mode 100644 index 0000000000..00cd59d429 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs new file mode 100644 index 0000000000..613a454d66 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [NonSerialized] public int myValue, my{caret:Make:all:fields:serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs.gold similarity index 53% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs.gold rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs.gold index 9819d6520d..c753b5def8 100644 --- a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs.gold +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized02.cs.gold @@ -3,5 +3,5 @@ using UnityEngine; public class Foo : MonoBehaviour { - [NonSerialized] [SerializeField] public int my{caret}Value; + public int myValue, my{caret}Value2, myValue3; } diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs new file mode 100644 index 0000000000..4bd9cab245 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [Whatever] private int myValue, my{caret:Make:all:fields:serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs.gold new file mode 100644 index 0000000000..595a5b5596 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerialized03.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] [Whatever] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs new file mode 100644 index 0000000000..2db8248e74 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public readonly int myValue, my{caret:Make:all:fields:serialized:(remove:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs.gold new file mode 100644 index 0000000000..d4d886796f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs new file mode 100644 index 0000000000..d8f00b290f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private readonly int myValue, my{caret:Make:all:fields:serialized:(remove:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs.gold new file mode 100644 index 0000000000..00cd59d429 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonly02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs new file mode 100644 index 0000000000..8e587ca577 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static readonly int myValue, my{caret:Make:all:fields:serialized:(remove:static:and:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs.gold new file mode 100644 index 0000000000..d4d886796f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs new file mode 100644 index 0000000000..2b704d9945 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static readonly int myValue, my{caret:Make:all:fields:serialized:(remove:static:and:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs.gold new file mode 100644 index 0000000000..00cd59d429 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveReadonlyStatic02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs new file mode 100644 index 0000000000..dce5d38b3a --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static int myValue, my{caret:Make:all:fields:serialized:(remove:static)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs.gold new file mode 100644 index 0000000000..d4d886796f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs new file mode 100644 index 0000000000..fd9c8efaf1 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static int myValue, my{caret:Make:all:fields:serialized:(remove:static)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs.gold new file mode 100644 index 0000000000..00cd59d429 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/AllToSerializedRemoveStatic02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/Availability01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/Availability01.cs new file mode 100644 index 0000000000..f3e18772f2 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/Availability01.cs @@ -0,0 +1,58 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{on:Make:field:non-serialized}Value; + private int my{on:To:serialized:field}Value2; + [SerializeField] private int my{on:Make:field:non-serialized}Value3; + [NonSerialized] public int my{on:To:serialized:field}Value4; + // Valid. NonSerialized wins - this is not serialized + [SerializeField] [NonSerialized] private int my{on:To:serialized:field}Value5; + [SerializeField] [NonSerialized] public int my{on:To:serialized:field}Value6; + + public int my{on:Make:field:'myValue7':non-serialized}Value7, my{on:Make:field:'myValue8':non-serialized}Value8, my{on:Make:field:'myValue9':non-serialized}Value9; + + public int my{on:Make:all:fields:non-serialized}value10, my{on:Make:all:fields:non-serialized}Value10; + + private int my{on:Make:field:'myValue11':serialized}Value11, my{on:Make:field:'myValue12':serialized}Value12; + + private int my{on:Make:all:fields:serialized}Value13, my{on:Make:all:fields:serialized}Value14; + + public static int my{on:Make:field:serialized:(remove:static)}Value15; + public readonly int my{on:Make:field:serialized:(remove:readonly)}Value16; + public static readonly int my{on:Make:field:serialized:(remove:static:and:readonly)}Value17; + + private static int my{on:Make:field:serialized:(remove:static)}Value18; + private readonly int my{on:Make:field:serialized:(remove:readonly)}Value19; + private static readonly int my{on:Make:field:serialized:(remove:static:and:readonly)}Value20; + + public static int my{on:Make:field:'myValue21':serialized:(remove:static)}Value21, my{on:Make:field:'myValue22':serialized:(remove:static)}Value22; + public readonly int my{on:Make:field:'myValue23':serialized:(remove:readonly)}Value23, my{on:Make:field:'myValue24':serialized:(remove:readonly)}Value24; + public static readonly int my{on:Make:field:'myValue24':serialized:(remove:static:and:readonly)}Value24, my{on:Make:field:'myValue25':serialized:(remove:static:and:readonly)}Value25; + + private static int my{on:Make:field:'myValue26':serialized:(remove:static)}Value26, my{on:Make:field:'myValue27':serialized:(remove:static)}Value27; + private readonly int my{on:Make:field:'myValue28':serialized:(remove:readonly)}Value28, my{on:Make:field:'myValue29':serialized:(remove:readonly)}Value29; + private static readonly int my{on:Make:field:'myValue30':serialized:(remove:static:and:readonly)}Value30, my{on:Make:field:'myValue31':serialized:(remove:static:and:readonly)}Value31; + + public static int my{on:Make:all:fields:serialized:(remove:static)}Value32, my{on:Make:all:fields:serialized:(remove:static)}Value33; + public readonly int my{on:Make:all:fields:serialized:(remove:readonly)}Value34, my{on:Make:all:fields:serialized:(remove:readonly)}Value35; + public static readonly int my{on:Make:all:fields:serialized:(remove:static:and:readonly)}Value36, my{on:Make:all:fields:serialized:(remove:static:and:readonly)}Value37; + + private static int my{on:Make:all:fields:serialized:(remove:static)}Value38, my{on:Make:all:fields:serialized:(remove:static)}Value39; + private readonly int my{on:Make:all:fields:serialized:(remove:readonly)}Value40, my{on:Make:all:fields:serialized:(remove:readonly)}Value41; + private static readonly int my{on:Make:all:fields:serialized:(remove:static:and:readonly)}Value42, my{on:Make:all:fields:serialized:(remove:static:and:readonly)}Value43; + + pub{off}lic i{off}nt myValue44; + pri{off}vate i{off}nt myValue45; + int{off}ernal i{off}nt myValue46; + pub{off}lic sta{off}tic i{off}nt myValue47; + pub{off}lic rea{off}donly i{off}nt myValue48; + pub{off}lic sta{off}tic rea{off}donly myValue49; + + pub{off}lic sta{off}tic i{off}nt myValue50; + pri{off}vate sta{off}tic i{off}nt myValue51; + + pub{off}lic read{off}only i{off}nt myValue52; + priv{off}ate read{off}only i{off}nt myValue53; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs new file mode 100644 index 0000000000..55f9850369 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue, my{caret:Make:field:'myValue2':non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs.gold new file mode 100644 index 0000000000..647f0bdf33 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized01.cs.gold @@ -0,0 +1,9 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int myValue; + [NonSerialized] public int my{caret}Value2; + public int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs new file mode 100644 index 0000000000..548390dadb --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue, my{caret:Make:field:'myValue2':non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs.gold new file mode 100644 index 0000000000..80947eb0a4 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized02.cs.gold @@ -0,0 +1,9 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int myValue; + private int my{caret}Value2; + [SerializeField] private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs new file mode 100644 index 0000000000..69a1d7e301 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField, NotNull] private int myValue, my{caret:Make:field:'myValue2':non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs.gold new file mode 100644 index 0000000000..4ac07902e7 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized03.cs.gold @@ -0,0 +1,9 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField, NotNull] private int myValue; + [NotNull] private int my{caret}Value2; + [SerializeField, NotNull] private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs new file mode 100644 index 0000000000..10ed8e9c4e --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] [NotNull] private int myValue, my{caret:Make:field:'myValue2':non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs.gold new file mode 100644 index 0000000000..7ca0df7baf --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized04.cs.gold @@ -0,0 +1,9 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] [NotNull] private int myValue; + [NotNull] private int my{caret}Value2; + [SerializeField] [NotNull] private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs new file mode 100644 index 0000000000..435c981101 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] public int myValue, my{caret:Make:field:'myValue2':non-serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs.gold new file mode 100644 index 0000000000..ce2d5f31c7 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToNonSerialized05.cs.gold @@ -0,0 +1,10 @@ +using System; +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] public int myValue; + [NonSerialized] [NotNull] public int my{caret}Value2; + [NotNull] public int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs new file mode 100644 index 0000000000..28034e7eff --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private int myValue, my{caret:Make:field:'myValue2':serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs.gold new file mode 100644 index 0000000000..115b422e37 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized01.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private int myValue; + [SerializeField] private int my{caret}Value2; + private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs new file mode 100644 index 0000000000..6c4e54bd7b --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [NonSerialized] public int myValue, my{caret:Make:field:'myValue2':serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs.gold new file mode 100644 index 0000000000..ea61241c4f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized02.cs.gold @@ -0,0 +1,9 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [NonSerialized] public int myValue; + public int my{caret}Value2; + [NonSerialized] public int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs new file mode 100644 index 0000000000..0c5376b864 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [Whatever] private int myValue, my{caret:Make:field:'myValue2':serialized}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs.gold new file mode 100644 index 0000000000..2bb28195ad --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerialized03.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [Whatever] private int myValue; + [SerializeField] [Whatever] private int my{caret}Value2; + [Whatever] private int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs new file mode 100644 index 0000000000..cfd1efc65e --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public readonly int myValue, my{caret:Make:field:'myValue2':serialized:(remove:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs.gold new file mode 100644 index 0000000000..2a5b980392 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly01.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public readonly int myValue; + public int my{caret}Value2; + public readonly int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs new file mode 100644 index 0000000000..ada8e57f2a --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private readonly int myValue, my{caret:Make:field:'myValue2':serialized:(remove:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs.gold new file mode 100644 index 0000000000..632df70621 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonly02.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private readonly int myValue; + [SerializeField] private int my{caret}Value2; + private readonly int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs new file mode 100644 index 0000000000..17e5770c90 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static readonly int myValue, my{caret:Make:field:'myValue2':serialized:(remove:static:and:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs.gold new file mode 100644 index 0000000000..f3d9edc719 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic01.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static readonly int myValue; + public int my{caret}Value2; + public static readonly int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs new file mode 100644 index 0000000000..2ce0fe3a83 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static readonly int myValue, my{caret:Make:field:'myValue2':serialized:(remove:static:and:readonly)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs.gold new file mode 100644 index 0000000000..b726239890 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveReadonlyStatic02.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static readonly int myValue; + [SerializeField] private int my{caret}Value2; + private static readonly int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs new file mode 100644 index 0000000000..bb1af4e7ea --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static int myValue, my{caret:Make:field:'myValue2':serialized:(remove:static)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs.gold new file mode 100644 index 0000000000..b6f21d226e --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic01.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static int myValue; + public int my{caret}Value2; + public static int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs new file mode 100644 index 0000000000..b0febae8aa --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static int myValue, my{caret:Make:field:'myValue2':serialized:(remove:static)}Value2, myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs.gold new file mode 100644 index 0000000000..b97cc7eb84 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/JustOneToSerializedRemoveStatic02.cs.gold @@ -0,0 +1,8 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static int myValue; + [SerializeField] private int my{caret}Value2; + private static int myValue3; +} diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized01.cs similarity index 100% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test01.cs rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized01.cs diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized01.cs.gold similarity index 100% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test01.cs.gold rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized01.cs.gold diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs new file mode 100644 index 0000000000..3300ac2563 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs.gold new file mode 100644 index 0000000000..3c3bb5965f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized02.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs new file mode 100644 index 0000000000..f9f561517f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField, NotNull] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs.gold new file mode 100644 index 0000000000..8e9b58789b --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized03.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs new file mode 100644 index 0000000000..ff4f3bc39e --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [SerializeField] [NotNull] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs.gold new file mode 100644 index 0000000000..8e9b58789b --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized04.cs.gold @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs new file mode 100644 index 0000000000..a09e4c5273 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs @@ -0,0 +1,7 @@ +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NotNull] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs.gold new file mode 100644 index 0000000000..3eb36d1039 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToNonSerialized05.cs.gold @@ -0,0 +1,8 @@ +using System; +using UnityEngine; +using JetBrains.Annotations; + +public class Foo : MonoBehaviour +{ + [NonSerialized] [NotNull] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs similarity index 54% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs index 48e115ea21..9fe3b73780 100644 --- a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test02.cs +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs @@ -2,5 +2,5 @@ public class Foo : MonoBehaviour { - [SerializeField] public int my{caret}Value; + private int my{caret}Value; } diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs new file mode 100644 index 0000000000..e227d73cab --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [NonSerialized] public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs.gold similarity index 53% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test03.cs.gold rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs.gold index b86c06e9c9..9e6a686359 100644 --- a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test03.cs.gold +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized02.cs.gold @@ -3,5 +3,5 @@ using UnityEngine; public class Foo : MonoBehaviour { - [NonSerialized] [SerializeField] private int my{caret}Value; + public int my{caret}Value; } diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs new file mode 100644 index 0000000000..8dc84b1356 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [Whatever] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs.gold new file mode 100644 index 0000000000..f44268c7a6 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerialized03.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] [Whatever] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs new file mode 100644 index 0000000000..1e83c06725 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs.gold new file mode 100644 index 0000000000..3f84deb17f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs new file mode 100644 index 0000000000..b3c24ab458 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs new file mode 100644 index 0000000000..659e1133b8 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs.gold similarity index 100% rename from resharper/test/data/intentions/ContextActions/MarkFieldNonSerialized/Test03.cs rename to resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonly03.cs.gold diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs new file mode 100644 index 0000000000..6611074ad1 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs.gold new file mode 100644 index 0000000000..3f84deb17f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs new file mode 100644 index 0000000000..0daa1e8bfb --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs new file mode 100644 index 0000000000..d03000cf72 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private static readonly int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs.gold new file mode 100644 index 0000000000..389bd8a441 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveReadonlyStatic03.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs new file mode 100644 index 0000000000..44bb7ab562 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public static int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs.gold new file mode 100644 index 0000000000..3f84deb17f --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic01.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + public int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs new file mode 100644 index 0000000000..63fbd5bdbb --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + private static int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs.gold new file mode 100644 index 0000000000..d49de93904 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic02.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs new file mode 100644 index 0000000000..d1d6d38fc5 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private static int my{caret}Value; +} diff --git a/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs.gold b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs.gold new file mode 100644 index 0000000000..389bd8a441 --- /dev/null +++ b/resharper/test/data/intentions/ContextActions/ToggleSerializedField/ToSerializedRemoveStatic03.cs.gold @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Foo : MonoBehaviour +{ + [SerializeField] private int my{caret}Value; +} diff --git a/resharper/test/src/Intentions/ContextActions/MarkFieldNonSerializedActionTests.cs b/resharper/test/src/Intentions/ContextActions/MarkFieldNonSerializedActionTests.cs deleted file mode 100644 index 33696f7a0a..0000000000 --- a/resharper/test/src/Intentions/ContextActions/MarkFieldNonSerializedActionTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -using JetBrains.ReSharper.FeaturesTestFramework.Intentions; -using JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions; -using NUnit.Framework; - -namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.ContextActions -{ - [TestUnity] - public class MarkFieldNonSerializedActionAvailabilityTest - : ContextActionAvailabilityTestBase - { - protected override string ExtraPath => @"MarkFieldNonSerialized"; - - [Test] public void TestAvailability01() { DoNamedTest2(); } - } - - [TestUnity] - public class MarkFieldNonSerializedActionExecutionTest - : ContextActionExecuteTestBase - { - protected override string ExtraPath => "MarkFieldNonSerialized"; - - [Test] public void Test01() { DoNamedTest(); } - [Test] public void Test02() { DoNamedTest(); } - [Test] public void Test03() { DoNamedTest(); } - } -} \ No newline at end of file diff --git a/resharper/test/src/Intentions/ContextActions/MarkSerializeFieldActionTests.cs b/resharper/test/src/Intentions/ContextActions/MarkSerializeFieldActionTests.cs deleted file mode 100644 index 0f8a7635b4..0000000000 --- a/resharper/test/src/Intentions/ContextActions/MarkSerializeFieldActionTests.cs +++ /dev/null @@ -1,25 +0,0 @@ -using JetBrains.ReSharper.FeaturesTestFramework.Intentions; -using JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions; -using NUnit.Framework; - -namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.ContextActions -{ - [TestUnity] - public class MarkSerializeFieldContextActionAvailabilityTest - : ContextActionAvailabilityTestBase - { - protected override string ExtraPath => @"MarkSerializeField"; - - [Test] public void TestAvailability01() { DoNamedTest2(); } - } - - [TestUnity] - public class MarkSerializeFieldContextActionExecutionTest - : ContextActionExecuteTestBase - { - protected override string ExtraPath => "MarkSerializeField"; - - [Test] public void Test01() { DoNamedTest(); } - [Test] public void Test02() { DoNamedTest(); } - } -} \ No newline at end of file diff --git a/resharper/test/src/Intentions/ContextActions/ToggleSerializedFieldActionTests.cs b/resharper/test/src/Intentions/ContextActions/ToggleSerializedFieldActionTests.cs new file mode 100644 index 0000000000..6477ef9f54 --- /dev/null +++ b/resharper/test/src/Intentions/ContextActions/ToggleSerializedFieldActionTests.cs @@ -0,0 +1,76 @@ +using JetBrains.ReSharper.FeaturesTestFramework.Intentions; +using JetBrains.ReSharper.Plugins.Unity.Feature.Services.ContextActions; +using NUnit.Framework; + +namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.ContextActions +{ + [TestUnity] + public class ToggleSerializedFieldActionAvailabilityTest + : ContextActionAvailabilityTestBase + { + protected override string ExtraPath => @"ToggleSerializedField"; + + [Test] public void TestAvailability01() { DoNamedTest2(); } + } + + [TestUnity] + public class ToggleSerializedFieldActionExecutionTest + : ContextActionExecuteTestBase + { + protected override string ExtraPath => "ToggleSerializedField"; + + [Test] public void TestToNonSerialized01() { DoNamedTest2(); } + [Test] public void TestToNonSerialized02() { DoNamedTest2(); } + [Test] public void TestToNonSerialized03() { DoNamedTest2(); } + [Test] public void TestToNonSerialized04() { DoNamedTest2(); } + [Test] public void TestToNonSerialized05() { DoNamedTest2(); } + + [Test] public void TestToSerialized01() { DoNamedTest2(); } + [Test] public void TestToSerialized02() { DoNamedTest2(); } + [Test] public void TestToSerialized03() { DoNamedTest2(); } + + [Test] public void TestToSerializedRemoveReadonly01() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveReadonly02() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveReadonly03() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveStatic01() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveStatic02() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveStatic03() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveReadonlyStatic01() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveReadonlyStatic02() { DoNamedTest2(); } + [Test] public void TestToSerializedRemoveReadonlyStatic03() { DoNamedTest2(); } + + [Test] public void TestJustOneToNonSerialized01() { DoNamedTest2(); } + [Test] public void TestJustOneToNonSerialized02() { DoNamedTest2(); } + [Test] public void TestJustOneToNonSerialized03() { DoNamedTest2(); } + [Test] public void TestJustOneToNonSerialized04() { DoNamedTest2(); } + [Test] public void TestJustOneToNonSerialized05() { DoNamedTest2(); } + + [Test] public void TestJustOneToSerialized01() { DoNamedTest2(); } + [Test] public void TestJustOneToSerialized02() { DoNamedTest2(); } + [Test] public void TestJustOneToSerialized03() { DoNamedTest2(); } + + [Test] public void TestJustOneToSerializedRemoveReadonly01() { DoNamedTest2(); } + [Test] public void TestJustOneToSerializedRemoveReadonly02() { DoNamedTest2(); } + [Test] public void TestJustOneToSerializedRemoveStatic01() { DoNamedTest2(); } + [Test] public void TestJustOneToSerializedRemoveStatic02() { DoNamedTest2(); } + [Test] public void TestJustOneToSerializedRemoveReadonlyStatic01() { DoNamedTest2(); } + [Test] public void TestJustOneToSerializedRemoveReadonlyStatic02() { DoNamedTest2(); } + + [Test] public void TestAllToNonSerialized01() { DoNamedTest2(); } + [Test] public void TestAllToNonSerialized02() { DoNamedTest2(); } + [Test] public void TestAllToNonSerialized03() { DoNamedTest2(); } + [Test] public void TestAllToNonSerialized04() { DoNamedTest2(); } + [Test] public void TestAllToNonSerialized05() { DoNamedTest2(); } + + [Test] public void TestAllToSerialized01() { DoNamedTest2(); } + [Test] public void TestAllToSerialized02() { DoNamedTest2(); } + [Test] public void TestAllToSerialized03() { DoNamedTest2(); } + + [Test] public void TestAllToSerializedRemoveReadonly01() { DoNamedTest2(); } + [Test] public void TestAllToSerializedRemoveReadonly02() { DoNamedTest2(); } + [Test] public void TestAllToSerializedRemoveStatic01() { DoNamedTest2(); } + [Test] public void TestAllToSerializedRemoveStatic02() { DoNamedTest2(); } + [Test] public void TestAllToSerializedRemoveReadonlyStatic01() { DoNamedTest2(); } + [Test] public void TestAllToSerializedRemoveReadonlyStatic02() { DoNamedTest2(); } + } +} \ No newline at end of file From b4013eca24786580062dd1f0861e25022f06ff97 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Thu, 7 Jun 2018 16:24:40 +0100 Subject: [PATCH 7/7] Add inspection for redundant HideInInspector Fixes #585 --- .../Daemon/Errors/CSharpErrors.xml | 23 ++++++++++-- ...HideInInspectorAttributeProblemAnalyzer.cs | 37 +++++++++++++++++++ .../RedundantAttributeDeadCodeQuickFix.cs | 5 +++ .../RedundantHideInInspectorAttribute.cs | 16 ++++++++ .../RedundantHideInInspectorAttribute.cs.gold | 25 +++++++++++++ .../Availability/Test01.cs | 7 ++++ .../Availability/Test01.cs.gold | 12 ++++++ .../Availability/Test02.cs | 6 +++ .../Availability/Test02.cs.gold | 11 ++++++ .../Test01.cs | 7 ++++ .../Test01.cs.gold | 7 ++++ .../Test02.cs | 7 ++++ .../Test02.cs.gold | 7 ++++ ...ntHideInInspectorAttributeAnalyzerTests.cs | 21 +++++++++++ ...ntHideInInspectorAttributeQuickFixTests.cs | 24 ++++++++++++ 15 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeProblemAnalyzer.cs create mode 100644 resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs create mode 100644 resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs.gold create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs create mode 100644 resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs.gold create mode 100644 resharper/test/src/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeAnalyzerTests.cs create mode 100644 resharper/test/src/Intentions/QuickFixes/RedundantHideInInspectorAttributeQuickFixTests.cs diff --git a/resharper/src/resharper-unity/Daemon/Errors/CSharpErrors.xml b/resharper/src/resharper-unity/Daemon/Errors/CSharpErrors.xml index 0adac76c24..da14da5426 100644 --- a/resharper/src/resharper-unity/Daemon/Errors/CSharpErrors.xml +++ b/resharper/src/resharper-unity/Daemon/Errors/CSharpErrors.xml @@ -43,7 +43,7 @@ Event function with the same name is already declared - Event function with the same name is already declared + Event function with the same name is already declared. MonoBehaviours must be instantiated with 'GameObject.AddComponent<T>()' instead of 'new' - Instantiating a MonoBehaviour based class with 'new' does not attach it to a GameObject, and Unity will not invoke any event functions. Create a new instance using 'GameObject.AddComponent<T>() + Instantiating a MonoBehaviour based class with 'new' does not attach it to a GameObject, and Unity will not invoke any event functions. Create a new instance using 'GameObject.AddComponent<T>(). Attribute is redundant when applied to this declaration type The attribute does not define any restrictions on valid targets, but is only useful when applied to specific declarations, e.g. field, class or method. + Redundant attribute usage Redundant 'InitializeOnLoad' attribute The 'InitializeOnLoad' attribute is redundant when static constructor is missing. + Redundant attribute usage Redundant 'SerializeField' attribute - Unity will ignore the 'SerializeField' attribute if a field is also marked with the 'NonSerialized' attribute + Unity will ignore the 'SerializeField' attribute if a field is also marked with the 'NonSerialized' attribute. + Redundant attribute usage + + + + Redundant 'HideInInspector' attribute + The 'HideInInspector' attribute only applies to serialised fields. + Redundant attribute usage + + + + Attribute.GetHighlightingRange() + + + diff --git a/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeProblemAnalyzer.cs b/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeProblemAnalyzer.cs new file mode 100644 index 0000000000..4d80ca3184 --- /dev/null +++ b/resharper/src/resharper-unity/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeProblemAnalyzer.cs @@ -0,0 +1,37 @@ +using JetBrains.ReSharper.Feature.Services.Daemon; +using JetBrains.ReSharper.Plugins.Unity.CSharp.Daemon.Errors; +using JetBrains.ReSharper.Plugins.Unity.Daemon.Stages.Dispatcher; +using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.CSharp.Tree; + +namespace JetBrains.ReSharper.Plugins.Unity.Daemon.Stages.Analysis +{ + [ElementProblemAnalyzer(typeof(IAttribute), + HighlightingTypes = new[] { typeof(RedundantHideInInspectorAttributeWarning) })] + public class RedundantHideInInspectorAttributeProblemAnalyzer : UnityElementProblemAnalyzer + { + public RedundantHideInInspectorAttributeProblemAnalyzer(UnityApi unityApi) + : base(unityApi) + { + } + + protected override void Analyze(IAttribute attribute, ElementProblemAnalyzerData data, IHighlightingConsumer consumer) + { + if (!(attribute.TypeReference?.Resolve().DeclaredElement is ITypeElement attributeTypeElement)) + return; + + if (!Equals(attributeTypeElement.GetClrName(), KnownTypes.HideInInspector)) + return; + + var fieldDeclarations = FieldDeclarationNavigator.GetByAttribute(attribute); + foreach (var fieldDeclaration in fieldDeclarations) + { + if (!Api.IsUnityField(fieldDeclaration.DeclaredElement)) + { + consumer.AddHighlighting(new RedundantHideInInspectorAttributeWarning(attribute)); + return; + } + } + } + } +} \ No newline at end of file diff --git a/resharper/src/resharper-unity/Feature/Services/QuickFixes/RedundantAttributeDeadCodeQuickFix.cs b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RedundantAttributeDeadCodeQuickFix.cs index 9a90847fa7..23077a08b8 100644 --- a/resharper/src/resharper-unity/Feature/Services/QuickFixes/RedundantAttributeDeadCodeQuickFix.cs +++ b/resharper/src/resharper-unity/Feature/Services/QuickFixes/RedundantAttributeDeadCodeQuickFix.cs @@ -28,6 +28,11 @@ public RedundantAttributeDeadCodeQuickFix(RedundantSerializeFieldAttributeWarnin myAttribute = highlighting.Attribute; } + public RedundantAttributeDeadCodeQuickFix(RedundantHideInInspectorAttributeWarning highlighting) + { + myAttribute = highlighting.Attribute; + } + public RedundantAttributeDeadCodeQuickFix(RedundantAttributeOnTargetWarning highlighting) { myAttribute = highlighting.Attribute; diff --git a/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs b/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs new file mode 100644 index 0000000000..ac3ee54906 --- /dev/null +++ b/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs @@ -0,0 +1,16 @@ +using System; +using UnityEngine; + +public class Test : MonoBehaviour +{ + [HideInInspector] private int Redundant1; + [HideInInspector] [NonSerialized] private int NotRedundant2; + [HideInInspector] [SerializeField] private static int Redundant3; +} + +public class Boring +{ + [HideInInspector] public int Redundant1; + [HideInInspector] private int Redundant2; + [HideInInspector] private static int Redundant3; +} diff --git a/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs.gold b/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs.gold new file mode 100644 index 0000000000..254b26a497 --- /dev/null +++ b/resharper/test/data/daemon/Stages/Analysis/RedundantHideInInspectorAttribute.cs.gold @@ -0,0 +1,25 @@ +using System; +using UnityEngine; + +public class |Test|(0) : MonoBehaviour +{ + [|HideInInspector|(1)] private int Redundant1; + [|HideInInspector|(2)] [NonSerialized] private int NotRedundant2; + [|HideInInspector|(3)] [SerializeField] private static int Redundant3; +} + +public class Boring +{ + [|HideInInspector|(4)] public int Redundant1; + [|HideInInspector|(5)] private int Redundant2; + [|HideInInspector|(6)] private static int Redundant3; +} + +--------------------------------------------------------- +(0): Unity Gutter Icon: Unity scripting component +(1): ReSharper Dead Code: Redundant 'HideInInspector' attribute +(2): ReSharper Dead Code: Redundant 'HideInInspector' attribute +(3): ReSharper Dead Code: Redundant 'HideInInspector' attribute +(4): ReSharper Dead Code: Redundant 'HideInInspector' attribute +(5): ReSharper Dead Code: Redundant 'HideInInspector' attribute +(6): ReSharper Dead Code: Redundant 'HideInInspector' attribute diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs new file mode 100644 index 0000000000..c0460230d8 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [HideIn{caret}Inspector] [NonSerialized] public int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs.gold new file mode 100644 index 0000000000..df3588a7c2 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test01.cs.gold @@ -0,0 +1,12 @@ +using System; +using UnityEngine; + +public class Test +{ + [|HideInInspector|(0)] [NonSerialized] public int Value; +} + +------------------------------------------------ +0: Redundant 'HideInInspector' attribute +QUICKFIXES: +Remove redundant attribute diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs new file mode 100644 index 0000000000..9fa6e81bab --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Test +{ + [HideIn{caret}Inspector] private int myValue1, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs.gold new file mode 100644 index 0000000000..a2c20a7217 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Availability/Test02.cs.gold @@ -0,0 +1,11 @@ +using UnityEngine; + +public class Test +{ + [|HideInInspector|(0)] private int myValue1, myValue2, myValue3; +} + +------------------------------------------------ +0: Redundant 'HideInInspector' attribute +QUICKFIXES: +Remove redundant attribute diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs new file mode 100644 index 0000000000..c0460230d8 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [HideIn{caret}Inspector] [NonSerialized] public int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs.gold new file mode 100644 index 0000000000..db1bda5d34 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test01.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + {caret} [NonSerialized] public int Value; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs new file mode 100644 index 0000000000..6fe0316db8 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + [HideIn{caret}Inspector] private int myValue1, myValue2, myValue3; +} diff --git a/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs.gold b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs.gold new file mode 100644 index 0000000000..d792cb0d38 --- /dev/null +++ b/resharper/test/data/intentions/QuickFixes/RedundantHideInInspectorAttribute/Test02.cs.gold @@ -0,0 +1,7 @@ +using System; +using UnityEngine; + +public class Test +{ + {caret} private int myValue1, myValue2, myValue3; +} diff --git a/resharper/test/src/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeAnalyzerTests.cs b/resharper/test/src/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeAnalyzerTests.cs new file mode 100644 index 0000000000..3bc2ab23e0 --- /dev/null +++ b/resharper/test/src/Daemon/Stages/Analysis/RedundantHideInInspectorAttributeAnalyzerTests.cs @@ -0,0 +1,21 @@ +using JetBrains.ReSharper.Feature.Services.Daemon; +using JetBrains.ReSharper.FeaturesTestFramework.Daemon; +using JetBrains.ReSharper.Plugins.Unity.Daemon.Stages.Highlightings; +using JetBrains.ReSharper.Psi; +using NUnit.Framework; + +namespace JetBrains.ReSharper.Plugins.Unity.Tests.Daemon.Stages.Analysis +{ + [TestUnity] + public class RedundantHideInInspectorAttributeAnalyzerTests : CSharpHighlightingTestBase + { + protected override string RelativeTestDataPath => @"daemon\Stages\Analysis"; + + protected override bool HighlightingPredicate(IHighlighting highlighting, IPsiSourceFile sourceFile) + { + return highlighting is IUnityHighlighting; + } + + [Test] public void TestRedundantHideInInspectorAttribute() { DoNamedTest2(); } + } +} \ No newline at end of file diff --git a/resharper/test/src/Intentions/QuickFixes/RedundantHideInInspectorAttributeQuickFixTests.cs b/resharper/test/src/Intentions/QuickFixes/RedundantHideInInspectorAttributeQuickFixTests.cs new file mode 100644 index 0000000000..dc6f45ac87 --- /dev/null +++ b/resharper/test/src/Intentions/QuickFixes/RedundantHideInInspectorAttributeQuickFixTests.cs @@ -0,0 +1,24 @@ +using JetBrains.ReSharper.FeaturesTestFramework.Intentions; +using JetBrains.ReSharper.Plugins.Unity.Feature.Services.QuickFixes; +using NUnit.Framework; + +namespace JetBrains.ReSharper.Plugins.Unity.Tests.Intentions.QuickFixes +{ + [TestUnity] + public class RedundantHideInInspectorAttributeQuickFixAvailabilityTests : QuickFixAvailabilityTestBase + { + protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RedundantHideInInspectorAttribute\Availability"; + + [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } + } + + [TestUnity] + public class RedundantHideInInspectorAttributeQuickFixTests : CSharpQuickFixTestBase + { + protected override string RelativeTestDataPath=> @"Intentions\QuickFixes\RedundantHideInInspectorAttribute"; + + [Test] public void Test01() { DoNamedTest(); } + [Test] public void Test02() { DoNamedTest(); } + } +} \ No newline at end of file