From 923fffcda673ad508af763fc0ed2738e1e8703a2 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 8 Apr 2016 17:12:21 -0700 Subject: [PATCH] rename `SimpleCodeStyleOption` to `CodeStyleOption` and serialize C# preferences --- .../IntroduceVariableTests.cs | 2 +- .../GenerateVariable/GenerateVariableTests.cs | 2 +- .../QualifyMemberAccessTests.cs | 4 +- .../UseExplicitTypeTests.cs | 16 ++-- .../UseImplicitTypeTests.cs | 16 ++-- .../EventHookupCommandHandlerTests.cs | 2 +- .../AbstractCodeActionOrUserDiagnosticTest.cs | 4 +- .../Simplification/TypeNameSimplifierTest.vb | 10 +-- .../QualifyMemberAccessTests.vb | 4 +- ...rpTypeStyleDiagnosticAnalyzerBase.State.cs | 6 +- .../CSharp/Impl/Options/AutomationObject.cs | 79 +++++++------------ .../CSharpSettingsManagerOptionSerializer.cs | 75 ++++++++++++++---- .../Impl/Options/Formatting/StyleViewModel.cs | 4 +- .../Options/AbstractOptionPreviewViewModel.cs | 21 ++++- .../BooleanCodeStyleOptionViewModel.cs | 2 +- .../Options/CheckBoxWithComboViewModel.cs | 10 +-- .../Options/SimpleCodeStyleOptionViewModel.cs | 10 +-- .../Impl/Options/AutomationObject.vb | 8 +- .../CodeStyle/CSharpCodeStyleOptions.cs | 6 +- .../CSharpCodeStyleOptionsProvider.cs | 5 ++ .../CodeStyle/TypeStyle/TypeStyleHelper.cs | 6 +- ...eCodeStyleOption.cs => CodeStyleOption.cs} | 44 +++++++---- .../Portable/CodeStyle/CodeStyleOptions.cs | 8 +- .../Core/Portable/PublicAPI.Unshipped.txt | 28 +++---- .../Simplification/SimplificationHelpers.cs | 8 +- .../Core/Portable/Workspaces.csproj | 2 +- 26 files changed, 222 insertions(+), 160 deletions(-) rename src/Workspaces/Core/Portable/CodeStyle/{SimpleCodeStyleOption.cs => CodeStyleOption.cs} (57%) diff --git a/src/EditorFeatures/CSharpTest/CodeActions/IntroduceVariable/IntroduceVariableTests.cs b/src/EditorFeatures/CSharpTest/CodeActions/IntroduceVariable/IntroduceVariableTests.cs index 5559c1a8ce0..69eafd758fd 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/IntroduceVariable/IntroduceVariableTests.cs +++ b/src/EditorFeatures/CSharpTest/CodeActions/IntroduceVariable/IntroduceVariableTests.cs @@ -20,7 +20,7 @@ protected override object CreateCodeRefactoringProvider(Workspace workspace) return new IntroduceVariableCodeRefactoringProvider(); } - private readonly SimpleCodeStyleOption onWithInfo = new SimpleCodeStyleOption(true, NotificationOption.Info); + private readonly CodeStyleOption onWithInfo = new CodeStyleOption(true, NotificationOption.Info); // specify all options explicitly to override defaults. private IDictionary ImplicitTypingEverywhere() => diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/GenerateVariable/GenerateVariableTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/GenerateVariable/GenerateVariableTests.cs index 4c718cae399..11aeae912d0 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/GenerateVariable/GenerateVariableTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/GenerateVariable/GenerateVariableTests.cs @@ -24,7 +24,7 @@ public class GenerateVariableTests : AbstractCSharpDiagnosticProviderBasedUserDi null, new GenerateVariableCodeFixProvider()); } - private readonly SimpleCodeStyleOption onWithInfo = new SimpleCodeStyleOption(true, NotificationOption.Info); + private readonly CodeStyleOption onWithInfo = new CodeStyleOption(true, NotificationOption.Info); // specify all options explicitly to override defaults. private IDictionary ImplicitTypingEverywhere() => diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.cs index 1cbac89f9f9..4cdda6c2724 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.cs @@ -20,12 +20,12 @@ public class QualifyMemberAccessTests : AbstractCSharpDiagnosticProviderBasedUse return Tuple.Create(new CSharpQualifyMemberAccessDiagnosticAnalyzer(), new CSharpQualifyMemberAccessCodeFixProvider()); } - private Task TestAsyncWithOption(string code, string expected, PerLanguageOption option) + private Task TestAsyncWithOption(string code, string expected, PerLanguageOption> option) { return TestAsync(code, expected, options: Option(option, true, NotificationOption.Error)); } - private Task TestMissingAsyncWithOption(string code, PerLanguageOption option) + private Task TestMissingAsyncWithOption(string code, PerLanguageOption> option) { return TestMissingAsync(code, options: Option(option, true, NotificationOption.Error)); } diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseExplicitTypeTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseExplicitTypeTests.cs index e4a9fd43d37..baabf1d0b7f 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseExplicitTypeTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseExplicitTypeTests.cs @@ -22,14 +22,14 @@ public partial class UseExplicitTypeTests : AbstractCSharpDiagnosticProviderBase new Tuple( new CSharpUseExplicitTypeDiagnosticAnalyzer(), new UseExplicitTypeCodeFixProvider()); - private readonly SimpleCodeStyleOption onWithNone = new SimpleCodeStyleOption(true, NotificationOption.None); - private readonly SimpleCodeStyleOption offWithNone = new SimpleCodeStyleOption(false, NotificationOption.None); - private readonly SimpleCodeStyleOption onWithInfo = new SimpleCodeStyleOption(true, NotificationOption.Info); - private readonly SimpleCodeStyleOption offWithInfo = new SimpleCodeStyleOption(false, NotificationOption.Info); - private readonly SimpleCodeStyleOption onWithWarning = new SimpleCodeStyleOption(true, NotificationOption.Warning); - private readonly SimpleCodeStyleOption offWithWarning = new SimpleCodeStyleOption(false, NotificationOption.Warning); - private readonly SimpleCodeStyleOption onWithError = new SimpleCodeStyleOption(true, NotificationOption.Error); - private readonly SimpleCodeStyleOption offWithError = new SimpleCodeStyleOption(false, NotificationOption.Error); + private readonly CodeStyleOption onWithNone = new CodeStyleOption(true, NotificationOption.None); + private readonly CodeStyleOption offWithNone = new CodeStyleOption(false, NotificationOption.None); + private readonly CodeStyleOption onWithInfo = new CodeStyleOption(true, NotificationOption.Info); + private readonly CodeStyleOption offWithInfo = new CodeStyleOption(false, NotificationOption.Info); + private readonly CodeStyleOption onWithWarning = new CodeStyleOption(true, NotificationOption.Warning); + private readonly CodeStyleOption offWithWarning = new CodeStyleOption(false, NotificationOption.Warning); + private readonly CodeStyleOption onWithError = new CodeStyleOption(true, NotificationOption.Error); + private readonly CodeStyleOption offWithError = new CodeStyleOption(false, NotificationOption.Error); // specify all options explicitly to override defaults. private IDictionary ExplicitTypeEverywhere() => diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseImplicitTypeTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseImplicitTypeTests.cs index bb923bc14c8..96c43bc7efd 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseImplicitTypeTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/UseImplicitOrExplicitType/UseImplicitTypeTests.cs @@ -23,14 +23,14 @@ public partial class UseImplicitTypeTests : AbstractCSharpDiagnosticProviderBase new Tuple( new CSharpUseImplicitTypeDiagnosticAnalyzer(), new UseImplicitTypeCodeFixProvider()); - private readonly SimpleCodeStyleOption onWithNone = new SimpleCodeStyleOption(true, NotificationOption.None); - private readonly SimpleCodeStyleOption offWithNone = new SimpleCodeStyleOption(false, NotificationOption.None); - private readonly SimpleCodeStyleOption onWithInfo = new SimpleCodeStyleOption(true, NotificationOption.Info); - private readonly SimpleCodeStyleOption offWithInfo = new SimpleCodeStyleOption(false, NotificationOption.Info); - private readonly SimpleCodeStyleOption onWithWarning = new SimpleCodeStyleOption(true, NotificationOption.Warning); - private readonly SimpleCodeStyleOption offWithWarning = new SimpleCodeStyleOption(false, NotificationOption.Warning); - private readonly SimpleCodeStyleOption onWithError = new SimpleCodeStyleOption(true, NotificationOption.Error); - private readonly SimpleCodeStyleOption offWithError = new SimpleCodeStyleOption(false, NotificationOption.Error); + private readonly CodeStyleOption onWithNone = new CodeStyleOption(true, NotificationOption.None); + private readonly CodeStyleOption offWithNone = new CodeStyleOption(false, NotificationOption.None); + private readonly CodeStyleOption onWithInfo = new CodeStyleOption(true, NotificationOption.Info); + private readonly CodeStyleOption offWithInfo = new CodeStyleOption(false, NotificationOption.Info); + private readonly CodeStyleOption onWithWarning = new CodeStyleOption(true, NotificationOption.Warning); + private readonly CodeStyleOption offWithWarning = new CodeStyleOption(false, NotificationOption.Warning); + private readonly CodeStyleOption onWithError = new CodeStyleOption(true, NotificationOption.Error); + private readonly CodeStyleOption offWithError = new CodeStyleOption(false, NotificationOption.Error); // specify all options explicitly to override defaults. private IDictionary ImplicitTypeEverywhere() => diff --git a/src/EditorFeatures/CSharpTest/EventHookup/EventHookupCommandHandlerTests.cs b/src/EditorFeatures/CSharpTest/EventHookup/EventHookupCommandHandlerTests.cs index 3ab6614e0f6..3493e6fc04e 100644 --- a/src/EditorFeatures/CSharpTest/EventHookup/EventHookupCommandHandlerTests.cs +++ b/src/EditorFeatures/CSharpTest/EventHookup/EventHookupCommandHandlerTests.cs @@ -962,6 +962,6 @@ private void C_MyEvent() } } - private IDictionary QualifyMethodAccess => new Dictionary() { { new OptionKey(CodeStyleOptions.QualifyMethodAccess, LanguageNames.CSharp), new SimpleCodeStyleOption(true, NotificationOption.Error) } }; + private IDictionary QualifyMethodAccess => new Dictionary() { { new OptionKey(CodeStyleOptions.QualifyMethodAccess, LanguageNames.CSharp), new CodeStyleOption(true, NotificationOption.Error) } }; } } diff --git a/src/EditorFeatures/Test/CodeActions/AbstractCodeActionOrUserDiagnosticTest.cs b/src/EditorFeatures/Test/CodeActions/AbstractCodeActionOrUserDiagnosticTest.cs index a3421e61849..752d6503dc9 100644 --- a/src/EditorFeatures/Test/CodeActions/AbstractCodeActionOrUserDiagnosticTest.cs +++ b/src/EditorFeatures/Test/CodeActions/AbstractCodeActionOrUserDiagnosticTest.cs @@ -367,9 +367,9 @@ protected static IList FlattenActions(IEnumerable codeAc return codeActions?.SelectMany(a => a.HasCodeActions ? a.GetCodeActions().ToArray() : new[] { a }).ToList(); } - protected IDictionary Option(PerLanguageOption option, bool value, CodeStyle.NotificationOption notification) + protected IDictionary Option(PerLanguageOption> option, bool value, CodeStyle.NotificationOption notification) { - return new Dictionary() { { new OptionKey(option, GetLanguage()), new CodeStyle.SimpleCodeStyleOption(value, notification) } }; + return new Dictionary() { { new OptionKey(option, GetLanguage()), new CodeStyle.CodeStyleOption(value, notification) } }; } } } diff --git a/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb b/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb index 25b6b3abed1..3cb1d07a006 100644 --- a/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb +++ b/src/EditorFeatures/Test2/Simplification/TypeNameSimplifierTest.vb @@ -2437,7 +2437,7 @@ class C } ]]> - Dim simplificationOptionSet = New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyFieldAccess, LanguageNames.CSharp), New SimpleCodeStyleOption(True, NotificationOption.Error)}} + Dim simplificationOptionSet = New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyFieldAccess, LanguageNames.CSharp), New CodeStyleOption(Of Boolean)(True, NotificationOption.Error)}} Await TestAsync(input, expected, simplificationOptionSet) End Function @@ -5555,19 +5555,19 @@ End Class #Region "Helpers" Protected Function QualifyFieldAccessOption(languageName As String) As Dictionary(Of OptionKey, Object) - Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyFieldAccess, languageName), New SimpleCodeStyleOption(True, NotificationOption.Error)}} + Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyFieldAccess, languageName), New CodeStyleOption(Of Boolean)(True, NotificationOption.Error)}} End Function Protected Function QualifyPropertyAccessOption(languageName As String) As Dictionary(Of OptionKey, Object) - Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyPropertyAccess, languageName), New SimpleCodeStyleOption(True, NotificationOption.Error)}} + Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyPropertyAccess, languageName), New CodeStyleOption(Of Boolean)(True, NotificationOption.Error)}} End Function Protected Function QualifyMethodAccessOption(languageName As String) As Dictionary(Of OptionKey, Object) - Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyMethodAccess, languageName), New SimpleCodeStyleOption(True, NotificationOption.Error)}} + Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyMethodAccess, languageName), New CodeStyleOption(Of Boolean)(True, NotificationOption.Error)}} End Function Protected Function QualifyEventAccessOption(languageName As String) As Dictionary(Of OptionKey, Object) - Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyEventAccess, languageName), New SimpleCodeStyleOption(True, NotificationOption.Error)}} + Return New Dictionary(Of OptionKey, Object) From {{New OptionKey(CodeStyleOptions.QualifyEventAccess, languageName), New CodeStyleOption(Of Boolean)(True, NotificationOption.Error)}} End Function Shared DontPreferIntrinsicPredefinedTypeKeywordInDeclaration As Dictionary(Of OptionKey, Object) = New Dictionary(Of OptionKey, Object) From {{New OptionKey(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, LanguageNames.VisualBasic), False}} diff --git a/src/EditorFeatures/VisualBasicTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.vb b/src/EditorFeatures/VisualBasicTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.vb index f9c91b7de2d..428fe9f917e 100644 --- a/src/EditorFeatures/VisualBasicTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.vb +++ b/src/EditorFeatures/VisualBasicTest/Diagnostics/QualifyMemberAccess/QualifyMemberAccessTests.vb @@ -15,11 +15,11 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Qualif Return Tuple.Create(Of DiagnosticAnalyzer, CodeFixProvider)(New VisualBasicQualifyMemberAccessDiagnosticAnalyzer(), New VisualBasicQualifyMemberAccessCodeFixProvider()) End Function - Private Function TestAsyncWithOption(code As String, expected As String, opt As PerLanguageOption(Of SimpleCodeStyleOption)) As Task + Private Function TestAsyncWithOption(code As String, expected As String, opt As PerLanguageOption(Of CodeStyleOption(Of Boolean))) As Task Return TestAsync(code, expected, options:=[Option](opt, True, NotificationOption.Error)) End Function - Private Function TestMissingAsyncWithOption(code As String, opt As PerLanguageOption(Of SimpleCodeStyleOption)) As Task + Private Function TestMissingAsyncWithOption(code As String, opt As PerLanguageOption(Of CodeStyleOption(Of Boolean))) As Task Return TestMissingAsync(code, options:=[Option](opt, True, NotificationOption.Error)) End Function diff --git a/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpTypeStyleDiagnosticAnalyzerBase.State.cs b/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpTypeStyleDiagnosticAnalyzerBase.State.cs index af347206e72..e0764f0dd69 100644 --- a/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpTypeStyleDiagnosticAnalyzerBase.State.cs +++ b/src/Features/CSharp/Portable/Diagnostics/Analyzers/CSharpTypeStyleDiagnosticAnalyzerBase.State.cs @@ -136,17 +136,17 @@ private TypeStylePreference GetCurrentTypeStylePreferences(OptionSet optionSet) _styleToSeverityMap.Add(TypeStylePreference.ImplicitTypeWhereApparent, styleForApparent.Notification.Value); _styleToSeverityMap.Add(TypeStylePreference.ImplicitTypeWherePossible, styleForElsewhere.Notification.Value); - if (styleForIntrinsicTypes.IsChecked) + if (styleForIntrinsicTypes.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeForIntrinsicTypes; } - if (styleForApparent.IsChecked) + if (styleForApparent.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeWhereApparent; } - if (styleForElsewhere.IsChecked) + if (styleForElsewhere.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeWherePossible; } diff --git a/src/VisualStudio/CSharp/Impl/Options/AutomationObject.cs b/src/VisualStudio/CSharp/Impl/Options/AutomationObject.cs index 17a1eac67b4..dbc6425cb4e 100644 --- a/src/VisualStudio/CSharp/Impl/Options/AutomationObject.cs +++ b/src/VisualStudio/CSharp/Impl/Options/AutomationObject.cs @@ -487,28 +487,28 @@ public string Style_NamingPreferences } } - public int Style_QualifyFieldAccess + public string Style_QualifyFieldAccess { - get { return GetBooleanOption(CodeStyleOptions.QualifyFieldAccess); } - set { SetBooleanOption(CodeStyleOptions.QualifyFieldAccess, value); } + get { return GetXmlOption(CodeStyleOptions.QualifyFieldAccess); } + set { SetXmlOption(CodeStyleOptions.QualifyFieldAccess, value); } } - public int Style_QualifyPropertyAccess + public string Style_QualifyPropertyAccess { - get { return GetBooleanOption(CodeStyleOptions.QualifyPropertyAccess); } - set { SetBooleanOption(CodeStyleOptions.QualifyPropertyAccess, value); } + get { return GetXmlOption(CodeStyleOptions.QualifyPropertyAccess); } + set { SetXmlOption(CodeStyleOptions.QualifyPropertyAccess, value); } } - public int Style_QualifyMethodAccess + public string Style_QualifyMethodAccess { - get { return GetBooleanOption(CodeStyleOptions.QualifyMethodAccess); } - set { SetBooleanOption(CodeStyleOptions.QualifyMethodAccess, value); } + get { return GetXmlOption(CodeStyleOptions.QualifyMethodAccess); } + set { SetXmlOption(CodeStyleOptions.QualifyMethodAccess, value); } } - public int Style_QualifyEventAccess + public string Style_QualifyEventAccess { - get { return GetBooleanOption(CodeStyleOptions.QualifyEventAccess); } - set { SetBooleanOption(CodeStyleOptions.QualifyEventAccess, value); } + get { return GetXmlOption(CodeStyleOptions.QualifyEventAccess); } + set { SetXmlOption(CodeStyleOptions.QualifyEventAccess, value); } } public int Style_UseVarWhenDeclaringLocals @@ -519,38 +519,20 @@ public int Style_UseVarWhenDeclaringLocals public string Style_UseImplicitTypeWherePossible { - get - { - return GetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeWherePossible); - } - set - { - SetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeWherePossible, value); - } + get { return GetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeWherePossible); } + set { SetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeWherePossible, value); } } public string Style_UseImplicitTypeWhereApparent { - get - { - return GetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent); - } - set - { - SetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, value); - } + get { return GetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent); } + set { SetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, value); } } public string Style_UseImplicitTypeForIntrinsicTypes { - get - { - return GetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes); - } - set - { - SetUseVarOption(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes, value); - } + get { return GetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes); } + set { SetXmlOption(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes, value); } } public int Wrapping_IgnoreSpacesAroundBinaryOperators @@ -594,11 +576,6 @@ private int GetBooleanOption(PerLanguageOption key) return _workspace.Options.GetOption(key, LanguageNames.CSharp) ? 1 : 0; } - private int GetBooleanOption(PerLanguageOption key) - { - return _workspace.Options.GetOption(key, LanguageNames.CSharp).IsChecked ? 1 : 0; - } - private void SetBooleanOption(Option key, int value) { _workspace.Options = _workspace.Options.WithChangedOption(key, value != 0); @@ -620,11 +597,9 @@ private int GetBooleanOption(PerLanguageOption key) return option.Value ? 1 : 0; } - private void SetBooleanOption(PerLanguageOption key, int value) + private string GetXmlOption(Option> option) { - var opt = _workspace.Options.GetOption(key, LanguageNames.CSharp); - opt.IsChecked = value != 0; - _workspace.Options = _workspace.Options.WithChangedOption(key, LanguageNames.CSharp, opt); + return _workspace.Options.GetOption(option).ToXElement().ToString(); } private void SetBooleanOption(PerLanguageOption key, int value) @@ -633,15 +608,21 @@ private void SetBooleanOption(PerLanguageOption key, int value) _workspace.Options = _workspace.Options.WithChangedOption(key, LanguageNames.CSharp, boolValue); } - private string GetUseVarOption(Option option) + private string GetXmlOption(PerLanguageOption> option) { - return _workspace.Options.GetOption(option).ToXElement().ToString(); + return _workspace.Options.GetOption(option, LanguageNames.CSharp).ToXElement().ToString(); } - private void SetUseVarOption(Option option, string value) + private void SetXmlOption(Option> option, string value) { - var convertedValue = SimpleCodeStyleOption.FromXElement(XElement.Parse(value)); + var convertedValue = CodeStyleOption.FromXElement(XElement.Parse(value)); _workspace.Options = _workspace.Options.WithChangedOption(option, convertedValue); } + + private void SetXmlOption(PerLanguageOption> option, string value) + { + var convertedValue = CodeStyleOption.FromXElement(XElement.Parse(value)); + _workspace.Options = _workspace.Options.WithChangedOption(option, LanguageNames.CSharp, convertedValue); + } } } diff --git a/src/VisualStudio/CSharp/Impl/Options/CSharpSettingsManagerOptionSerializer.cs b/src/VisualStudio/CSharp/Impl/Options/CSharpSettingsManagerOptionSerializer.cs index 7d13a52ae21..8f8310cf6b7 100644 --- a/src/VisualStudio/CSharp/Impl/Options/CSharpSettingsManagerOptionSerializer.cs +++ b/src/VisualStudio/CSharp/Impl/Options/CSharpSettingsManagerOptionSerializer.cs @@ -33,6 +33,7 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options CompletionOptions.FeatureName, CSharpCompletionOptions.FeatureName, CSharpCodeStyleOptions.FeatureName, + CodeStyleOptions.PerLanguageCodeStyleOption, SimplificationOptions.PerLanguageFeatureName, ExtractMethodOptions.FeatureName, CSharpFormattingOptions.IndentFeatureName, @@ -54,6 +55,10 @@ public CSharpSettingsManagerOptionSerializer(SVsServiceProvider serviceProvider, private const string SpaceAroundBinaryOperator = nameof(AutomationObject.Space_AroundBinaryOperator); private const string UnindentLabels = nameof(AutomationObject.Indent_UnindentLabels); private const string FlushLabelsLeft = nameof(AutomationObject.Indent_FlushLabelsLeft); + private const string Style_QualifyFieldAccess = nameof(AutomationObject.Style_QualifyFieldAccess); + private const string Style_QualifyPropertyAccess = nameof(AutomationObject.Style_QualifyPropertyAccess); + private const string Style_QualifyMethodAccess = nameof(AutomationObject.Style_QualifyMethodAccess); + private const string Style_QualifyEventAccess = nameof(AutomationObject.Style_QualifyEventAccess); private const string Style_UseImplicitTypeForIntrinsicTypes = nameof(AutomationObject.Style_UseImplicitTypeForIntrinsicTypes); private const string Style_UseImplicitTypeWhereApparent = nameof(AutomationObject.Style_UseImplicitTypeWhereApparent); private const string Style_UseImplicitTypeWherePossible = nameof(AutomationObject.Style_UseImplicitTypeWherePossible); @@ -89,7 +94,8 @@ private bool ShouldIncludeOnOffOption(FieldInfo fieldInfo) typeof(CSharpCodeStyleOptions), typeof(ExtractMethodOptions), typeof(ServiceFeatureOnOffOptions), - typeof(CSharpFormattingOptions) + typeof(CSharpFormattingOptions), + typeof(CodeStyleOptions) }; var bindingFlags = BindingFlags.Public | BindingFlags.Static; @@ -126,6 +132,7 @@ protected override bool SupportsOption(IOption option, string languageName) option == AddImportOptions.SuggestForTypesInNuGetPackages || option == CSharpCompletionOptions.AddNewLineOnEnterAfterFullyTypedWord || option == CSharpCompletionOptions.IncludeSnippets || + option.Feature == CodeStyleOptions.PerLanguageCodeStyleOption || option.Feature == CSharpCodeStyleOptions.FeatureName || option.Feature == CSharpFormattingOptions.WrappingFeatureName || option.Feature == CSharpFormattingOptions.IndentFeatureName || @@ -224,26 +231,46 @@ public override bool TryFetch(OptionKey optionKey, out object value) return true; } + // code style: use this. + if (optionKey.Option == CodeStyleOptions.QualifyFieldAccess) + { + return FetchStyleBool(Style_QualifyFieldAccess, out value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyPropertyAccess) + { + return FetchStyleBool(Style_QualifyPropertyAccess, out value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyMethodAccess) + { + return FetchStyleBool(Style_QualifyMethodAccess, out value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyEventAccess) + { + return FetchStyleBool(Style_QualifyEventAccess, out value); + } + // code style: use var options. if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes) { - var typeStyleValue = this.Manager.GetValueOrDefault(Style_UseImplicitTypeForIntrinsicTypes); - return FetchTypeStyleOption(typeStyleValue, out value); + return FetchStyleBool(Style_UseImplicitTypeForIntrinsicTypes, out value); } else if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeWhereApparent) { - var typeStyleValue = this.Manager.GetValueOrDefault(Style_UseImplicitTypeWhereApparent); - return FetchTypeStyleOption(typeStyleValue, out value); + return FetchStyleBool(Style_UseImplicitTypeWhereApparent, out value); } else if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeWherePossible) { - var typeStyleValue = this.Manager.GetValueOrDefault(Style_UseImplicitTypeWherePossible); - return FetchTypeStyleOption(typeStyleValue, out value); + return FetchStyleBool(Style_UseImplicitTypeWherePossible, out value); } return base.TryFetch(optionKey, out value); } + private bool FetchStyleBool(string settingName, out object value) + { + var typeStyleValue = Manager.GetValueOrDefault(settingName); + return FetchStyleOption(typeStyleValue, out value); + } public override bool TryPersist(OptionKey optionKey, object value) { @@ -310,39 +337,57 @@ public override bool TryPersist(OptionKey optionKey, object value) } } + // code style: use this. + if (optionKey.Option == CodeStyleOptions.QualifyFieldAccess) + { + return PersistStyleOption(Style_QualifyFieldAccess, value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyPropertyAccess) + { + return PersistStyleOption(Style_QualifyPropertyAccess, value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyMethodAccess) + { + return PersistStyleOption(Style_QualifyMethodAccess, value); + } + else if (optionKey.Option == CodeStyleOptions.QualifyEventAccess) + { + return PersistStyleOption(Style_QualifyEventAccess, value); + } + // code style: use var options. if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes) { - return PersistTypeStyleOption(Style_UseImplicitTypeForIntrinsicTypes, value); + return PersistStyleOption(Style_UseImplicitTypeForIntrinsicTypes, value); } else if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeWhereApparent) { - return PersistTypeStyleOption(Style_UseImplicitTypeWhereApparent, value); + return PersistStyleOption(Style_UseImplicitTypeWhereApparent, value); } else if (optionKey.Option == CSharpCodeStyleOptions.UseImplicitTypeWherePossible) { - return PersistTypeStyleOption(Style_UseImplicitTypeWherePossible, value); + return PersistStyleOption(Style_UseImplicitTypeWherePossible, value); } return base.TryPersist(optionKey, value); } - private bool PersistTypeStyleOption(string option, object value) + private bool PersistStyleOption(string option, object value) { - var serializedValue = ((SimpleCodeStyleOption)value).ToXElement().ToString(); + var serializedValue = ((CodeStyleOption)value).ToXElement().ToString(); this.Manager.SetValueAsync(option, value: serializedValue, isMachineLocal: false); return true; } - private static bool FetchTypeStyleOption(string typeStyleOptionValue, out object value) + private static bool FetchStyleOption(string typeStyleOptionValue, out object value) { if (string.IsNullOrEmpty(typeStyleOptionValue)) { - value = SimpleCodeStyleOption.Default; + value = CodeStyleOption.Default; } else { - value = SimpleCodeStyleOption.FromXElement(XElement.Parse(typeStyleOptionValue)); + value = CodeStyleOption.FromXElement(XElement.Parse(typeStyleOptionValue)); } return true; diff --git a/src/VisualStudio/CSharp/Impl/Options/Formatting/StyleViewModel.cs b/src/VisualStudio/CSharp/Impl/Options/Formatting/StyleViewModel.cs index 94daa6e2370..bf877a63e40 100644 --- a/src/VisualStudio/CSharp/Impl/Options/Formatting/StyleViewModel.cs +++ b/src/VisualStudio/CSharp/Impl/Options/Formatting/StyleViewModel.cs @@ -22,7 +22,9 @@ internal class StyleViewModel : AbstractOptionPreviewViewModel { internal override bool ShouldPersistOption(OptionKey key) { - return key.Option.Feature == CSharpCodeStyleOptions.FeatureName || key.Option.Feature == SimplificationOptions.PerLanguageFeatureName; + return key.Option.Feature == CSharpCodeStyleOptions.FeatureName || + key.Option.Feature == CodeStyleOptions.PerLanguageCodeStyleOption || + key.Option.Feature == SimplificationOptions.PerLanguageFeatureName; } #region "Preview Text" diff --git a/src/VisualStudio/Core/Impl/Options/AbstractOptionPreviewViewModel.cs b/src/VisualStudio/Core/Impl/Options/AbstractOptionPreviewViewModel.cs index 3e088d88989..2ac34bec020 100644 --- a/src/VisualStudio/Core/Impl/Options/AbstractOptionPreviewViewModel.cs +++ b/src/VisualStudio/Core/Impl/Options/AbstractOptionPreviewViewModel.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Windows.Data; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.Editor; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; using Microsoft.CodeAnalysis.Editor.Shared.Preview; @@ -79,13 +80,29 @@ internal OptionSet ApplyChangedOptions(OptionSet optionSet) public void SetOptionAndUpdatePreview(T value, IOption option, string preview) { - if (option is PerLanguageOption) + if (option is Option>) + { + var opt = Options.GetOption((Option>)option); + opt.Value = value; + Options = Options.WithChangedOption((Option>)option, opt); + } + else if (option is PerLanguageOption>) + { + var opt = Options.GetOption((PerLanguageOption>)option, Language); + opt.Value = value; + Options = Options.WithChangedOption((PerLanguageOption>)option, Language, opt); + } + else if (option is Option) + { + Options = Options.WithChangedOption((Option)option, value); + } + else if (option is PerLanguageOption) { Options = Options.WithChangedOption((PerLanguageOption)option, Language, value); } else { - Options = Options.WithChangedOption((Option)option, value); + throw new InvalidOperationException("Unexpected option type"); } UpdateDocument(preview); diff --git a/src/VisualStudio/Core/Impl/Options/BooleanCodeStyleOptionViewModel.cs b/src/VisualStudio/Core/Impl/Options/BooleanCodeStyleOptionViewModel.cs index 460ca986962..7d0fa44a6ff 100644 --- a/src/VisualStudio/Core/Impl/Options/BooleanCodeStyleOptionViewModel.cs +++ b/src/VisualStudio/Core/Impl/Options/BooleanCodeStyleOptionViewModel.cs @@ -15,7 +15,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options /// /// This exists to support options that are implemented as boolean /// options in the non UI layers, . - /// In future, if such options are moved to use , + /// In future, if such options are moved to use , /// this class can be completely deleted. /// internal class BooleanCodeStyleOptionViewModel : AbstractCodeStyleOptionViewModel diff --git a/src/VisualStudio/Core/Impl/Options/CheckBoxWithComboViewModel.cs b/src/VisualStudio/Core/Impl/Options/CheckBoxWithComboViewModel.cs index 8d388bfec04..0174dc49901 100644 --- a/src/VisualStudio/Core/Impl/Options/CheckBoxWithComboViewModel.cs +++ b/src/VisualStudio/Core/Impl/Options/CheckBoxWithComboViewModel.cs @@ -12,7 +12,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options /// has a checkbox for selection and a combobox for notification levels. /// /// - /// At the features level, this maps to + /// At the features level, this maps to /// internal class CheckBoxWithComboOptionViewModel : AbstractCheckBoxViewModel { @@ -30,8 +30,8 @@ public CheckBoxWithComboOptionViewModel(IOption option, string description, stri { NotificationOptions = items; - var codeStyleOption = ((SimpleCodeStyleOption)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null))); - SetProperty(ref _isChecked, codeStyleOption.IsChecked); + var codeStyleOption = ((CodeStyleOption)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null))); + SetProperty(ref _isChecked, codeStyleOption.Value); var notificationViewModel = items.Where(i => i.Notification.Value == codeStyleOption.Notification.Value).Single(); SetProperty(ref _selectedNotificationOption, notificationViewModel); @@ -47,7 +47,7 @@ public override bool IsChecked set { SetProperty(ref _isChecked, value); - Info.SetOptionAndUpdatePreview(new SimpleCodeStyleOption(_isChecked, _selectedNotificationOption.Notification), Option, GetPreview()); + Info.SetOptionAndUpdatePreview(new CodeStyleOption(_isChecked, _selectedNotificationOption.Notification), Option, GetPreview()); } } @@ -60,7 +60,7 @@ public NotificationOptionViewModel SelectedNotificationOption set { SetProperty(ref _selectedNotificationOption, value); - Info.SetOptionAndUpdatePreview(new SimpleCodeStyleOption(_isChecked, _selectedNotificationOption.Notification), Option, GetPreview()); + Info.SetOptionAndUpdatePreview(new CodeStyleOption(_isChecked, _selectedNotificationOption.Notification), Option, GetPreview()); } } } diff --git a/src/VisualStudio/Core/Impl/Options/SimpleCodeStyleOptionViewModel.cs b/src/VisualStudio/Core/Impl/Options/SimpleCodeStyleOptionViewModel.cs index 1c04fd46a5b..5108826f0be 100644 --- a/src/VisualStudio/Core/Impl/Options/SimpleCodeStyleOptionViewModel.cs +++ b/src/VisualStudio/Core/Impl/Options/SimpleCodeStyleOptionViewModel.cs @@ -8,7 +8,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options { /// - /// This class represents the view model for a + /// This class represents the view model for a /// that binds to the codestyle options UI. /// internal class SimpleCodeStyleOptionViewModel : AbstractCodeStyleOptionViewModel @@ -24,7 +24,7 @@ public override CodeStylePreference SelectedPreference { if (SetProperty(ref _selectedPreference, value)) { - Info.SetOptionAndUpdatePreview(new SimpleCodeStyleOption(_selectedPreference.IsChecked, _selectedNotificationPreference.Notification), Option, GetPreview()); + Info.SetOptionAndUpdatePreview(new CodeStyleOption(_selectedPreference.IsChecked, _selectedNotificationPreference.Notification), Option, GetPreview()); } } } @@ -41,7 +41,7 @@ public override NotificationOptionViewModel SelectedNotificationPreference { if (SetProperty(ref _selectedNotificationPreference, value)) { - Info.SetOptionAndUpdatePreview(new SimpleCodeStyleOption(_selectedPreference.IsChecked, _selectedNotificationPreference.Notification), Option, GetPreview()); + Info.SetOptionAndUpdatePreview(new CodeStyleOption(_selectedPreference.IsChecked, _selectedNotificationPreference.Notification), Option, GetPreview()); } } } @@ -60,8 +60,8 @@ public override NotificationOptionViewModel SelectedNotificationPreference List notificationPreferences = null) : base(option, description, truePreview, falsePreview, info, options, groupName, preferences, notificationPreferences) { - var codeStyleOption = ((SimpleCodeStyleOption)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null))); - _selectedPreference = Preferences.Single(c => c.IsChecked == codeStyleOption.IsChecked); + var codeStyleOption = ((CodeStyleOption)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null))); + _selectedPreference = Preferences.Single(c => c.IsChecked == codeStyleOption.Value); var notificationViewModel = NotificationPreferences.Single(i => i.Notification.Value == codeStyleOption.Notification.Value); _selectedNotificationPreference = NotificationPreferences.Single(p => p.Notification.Value == notificationViewModel.Notification.Value); diff --git a/src/VisualStudio/VisualBasic/Impl/Options/AutomationObject.vb b/src/VisualStudio/VisualBasic/Impl/Options/AutomationObject.vb index 5284df0b9f6..8baf216e5ae 100644 --- a/src/VisualStudio/VisualBasic/Impl/Options/AutomationObject.vb +++ b/src/VisualStudio/VisualBasic/Impl/Options/AutomationObject.vb @@ -243,13 +243,13 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options _workspace.Options = _workspace.Options.WithChangedOption(key, LanguageNames.VisualBasic, boolValue) End Sub - Private Function GetBooleanOption(key As [PerLanguageOption](Of SimpleCodeStyleOption)) As Boolean - Return _workspace.Options.GetOption(key, LanguageNames.VisualBasic).IsChecked + Private Function GetBooleanOption(key As [PerLanguageOption](Of CodeStyleOption(Of Boolean))) As Boolean + Return _workspace.Options.GetOption(key, LanguageNames.VisualBasic).Value End Function - Private Sub SetBooleanOption(key As [PerLanguageOption](Of SimpleCodeStyleOption), value As Boolean) + Private Sub SetBooleanOption(key As [PerLanguageOption](Of CodeStyleOption(Of Boolean)), value As Boolean) Dim opt = _workspace.Options.GetOption(key, LanguageNames.VisualBasic) - opt.IsChecked = value + opt.Value = value _workspace.Options = _workspace.Options.WithChangedOption(key, LanguageNames.VisualBasic, opt) End Sub End Class diff --git a/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptions.cs b/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptions.cs index 2e6d08ecbaa..a8a15bb347b 100644 --- a/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptions.cs +++ b/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptions.cs @@ -12,8 +12,8 @@ internal static class CSharpCodeStyleOptions // TODO: get sign off on public api changes. public static readonly Option UseVarWhenDeclaringLocals = new Option(FeatureName, "UseVarWhenDeclaringLocals", defaultValue: true); - public static readonly Option UseImplicitTypeForIntrinsicTypes = new Option(FeatureName, nameof(UseImplicitTypeForIntrinsicTypes), defaultValue: SimpleCodeStyleOption.Default); - public static readonly Option UseImplicitTypeWhereApparent = new Option(FeatureName, nameof(UseImplicitTypeWhereApparent), defaultValue: SimpleCodeStyleOption.Default); - public static readonly Option UseImplicitTypeWherePossible = new Option(FeatureName, nameof(UseImplicitTypeWherePossible), defaultValue: SimpleCodeStyleOption.Default); + public static readonly Option> UseImplicitTypeForIntrinsicTypes = new Option>(FeatureName, nameof(UseImplicitTypeForIntrinsicTypes), defaultValue: CodeStyleOption.Default); + public static readonly Option> UseImplicitTypeWhereApparent = new Option>(FeatureName, nameof(UseImplicitTypeWhereApparent), defaultValue: CodeStyleOption.Default); + public static readonly Option> UseImplicitTypeWherePossible = new Option>(FeatureName, nameof(UseImplicitTypeWherePossible), defaultValue: CodeStyleOption.Default); } } diff --git a/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptionsProvider.cs b/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptionsProvider.cs index d62bf884f74..79084cfabfa 100644 --- a/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptionsProvider.cs +++ b/src/Workspaces/CSharp/Portable/CodeStyle/CSharpCodeStyleOptionsProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; +using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options.Providers; @@ -13,6 +14,10 @@ internal class CSharpCodeStyleOptionsProvider : IOptionProvider { private readonly IEnumerable _options = new List { + CodeStyleOptions.QualifyFieldAccess, + CodeStyleOptions.QualifyPropertyAccess, + CodeStyleOptions.QualifyMethodAccess, + CodeStyleOptions.QualifyEventAccess, CSharpCodeStyleOptions.UseVarWhenDeclaringLocals, CSharpCodeStyleOptions.UseImplicitTypeWherePossible, CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, diff --git a/src/Workspaces/CSharp/Portable/CodeStyle/TypeStyle/TypeStyleHelper.cs b/src/Workspaces/CSharp/Portable/CodeStyle/TypeStyle/TypeStyleHelper.cs index 3a892939761..7295bd30cbe 100644 --- a/src/Workspaces/CSharp/Portable/CodeStyle/TypeStyle/TypeStyleHelper.cs +++ b/src/Workspaces/CSharp/Portable/CodeStyle/TypeStyle/TypeStyleHelper.cs @@ -234,17 +234,17 @@ private static TypeStylePreference GetCurrentTypeStylePreferences(OptionSet opti var styleForApparent = optionSet.GetOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent); var styleForElsewhere = optionSet.GetOption(CSharpCodeStyleOptions.UseImplicitTypeWherePossible); - if (styleForIntrinsicTypes.IsChecked) + if (styleForIntrinsicTypes.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeForIntrinsicTypes; } - if (styleForApparent.IsChecked) + if (styleForApparent.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeWhereApparent; } - if (styleForElsewhere.IsChecked) + if (styleForElsewhere.Value) { stylePreferences |= TypeStylePreference.ImplicitTypeWherePossible; } diff --git a/src/Workspaces/Core/Portable/CodeStyle/SimpleCodeStyleOption.cs b/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOption.cs similarity index 57% rename from src/Workspaces/Core/Portable/CodeStyle/SimpleCodeStyleOption.cs rename to src/Workspaces/Core/Portable/CodeStyle/CodeStyleOption.cs index fe71b2bc131..46c0d5284a5 100644 --- a/src/Workspaces/Core/Portable/CodeStyle/SimpleCodeStyleOption.cs +++ b/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOption.cs @@ -6,44 +6,45 @@ namespace Microsoft.CodeAnalysis.CodeStyle { /// - /// Represents a code style option that typically - /// offers two choices as preferences and a set of - /// notification styles. the preference is then - /// simply recorded as a boolean. + /// Represents a code style option and an associated notification option. /// - public class SimpleCodeStyleOption + public class CodeStyleOption { + public static CodeStyleOption Default => new CodeStyleOption(default(T), NotificationOption.None); + private const int SerializationVersion = 1; - public static readonly SimpleCodeStyleOption Default = new SimpleCodeStyleOption(false, NotificationOption.None); - public SimpleCodeStyleOption(bool isChecked, NotificationOption notification) + public CodeStyleOption(T value, NotificationOption notification) { - IsChecked = isChecked; + Value = value; Notification = notification; } - public bool IsChecked { get; set; } + public T Value { get; set; } public NotificationOption Notification { get; set; } public XElement ToXElement() => - new XElement(nameof(SimpleCodeStyleOption), + new XElement(nameof(CodeStyleOption), // `nameof()` returns just "CodeStyleOption" new XAttribute(nameof(SerializationVersion), SerializationVersion), - new XAttribute(nameof(IsChecked), IsChecked), + new XAttribute("Type", typeof(T).Name), + new XAttribute(nameof(Value), Value), new XAttribute(nameof(DiagnosticSeverity), Notification.Value)); - public static SimpleCodeStyleOption FromXElement(XElement element) + public static CodeStyleOption FromXElement(XElement element) { - var isCheckedAttribute = element.Attribute(nameof(IsChecked)); + var typeAttribute = element.Attribute("Type"); + var valueAttribute = element.Attribute(nameof(Value)); var severityAttribute = element.Attribute(nameof(DiagnosticSeverity)); - if (isCheckedAttribute == null || severityAttribute == null) + if (typeAttribute == null || valueAttribute == null || severityAttribute == null) { // data from storage is corrupt, or nothing has been stored yet. return Default; } - var isChecked = bool.Parse(isCheckedAttribute.Value); + var parser = GetParser(typeAttribute.Value); + var value = (T)parser(valueAttribute.Value); var severity = (DiagnosticSeverity)Enum.Parse(typeof(DiagnosticSeverity), severityAttribute.Value); NotificationOption notificationOption; @@ -65,7 +66,18 @@ public static SimpleCodeStyleOption FromXElement(XElement element) throw new ArgumentException(nameof(element)); } - return new SimpleCodeStyleOption(isChecked, notificationOption); + return new CodeStyleOption(value, notificationOption); + } + + private static Func GetParser(string type) + { + switch (type) + { + case nameof(Boolean): + return v => bool.Parse(v); + default: + throw new ArgumentException(nameof(type)); + } } } } diff --git a/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOptions.cs b/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOptions.cs index 85fa1b8722e..557a21230ac 100644 --- a/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOptions.cs +++ b/src/Workspaces/Core/Portable/CodeStyle/CodeStyleOptions.cs @@ -11,21 +11,21 @@ public class CodeStyleOptions /// /// This option says if we should simplify away the . or . in field access expressions. /// - public static readonly PerLanguageOption QualifyFieldAccess = new PerLanguageOption(PerLanguageCodeStyleOption, nameof(QualifyFieldAccess), defaultValue: SimpleCodeStyleOption.Default); + public static readonly PerLanguageOption> QualifyFieldAccess = new PerLanguageOption>(PerLanguageCodeStyleOption, nameof(QualifyFieldAccess), defaultValue: CodeStyleOption.Default); /// /// This option says if we should simplify away the . or . in property access expressions. /// - public static readonly PerLanguageOption QualifyPropertyAccess = new PerLanguageOption(PerLanguageCodeStyleOption, nameof(QualifyPropertyAccess), defaultValue: SimpleCodeStyleOption.Default); + public static readonly PerLanguageOption> QualifyPropertyAccess = new PerLanguageOption>(PerLanguageCodeStyleOption, nameof(QualifyPropertyAccess), defaultValue: CodeStyleOption.Default); /// /// This option says if we should simplify away the . or . in method access expressions. /// - public static readonly PerLanguageOption QualifyMethodAccess = new PerLanguageOption(PerLanguageCodeStyleOption, nameof(QualifyMethodAccess), defaultValue: SimpleCodeStyleOption.Default); + public static readonly PerLanguageOption> QualifyMethodAccess = new PerLanguageOption>(PerLanguageCodeStyleOption, nameof(QualifyMethodAccess), defaultValue: CodeStyleOption.Default); /// /// This option says if we should simplify away the . or . in event access expressions. /// - public static readonly PerLanguageOption QualifyEventAccess = new PerLanguageOption(PerLanguageCodeStyleOption, nameof(QualifyEventAccess), defaultValue: SimpleCodeStyleOption.Default); + public static readonly PerLanguageOption> QualifyEventAccess = new PerLanguageOption>(PerLanguageCodeStyleOption, nameof(QualifyEventAccess), defaultValue: CodeStyleOption.Default); } } diff --git a/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt b/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt index c095f224e5e..c384ed4fa41 100644 --- a/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt +++ b/src/Workspaces/Core/Portable/PublicAPI.Unshipped.txt @@ -1,3 +1,10 @@ +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.CodeStyleOption(T value, Microsoft.CodeAnalysis.CodeStyle.NotificationOption notification) -> void +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.Notification.get -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.Notification.set -> void +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.ToXElement() -> System.Xml.Linq.XElement +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.Value.get -> T +Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.Value.set -> void Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.CodeStyleOptions() -> void Microsoft.CodeAnalysis.CodeStyle.NotificationOption @@ -5,13 +12,6 @@ Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Name.get -> string Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Name.set -> void Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Value.get -> Microsoft.CodeAnalysis.DiagnosticSeverity Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Value.set -> void -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.IsChecked.get -> bool -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.IsChecked.set -> void -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.Notification.get -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.Notification.set -> void -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.SimpleCodeStyleOption(bool isChecked, Microsoft.CodeAnalysis.CodeStyle.NotificationOption notification) -> void -Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.ToXElement() -> System.Xml.Linq.XElement Microsoft.CodeAnalysis.Document.Options.get -> Microsoft.CodeAnalysis.Options.DocumentOptionSet Microsoft.CodeAnalysis.Editing.SyntaxGenerator.AddSwitchSections(Microsoft.CodeAnalysis.SyntaxNode switchStatement, System.Collections.Generic.IEnumerable switchSections) -> Microsoft.CodeAnalysis.SyntaxNode Microsoft.CodeAnalysis.Options.DocumentOptionSet @@ -29,20 +29,20 @@ override Microsoft.CodeAnalysis.Options.DocumentOptionSet.GetOption(Microsoft override Microsoft.CodeAnalysis.Options.DocumentOptionSet.WithChangedOption(Microsoft.CodeAnalysis.Options.OptionKey optionAndLanguage, object value) -> Microsoft.CodeAnalysis.Options.OptionSet override Microsoft.CodeAnalysis.Options.DocumentOptionSet.WithChangedOption(Microsoft.CodeAnalysis.Options.Option option, T value) -> Microsoft.CodeAnalysis.Options.OptionSet override Microsoft.CodeAnalysis.Options.DocumentOptionSet.WithChangedOption(Microsoft.CodeAnalysis.Options.PerLanguageOption option, string language, T value) -> Microsoft.CodeAnalysis.Options.OptionSet -static Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.FromXElement(System.Xml.Linq.XElement element) -> Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption static Microsoft.CodeAnalysis.Editing.DeclarationModifiers.TryParse(string value, out Microsoft.CodeAnalysis.Editing.DeclarationModifiers modifiers) -> bool +static Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.Default.get -> Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption +static Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption.FromXElement(System.Xml.Linq.XElement element) -> Microsoft.CodeAnalysis.CodeStyle.CodeStyleOption static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.NamingPreferences.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyEventAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyFieldAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyMethodAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption static Microsoft.CodeAnalysis.Simplification.SimplificationOptions.QualifyPropertyAccess.get -> Microsoft.CodeAnalysis.Options.PerLanguageOption -static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyEventAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption -static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyFieldAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption -static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyMethodAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption -static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyPropertyAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption +static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyEventAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption> +static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyFieldAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption> +static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyMethodAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption> +static readonly Microsoft.CodeAnalysis.CodeStyle.CodeStyleOptions.QualifyPropertyAccess -> Microsoft.CodeAnalysis.Options.PerLanguageOption> static readonly Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Error -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption static readonly Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Info -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption static readonly Microsoft.CodeAnalysis.CodeStyle.NotificationOption.None -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption static readonly Microsoft.CodeAnalysis.CodeStyle.NotificationOption.Warning -> Microsoft.CodeAnalysis.CodeStyle.NotificationOption -static readonly Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption.Default -> Microsoft.CodeAnalysis.CodeStyle.SimpleCodeStyleOption -virtual Microsoft.CodeAnalysis.Workspace.UpdateGeneratedDocuments(Microsoft.CodeAnalysis.ProjectId projectId, System.Collections.Immutable.ImmutableArray documentsRemoved, System.Collections.Immutable.ImmutableArray documentsAdded) -> void \ No newline at end of file +virtual Microsoft.CodeAnalysis.Workspace.UpdateGeneratedDocuments(Microsoft.CodeAnalysis.ProjectId projectId, System.Collections.Immutable.ImmutableArray documentsRemoved, System.Collections.Immutable.ImmutableArray documentsAdded) -> void diff --git a/src/Workspaces/Core/Portable/Simplification/SimplificationHelpers.cs b/src/Workspaces/Core/Portable/Simplification/SimplificationHelpers.cs index e1cb2d72c7d..d2ddea12100 100644 --- a/src/Workspaces/Core/Portable/Simplification/SimplificationHelpers.cs +++ b/src/Workspaces/Core/Portable/Simplification/SimplificationHelpers.cs @@ -110,10 +110,10 @@ internal static bool ShouldSimplifyMemberAccessExpression(SemanticModel semantic internal static bool ShouldSimplifyMemberAccessExpression(ISymbol symbol, string languageName, OptionSet optionSet) { if (!symbol.IsStatic && - (symbol.IsKind(SymbolKind.Field) && optionSet.GetOption(CodeStyleOptions.QualifyFieldAccess, languageName).IsChecked || - (symbol.IsKind(SymbolKind.Property) && optionSet.GetOption(CodeStyleOptions.QualifyPropertyAccess, languageName).IsChecked) || - (symbol.IsKind(SymbolKind.Method) && optionSet.GetOption(CodeStyleOptions.QualifyMethodAccess, languageName).IsChecked) || - (symbol.IsKind(SymbolKind.Event) && optionSet.GetOption(CodeStyleOptions.QualifyEventAccess, languageName).IsChecked))) + (symbol.IsKind(SymbolKind.Field) && optionSet.GetOption(CodeStyleOptions.QualifyFieldAccess, languageName).Value || + (symbol.IsKind(SymbolKind.Property) && optionSet.GetOption(CodeStyleOptions.QualifyPropertyAccess, languageName).Value) || + (symbol.IsKind(SymbolKind.Method) && optionSet.GetOption(CodeStyleOptions.QualifyMethodAccess, languageName).Value) || + (symbol.IsKind(SymbolKind.Event) && optionSet.GetOption(CodeStyleOptions.QualifyEventAccess, languageName).Value))) { return false; } diff --git a/src/Workspaces/Core/Portable/Workspaces.csproj b/src/Workspaces/Core/Portable/Workspaces.csproj index b10dbac610f..abbb4cc9ed8 100644 --- a/src/Workspaces/Core/Portable/Workspaces.csproj +++ b/src/Workspaces/Core/Portable/Workspaces.csproj @@ -346,7 +346,7 @@ - + -- GitLab