未验证 提交 cbcaa2ac 编写于 作者: D dotnet-automerge-bot 提交者: GitHub

Merge pull request #33728 from dotnet/merges/dev16.0-to-master

Merge dev16.0 to master
......@@ -83,6 +83,10 @@ internal static class FeatureOnOffOptions
nameof(FeatureOnOffOptions), nameof(NavigateToDecompiledSources), defaultValue: false,
storageLocations: new RoamingProfileStorageLocation($"TextEditor.{nameof(NavigateToDecompiledSources)}"));
public static readonly Option<int> UseEnhancedColors = new Option<int>(
nameof(FeatureOnOffOptions), nameof(UseEnhancedColors), defaultValue: 1,
storageLocations: new RoamingProfileStorageLocation("WindowManagement.Options.UseEnhancedColorsForManagedLanguages"));
// Note: no storage location since this is intentionally a session variable
public static readonly Option<bool> AcceptedDecompilerDisclaimer = new Option<bool>(
nameof(FeatureOnOffOptions), nameof(AcceptedDecompilerDisclaimer), defaultValue: false);
......
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options
[Guid(Guids.CSharpOptionPageAdvancedIdString)]
internal class AdvancedOptionPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new AdvancedOptionPageControl(serviceProvider);
return new AdvancedOptionPageControl(optionStore);
}
}
}
......@@ -112,7 +112,15 @@
</StackPanel>
</GroupBox>
<GroupBox x:Uid="ExtractMethodGroupBox"
<GroupBox x:Uid="ClassificationsGroupBox"
Header="{x:Static local:AdvancedOptionPageStrings.Option_Classifications}">
<StackPanel>
<CheckBox x:Name="Use_enhanced_colors"
Content="{x:Static local:AdvancedOptionPageStrings.Option_Use_enhanced_colors_for_C_and_Basic}" />
</StackPanel>
</GroupBox>
<GroupBox x:Uid="ExtractMethodGroupBox"
Header="{x:Static local:AdvancedOptionPageStrings.Option_ExtractMethod}">
<StackPanel>
<CheckBox x:Name="DontPutOutOrRefOnStruct"
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Editor.CSharp.SplitStringLiteral;
......@@ -18,7 +17,7 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options
{
internal partial class AdvancedOptionPageControl : AbstractOptionPageControl
{
public AdvancedOptionPageControl(IServiceProvider serviceProvider) : base(serviceProvider)
public AdvancedOptionPageControl(OptionStore optionStore) : base(optionStore)
{
InitializeComponent();
......@@ -65,6 +64,8 @@ public AdvancedOptionPageControl(IServiceProvider serviceProvider) : base(servic
BindToOption(Report_invalid_regular_expressions, RegularExpressionsOptions.ReportInvalidRegexPatterns, LanguageNames.CSharp);
BindToOption(Highlight_related_components_under_cursor, RegularExpressionsOptions.HighlightRelatedRegexComponentsUnderCursor, LanguageNames.CSharp);
BindToOption(Show_completion_list, RegularExpressionsOptions.ProvideRegexCompletions, LanguageNames.CSharp);
BindToOption(Use_enhanced_colors, FeatureOnOffOptions.UseEnhancedColors);
}
}
}
......@@ -180,5 +180,11 @@ public static string Option_SeparateImportGroups
public static string Option_Show_completion_list =>
ServicesVSResources.Show_completion_list;
public static string Option_Classifications =>
ServicesVSResources.Classifications;
public static string Option_Use_enhanced_colors_for_C_and_Basic =>
ServicesVSResources.Use_enhanced_colors_for_C_and_Basic;
}
}
......@@ -16,10 +16,11 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting
[Guid(Guids.CSharpOptionPageCodeStyleIdString)]
internal class CodeStylePage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new GridOptionPreviewControl(
serviceProvider,
optionStore,
(o, s) => new StyleViewModel(o, s),
GetEditorConfigOptions(),
LanguageNames.CSharp);
......
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting
[Guid(Guids.CSharpOptionPageFormattingIndentationIdString)]
internal class FormattingIndentationOptionPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new OptionPreviewControl(serviceProvider, (o, s) => new IndentationViewModel(o, s));
return new OptionPreviewControl(serviceProvider, optionStore, (o, s) => new IndentationViewModel(o, s));
}
}
}
......@@ -11,9 +11,9 @@ public FormattingNewLinesPage()
{
}
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new OptionPreviewControl(serviceProvider, (o, s) => new NewLinesViewModel(o, s));
return new OptionPreviewControl(serviceProvider, optionStore, (o, s) => new NewLinesViewModel(o, s));
}
}
}
......@@ -11,9 +11,9 @@ internal class FormattingOptionPage : AbstractOptionPage
{
private FormattingOptionPageControl _optionPageControl;
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
_optionPageControl = new FormattingOptionPageControl(serviceProvider);
_optionPageControl = new FormattingOptionPageControl(optionStore);
return _optionPageControl;
}
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeCleanup;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Editor.Shared.Options;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options;
......@@ -14,7 +11,7 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options
/// </summary>
internal partial class FormattingOptionPageControl : AbstractOptionPageControl
{
public FormattingOptionPageControl(IServiceProvider serviceProvider) : base(serviceProvider)
public FormattingOptionPageControl(OptionStore optionStore) : base(optionStore)
{
InitializeComponent();
......
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting
[Guid(Guids.CSharpOptionPageFormattingSpacingIdString)]
internal class FormattingSpacingPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new OptionPreviewControl(serviceProvider, (o, s) => new SpacingViewModel(o, s));
return new OptionPreviewControl(serviceProvider, optionStore, (o, s) => new SpacingViewModel(o, s));
}
}
}
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting
[Guid(Guids.CSharpOptionPageFormattingWrappingIdString)]
internal class FormattingWrappingPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new OptionPreviewControl(serviceProvider, (o, s) => new WrappingViewModel(o, s));
return new OptionPreviewControl(serviceProvider, optionStore, (o, s) => new WrappingViewModel(o, s));
}
}
}
......@@ -73,19 +73,19 @@ class MyClass
}
}";
public IndentationViewModel(OptionSet options, IServiceProvider serviceProvider) : base(options, serviceProvider, LanguageNames.CSharp)
public IndentationViewModel(OptionStore optionStore, IServiceProvider serviceProvider) : base(optionStore, serviceProvider, LanguageNames.CSharp)
{
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentBlock, CSharpVSResources.Indent_block_contents, BlockContentPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentBraces, CSharpVSResources.Indent_open_and_close_braces, IndentBracePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchCaseSection, CSharpVSResources.Indent_case_contents, SwitchCasePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchCaseSectionWhenBlock, CSharpVSResources.Indent_case_contents_when_block, SwitchCaseWhenBlockPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchSection, CSharpVSResources.Indent_case_labels, SwitchCasePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentBlock, CSharpVSResources.Indent_block_contents, BlockContentPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentBraces, CSharpVSResources.Indent_open_and_close_braces, IndentBracePreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchCaseSection, CSharpVSResources.Indent_case_contents, SwitchCasePreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchCaseSectionWhenBlock, CSharpVSResources.Indent_case_contents_when_block, SwitchCaseWhenBlockPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.IndentSwitchSection, CSharpVSResources.Indent_case_labels, SwitchCasePreview, this, optionStore));
Items.Add(new TextBlock() { Text = CSharpVSResources.Label_Indentation });
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_in_leftmost_column, GotoLabelPreview, "goto", LabelPositionOptions.LeftMost, CSharpFormattingOptions.LabelPositioning, this, options));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Indent_labels_normally, GotoLabelPreview, "goto", LabelPositionOptions.NoIndent, CSharpFormattingOptions.LabelPositioning, this, options));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_one_indent_less_than_current, GotoLabelPreview, "goto", LabelPositionOptions.OneLess, CSharpFormattingOptions.LabelPositioning, this, options));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_in_leftmost_column, GotoLabelPreview, "goto", LabelPositionOptions.LeftMost, CSharpFormattingOptions.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Indent_labels_normally, GotoLabelPreview, "goto", LabelPositionOptions.NoIndent, CSharpFormattingOptions.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_one_indent_less_than_current, GotoLabelPreview, "goto", LabelPositionOptions.OneLess, CSharpFormattingOptions.LabelPositioning, this, optionStore));
}
}
}
......@@ -195,30 +195,30 @@ class B {
public int B { get; set; }
}";
public NewLinesViewModel(OptionSet options, IServiceProvider serviceProvider) : base(options, serviceProvider, LanguageNames.CSharp)
public NewLinesViewModel(OptionStore optionStore, IServiceProvider serviceProvider) : base(optionStore, serviceProvider, LanguageNames.CSharp)
{
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.New_line_options_for_braces });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInTypes, CSharpVSResources.Place_open_brace_on_new_line_for_types, s_previewText, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInMethods, CSharpVSResources.Place_open_brace_on_new_line_for_methods_local_functions, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInProperties, CSharpVSResources.Place_open_brace_on_new_line_for_properties_indexers_and_events, s_propertyPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAccessors, CSharpVSResources.Place_open_brace_on_new_line_for_property_indexer_and_event_accessors, s_propertyPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAnonymousMethods, CSharpVSResources.Place_open_brace_on_new_line_for_anonymous_methods, s_anonymousMethodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInControlBlocks, CSharpVSResources.Place_open_brace_on_new_line_for_control_blocks, s_forBlockPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAnonymousTypes, CSharpVSResources.Place_open_brace_on_new_line_for_anonymous_types, s_anonymousTypePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInObjectCollectionArrayInitializers, CSharpVSResources.Place_open_brace_on_new_line_for_object_collection_and_array_initializers, s_InitializerPreviewTrue, s_InitializerPreviewFalse, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInLambdaExpressionBody, CSharpVSResources.Place_open_brace_on_new_line_for_lambda_expression, s_lambdaPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInTypes, CSharpVSResources.Place_open_brace_on_new_line_for_types, s_previewText, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInMethods, CSharpVSResources.Place_open_brace_on_new_line_for_methods_local_functions, s_methodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInProperties, CSharpVSResources.Place_open_brace_on_new_line_for_properties_indexers_and_events, s_propertyPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAccessors, CSharpVSResources.Place_open_brace_on_new_line_for_property_indexer_and_event_accessors, s_propertyPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAnonymousMethods, CSharpVSResources.Place_open_brace_on_new_line_for_anonymous_methods, s_anonymousMethodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInControlBlocks, CSharpVSResources.Place_open_brace_on_new_line_for_control_blocks, s_forBlockPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInAnonymousTypes, CSharpVSResources.Place_open_brace_on_new_line_for_anonymous_types, s_anonymousTypePreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInObjectCollectionArrayInitializers, CSharpVSResources.Place_open_brace_on_new_line_for_object_collection_and_array_initializers, s_InitializerPreviewTrue, s_InitializerPreviewFalse, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLinesForBracesInLambdaExpressionBody, CSharpVSResources.Place_open_brace_on_new_line_for_lambda_expression, s_lambdaPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.New_line_options_for_keywords });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForElse, CSharpVSResources.Place_else_on_new_line, s_ifElsePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForCatch, CSharpVSResources.Place_catch_on_new_line, s_tryCatchFinallyPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForFinally, CSharpVSResources.Place_finally_on_new_line, s_tryCatchFinallyPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForElse, CSharpVSResources.Place_else_on_new_line, s_ifElsePreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForCatch, CSharpVSResources.Place_catch_on_new_line, s_tryCatchFinallyPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForFinally, CSharpVSResources.Place_finally_on_new_line, s_tryCatchFinallyPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.New_line_options_for_expressions });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForMembersInObjectInit, CSharpVSResources.Place_members_in_object_initializers_on_new_line, s_objectInitializerPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForMembersInAnonymousTypes, CSharpVSResources.Place_members_in_anonymous_types_on_new_line, s_anonymousTypePreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForClausesInQuery, CSharpVSResources.Place_query_expression_clauses_on_new_line, s_queryExpressionPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForMembersInObjectInit, CSharpVSResources.Place_members_in_object_initializers_on_new_line, s_objectInitializerPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForMembersInAnonymousTypes, CSharpVSResources.Place_members_in_anonymous_types_on_new_line, s_anonymousTypePreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.NewLineForClausesInQuery, CSharpVSResources.Place_query_expression_clauses_on_new_line, s_queryExpressionPreview, this, optionStore));
}
}
}
......@@ -98,51 +98,51 @@ class C : I {
}
//]";
public SpacingViewModel(OptionSet options, IServiceProvider serviceProvider) : base(options, serviceProvider, LanguageNames.CSharp)
public SpacingViewModel(OptionStore optionStore, IServiceProvider serviceProvider) : base(optionStore, serviceProvider, LanguageNames.CSharp)
{
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_method_declarations });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpacingAfterMethodDeclarationName, CSharpVSResources.Insert_space_between_method_name_and_its_opening_parenthesis2, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinMethodDeclarationParenthesis, CSharpVSResources.Insert_space_within_parameter_list_parentheses, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptyMethodDeclarationParentheses, CSharpVSResources.Insert_space_within_empty_parameter_list_parentheses, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpacingAfterMethodDeclarationName, CSharpVSResources.Insert_space_between_method_name_and_its_opening_parenthesis2, s_methodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinMethodDeclarationParenthesis, CSharpVSResources.Insert_space_within_parameter_list_parentheses, s_methodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptyMethodDeclarationParentheses, CSharpVSResources.Insert_space_within_empty_parameter_list_parentheses, s_methodPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_method_calls });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterMethodCallName, CSharpVSResources.Insert_space_between_method_name_and_its_opening_parenthesis1, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinMethodCallParentheses, CSharpVSResources.Insert_space_within_argument_list_parentheses, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptyMethodCallParentheses, CSharpVSResources.Insert_space_within_empty_argument_list_parentheses, s_methodPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterMethodCallName, CSharpVSResources.Insert_space_between_method_name_and_its_opening_parenthesis1, s_methodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinMethodCallParentheses, CSharpVSResources.Insert_space_within_argument_list_parentheses, s_methodPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptyMethodCallParentheses, CSharpVSResources.Insert_space_within_empty_argument_list_parentheses, s_methodPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_other_spacing_options });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterControlFlowStatementKeyword, CSharpVSResources.Insert_space_after_keywords_in_control_flow_statements, s_forDelimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinExpressionParentheses, CSharpVSResources.Insert_space_within_parentheses_of_expressions, s_expressionPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinCastParentheses, CSharpVSResources.Insert_space_within_parentheses_of_type_casts, s_castPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinOtherParentheses, CSharpVSResources.Insert_spaces_within_parentheses_of_control_flow_statements, s_forDelimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterCast, CSharpVSResources.Insert_space_after_cast, s_castPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpacesIgnoreAroundVariableDeclaration, CSharpVSResources.Ignore_spaces_in_declaration_statements, s_declarationSpacingPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterControlFlowStatementKeyword, CSharpVSResources.Insert_space_after_keywords_in_control_flow_statements, s_forDelimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinExpressionParentheses, CSharpVSResources.Insert_space_within_parentheses_of_expressions, s_expressionPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinCastParentheses, CSharpVSResources.Insert_space_within_parentheses_of_type_casts, s_castPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinOtherParentheses, CSharpVSResources.Insert_spaces_within_parentheses_of_control_flow_statements, s_forDelimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterCast, CSharpVSResources.Insert_space_after_cast, s_castPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpacesIgnoreAroundVariableDeclaration, CSharpVSResources.Ignore_spaces_in_declaration_statements, s_declarationSpacingPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_brackets });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeOpenSquareBracket, CSharpVSResources.Insert_space_before_open_square_bracket, s_bracketPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptySquareBrackets, CSharpVSResources.Insert_space_within_empty_square_brackets, s_bracketPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinSquareBrackets, CSharpVSResources.Insert_spaces_within_square_brackets, s_bracketPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeOpenSquareBracket, CSharpVSResources.Insert_space_before_open_square_bracket, s_bracketPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBetweenEmptySquareBrackets, CSharpVSResources.Insert_space_within_empty_square_brackets, s_bracketPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceWithinSquareBrackets, CSharpVSResources.Insert_spaces_within_square_brackets, s_bracketPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_delimiters });
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterColonInBaseTypeDeclaration, CSharpVSResources.Insert_space_after_colon_for_base_or_interface_in_type_declaration, s_baseColonPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterComma, CSharpVSResources.Insert_space_after_comma, s_delimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterDot, CSharpVSResources.Insert_space_after_dot, s_delimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterSemicolonsInForStatement, CSharpVSResources.Insert_space_after_semicolon_in_for_statement, s_forDelimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeColonInBaseTypeDeclaration, CSharpVSResources.Insert_space_before_colon_for_base_or_interface_in_type_declaration, s_baseColonPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeComma, CSharpVSResources.Insert_space_before_comma, s_delimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeDot, CSharpVSResources.Insert_space_before_dot, s_delimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeSemicolonsInForStatement, CSharpVSResources.Insert_space_before_semicolon_in_for_statement, s_forDelimiterPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterColonInBaseTypeDeclaration, CSharpVSResources.Insert_space_after_colon_for_base_or_interface_in_type_declaration, s_baseColonPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterComma, CSharpVSResources.Insert_space_after_comma, s_delimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterDot, CSharpVSResources.Insert_space_after_dot, s_delimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceAfterSemicolonsInForStatement, CSharpVSResources.Insert_space_after_semicolon_in_for_statement, s_forDelimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeColonInBaseTypeDeclaration, CSharpVSResources.Insert_space_before_colon_for_base_or_interface_in_type_declaration, s_baseColonPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeComma, CSharpVSResources.Insert_space_before_comma, s_delimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeDot, CSharpVSResources.Insert_space_before_dot, s_delimiterPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.SpaceBeforeSemicolonsInForStatement, CSharpVSResources.Insert_space_before_semicolon_in_for_statement, s_forDelimiterPreview, this, optionStore));
Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_operators });
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Ignore_spaces_around_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Ignore, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, Options));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Remove_spaces_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Remove, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, Options));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Insert_space_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Single, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, Options));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Ignore_spaces_around_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Ignore, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Remove_spaces_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Remove, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Insert_space_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Single, CSharpFormattingOptions.SpacingAroundBinaryOperator, this, OptionStore));
}
}
}
......@@ -31,10 +31,10 @@ void goo()
}
}";
public WrappingViewModel(OptionSet options, IServiceProvider serviceProvider) : base(options, serviceProvider, LanguageNames.CSharp)
public WrappingViewModel(OptionStore optionStore, IServiceProvider serviceProvider) : base(optionStore, serviceProvider, LanguageNames.CSharp)
{
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.WrappingPreserveSingleLine, CSharpVSResources.Leave_block_on_single_line, s_blockPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.WrappingKeepStatementsOnSingleLine, CSharpVSResources.Leave_statements_and_member_declarations_on_the_same_line, s_declarationPreview, this, options));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.WrappingPreserveSingleLine, CSharpVSResources.Leave_block_on_single_line, s_blockPreview, this, optionStore));
Items.Add(new CheckBoxOptionViewModel(CSharpFormattingOptions.WrappingKeepStatementsOnSingleLine, CSharpVSResources.Leave_statements_and_member_declarations_on_the_same_line, s_declarationPreview, this, optionStore));
}
}
}
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options
[Guid(Guids.CSharpOptionPageIntelliSenseIdString)]
internal class IntelliSenseOptionPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new IntelliSenseOptionPageControl(serviceProvider);
return new IntelliSenseOptionPageControl(optionStore);
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Windows;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Completion;
......@@ -10,7 +9,7 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options
{
internal partial class IntelliSenseOptionPageControl : AbstractOptionPageControl
{
public IntelliSenseOptionPageControl(IServiceProvider serviceProvider) : base(serviceProvider)
public IntelliSenseOptionPageControl(OptionStore optionStore) : base(optionStore)
{
InitializeComponent();
......@@ -18,7 +17,7 @@ public IntelliSenseOptionPageControl(IServiceProvider serviceProvider) : base(se
BindToOption(Highlight_matching_portions_of_completion_list_items, CompletionOptions.HighlightMatchingPortionsOfCompletionListItems, LanguageNames.CSharp);
BindToOption(Show_completion_list_after_a_character_is_typed, CompletionOptions.TriggerOnTypingLetters, LanguageNames.CSharp);
Show_completion_list_after_a_character_is_deleted.IsChecked = this.OptionService.GetOption(
Show_completion_list_after_a_character_is_deleted.IsChecked = this.OptionStore.GetOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp) == true;
Show_completion_list_after_a_character_is_deleted.IsEnabled = Show_completion_list_after_a_character_is_typed.IsChecked == true;
......@@ -47,16 +46,12 @@ private void Show_completion_list_after_a_character_is_typed_Unchecked(object se
private void Show_completion_list_after_a_character_is_deleted_Checked(object sender, RoutedEventArgs e)
{
this.OptionService.SetOptions(
this.OptionService.GetOptions().WithChangedOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, value: true));
this.OptionStore.SetOption(CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, value: true);
}
private void Show_completion_list_after_a_character_is_deleted_Unchecked(object sender, RoutedEventArgs e)
{
this.OptionService.SetOptions(
this.OptionService.GetOptions().WithChangedOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, value: false));
this.OptionStore.SetOption(CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, value: false);
}
}
}
......@@ -3,7 +3,6 @@
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.VisualStudio.ComponentModelHost;
......@@ -18,13 +17,13 @@ internal class NamingStylesOptionPage : AbstractOptionPage
private NamingStyleOptionPageControl _grid;
private INotificationService _notificationService;
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
var componentModel = (IComponentModel)serviceProvider.GetService(typeof(SComponentModel));
var workspace = componentModel.GetService<VisualStudioWorkspace>();
_notificationService = workspace.Services.GetService<INotificationService>();
_grid = new NamingStyleOptionPageControl(serviceProvider, _notificationService, LanguageNames.CSharp);
_grid = new NamingStyleOptionPageControl(optionStore, _notificationService, LanguageNames.CSharp);
return _grid;
}
......
......@@ -186,7 +186,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</value>
regular expression;
Use enhanced colors;</value>
<comment>C# Advanced options page keywords</comment>
</data>
<data name="307" xml:space="preserve">
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Zobrazit diagnostiku pro zavřené soubory;
Obarvit regulární výraz;
Zvýrazňovat související komponenty pod kurzorem;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Diagnose für geschlossene Dateien anzeigen;
Reguläre Ausdrücke farbig hervorheben;
Zugehörige Komponenten unter dem Cursor markieren;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Mostrar diagnósticos para archivos cerrados;
Colorear la expresión regular;
Destacar componentes relacionados bajo el cursor;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Afficher les diagnostics des fichiers fermés;
Colorer l'expression régulière;
Mettre en évidence les composants connexes sous le curseur;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Mostra diagnostica per file chiusi;
Colora espressione regolare;
Evidenzia componenti correlati sotto il cursore;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">閉じているファイルの診断結果を表示する; 正規表現を色付けする; カーソルの下の関連コンポーネントを強調表示する; 無効な正規表現を報告する; 完全なソリューション分析を有効にする; エディター機能分析を外部処理で実行する; 逆コンパイルされたソースへのナビゲーションを有効にする; ディレクティブを使用する; using の並べ替えのとき、最初に System ディレクティブを配置する; ディレクティブ グループを使用して分離します; 参照アセンブリの型に using を提案する; NuGet パッケージの型に using を提案する; 強調表示する; カーソルの下のシンボルへの参照wを強調表示する; カーソルの下の関連キーワードを強調表示する; アウトライン; ファイルを開くときにアウトライン モードに入る; プロシージャ行の区切り記号を表示する; 宣言レベルのコンストラクトのアウトラインを表示する; コード レベルのコンストラクトのアウトラインを表示する; コメントとプリプロセッサ領域のアウトラインを表示する; 定義を折りたたむときに領域を折りたたむ; フェード; 未使用の using をフェードアウトします; 到達できないコードをフェードアウトします; ブロック構造のガイド; 宣言レベルのコンストラクトのガイドを表示する; コード レベルのコンストラクトのガイドを表示する; エディターのヘルプ; /// に対する XML ドキュメントを生成する; /* */ コメントを作成するときに新しい行の先頭に * を挿入する; Enter で文字列リテラルを分割する; string.Format 呼び出しで無効なプレースホルダーをレポートします; メソッドの抽出; カスタム構造体に ref または out を設定しない; インターフェイスまたは抽象クラスの実装; プロパティ、イベント、メソッドを挿入するときに、それらを配置する; 同じ種類の他のメンバー; 末尾; プロパティを生成するとき; スロー プロパティを優先する; 自動プロパティを優先する;</target>
<note>C# Advanced options page keywords</note>
</trans-unit>
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">닫힌 파일에 대한 진단 표시;
정규식 색 지정;
커서 아래의 관련 구성 요소 강조;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Pokaż diagnostykę dla zamkniętych plików;
Koloruj wyrażenie regularne;
Wyróżnij powiązane składniki pod kursorem;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Mostrar diagnósticos para arquivos fechados;
Colorir a expressão regular;
Destacar os componentes relacionados sob o cursor;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Отображать диагностические сведения для закрытых файлов; Выделять регулярные выражения цветом; Выделять соответствующие компоненты под курсором; Сообщать о недопустимых регулярных выражениях; Включить полный анализ решения; Выполнять анализ функций редактора во внешнем процессе; Включить переход на декомпилированные исходные файлы; Директивы using; Размещать системные директивы при сортировке с использованием директивы using; Разделять группы директив using; Предлагать директивы usings для типов в ссылочных сборках; Предлагать директивы usings для типов в пакетах NuGet; Выделение цветом; Выделять цветом ссылки на символы под курсором; Выделять цветом соответствующие ключевые слова под курсором; Отображение структуры; Переходить в режим отображения структуры при открытии файлов; Отображать разделители линий процедур; Отображать структуру для инструкций уровня объявления; Отображать структуру для инструкций уровня кода; Отображать структуру для комментариев и регионов препроцессора; Сворачивать регионы при сворачивании определений; Скрытие с помощью плавной анимации; Скрывать неиспользуемые директивы using с помощью плавной анимации; Скрывать неиспользуемый код с помощью плавной анимации; Направляющие для блочных структур; Отображать направляющие для инструкций уровня объявления; Отображать направляющие для инструкций уровня кода; Справка по редактору; Формировать комментарии XML-документации для ///; Вставлять * в начале новых строк при написании комментариев /* */; Отображать предварительный просмотр для отслеживания переименования; Разделять строковые литералы при нажатии клавиши ВВОД; Сообщать о недопустимых заполнителях в вызовах string.Format; Метод извлечения; Не помещать ссылку или вывод в настраиваемую структуру; Реализовать интерфейс или абстрактный класс; При вставке свойств, событий и методов размещать их; с другими членами того же типа, в конце; При создании свойств; предпочитать свойства, создающие исключения; предпочитать автоматические свойства;</target>
<note>C# Advanced options page keywords</note>
</trans-unit>
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">Teşhis için kapalı dosyaları göster;
Normal ifade renklendirmek;
İmleç altında ilişkili bileşenleri vurgulamak;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">显示已关闭文件的诊断;
为正则表达式着色;
突出显示光标下的相关组件;
......
......@@ -77,7 +77,8 @@ When generating property;
prefer throwing properties;
prefer auto properties;
regex;
regular expression;</source>
regular expression;
Use enhanced colors;</source>
<target state="needs-review-translation">顯示已關閉檔的診斷程式;
著色正則運算式;
在游標下突出顯示相關元件;
......
......@@ -4,6 +4,7 @@
using System.Linq;
using Microsoft.CodeAnalysis.CSharp.Formatting;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Composition;
using Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting;
......@@ -48,7 +49,8 @@ public void TestCheckBox()
using (var workspace = TestWorkspace.CreateCSharp(""))
{
var serviceProvider = new MockServiceProvider(workspace.ExportProvider);
using (var viewModel = new SpacingViewModel(workspace.Options, serviceProvider))
var optionStore = new OptionStore(workspace.Options, Enumerable.Empty<IOption>());
using (var viewModel = new SpacingViewModel(optionStore, serviceProvider))
{
// Use the first item's preview.
var checkbox = viewModel.Items.OfType<CheckBoxOptionViewModel>().First();
......@@ -74,9 +76,10 @@ public void TestOptionLoading()
using (var workspace = TestWorkspace.CreateCSharp(""))
{
var optionSet = workspace.Options.WithChangedOption(CSharpFormattingOptions.SpacingAfterMethodDeclarationName, true);
var optionStore = new OptionStore(optionSet, Enumerable.Empty<IOption>());
var serviceProvider = new MockServiceProvider(workspace.ExportProvider);
using (var viewModel = new SpacingViewModel(optionSet, serviceProvider))
using (var viewModel = new SpacingViewModel(optionStore, serviceProvider))
{
// Use the first item's preview.
var checkbox = viewModel.Items.OfType<CheckBoxOptionViewModel>().Where(c => c.Option == CSharpFormattingOptions.SpacingAfterMethodDeclarationName).First();
......@@ -91,15 +94,15 @@ public void TestOptionSaving()
using (var workspace = TestWorkspace.CreateCSharp(""))
{
var serviceProvider = new MockServiceProvider(workspace.ExportProvider);
using (var viewModel = new SpacingViewModel(workspace.Options, serviceProvider))
var optionStore = new OptionStore(workspace.Options, Enumerable.Empty<IOption>());
using (var viewModel = new SpacingViewModel(optionStore, serviceProvider))
{
// Use the first item's preview.
var checkbox = viewModel.Items.OfType<CheckBoxOptionViewModel>().Where(c => c.Option == CSharpFormattingOptions.SpacingAfterMethodDeclarationName).First();
var initial = checkbox.IsChecked;
checkbox.IsChecked = !checkbox.IsChecked;
var changedOptions = viewModel.ApplyChangedOptions(workspace.Options);
Assert.NotEqual(changedOptions.GetOption(CSharpFormattingOptions.SpacingAfterMethodDeclarationName), initial);
Assert.NotEqual(optionStore.GetOption(CSharpFormattingOptions.SpacingAfterMethodDeclarationName), initial);
}
}
}
......
......@@ -606,6 +606,15 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to Classifications.
/// </summary>
internal static string Classifications {
get {
return ResourceManager.GetString("Classifications", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Close.
/// </summary>
......@@ -3039,6 +3048,15 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to Use enhanced colors for C# and Basic.
/// </summary>
internal static string Use_enhanced_colors_for_C_and_Basic {
get {
return ResourceManager.GetString("Use_enhanced_colors_for_C_and_Basic", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Use expression body for accessors.
/// </summary>
......
......@@ -1186,6 +1186,12 @@ I agree to all of the foregoing:</value>
<data name="Select_member" xml:space="preserve">
<value>Select member</value>
</data>
<data name="Classifications" xml:space="preserve">
<value>Classifications</value>
</data>
<data name="Use_enhanced_colors_for_C_and_Basic" xml:space="preserve">
<value>Use enhanced colors for C# and Basic</value>
</data>
<data name="Prefer_static_local_functions" xml:space="preserve">
<value>Prefer static local functions</value>
</data>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Obarvovat regulární výrazy</target>
......@@ -257,6 +262,11 @@
<target state="translated">Nepoužitá hodnota je explicitně přiřazen k zahození.</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Používat text výrazu pro lambdy</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Reguläre Ausdrücke farbig hervorheben</target>
......@@ -257,6 +262,11 @@
<target state="translated">Der nicht verwendete Wert wird explizit verworfen.</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Ausdruckskörper für Lambdaausdrücke verwenden</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Colorear las expresiones regulares</target>
......@@ -257,6 +262,11 @@
<target state="translated">El valor no utilizado se asigna explícitamente para descartar</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Usar cuerpo de expresión para lambdas</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Colorer les expressions régulières</target>
......@@ -257,6 +262,11 @@
<target state="translated">La valeur non utilisée est explicitement marquée pour être ignorée</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Utiliser le corps d'expression pour les expressions lambda</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Colora espressioni regolari</target>
......@@ -257,6 +262,11 @@
<target state="translated">Il valore inutilizzato è assegnato a discard in modo esplicito</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Usa il corpo dell'espressione per le espressioni lambda</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">正規表現を色付け</target>
......@@ -257,6 +262,11 @@
<target state="translated">未使用の値は破棄するよう明示的に割り当てます</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">ラムダ式に式本体を使用する</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">정규식 색 지정</target>
......@@ -257,6 +262,11 @@
<target state="translated">사용하지 않은 값은 버리기에 명시적으로 할당됩니다.</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">람다에 식 본문 사용</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Koloruj wyrażenia regularne</target>
......@@ -257,6 +262,11 @@
<target state="translated">Nieużywana wartość jest jawnie przypisana w celu odrzucenia</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Użyj treści wyrażenia dla wyrażeń lambda</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Colorir expressões regulares</target>
......@@ -257,6 +262,11 @@
<target state="translated">O valor não utilizado é explicitamente atribuído para descartar</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Usar o corpo de expressão para lambdas</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Выделить регулярные выражения цветом</target>
......@@ -257,6 +262,11 @@
<target state="translated">Неиспользуемое значение явно присваивается для отмены</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">Использовать тело выражения для лямбда-выражений</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">Normal ifadeler renklendirme</target>
......@@ -257,6 +262,11 @@
<target state="translated">Kullanılmayan değeri açıkça atmak için atanır</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">İfade vücut lambda için kullanın</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">对正则表达式着色</target>
......@@ -257,6 +262,11 @@
<target state="translated">未使用的值被显式指定为丢弃</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">对 lambdas 使用表达式正文</target>
......
......@@ -57,6 +57,11 @@
<target state="new">Calculating dependents...</target>
<note />
</trans-unit>
<trans-unit id="Classifications">
<source>Classifications</source>
<target state="new">Classifications</target>
<note />
</trans-unit>
<trans-unit id="Colorize_regular_expressions">
<source>Colorize regular expressions</source>
<target state="translated">為規則運算式標上顏色</target>
......@@ -257,6 +262,11 @@
<target state="translated">未使用的值會明確指派給 discard</target>
<note />
</trans-unit>
<trans-unit id="Use_enhanced_colors_for_C_and_Basic">
<source>Use enhanced colors for C# and Basic</source>
<target state="new">Use enhanced colors for C# and Basic</target>
<note />
</trans-unit>
<trans-unit id="Use_expression_body_for_lambdas">
<source>Use expression body for lambdas</source>
<target state="translated">使用 Lambda 的運算式主體</target>
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis.Options;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Shell;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
......@@ -8,16 +10,30 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
[System.ComponentModel.DesignerCategory("code")] // this must be fully qualified
internal abstract class AbstractOptionPage : UIElementDialogPage
{
protected abstract AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider);
private static IOptionService s_optionService;
private static OptionStore s_optionStore;
private static bool s_needsLoadOnNextActivate = true;
protected abstract AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore);
protected AbstractOptionPageControl pageControl;
private bool _needsLoadOnNextActivate = true;
private void EnsureOptionPageCreated()
{
if (s_optionStore == null)
{
var componentModel = (IComponentModel)this.Site.GetService(typeof(SComponentModel));
var workspace = componentModel.GetService<VisualStudioWorkspace>();
s_optionService = workspace.Services.GetService<IOptionService>();
s_optionStore = new OptionStore(s_optionService.GetOptions(), s_optionService.GetRegisteredOptions());
}
if (pageControl == null)
{
pageControl = CreateOptionPage(this.Site);
// Use a single option store for all option pages so that changes are accumulated
// together and, in the case of the same option appearing on two pages, the changes
// are kept in sync.
pageControl = CreateOptionPage(this.Site, s_optionStore);
}
}
......@@ -32,13 +48,18 @@ protected override System.Windows.UIElement Child
protected override void OnActivate(System.ComponentModel.CancelEventArgs e)
{
if (_needsLoadOnNextActivate)
EnsureOptionPageCreated();
if (s_needsLoadOnNextActivate)
{
EnsureOptionPageCreated();
pageControl.LoadSettings();
// Reset the option store to the current state of the options.
s_optionStore.SetOptions(s_optionService.GetOptions());
s_optionStore.SetRegisteredOptions(s_optionService.GetRegisteredOptions());
_needsLoadOnNextActivate = false;
s_needsLoadOnNextActivate = false;
}
pageControl.LoadSettings();
}
public override void LoadSettingsFromStorage()
......@@ -51,21 +72,28 @@ public override void LoadSettingsFromStorage()
// saved. The intent here is the settings get reloaded so the next time you open the
// page they are properly populated.
//
// We need to ignore the first case since the option store is static and shared among
// pages. Each page will get this same call so we should ensure that our page has been
// created first.
//
// This second one is tricky, because we don't actually want to update our controls
// right then, because they'd be wrong the next time the page opens -- it's possible
// they may have been changed programmatically. Therefore, we'll set a flag so we load
// next time
_needsLoadOnNextActivate = true;
s_needsLoadOnNextActivate = pageControl != null;
}
public override void SaveSettingsToStorage()
{
EnsureOptionPageCreated();
pageControl.SaveSettings();
// Make sure we load the next time the page is activated, in case if options changed
// Save the changes that were accumulated in the option store.
s_optionService.SetOptions(s_optionStore.GetOptions());
// Make sure we load the next time a page is activated, in case that options changed
// programmatically between now and the next time the page is activated
_needsLoadOnNextActivate = true;
s_needsLoadOnNextActivate = true;
}
protected override void OnClosed(EventArgs e)
......
......@@ -7,17 +7,16 @@
using System.Windows.Controls;
using System.Windows.Data;
using Microsoft.CodeAnalysis.Options;
using Microsoft.VisualStudio.ComponentModelHost;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
[System.ComponentModel.DesignerCategory("code")] // this must be fully qualified
public abstract class AbstractOptionPageControl : UserControl
{
internal readonly IOptionService OptionService;
internal readonly OptionStore OptionStore;
private readonly List<BindingExpressionBase> _bindingExpressions = new List<BindingExpressionBase>();
public AbstractOptionPageControl(IServiceProvider serviceProvider)
public AbstractOptionPageControl(OptionStore optionStore)
{
InitializeStyles();
......@@ -26,9 +25,7 @@ public AbstractOptionPageControl(IServiceProvider serviceProvider)
return;
}
var componentModel = (IComponentModel)serviceProvider.GetService(typeof(SComponentModel));
var workspace = componentModel.GetService<VisualStudioWorkspace>();
this.OptionService = workspace.Services.GetService<IOptionService>();
this.OptionStore = optionStore;
}
private void InitializeStyles()
......@@ -59,9 +56,23 @@ protected void BindToOption(CheckBox checkbox, Option<bool> optionKey)
{
var binding = new Binding()
{
Source = new OptionBinding<bool>(OptionService, optionKey),
Source = new OptionBinding<bool>(OptionStore, optionKey),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit
UpdateSourceTrigger = UpdateSourceTrigger.Default
};
var bindingExpression = checkbox.SetBinding(CheckBox.IsCheckedProperty, binding);
_bindingExpressions.Add(bindingExpression);
}
protected void BindToOption(CheckBox checkbox, Option<int> optionKey)
{
var binding = new Binding()
{
Source = new OptionBinding<int>(OptionStore, optionKey),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Default,
Converter = new CheckBoxCheckedToIntConverter(),
};
var bindingExpression = checkbox.SetBinding(CheckBox.IsCheckedProperty, binding);
......@@ -72,9 +83,9 @@ protected void BindToOption(CheckBox checkbox, PerLanguageOption<bool> optionKey
{
var binding = new Binding()
{
Source = new PerLanguageOptionBinding<bool>(OptionService, optionKey, languageName),
Source = new PerLanguageOptionBinding<bool>(OptionStore, optionKey, languageName),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit
UpdateSourceTrigger = UpdateSourceTrigger.Default
};
var bindingExpression = checkbox.SetBinding(CheckBox.IsCheckedProperty, binding);
......@@ -85,9 +96,9 @@ protected void BindToOption(TextBox textBox, Option<int> optionKey)
{
var binding = new Binding()
{
Source = new OptionBinding<int>(OptionService, optionKey),
Source = new OptionBinding<int>(OptionStore, optionKey),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit
UpdateSourceTrigger = UpdateSourceTrigger.Default
};
var bindingExpression = textBox.SetBinding(TextBox.TextProperty, binding);
......@@ -98,9 +109,9 @@ protected void BindToOption(TextBox textBox, PerLanguageOption<int> optionKey, s
{
var binding = new Binding()
{
Source = new PerLanguageOptionBinding<int>(OptionService, optionKey, languageName),
Source = new PerLanguageOptionBinding<int>(OptionStore, optionKey, languageName),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit
UpdateSourceTrigger = UpdateSourceTrigger.Default
};
var bindingExpression = textBox.SetBinding(TextBox.TextProperty, binding);
......@@ -111,9 +122,9 @@ protected void BindToOption<T>(RadioButton radiobutton, PerLanguageOption<T> opt
{
var binding = new Binding()
{
Source = new PerLanguageOptionBinding<T>(OptionService, optionKey, languageName),
Source = new PerLanguageOptionBinding<T>(OptionStore, optionKey, languageName),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
UpdateSourceTrigger = UpdateSourceTrigger.Default,
Converter = new RadioButtonCheckedConverter(),
ConverterParameter = optionValue
};
......@@ -128,9 +139,9 @@ protected void BindToFullSolutionAnalysisOption(CheckBox checkbox, string langua
var binding = new Binding()
{
Source = new FullSolutionAnalysisOptionBinding(OptionService, languageName),
Source = new FullSolutionAnalysisOptionBinding(OptionStore, languageName),
Path = new PropertyPath("Value"),
UpdateSourceTrigger = UpdateSourceTrigger.Explicit
UpdateSourceTrigger = UpdateSourceTrigger.Default
};
var bindingExpression = checkbox.SetBinding(CheckBox.IsCheckedProperty, binding);
......@@ -177,4 +188,19 @@ public class RadioButtonCheckedConverter : IValueConverter
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
public class CheckBoxCheckedToIntConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return !value.Equals(-1);
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? 1 : -1;
}
}
}
......@@ -43,13 +43,11 @@ internal abstract class AbstractOptionPreviewViewModel : AbstractNotifyPropertyC
public List<object> Items { get; set; }
public ObservableCollection<AbstractCodeStyleOptionViewModel> CodeStyleItems { get; set; }
public OptionSet Options { get; set; }
private readonly OptionSet _originalOptions;
public OptionStore OptionStore { get; set; }
protected AbstractOptionPreviewViewModel(OptionSet options, IServiceProvider serviceProvider, string language)
protected AbstractOptionPreviewViewModel(OptionStore optionStore, IServiceProvider serviceProvider, string language)
{
this.Options = options;
_originalOptions = options;
this.OptionStore = optionStore;
this.Items = new List<object>();
this.CodeStyleItems = new ObservableCollection<AbstractCodeStyleOptionViewModel>();
......@@ -65,37 +63,27 @@ protected AbstractOptionPreviewViewModel(OptionSet options, IServiceProvider ser
_contentType = _contentTypeRegistryService.GetContentType(ContentTypeNames.CSharpContentType);
}
internal OptionSet ApplyChangedOptions(OptionSet optionSet)
{
foreach (var optionKey in this.Options.GetChangedOptions(_originalOptions))
{
optionSet = optionSet.WithChangedOption(optionKey, this.Options.GetOption(optionKey));
}
return optionSet;
}
public void SetOptionAndUpdatePreview<T>(T value, IOption option, string preview)
{
if (option is Option<CodeStyleOption<T>>)
{
var opt = Options.GetOption((Option<CodeStyleOption<T>>)option);
var opt = OptionStore.GetOption((Option<CodeStyleOption<T>>)option);
opt.Value = value;
Options = Options.WithChangedOption((Option<CodeStyleOption<T>>)option, opt);
OptionStore.SetOption((Option<CodeStyleOption<T>>)option, opt);
}
else if (option is PerLanguageOption<CodeStyleOption<T>>)
{
var opt = Options.GetOption((PerLanguageOption<CodeStyleOption<T>>)option, Language);
var opt = OptionStore.GetOption((PerLanguageOption<CodeStyleOption<T>>)option, Language);
opt.Value = value;
Options = Options.WithChangedOption((PerLanguageOption<CodeStyleOption<T>>)option, Language, opt);
OptionStore.SetOption((PerLanguageOption<CodeStyleOption<T>>)option, Language, opt);
}
else if (option is Option<T>)
{
Options = Options.WithChangedOption((Option<T>)option, value);
OptionStore.SetOption((Option<T>)option, value);
}
else if (option is PerLanguageOption<T>)
{
Options = Options.WithChangedOption((PerLanguageOption<T>)option, Language, value);
OptionStore.SetOption((PerLanguageOption<T>)option, Language, value);
}
else
{
......@@ -150,7 +138,7 @@ public void UpdatePreview(string text)
project = project.WithMetadataReferences(referenceAssemblies);
var document = project.AddDocument("document", SourceText.From(text, Encoding.UTF8));
var formatted = Formatter.FormatAsync(document, this.Options).WaitAndGetResult(CancellationToken.None);
var formatted = Formatter.FormatAsync(document, OptionStore.GetOptions()).WaitAndGetResult(CancellationToken.None);
var textBuffer = _textBufferFactoryService.CreateTextBuffer(formatted.GetTextAsync().Result.ToString(), _contentType);
......@@ -223,7 +211,7 @@ private void UpdateDocument(string text)
}
protected void AddParenthesesOption(
string language, OptionSet optionSet,
string language, OptionStore optionStore,
PerLanguageOption<CodeStyleOption<ParenthesesPreference>> languageOption,
string title, string[] examples, bool defaultAddForClarity)
{
......@@ -240,11 +228,11 @@ private void UpdateDocument(string text)
CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ParenthesesPreference>(
languageOption, language, title, preferences.ToArray(),
examples, this, optionSet, ServicesVSResources.Parentheses_preferences_colon,
examples, this, optionStore, ServicesVSResources.Parentheses_preferences_colon,
codeStylePreferences));
}
protected void AddUnusedParameterOption(string language, OptionSet optionSet, string title, string[] examples)
protected void AddUnusedParameterOption(string language, OptionStore optionStore, string title, string[] examples)
{
var unusedParameterPreferences = new List<CodeStylePreference>
{
......@@ -261,7 +249,7 @@ protected void AddUnusedParameterOption(string language, OptionSet optionSet, st
CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<UnusedParametersPreference>(
CodeStyleOptions.UnusedParameters, language,
ServicesVSResources.Avoid_unused_parameters, enumValues,
examples, this, optionSet, title,
examples, this, optionStore, title,
unusedParameterPreferences));
}
}
......
......@@ -35,7 +35,7 @@ public bool IsChecked
}
}
public AbstractRadioButtonViewModel(string description, string preview, AbstractOptionPreviewViewModel info, OptionSet options, bool isChecked, string group)
public AbstractRadioButtonViewModel(string description, string preview, AbstractOptionPreviewViewModel info, bool isChecked, string group)
{
Description = description;
this.Preview = preview;
......
......@@ -6,15 +6,15 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
internal class CheckBoxOptionViewModel : AbstractCheckBoxViewModel
{
public CheckBoxOptionViewModel(IOption option, string description, string preview, AbstractOptionPreviewViewModel info, OptionSet options)
: this(option, description, preview, preview, info, options)
public CheckBoxOptionViewModel(IOption option, string description, string preview, AbstractOptionPreviewViewModel info, OptionStore optionStore)
: this(option, description, preview, preview, info, optionStore)
{
}
public CheckBoxOptionViewModel(IOption option, string description, string truePreview, string falsePreview, AbstractOptionPreviewViewModel info, OptionSet options)
public CheckBoxOptionViewModel(IOption option, string description, string truePreview, string falsePreview, AbstractOptionPreviewViewModel info, OptionStore optionStore)
: base(option, description, truePreview, falsePreview, info)
{
SetProperty(ref _isChecked, (bool)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null)));
SetProperty(ref _isChecked, (bool)optionStore.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null)));
}
public override bool IsChecked
......
......@@ -7,15 +7,15 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
internal class FullSolutionAnalysisOptionBinding
{
private readonly IOptionService _optionService;
private readonly OptionStore _optionStore;
private readonly string _languageName;
private readonly Option<bool> _fullSolutionAnalysis;
private readonly PerLanguageOption<bool?> _closedFileDiagnostics;
public FullSolutionAnalysisOptionBinding(IOptionService optionService, string languageName)
public FullSolutionAnalysisOptionBinding(OptionStore optionStore, string languageName)
{
_optionService = optionService;
_optionStore = optionStore;
_languageName = languageName;
_fullSolutionAnalysis = RuntimeOptions.FullSolutionAnalysis;
......@@ -26,25 +26,20 @@ public bool Value
{
get
{
return ServiceFeatureOnOffOptions.IsClosedFileDiagnosticsEnabled(_optionService.GetOptions(), _languageName) &&
_optionService.GetOption(_fullSolutionAnalysis);
return ServiceFeatureOnOffOptions.IsClosedFileDiagnosticsEnabled(_optionStore.GetOptions(), _languageName) &&
_optionStore.GetOption(_fullSolutionAnalysis);
}
set
{
var oldOptions = _optionService.GetOptions();
// set normal option first
var newOptions = oldOptions.WithChangedOption(_closedFileDiagnostics, _languageName, value);
_optionStore.SetOption(_closedFileDiagnostics, _languageName, value);
// we only enable this option if it is disabled. we never disable this option here.
if (value)
{
newOptions = newOptions.WithChangedOption(_fullSolutionAnalysis, value);
_optionStore.SetOption(_fullSolutionAnalysis, value);
}
_optionService.SetOptions(newOptions);
OptionLogger.Log(oldOptions, newOptions);
}
}
}
......
......@@ -22,7 +22,7 @@ internal partial class GridOptionPreviewControl : AbstractOptionPageControl
private const string UseEditorConfigUrl = "https://go.microsoft.com/fwlink/?linkid=866541";
internal AbstractOptionPreviewViewModel ViewModel;
private readonly IServiceProvider _serviceProvider;
private readonly Func<OptionSet, IServiceProvider, AbstractOptionPreviewViewModel> _createViewModel;
private readonly Func<OptionStore, IServiceProvider, AbstractOptionPreviewViewModel> _createViewModel;
private readonly ImmutableArray<(string feature, ImmutableArray<IOption> options)> _groupedEditorConfigOptions;
private readonly string _language;
......@@ -35,11 +35,12 @@ internal partial class GridOptionPreviewControl : AbstractOptionPageControl
public static string GenerateEditorConfigFileFromSettingsText => ServicesVSResources.Generate_dot_editorconfig_file_from_settings;
internal GridOptionPreviewControl(IServiceProvider serviceProvider,
Func<OptionSet, IServiceProvider,
OptionStore optionStore,
Func<OptionStore, IServiceProvider,
AbstractOptionPreviewViewModel> createViewModel,
ImmutableArray<(string feature, ImmutableArray<IOption> options)> groupedEditorConfigOptions,
string language)
: base(serviceProvider)
: base(optionStore)
{
InitializeComponent();
......@@ -85,18 +86,9 @@ private void Options_PreviewKeyDown(object sender, KeyEventArgs e)
}
}
internal override void SaveSettings()
{
var optionSet = this.OptionService.GetOptions();
var changedOptions = this.ViewModel.ApplyChangedOptions(optionSet);
this.OptionService.SetOptions(changedOptions);
OptionLogger.Log(optionSet, changedOptions);
}
internal override void LoadSettings()
{
this.ViewModel = _createViewModel(this.OptionService.GetOptions(), _serviceProvider);
this.ViewModel = _createViewModel(OptionStore, _serviceProvider);
var firstItem = this.ViewModel.CodeStyleItems.OfType<AbstractCodeStyleOptionViewModel>().First();
this.ViewModel.SetOptionAndUpdatePreview(firstItem.SelectedPreference.IsChecked, firstItem.Option, firstItem.GetPreview());
......@@ -116,7 +108,7 @@ internal override void Close()
internal void Generate_Save_EditorConfig(object sender, System.Windows.RoutedEventArgs e)
{
var optionSet = this.ViewModel.ApplyChangedOptions(this.OptionService.GetOptions());
var optionSet = this.OptionStore.GetOptions();
var editorconfig = EditorConfigFileGenerator.Generate(_groupedEditorConfigOptions, optionSet, _language);
using (var sfd = new System.Windows.Forms.SaveFileDialog
{
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.ComponentModel;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
internal class OptionBinding<T>
internal class OptionBinding<T> : INotifyPropertyChanged
{
private readonly IOptionService _optionService;
private readonly OptionStore _optionStore;
private readonly Option<T> _key;
public OptionBinding(IOptionService optionService, Option<T> key)
public event PropertyChangedEventHandler PropertyChanged;
public OptionBinding(OptionStore optionStore, Option<T> key)
{
_optionService = optionService;
_optionStore = optionStore;
_key = key;
_optionStore.OptionChanged += (sender, e) =>
{
if (e.Option == _key)
{
PropertyChanged?.Raise(this, new PropertyChangedEventArgs(nameof(Value)));
}
};
}
public T Value
{
get
{
return _optionService.GetOption(_key);
return _optionStore.GetOption(_key);
}
set
{
var oldOptions = _optionService.GetOptions();
var newOptions = oldOptions.WithChangedOption(_key, value);
_optionService.SetOptions(newOptions);
OptionLogger.Log(oldOptions, newOptions);
_optionStore.SetOption(_key, value);
}
}
}
......
......@@ -16,10 +16,10 @@ internal partial class OptionPreviewControl : AbstractOptionPageControl
{
internal AbstractOptionPreviewViewModel ViewModel;
private readonly IServiceProvider _serviceProvider;
private readonly Func<OptionSet, IServiceProvider, AbstractOptionPreviewViewModel> _createViewModel;
private readonly Func<OptionStore, IServiceProvider, AbstractOptionPreviewViewModel> _createViewModel;
internal OptionPreviewControl(IServiceProvider serviceProvider, Func<OptionSet, IServiceProvider, AbstractOptionPreviewViewModel> createViewModel) : base(serviceProvider)
internal OptionPreviewControl(IServiceProvider serviceProvider, OptionStore optionStore, Func<OptionStore, IServiceProvider, AbstractOptionPreviewViewModel> createViewModel) : base(optionStore)
{
InitializeComponent();
......@@ -87,18 +87,9 @@ private void Options_PreviewKeyDown(object sender, KeyEventArgs e)
}
}
internal override void SaveSettings()
{
var optionSet = this.OptionService.GetOptions();
var changedOptions = this.ViewModel.ApplyChangedOptions(optionSet);
this.OptionService.SetOptions(changedOptions);
OptionLogger.Log(optionSet, changedOptions);
}
internal override void LoadSettings()
{
this.ViewModel = _createViewModel(this.OptionService.GetOptions(), _serviceProvider);
this.ViewModel = _createViewModel(this.OptionStore, _serviceProvider);
// Use the first item's preview.
var firstItem = this.ViewModel.Items.OfType<CheckBoxOptionViewModel>().First();
......
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
/// <summary>
/// This class is intended to be used by Option pages. It will provide access to an options
/// from an optionset but will not persist changes automatically.
/// </summary>
public class OptionStore
{
public event EventHandler<OptionKey> OptionChanged;
private OptionSet _optionSet;
private IEnumerable<IOption> _registeredOptions;
public OptionStore(OptionSet optionSet, IEnumerable<IOption> registeredOptions)
{
_optionSet = optionSet;
_registeredOptions = registeredOptions;
}
public object GetOption(OptionKey optionKey) => _optionSet.GetOption(optionKey);
public T GetOption<T>(Option<T> option) => _optionSet.GetOption(option);
public T GetOption<T>(PerLanguageOption<T> option, string language) => _optionSet.GetOption(option, language);
public OptionSet GetOptions() => _optionSet;
public void SetOption(OptionKey optionKey, object value)
{
var oldOptions = _optionSet;
_optionSet = _optionSet.WithChangedOption(optionKey, value);
OptionLogger.Log(oldOptions, _optionSet);
OnOptionChanged(optionKey);
}
public void SetOption<T>(Option<T> option, T value)
{
var oldOptions = _optionSet;
_optionSet = _optionSet.WithChangedOption(option, value);
OptionLogger.Log(oldOptions, _optionSet);
OnOptionChanged(new OptionKey(option));
}
public void SetOption<T>(PerLanguageOption<T> option, string language, T value)
{
var oldOptionSet = _optionSet;
_optionSet = _optionSet.WithChangedOption(option, language, value);
OptionLogger.Log(oldOptionSet, _optionSet);
OnOptionChanged(new OptionKey(option, language));
}
public IEnumerable<IOption> GetRegisteredOptions()
{
return _registeredOptions;
}
public void SetOptions(OptionSet optionSet)
{
_optionSet = optionSet;
}
public void SetRegisteredOptions(IEnumerable<IOption> registeredOptions)
{
_registeredOptions = registeredOptions;
}
private void OnOptionChanged(OptionKey optionKey)
{
OptionChanged?.Invoke(this, optionKey);
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.ComponentModel;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
internal class PerLanguageOptionBinding<T>
internal class PerLanguageOptionBinding<T> : INotifyPropertyChanged
{
private readonly IOptionService _optionService;
private readonly OptionStore _optionStore;
private readonly PerLanguageOption<T> _key;
private readonly string _languageName;
public PerLanguageOptionBinding(IOptionService optionService, PerLanguageOption<T> key, string languageName)
public event PropertyChangedEventHandler PropertyChanged;
public PerLanguageOptionBinding(OptionStore optionStore, PerLanguageOption<T> key, string languageName)
{
_optionService = optionService;
_optionStore = optionStore;
_key = key;
_languageName = languageName;
_optionStore.OptionChanged += (sender, e) =>
{
if (e.Option == _key)
{
PropertyChanged?.Raise(this, new PropertyChangedEventArgs(nameof(Value)));
}
};
}
public T Value
{
get
{
return _optionService.GetOption(_key, _languageName);
return _optionStore.GetOption(_key, _languageName);
}
set
{
var oldOptions = _optionService.GetOptions();
var newOptions = oldOptions.WithChangedOption(_key, _languageName, value);
_optionService.SetOptions(newOptions);
OptionLogger.Log(oldOptions, newOptions);
_optionStore.SetOption(_key, _languageName, value);
}
}
}
......
......@@ -9,8 +9,8 @@ internal class RadioButtonViewModel<TOption> : AbstractRadioButtonViewModel
private readonly Option<TOption> _option;
private readonly TOption _value;
public RadioButtonViewModel(string description, string preview, string group, TOption value, Option<TOption> option, AbstractOptionPreviewViewModel info, OptionSet options)
: base(description, preview, info, options, isChecked: options.GetOption(option).Equals(value), group: group)
public RadioButtonViewModel(string description, string preview, string group, TOption value, Option<TOption> option, AbstractOptionPreviewViewModel info, OptionStore optionStore)
: base(description, preview, info, isChecked: optionStore.GetOption(option).Equals(value), group: group)
{
_value = value;
_option = option;
......
......@@ -46,7 +46,6 @@ public virtual NotificationOptionViewModel SelectedNotificationPreference
IOption option,
string description,
AbstractOptionPreviewViewModel info,
OptionSet options,
string groupName,
List<CodeStylePreference> preferences = null,
List<NotificationOptionViewModel> notificationPreferences = null)
......
......@@ -25,16 +25,16 @@ internal class BooleanCodeStyleOptionViewModel : AbstractCodeStyleOptionViewMode
string truePreview,
string falsePreview,
AbstractOptionPreviewViewModel info,
OptionSet options,
OptionStore optionStore,
string groupName,
List<CodeStylePreference> preferences = null,
List<NotificationOptionViewModel> notificationPreferences = null)
: base(option, description, info, options, groupName, preferences, notificationPreferences)
: base(option, description, info, groupName, preferences, notificationPreferences)
{
_truePreview = truePreview;
_falsePreview = falsePreview;
var codeStyleOption = ((CodeStyleOption<bool>)options.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null)));
var codeStyleOption = ((CodeStyleOption<bool>)optionStore.GetOption(new OptionKey(option, option.IsPerLanguage ? info.Language : null)));
_selectedPreference = Preferences.Single(c => c.IsChecked == codeStyleOption.Value);
var notificationViewModel = NotificationPreferences.Single(i => i.Notification.Severity == codeStyleOption.Notification.Severity);
......
......@@ -40,11 +40,11 @@ static EnumCodeStyleOptionViewModel()
T[] enumValues,
string[] previews,
AbstractOptionPreviewViewModel info,
OptionSet options,
OptionStore optionStore,
string groupName,
List<CodeStylePreference> preferences)
: this((IOption)option, language, description, enumValues, previews, info,
options, groupName, preferences)
optionStore, groupName, preferences)
{
}
......@@ -54,11 +54,11 @@ static EnumCodeStyleOptionViewModel()
T[] enumValues,
string[] previews,
AbstractOptionPreviewViewModel info,
OptionSet options,
OptionStore optionStore,
string groupName,
List<CodeStylePreference> preferences)
: this(option, language: null, description, enumValues, previews, info,
options, groupName, preferences)
optionStore, groupName, preferences)
{
}
......@@ -69,10 +69,10 @@ static EnumCodeStyleOptionViewModel()
T[] enumValues,
string[] previews,
AbstractOptionPreviewViewModel info,
OptionSet options,
OptionStore optionStore,
string groupName,
List<CodeStylePreference> preferences)
: base(option, description, info, options, groupName, preferences)
: base(option, description, info, groupName, preferences)
{
Debug.Assert(preferences.Count == enumValues.Length);
Debug.Assert(previews.Length == enumValues.Length);
......@@ -80,7 +80,7 @@ static EnumCodeStyleOptionViewModel()
_enumValues = enumValues.ToImmutableArray();
_previews = previews.ToImmutableArray();
var codeStyleOption = (CodeStyleOption<T>)options.GetOption(new OptionKey(option, language));
var codeStyleOption = (CodeStyleOption<T>)optionStore.GetOption(new OptionKey(option, language));
var enumIndex = _enumValues.IndexOf(codeStyleOption.Value);
if (enumIndex < 0 || enumIndex >= Preferences.Count)
......
......@@ -43,8 +43,8 @@ internal partial class NamingStyleOptionPageControl : AbstractOptionPageControl
new NotificationOptionViewModel(NotificationOption.Error, KnownMonikers.StatusError)
};
internal NamingStyleOptionPageControl(IServiceProvider serviceProvider, INotificationService notificationService, string languageName)
: base(serviceProvider)
internal NamingStyleOptionPageControl(OptionStore optionStore, INotificationService notificationService, string languageName)
: base(optionStore)
{
_languageName = languageName;
_notificationService = notificationService;
......@@ -177,9 +177,9 @@ internal override void SaveSettings()
namingStyles.ToImmutableAndFree(),
namingRules.ToImmutableAndFree());
var oldOptions = OptionService.GetOptions();
var oldOptions = OptionStore.GetOptions();
var newOptions = oldOptions.WithChangedOption(SimplificationOptions.NamingPreferences, _languageName, info);
OptionService.SetOptions(newOptions);
OptionStore.SetOptions(newOptions);
OptionLogger.Log(oldOptions, newOptions);
}
......@@ -187,7 +187,7 @@ internal override void LoadSettings()
{
base.LoadSettings();
var preferences = OptionService.GetOption(SimplificationOptions.NamingPreferences, _languageName);
var preferences = OptionStore.GetOption(SimplificationOptions.NamingPreferences, _languageName);
if (preferences == null)
{
return;
......
......@@ -8,8 +8,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Friend Class AdvancedOptionPage
Inherits AbstractOptionPage
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider) As AbstractOptionPageControl
Return New AdvancedOptionPageControl(serviceProvider)
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider, optionStore As OptionStore) As AbstractOptionPageControl
Return New AdvancedOptionPageControl(optionStore)
End Function
End Class
End Namespace
......@@ -117,6 +117,14 @@
Content="{x:Static local:AdvancedOptionPageStrings.Option_Show_completion_list}" />
</StackPanel>
</GroupBox>
<GroupBox x:Uid="ClassificationsGroupBox"
Header="{x:Static local:AdvancedOptionPageStrings.Option_Classifications}">
<StackPanel>
<CheckBox x:Name="Use_enhanced_colors"
Content="{x:Static local:AdvancedOptionPageStrings.Option_Use_enhanced_colors_for_C_and_Basic}" />
</StackPanel>
</GroupBox>
<GroupBox x:Uid="ExtractMethodGroupBox"
Header="{x:Static local:AdvancedOptionPageStrings.Option_ExtractMethod}">
......
......@@ -11,11 +11,12 @@ Imports Microsoft.CodeAnalysis.Structure
Imports Microsoft.CodeAnalysis.SymbolSearch
Imports Microsoft.CodeAnalysis.ValidateFormatString
Imports Microsoft.VisualStudio.LanguageServices.Implementation
Imports Microsoft.VisualStudio.LanguageServices.Implementation.Options
Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Friend Class AdvancedOptionPageControl
Public Sub New(serviceProvider As IServiceProvider)
MyBase.New(serviceProvider)
Public Sub New(optionStore As OptionStore)
MyBase.New(optionStore)
InitializeComponent()
......@@ -62,6 +63,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
BindToOption(Report_invalid_regular_expressions, RegularExpressionsOptions.ReportInvalidRegexPatterns, LanguageNames.VisualBasic)
BindToOption(Highlight_related_components_under_cursor, RegularExpressionsOptions.HighlightRelatedRegexComponentsUnderCursor, LanguageNames.VisualBasic)
BindToOption(Show_completion_list, RegularExpressionsOptions.ProvideRegexCompletions, LanguageNames.VisualBasic)
BindToOption(Use_enhanced_colors, FeatureOnOffOptions.UseEnhancedColors)
End Sub
End Class
End Namespace
......@@ -217,5 +217,11 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Public ReadOnly Property Option_Show_completion_list As String =
ServicesVSResources.Show_completion_list
Public ReadOnly Property Option_Classifications As String =
ServicesVSResources.Classifications
Public ReadOnly Property Option_Use_enhanced_colors_for_C_and_Basic As String =
ServicesVSResources.Use_enhanced_colors_for_C_and_Basic
End Module
End Namespace
......@@ -13,8 +13,9 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options.Formatting
Friend Class CodeStylePage
Inherits AbstractOptionPage
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider) As AbstractOptionPageControl
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider, optionStore As OptionStore) As AbstractOptionPageControl
Return New GridOptionPreviewControl(serviceProvider,
optionStore,
Function(o, s) New StyleViewModel(o, s),
GetEditorConfigOptions(),
LanguageNames.VisualBasic)
......
......@@ -8,8 +8,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
<Guid(Guids.VisualBasicOptionPageIntelliSenseIdString)>
Friend Class IntelliSenseOptionPage
Inherits AbstractOptionPage
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider) As AbstractOptionPageControl
Return New IntelliSenseOptionPageControl(serviceProvider)
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider, optionStore As OptionStore) As AbstractOptionPageControl
Return New IntelliSenseOptionPageControl(optionStore)
End Function
End Class
End Namespace
......@@ -9,12 +9,12 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Partial Friend Class IntelliSenseOptionPageControl
Inherits AbstractOptionPageControl
Public Sub New(serviceProvider As IServiceProvider)
MyBase.New(serviceProvider)
Public Sub New(optionStore As OptionStore)
MyBase.New(optionStore)
InitializeComponent()
BindToOption(Show_completion_list_after_a_character_is_typed, CompletionOptions.TriggerOnTypingLetters, LanguageNames.VisualBasic)
Show_completion_list_after_a_character_is_deleted.IsChecked = Me.OptionService.GetOption(
Show_completion_list_after_a_character_is_deleted.IsChecked = Me.OptionStore.GetOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.VisualBasic) <> False
BindToOption(Show_completion_item_filters, CompletionOptions.ShowCompletionItemFilters, LanguageNames.VisualBasic)
......@@ -30,15 +30,11 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
End Sub
Private Sub Show_completion_list_after_a_character_is_deleted_Checked(sender As Object, e As RoutedEventArgs)
Me.OptionService.SetOptions(
Me.OptionService.GetOptions().WithChangedOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.VisualBasic, value:=True))
Me.OptionStore.SetOption(CompletionOptions.TriggerOnDeletion, LanguageNames.VisualBasic, value:=True)
End Sub
Private Sub Show_completion_list_after_a_character_is_deleted_Unchecked(sender As Object, e As RoutedEventArgs)
Me.OptionService.SetOptions(
Me.OptionService.GetOptions().WithChangedOption(
CompletionOptions.TriggerOnDeletion, LanguageNames.VisualBasic, value:=False))
Me.OptionStore.SetOption(CompletionOptions.TriggerOnDeletion, LanguageNames.VisualBasic, value:=False)
End Sub
End Class
End Namespace
......@@ -16,12 +16,12 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Private _grid As NamingStyleOptionPageControl
Private _notificationService As INotificationService
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider) As AbstractOptionPageControl
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider, optionStore As OptionStore) As AbstractOptionPageControl
Dim componentModel = DirectCast(serviceProvider.GetService(GetType(SComponentModel)), IComponentModel)
Dim workspace = componentModel.GetService(Of VisualStudioWorkspace)
_notificationService = workspace.Services.GetService(Of INotificationService)
_grid = New NamingStyleOptionPageControl(serviceProvider, _notificationService, LanguageNames.VisualBasic)
_grid = New NamingStyleOptionPageControl(optionStore, _notificationService, LanguageNames.VisualBasic)
Return _grid
End Function
......
......@@ -8,8 +8,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Friend Class StyleOptionPage
Inherits AbstractOptionPage
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider) As AbstractOptionPageControl
Return New OptionPreviewControl(serviceProvider, Function(o, s) New StyleViewModel(o, s))
Protected Overrides Function CreateOptionPage(serviceProvider As IServiceProvider, optionStore As OptionStore) As AbstractOptionPageControl
Return New OptionPreviewControl(serviceProvider, optionStore, Function(o, s) New StyleViewModel(o, s))
End Function
End Class
End Namespace
......@@ -617,8 +617,8 @@ End Class
#End Region
#End Region
Public Sub New(optionSet As OptionSet, serviceProvider As IServiceProvider)
MyBase.New(optionSet, serviceProvider, LanguageNames.VisualBasic)
Public Sub New(optionStore As OptionStore, serviceProvider As IServiceProvider)
MyBase.New(optionStore, serviceProvider, LanguageNames.VisualBasic)
Dim collectionView = DirectCast(CollectionViewSource.GetDefaultView(CodeStyleItems), ListCollectionView)
collectionView.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(AbstractCodeStyleOptionViewModel.GroupName)))
......@@ -644,71 +644,71 @@ End Class
Dim parameterPreferencesGroupTitle = ServicesVSResources.Parameter_preferences_colon
' qualify with Me. group
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyFieldAccess, BasicVSResources.Qualify_field_access_with_Me, s_fieldDeclarationPreviewTrue, s_fieldDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyPropertyAccess, BasicVSResources.Qualify_property_access_with_Me, s_propertyDeclarationPreviewTrue, s_propertyDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyMethodAccess, BasicVSResources.Qualify_method_access_with_Me, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyEventAccess, BasicVSResources.Qualify_event_access_with_Me, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, Me, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyFieldAccess, BasicVSResources.Qualify_field_access_with_Me, s_fieldDeclarationPreviewTrue, s_fieldDeclarationPreviewFalse, Me, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyPropertyAccess, BasicVSResources.Qualify_property_access_with_Me, s_propertyDeclarationPreviewTrue, s_propertyDeclarationPreviewFalse, Me, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyMethodAccess, BasicVSResources.Qualify_method_access_with_Me, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, Me, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.QualifyEventAccess, BasicVSResources.Qualify_event_access_with_Me, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, Me, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences))
' predefined or framework type group
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, ServicesVSResources.For_locals_parameters_and_members, _intrinsicDeclarationPreviewTrue, _intrinsicDeclarationPreviewFalse, Me, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ServicesVSResources.For_member_access_expressions, _intrinsicMemberAccessPreviewTrue, _intrinsicMemberAccessPreviewFalse, Me, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, ServicesVSResources.For_locals_parameters_and_members, _intrinsicDeclarationPreviewTrue, _intrinsicDeclarationPreviewFalse, Me, optionStore, predefinedTypesGroupTitle, predefinedTypesPreferences))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ServicesVSResources.For_member_access_expressions, _intrinsicMemberAccessPreviewTrue, _intrinsicMemberAccessPreviewFalse, Me, optionStore, predefinedTypesGroupTitle, predefinedTypesPreferences))
AddParenthesesOptions(optionSet)
AddParenthesesOptions(optionStore)
' Code block
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferAutoProperties, ServicesVSResources.analyzer_Prefer_auto_properties, s_preferAutoProperties, s_preferAutoProperties, Me, optionSet, codeBlockPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferAutoProperties, ServicesVSResources.analyzer_Prefer_auto_properties, s_preferAutoProperties, s_preferAutoProperties, Me, optionStore, codeBlockPreferencesGroupTitle))
' expression preferences
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferObjectInitializer, ServicesVSResources.Prefer_object_initializer, s_preferObjectInitializer, s_preferObjectInitializer, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCollectionInitializer, ServicesVSResources.Prefer_collection_initializer, s_preferCollectionInitializer, s_preferCollectionInitializer, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferExplicitTupleNames, ServicesVSResources.Prefer_explicit_tuple_name, s_preferExplicitTupleName, s_preferExplicitTupleName, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferInferredTupleNames, ServicesVSResources.Prefer_inferred_tuple_names, s_preferInferredTupleName, s_preferInferredTupleName, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferInferredAnonymousTypeMemberNames, ServicesVSResources.Prefer_inferred_anonymous_type_member_names, s_preferInferredAnonymousTypeMemberName, s_preferInferredAnonymousTypeMemberName, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferConditionalExpressionOverAssignment, ServicesVSResources.Prefer_conditional_expression_over_if_with_assignments, s_preferConditionalExpressionOverIfWithAssignments, s_preferConditionalExpressionOverIfWithAssignments, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferConditionalExpressionOverReturn, ServicesVSResources.Prefer_conditional_expression_over_if_with_returns, s_preferConditionalExpressionOverIfWithReturns, s_preferConditionalExpressionOverIfWithReturns, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCompoundAssignment, ServicesVSResources.Prefer_compound_assignments, s_preferCompoundAssignments, s_preferCompoundAssignments, Me, optionSet, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferObjectInitializer, ServicesVSResources.Prefer_object_initializer, s_preferObjectInitializer, s_preferObjectInitializer, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCollectionInitializer, ServicesVSResources.Prefer_collection_initializer, s_preferCollectionInitializer, s_preferCollectionInitializer, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferExplicitTupleNames, ServicesVSResources.Prefer_explicit_tuple_name, s_preferExplicitTupleName, s_preferExplicitTupleName, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferInferredTupleNames, ServicesVSResources.Prefer_inferred_tuple_names, s_preferInferredTupleName, s_preferInferredTupleName, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferInferredAnonymousTypeMemberNames, ServicesVSResources.Prefer_inferred_anonymous_type_member_names, s_preferInferredAnonymousTypeMemberName, s_preferInferredAnonymousTypeMemberName, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferConditionalExpressionOverAssignment, ServicesVSResources.Prefer_conditional_expression_over_if_with_assignments, s_preferConditionalExpressionOverIfWithAssignments, s_preferConditionalExpressionOverIfWithAssignments, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferConditionalExpressionOverReturn, ServicesVSResources.Prefer_conditional_expression_over_if_with_returns, s_preferConditionalExpressionOverIfWithReturns, s_preferConditionalExpressionOverIfWithReturns, Me, optionStore, expressionPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCompoundAssignment, ServicesVSResources.Prefer_compound_assignments, s_preferCompoundAssignments, s_preferCompoundAssignments, Me, optionStore, expressionPreferencesGroupTitle))
AddUnusedValueOptions(optionSet, expressionPreferencesGroupTitle)
AddUnusedValueOptions(optionStore, expressionPreferencesGroupTitle)
' nothing preferences
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCoalesceExpression, ServicesVSResources.Prefer_coalesce_expression, s_preferCoalesceExpression, s_preferCoalesceExpression, Me, optionSet, nothingPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferNullPropagation, ServicesVSResources.Prefer_null_propagation, s_preferNullPropagation, s_preferNullPropagation, Me, optionSet, nothingPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIsNullCheckOverReferenceEqualityMethod, BasicVSResources.Prefer_Is_Nothing_for_reference_equality_checks, s_preferIsNothingCheckOverReferenceEquals, s_preferIsNothingCheckOverReferenceEquals, Me, optionSet, nothingPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferCoalesceExpression, ServicesVSResources.Prefer_coalesce_expression, s_preferCoalesceExpression, s_preferCoalesceExpression, Me, optionStore, nothingPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferNullPropagation, ServicesVSResources.Prefer_null_propagation, s_preferNullPropagation, s_preferNullPropagation, Me, optionStore, nothingPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferIsNullCheckOverReferenceEqualityMethod, BasicVSResources.Prefer_Is_Nothing_for_reference_equality_checks, s_preferIsNothingCheckOverReferenceEquals, s_preferIsNothingCheckOverReferenceEquals, Me, optionStore, nothingPreferencesGroupTitle))
' Field preferences
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferReadonly, ServicesVSResources.Prefer_readonly_fields, s_preferReadonly, s_preferReadonly, Me, optionSet, fieldPreferencesGroupTitle))
Me.CodeStyleItems.Add(New BooleanCodeStyleOptionViewModel(CodeStyleOptions.PreferReadonly, ServicesVSResources.Prefer_readonly_fields, s_preferReadonly, s_preferReadonly, Me, optionStore, fieldPreferencesGroupTitle))
' Parameter preferences
AddParameterOptions(optionSet, parameterPreferencesGroupTitle)
AddParameterOptions(optionStore, parameterPreferencesGroupTitle)
End Sub
Private Sub AddParenthesesOptions(optionSet As OptionSet)
Private Sub AddParenthesesOptions(optionStore As OptionStore)
AddParenthesesOption(
LanguageNames.VisualBasic, optionSet, CodeStyleOptions.ArithmeticBinaryParentheses,
LanguageNames.VisualBasic, optionStore, CodeStyleOptions.ArithmeticBinaryParentheses,
BasicVSResources.In_arithmetic_binary_operators,
{s_arithmeticBinaryAlwaysForClarity, s_arithmeticBinaryNeverIfUnnecessary},
defaultAddForClarity:=True)
AddParenthesesOption(
LanguageNames.VisualBasic, optionSet, CodeStyleOptions.OtherBinaryParentheses,
LanguageNames.VisualBasic, optionStore, CodeStyleOptions.OtherBinaryParentheses,
BasicVSResources.In_other_binary_operators,
{s_otherBinaryAlwaysForClarity, s_otherBinaryNeverIfUnnecessary},
defaultAddForClarity:=True)
AddParenthesesOption(
LanguageNames.VisualBasic, optionSet, CodeStyleOptions.RelationalBinaryParentheses,
LanguageNames.VisualBasic, optionStore, CodeStyleOptions.RelationalBinaryParentheses,
BasicVSResources.In_relational_binary_operators,
{s_relationalBinaryAlwaysForClarity, s_relationalBinaryNeverIfUnnecessary},
defaultAddForClarity:=True)
AddParenthesesOption(
LanguageNames.VisualBasic, optionSet, CodeStyleOptions.OtherParentheses,
LanguageNames.VisualBasic, optionStore, CodeStyleOptions.OtherParentheses,
ServicesVSResources.In_other_operators,
{s_otherParenthesesAlwaysForClarity, s_otherParenthesesNeverIfUnnecessary},
defaultAddForClarity:=False)
End Sub
Private Sub AddUnusedValueOptions(optionSet As OptionSet, expressionPreferencesGroupTitle As String)
Private Sub AddUnusedValueOptions(optionStore As OptionStore, expressionPreferencesGroupTitle As String)
Dim unusedValuePreferences = New List(Of CodeStylePreference) From
{
New CodeStylePreference(BasicVSResources.Unused_local, isChecked:=True)
......@@ -725,7 +725,7 @@ End Class
enumValues,
{s_avoidUnusedValueAssignmentUnusedLocal},
Me,
optionSet,
optionStore,
expressionPreferencesGroupTitle,
unusedValuePreferences))
......@@ -735,20 +735,20 @@ End Class
enumValues,
{s_avoidUnusedValueExpressionStatementUnusedLocal},
Me,
optionSet,
optionStore,
expressionPreferencesGroupTitle,
unusedValuePreferences))
End Sub
Private Sub AddParameterOptions(optionSet As OptionSet, parameterPreferencesGroupTitle As String)
Private Sub AddParameterOptions(optionStore As OptionStore, parameterPreferencesGroupTitle As String)
Dim examples =
{
s_avoidUnusedParametersNonPublicMethods,
s_avoidUnusedParametersAllMethods
}
AddUnusedParameterOption(LanguageNames.VisualBasic, optionSet, parameterPreferencesGroupTitle, examples)
AddUnusedParameterOption(LanguageNames.VisualBasic, optionStore, parameterPreferencesGroupTitle, examples)
End Sub
End Class
End Namespace
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
[Guid(Guids.RoslynOptionPageFeatureManagerComponentsIdString)]
internal class InternalComponentsOnOffPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new InternalOptionsControl(nameof(EditorComponentOnOffOptions), serviceProvider);
return new InternalOptionsControl(nameof(EditorComponentOnOffOptions), optionStore);
}
}
}
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
[Guid(Guids.RoslynOptionPageInternalDiagnosticsIdString)]
internal class InternalDiagnosticsPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new InternalOptionsControl(nameof(InternalDiagnosticsOptions), serviceProvider);
return new InternalOptionsControl(nameof(InternalDiagnosticsOptions), optionStore);
}
}
}
......@@ -16,15 +16,15 @@ namespace Roslyn.VisualStudio.DiagnosticsWindow.OptionsPages
[Guid(Guids.RoslynOptionPageFeatureManagerFeaturesIdString)]
internal class InternalFeaturesOnOffPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new InternalFeaturesOptionsControl(nameof(InternalFeatureOnOffOptions), serviceProvider);
return new InternalFeaturesOptionsControl(nameof(InternalFeatureOnOffOptions), optionStore);
}
internal class InternalFeaturesOptionsControl : InternalOptionsControl
{
public InternalFeaturesOptionsControl(string featureOptionName, IServiceProvider serviceProvider)
: base(featureOptionName, serviceProvider)
public InternalFeaturesOptionsControl(string featureOptionName, OptionStore optionStore)
: base(featureOptionName, optionStore)
{
}
......
......@@ -14,8 +14,8 @@ internal partial class InternalOptionsControl : AbstractOptionPageControl
{
private readonly string _featureOptionName;
public InternalOptionsControl(string featureOptionName, IServiceProvider serviceProvider)
: base(serviceProvider)
public InternalOptionsControl(string featureOptionName, OptionStore optionStore)
: base(optionStore)
{
_featureOptionName = featureOptionName;
......@@ -104,7 +104,7 @@ public InternalOptionsControl(string featureOptionName, IServiceProvider service
protected virtual void AddOptions(Panel panel)
{
foreach (var option in OptionService.GetRegisteredOptions().Where(o => o.Feature == _featureOptionName).OrderBy(o => o.Name))
foreach (var option in OptionStore.GetRegisteredOptions().Where(o => o.Feature == _featureOptionName).OrderBy(o => o.Name))
{
if (!option.IsPerLanguage)
{
......
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options
[Guid(Guids.RoslynOptionPageInternalSolutionCrawlerIdString)]
internal class InternalSolutionCrawlerPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new InternalOptionsControl(nameof(InternalSolutionCrawlerOptions), serviceProvider);
return new InternalOptionsControl(nameof(InternalSolutionCrawlerOptions), optionStore);
}
}
}
......@@ -11,9 +11,9 @@ namespace Roslyn.VisualStudio.DiagnosticsWindow.OptionsPages
[Guid(Guids.RoslynOptionPagePerformanceFunctionIdIdString)]
internal class PerformanceFunctionIdPage : AbstractOptionPage
{
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
return new InternalOptionsControl(nameof(FunctionIdOptions), serviceProvider);
return new InternalOptionsControl(nameof(FunctionIdOptions), optionStore);
}
}
}
......@@ -23,7 +23,7 @@ internal class PerformanceLoggersPage : AbstractOptionPage
private IThreadingContext _threadingContext;
private IRemoteHostClientService _remoteService;
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider)
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
if (_optionService == null)
{
......@@ -36,7 +36,7 @@ protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider s
_remoteService = workspace.Services.GetService<IRemoteHostClientService>();
}
return new InternalOptionsControl(nameof(LoggerOptions), serviceProvider);
return new InternalOptionsControl(nameof(LoggerOptions), optionStore);
}
protected override void OnApply(PageApplyEventArgs e)
......
......@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.ErrorReporting;
namespace Roslyn.Utilities
{
......@@ -165,13 +166,26 @@ public bool HasHandlers
public void RaiseEvent(Action<TEventHandler> invoker)
{
if (this.HasHandlers)
// The try/catch here is to find additional telemetry for https://devdiv.visualstudio.com/DevDiv/_queries/query/71ee8553-7220-4b2a-98cf-20edab701fd1/.
// We've realized there's a problem with our eventing, where if an exception is encountered while calling into subscribers to Workspace events,
// we won't notify all of the callers. The expectation is such an exception would be thrown to the SafeStartNew in the workspace's event queue that
// will raise that as a fatal exception, but OperationCancelledExceptions might be able to propagate through and fault the task we are using in the
// chain. I'm choosing to use ReportWithoutCrashAndPropagate, because if our theory here is correct, it seems the first exception isn't actually
// causing crashes, and so if it turns out this is a very common situation I don't want to make a often-benign situation fatal.
try
{
foreach (var registry in _registries)
if (this.HasHandlers)
{
registry.Invoke(invoker);
foreach (var registry in _registries)
{
registry.Invoke(invoker);
}
}
}
catch (Exception e) when (FatalError.ReportWithoutCrashAndPropagate(e))
{
throw ExceptionUtilities.Unreachable;
}
}
}
}
......
......@@ -7,6 +7,7 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
......@@ -496,27 +497,38 @@ protected internal void OnAdditionalDocumentOpened(DocumentId documentId, Source
protected internal void OnDocumentClosed(DocumentId documentId, TextLoader reloader, bool updateActiveContext = false)
{
using (_serializationLock.DisposableWait())
this.CheckDocumentIsInCurrentSolution(documentId);
this.CheckDocumentIsOpen(documentId);
// The try/catch here is to find additional telemetry for https://devdiv.visualstudio.com/DevDiv/_queries/query/71ee8553-7220-4b2a-98cf-20edab701fd1/,
// where we have one theory that OnDocumentClosed is running but failing somewhere in the middle and thus failing to get to the RaiseDocumentClosedEventAsync() line.
// We are choosing ReportWithoutCrashAndPropagate because this is a public API that has callers outside VS and also non-VisualStudioWorkspace callers inside VS, and
// we don't want to be crashing underneath them if they were already handling exceptions or (worse) was using those exceptions for expected code flow.
try
{
this.CheckDocumentIsInCurrentSolution(documentId);
this.CheckDocumentIsOpen(documentId);
using (_serializationLock.DisposableWait())
{
// forget any open document info
ClearOpenDocument(documentId);
// forget any open document info
ClearOpenDocument(documentId);
var oldSolution = this.CurrentSolution;
var oldDocument = oldSolution.GetDocument(documentId);
var oldSolution = this.CurrentSolution;
var oldDocument = oldSolution.GetDocument(documentId);
this.OnDocumentClosing(documentId);
this.OnDocumentClosing(documentId);
var newSolution = oldSolution.WithDocumentTextLoader(documentId, reloader, PreservationMode.PreserveValue);
newSolution = this.SetCurrentSolution(newSolution);
var newSolution = oldSolution.WithDocumentTextLoader(documentId, reloader, PreservationMode.PreserveValue);
newSolution = this.SetCurrentSolution(newSolution);
var newDoc = newSolution.GetDocument(documentId);
this.OnDocumentTextChanged(newDoc);
var newDoc = newSolution.GetDocument(documentId);
this.OnDocumentTextChanged(newDoc);
this.RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind.DocumentChanged, oldSolution, newSolution, documentId: documentId); // don't wait for this
this.RaiseDocumentClosedEventAsync(newDoc); // don't wait for this
this.RaiseWorkspaceChangedEventAsync(WorkspaceChangeKind.DocumentChanged, oldSolution, newSolution, documentId: documentId); // don't wait for this
this.RaiseDocumentClosedEventAsync(newDoc); // don't wait for this
}
}
catch (Exception e) when (FatalError.ReportWithoutCrashAndPropagate(e))
{
throw ExceptionUtilities.Unreachable;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册