StyleViewModel.cs 8.7 KB
Newer Older
1 2 3
// 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;
4
using System.Collections.Generic;
5
using System.Windows.Data;
6
using Microsoft.CodeAnalysis;
7
using Microsoft.CodeAnalysis.CodeStyle;
8 9 10 11 12 13 14
using Microsoft.CodeAnalysis.CSharp.CodeStyle;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options;

namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting
{
15 16 17 18 19 20
    /// <summary>
    /// This is the view model for CodeStyle options page.
    /// </summary>
    /// <remarks>
    /// The codestyle options page is defined in <see cref="CodeStylePage"/>
    /// </remarks>
21 22 23 24
    internal class StyleViewModel : AbstractOptionPreviewViewModel
    {
        internal override bool ShouldPersistOption(OptionKey key)
        {
25 26 27
            return key.Option.Feature == CSharpCodeStyleOptions.FeatureName ||
                key.Option.Feature == CodeStyleOptions.PerLanguageCodeStyleOption ||
                key.Option.Feature == SimplificationOptions.PerLanguageFeatureName;
28 29
        }

B
Balaji Krishnan 已提交
30 31
        #region "Preview Text"

B
Balaji Krishnan 已提交
32
        private static readonly string s_fieldDeclarationPreviewTrue = @"
33
class C{
B
Balaji Krishnan 已提交
34
    int capacity;
B
Balaji Krishnan 已提交
35
    void Method()
36 37
    {
//[
B
Balaji Krishnan 已提交
38
        this.capacity = 0;
39 40 41 42
//]
    }
}";

B
Balaji Krishnan 已提交
43
        private static readonly string s_fieldDeclarationPreviewFalse = @"
44
class C{
B
Balaji Krishnan 已提交
45
    int capacity;
B
Balaji Krishnan 已提交
46
    void Method()
47 48
    {
//[
B
Balaji Krishnan 已提交
49 50 51 52 53 54 55 56
        capacity = 0;
//]
    }
}";

        private static readonly string s_propertyDeclarationPreviewTrue = @"
class C{
    public int Id { get; set; }
B
Balaji Krishnan 已提交
57
    void Method()
B
Balaji Krishnan 已提交
58 59 60 61 62 63 64 65 66 67
    {
//[
        this.Id = 0;
//]
    }
}";

        private static readonly string s_propertyDeclarationPreviewFalse = @"
class C{
    public int Id { get; set; }
B
Balaji Krishnan 已提交
68
    void Method()
B
Balaji Krishnan 已提交
69 70 71 72 73 74 75 76 77 78
    {
//[
        Id = 0;
//]
    }
}";

        private static readonly string s_eventDeclarationPreviewTrue = @"
using System;
class C{
B
Balaji Krishnan 已提交
79
    event EventHandler Elapsed;
B
Balaji Krishnan 已提交
80 81 82
    void Handler(object sender, EventArgs args)
    {
//[
B
Balaji Krishnan 已提交
83
        this.Elapsed += Handler;
B
Balaji Krishnan 已提交
84 85 86 87 88 89 90
//]
    }
}";

        private static readonly string s_eventDeclarationPreviewFalse = @"
using System;
class C{
B
Balaji Krishnan 已提交
91
    event EventHandler Elapsed;
B
Balaji Krishnan 已提交
92 93 94
    void Handler(object sender, EventArgs args)
    {
//[
B
Balaji Krishnan 已提交
95
        Elapsed += Handler;
B
Balaji Krishnan 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
//]
    }
}";

        private static readonly string s_methodDeclarationPreviewTrue = @"
using System;
class C{
    void Display()
    {
//[
        this.Display();
//]
    }
}";

        private static readonly string s_methodDeclarationPreviewFalse = @"
using System;
class C{
    void Display()
    {
//[
        Display();
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
//]
    }
}";

        private static readonly string s_intrinsicPreviewDeclarationTrue = @"
class Program
{
//[
    private int _member;
    static void M(int argument)
    {
        int local;
    }
//]
}";

        private static readonly string s_intrinsicPreviewDeclarationFalse = @"
using System;
class Program
{
//[
    private Int32 _member;
    static void M(Int32 argument)
    {
        Int32 local;
    }
//]
}";

        private static readonly string s_intrinsicPreviewMemberAccessTrue = @"
class Program
{
//[
    static void M()
    {
        var local = int.MaxValue;
    }
//]
}";

        private static readonly string s_intrinsicPreviewMemberAccessFalse = @"
using System;
class Program
{
//[
    static void M()
    {
        var local = Int32.MaxValue;
    }
//]
}";

B
Balaji Krishnan 已提交
170 171
        private static readonly string s_varForIntrinsicsPreviewFalse = @"
using System;
172
class C{
B
Balaji Krishnan 已提交
173
    void Method()
174 175
    {
//[
B
Balaji Krishnan 已提交
176
        int x = 5; // built-in types
177 178 179 180
//]
    }
}";

B
Balaji Krishnan 已提交
181 182
        private static readonly string s_varForIntrinsicsPreviewTrue = @"
using System;
183
class C{
B
Balaji Krishnan 已提交
184
    void Method()
185 186
    {
//[
B
Balaji Krishnan 已提交
187
        var x = 5; // built-in types
188 189 190 191
//]
    }
}";

B
Balaji Krishnan 已提交
192 193
        private static readonly string s_varWhereApparentPreviewFalse = @"
using System;
194
class C{
B
Balaji Krishnan 已提交
195
    void Method()
196 197
    {
//[
B
Balaji Krishnan 已提交
198
        C cobj = new C(); // type is apparent from assignment expression
199 200 201 202
//]
    }
}";

B
Balaji Krishnan 已提交
203 204
        private static readonly string s_varWhereApparentPreviewTrue = @"
using System;
205
class C{
B
Balaji Krishnan 已提交
206
    void Method()
207 208
    {
//[
B
Balaji Krishnan 已提交
209
        var cobj = new C(); // type is apparent from assignment expression
B
Balaji Krishnan 已提交
210 211 212 213 214 215 216
//]
    }
}";

        private static readonly string s_varWherePossiblePreviewFalse = @"
using System;
class C{
B
Balaji Krishnan 已提交
217
    void Init()
B
Balaji Krishnan 已提交
218 219
    {
//[
B
Balaji Krishnan 已提交
220
        Action f = this.Init(); // everywhere else.
B
Balaji Krishnan 已提交
221 222 223 224 225 226 227
//]
    }
}";

        private static readonly string s_varWherePossiblePreviewTrue = @"
using System;
class C{
B
Balaji Krishnan 已提交
228
    void Init()
B
Balaji Krishnan 已提交
229 230
    {
//[
B
Balaji Krishnan 已提交
231
        var f = this.Init(); // everywhere else.
232 233 234
//]
    }
}";
B
Balaji Krishnan 已提交
235 236
        #endregion

237 238
        internal StyleViewModel(OptionSet optionSet, IServiceProvider serviceProvider) : base(optionSet, serviceProvider, LanguageNames.CSharp)
        {
B
Balaji Krishnan 已提交
239
            var collectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(CodeStyleItems);
B
Balaji Krishnan 已提交
240
            collectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(AbstractCodeStyleOptionViewModel.GroupName)));
241

B
Balaji Krishnan 已提交
242 243 244
            var qualifyGroupTitle = CSharpVSResources.QualifyGroupTitle;
            var predefinedTypesGroupTitle = CSharpVSResources.PredefinedTypesGroupTitle;
            var varGroupTitle = CSharpVSResources.VarGroupTitle;
245

B
Balaji Krishnan 已提交
246 247
            var qualifyMemberAccessPreferences = new List<CodeStylePreference>
            {
B
Balaji Krishnan 已提交
248 249
                new CodeStylePreference(CSharpVSResources.PreferThis, isChecked: true),
                new CodeStylePreference(CSharpVSResources.DoNotPreferThis, isChecked: false),
B
Balaji Krishnan 已提交
250 251 252 253
            };

            var predefinedTypesPreferences = new List<CodeStylePreference>
            {
B
Balaji Krishnan 已提交
254 255
                new CodeStylePreference(CSharpVSResources.PreferPredefinedType, isChecked: true),
                new CodeStylePreference(CSharpVSResources.PreferFrameworkType, isChecked: false),
B
Balaji Krishnan 已提交
256
            };
257

258
            var typeStylePreferences = new List<CodeStylePreference>
259
            {
B
Balaji Krishnan 已提交
260 261
                new CodeStylePreference(CSharpVSResources.PreferVar, isChecked: true),
                new CodeStylePreference(CSharpVSResources.PreferExplicitType, isChecked: false),
262
            };
B
Balaji Krishnan 已提交
263

264 265 266 267
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyFieldAccess, CSharpVSResources.QualifyFieldAccessWithThis, s_fieldDeclarationPreviewTrue, s_fieldDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyPropertyAccess, CSharpVSResources.QualifyPropertyAccessWithThis, s_propertyDeclarationPreviewTrue, s_propertyDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyMethodAccess, CSharpVSResources.QualifyMethodAccessWithThis, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CodeStyleOptions.QualifyEventAccess, CSharpVSResources.QualifyEventAccessWithThis, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, this, optionSet, qualifyGroupTitle, qualifyMemberAccessPreferences));
B
Balaji Krishnan 已提交
268 269 270

            CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInDeclaration, CSharpVSResources.PreferIntrinsicPredefinedTypeKeywordInDeclaration, s_intrinsicPreviewDeclarationTrue, s_intrinsicPreviewDeclarationFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
            CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(SimplificationOptions.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, CSharpVSResources.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, s_intrinsicPreviewMemberAccessTrue, s_intrinsicPreviewMemberAccessFalse, this, optionSet, predefinedTypesGroupTitle, predefinedTypesPreferences));
271

272 273 274
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes, CSharpVSResources.UseImplicitTypeForIntrinsicTypes, s_varForIntrinsicsPreviewTrue, s_varForIntrinsicsPreviewFalse, this, optionSet, varGroupTitle, typeStylePreferences));
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, CSharpVSResources.UseImplicitTypeWhenTypeIsApparent, s_varWhereApparentPreviewTrue, s_varWhereApparentPreviewFalse, this, optionSet, varGroupTitle, typeStylePreferences));
            CodeStyleItems.Add(new SimpleCodeStyleOptionViewModel(CSharpCodeStyleOptions.UseImplicitTypeWherePossible, CSharpVSResources.UseImplicitTypeWhenPossible, s_varWherePossiblePreviewTrue, s_varWherePossiblePreviewFalse, this, optionSet, varGroupTitle, typeStylePreferences));
275 276 277
        }
    }
}