/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/VisualStudio/CSharp/Impl/Options/Formatting/StyleViewModel.cs
2 519 строк
78 KB
Cyrus Najmabadi
Use implicit object creation expressions
13 сен 2025, 01:48
13 сен 2025, 01:48
4c6a36a
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Collections.Generic; using System.Windows.Data; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.AddImport; using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.CodeStyle; using Microsoft.CodeAnalysis.Editor.CSharp; using Microsoft.VisualStudio.LanguageServices.Implementation.Options; namespace Microsoft.VisualStudio.LanguageServices.CSharp.Options.Formatting; /// <summary> /// This is the view model for CodeStyle options page. /// </summary> /// <remarks> /// The codestyle options page is defined in <see cref="CodeStylePage"/> /// </remarks> internal sealed class StyleViewModel : AbstractOptionPreviewViewModel { #region "Preview Text" private const string s_fieldDeclarationPreviewTrue = """ class C{ int capacity; void Method() { //[ this.capacity = 0; //] } } """; private const string s_fieldDeclarationPreviewFalse = """ class C{ int capacity; void Method() { //[ capacity = 0; //] } } """; private const string s_propertyDeclarationPreviewTrue = """ class C{ public int Id { get; set; } void Method() { //[ this.Id = 0; //] } } """; private const string s_propertyDeclarationPreviewFalse = """ class C{ public int Id { get; set; } void Method() { //[ Id = 0; //] } } """; private const string s_eventDeclarationPreviewTrue = """ using System; class C{ event EventHandler Elapsed; void Handler(object sender, EventArgs args) { //[ this.Elapsed += Handler; //] } } """; private const string s_eventDeclarationPreviewFalse = """ using System; class C{ event EventHandler Elapsed; void Handler(object sender, EventArgs args) { //[ Elapsed += Handler; //] } } """; private const string s_methodDeclarationPreviewTrue = """ using System; class C{ void Display() { //[ this.Display(); //] } } """; private const string s_methodDeclarationPreviewFalse = """ using System; class C{ void Display() { //[ Display(); //] } } """; private const string s_intrinsicPreviewDeclarationTrue = """ class Program { //[ private int _member; static void M(int argument) { int local; } //] } """; private const string s_intrinsicPreviewDeclarationFalse = """ using System; class Program { //[ private Int32 _member; static void M(Int32 argument) { Int32 local; } //] } """; private const string s_intrinsicPreviewMemberAccessTrue = """ class Program { //[ static void M() { var local = int.MaxValue; } //] } """; private const string s_intrinsicPreviewMemberAccessFalse = """ using System; class Program { //[ static void M() { var local = Int32.MaxValue; } //] } """; private static readonly string s_varForIntrinsicsPreviewFalse = $$""" using System; class C{ void Method() { //[ int x = 5; // {{ServicesVSResources.built_in_types}} //] } } """; private static readonly string s_varForIntrinsicsPreviewTrue = $$""" using System; class C{ void Method() { //[ var x = 5; // {{ServicesVSResources.built_in_types}} //] } } """; private static readonly string s_varWhereApparentPreviewFalse = $$""" using System; class C{ void Method() { //[ C cobj = new C(); // {{ServicesVSResources.type_is_apparent_from_assignment_expression}} //] } } """; private static readonly string s_varWhereApparentPreviewTrue = $$""" using System; class C{ void Method() { //[ var cobj = new C(); // {{ServicesVSResources.type_is_apparent_from_assignment_expression}} //] } } """; private static readonly string s_varWherePossiblePreviewFalse = $$""" using System; class C{ void Init() { //[ Action f = this.Init(); // {{ServicesVSResources.everywhere_else}} //] } } """; private static readonly string s_varWherePossiblePreviewTrue = $$""" using System; class C{ void Init() { //[ var f = this.Init(); // {{ServicesVSResources.everywhere_else}} //] } } """; private static readonly string s_preferThrowExpression = $$""" using System; class C { private string s; void M1(string s) { //[ // {{ServicesVSResources.Prefer_colon}} this.s = s ?? throw new ArgumentNullException(nameof(s)); //] } void M2(string s) { //[ // {{ServicesVSResources.Over_colon}} if (s == null) { throw new ArgumentNullException(nameof(s)); } this.s = s; //] } } """; private static readonly string s_preferCoalesceExpression = $$""" using System; class C { private string s; void M1(string s) { //[ // {{ServicesVSResources.Prefer_colon}} var v = x ?? y; //] } void M2(string s) { //[ // {{ServicesVSResources.Over_colon}} var v = x != null ? x : y; // {{ServicesVSResources.or}} var v = x == null ? y : x; //] } } """; private static readonly string s_preferConditionalDelegateCall = $$""" using System; class C { private string s; void M1(string s) { //[ // {{ServicesVSResources.Prefer_colon}} func?.Invoke(args); //] } void M2(string s) { //[ // {{ServicesVSResources.Over_colon}} if (func != null) { func(args); } //] } } """; private static readonly string s_preferNullPropagation = $$""" using System; class C { void M1(object o) { //[ // {{ServicesVSResources.Prefer_colon}} var v = o?.ToString(); //] } void M2(object o) { //[ // {{ServicesVSResources.Over_colon}} var v = o == null ? null : o.ToString(); // {{ServicesVSResources.or}} var v = o != null ? o.ToString() : null; //] } } """; private static readonly string s_preferSwitchExpression = $$""" class C { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} return num switch { 1 => 1, _ => 2, } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} switch (num) { case 1: return 1; default: return 2; } //] } } """; private static readonly string s_preferPatternMatching = $$""" class C { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} return num is 1 or 2; //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} return num == 1 || num == 2; //] } } """; private static readonly string s_preferPatternMatchingOverAsWithNullCheck = $$""" class C { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} if (o is string s) { } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} var s = o as string; if (s != null) { } //] } } """; private static readonly string s_preferPatternMatchingOverMixedTypeCheck = $$""" class C { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} if (o is not string s) { } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} if (!(o is string s)) { } //] } } """; private static readonly string s_preferConditionalExpressionOverIfWithAssignments = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} string s = expr ? "hello" : "world"; // {{ServicesVSResources.Over_colon}} string s; if (expr) { s = "hello"; } else { s = "world"; } //] } } """; private static readonly string s_preferConditionalExpressionOverIfWithReturns = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} return expr ? "hello" : "world"; // {{ServicesVSResources.Over_colon}} if (expr) { return "hello"; } else { return "world"; } //] } } """; private static readonly string s_preferPatternMatchingOverIsWithCastCheck = $$""" class C { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} if (o is int i) { } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} if (o is int) { var i = (int)o; } //] } } """; private static readonly string s_preferObjectInitializer = $$""" using System; class Customer { private int Age; void M1() { //[ // {{ServicesVSResources.Prefer_colon}} var c = new Customer() { Age = 21 }; //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} var c = new Customer(); c.Age = 21; //] } } """; private static readonly string s_preferCollectionInitializer = $$""" using System.Collections.Generic; class Customer { private int Age; void M1() { //[ // {{ServicesVSResources.Prefer_colon}} var list = new List<int> { 1, 2, 3 }; //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} var list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); //] } } """; private static readonly string s_preferExplicitTupleName = $$""" class Customer { void M1() { //[ // {{ServicesVSResources.Prefer_colon}} (string name, int age) customer = GetCustomer(); var name = customer.name; var age = customer.age; //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} (string name, int age) customer = GetCustomer(); var name = customer.Item1; var age = customer.Item2; //] } } """; private static readonly string s_preferSimpleDefaultExpression = $$""" using System.Threading; class Customer1 { //[ // {{ServicesVSResources.Prefer_colon}} void DoWork(CancellationToken cancellationToken = default) { } //] } class Customer2 { //[ // {{ServicesVSResources.Over_colon}} void DoWork(CancellationToken cancellationToken = default(CancellationToken)) { } //] } """; private static readonly string s_preferSimplifiedConditionalExpression = $$""" using System.Threading; class Customer1 { bool A() => true; bool B() => true; void M1() { //[ // {{ServicesVSResources.Prefer_colon}} var x = A() && B(); //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} var x = A() && B() ? true : false //] } } """; private static readonly string s_preferInferredTupleName = $$""" using System.Threading; class Customer { void M1(int age, string name) { //[ // {{ServicesVSResources.Prefer_colon}} var tuple = (age, name); //] } void M2(int age, string name) { //[ // {{ServicesVSResources.Over_colon}} var tuple = (age: age, name: name); //] } } """; private static readonly string s_preferInferredAnonymousTypeMemberName = $$""" using System.Threading; class Customer { void M1(int age, string name) { //[ // {{ServicesVSResources.Prefer_colon}} var anon = new { age, name }; //] } void M2(int age, string name) { //[ // {{ServicesVSResources.Over_colon}} var anon = new { age = age, name = name }; //] } } """; private static readonly string s_preferInlinedVariableDeclaration = $$""" using System; class Customer { void M1(string value) { //[ // {{ServicesVSResources.Prefer_colon}} if (int.TryParse(value, out int i)) { } //] } void M2(string value) { //[ // {{ServicesVSResources.Over_colon}} int i; if (int.TryParse(value, out i)) { } //] } } """; private static readonly string s_preferDeconstructedVariableDeclaration = $$""" using System; class Customer { void M1(string value) { //[ // {{ServicesVSResources.Prefer_colon}} var (name, age) = GetPersonTuple(); Console.WriteLine($"{name} {age}"); (int x, int y) = GetPointTuple(); Console.WriteLine($"{x} {y}"); //] } void M2(string value) { //[ // {{ServicesVSResources.Over_colon}} var person = GetPersonTuple(); Console.WriteLine($"{person.name} {person.age}"); (int x, int y) point = GetPointTuple(); Console.WriteLine($"{point.x} {point.y}"); //] } } """; private static readonly string s_doNotPreferBraces = $$""" using System; class Customer { private int Age; void M1() { //[ // {{ServicesVSResources.Allow_colon}} if (test) Console.WriteLine("Text"); // {{ServicesVSResources.Allow_colon}} if (test) Console.WriteLine("Text"); // {{ServicesVSResources.Allow_colon}} if (test) Console.WriteLine( "Text"); // {{ServicesVSResources.Allow_colon}} if (test) { Console.WriteLine( "Text"); } //] } } """; private static readonly string s_preferBracesWhenMultiline = $$""" using System; class Customer { private int Age; void M1() { //[ // {{ServicesVSResources.Allow_colon}} if (test) Console.WriteLine("Text"); // {{ServicesVSResources.Allow_colon}} if (test) Console.WriteLine("Text"); // {{ServicesVSResources.Prefer_colon}} if (test) { Console.WriteLine( "Text"); } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} if (test) Console.WriteLine( "Text"); //] } } """; private static readonly string s_preferBraces = $$""" using System; class Customer { private int Age; void M1() { //[ // {{ServicesVSResources.Prefer_colon}} if (test) { Console.WriteLine("Text"); } //] } void M2() { //[ // {{ServicesVSResources.Over_colon}} if (test) Console.WriteLine("Text"); //] } } """; private static readonly string s_preferAutoProperties = $$""" using System; class Customer1 { //[ // {{ServicesVSResources.Prefer_colon}} public int Age { get; } //] } class Customer2 { //[ // {{ServicesVSResources.Over_colon}} private int age; public int Age { get { return age; } } //] } """; private static readonly string s_preferFileScopedNamespace = $$""" //[ // {{ServicesVSResources.Prefer_colon}} namespace A.B.C; public class Program { } //] //[ // {{ServicesVSResources.Over_colon}} namespace A.B.C { public class Program { } } //] """; private static readonly string s_preferBlockNamespace = $$""" //[ // {{ServicesVSResources.Prefer_colon}} namespace A.B.C { public class Program { } } //] //[ // {{ServicesVSResources.Over_colon}} namespace A.B.C; public class Program { } //] """; private static readonly string s_preferSimpleUsingStatement = $$""" using System; class Customer1 { //[ // {{ServicesVSResources.Prefer_colon}} void Method() { using var resource = GetResource(); ProcessResource(resource); } //] } class Customer2 { //[ // {{ServicesVSResources.Over_colon}} void Method() { using (var resource = GetResource()) { ProcessResource(resource); } } //] } """; private static readonly string s_preferSystemHashCode = $$""" using System; class Customer1 { int a, b, c; //[ // {{ServicesVSResources.Prefer_colon}} // {{ServicesVSResources.Requires_System_HashCode_be_present_in_project}} public override int GetHashCode() { return System.HashCode.Combine(a, b, c); } //] } class Customer2 { int a, b, c; //[ // {{ServicesVSResources.Over_colon}} public override int GetHashCode() { var hashCode = 339610899; hashCode = hashCode * -1521134295 + a.GetHashCode(); hashCode = hashCode * -1521134295 + b.GetHashCode(); hashCode = hashCode * -1521134295 + c.GetHashCode(); return hashCode; } //] } """; private static readonly string s_preferMethodGroupConversion = $$""" using System; class Customer1 { public void M() { //[ // {{ServicesVSResources.Prefer_colon}} Action<object> writeObject = Console.Write; //] } } class Customer2 { public void M() { //[ // {{ServicesVSResources.Over_colon}} Action<object> writeObject = obj => Console.Write(obj); //] } //] } """; private static readonly string s_preferTopLevelStatements = $$""" using System; //[ // {{ServicesVSResources.Prefer_colon}} Console.WriteLine("Hello, World!"); //] //[ // {{ServicesVSResources.Over_colon}} internal class Program { private static void Main(string[] args) { Console.WriteLine("Hello, World!"); } } //] """; private static readonly string s_preferProgramMain = $$""" using System; //[ // {{ServicesVSResources.Prefer_colon}} internal class Program { private static void Main(string[] args) { Console.WriteLine("Hello, World!"); } } //] //[ // {{ServicesVSResources.Over_colon}} Console.WriteLine("Hello, World!"); //] """; private static readonly string s_preferLocalFunctionOverAnonymousFunction = $$""" using System; class Customer { void M1(string value) { //[ // {{ServicesVSResources.Prefer_colon}} int fibonacci(int n) { return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2); } //] } void M2(string value) { //[ // {{ServicesVSResources.Over_colon}} Func<int, int> fibonacci = null; fibonacci = (int n) => { return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2); }; //] } } """; private static readonly string s_preferCompoundAssignments = $$""" using System; class Customer { void M1(int value) { //[ // {{ServicesVSResources.Prefer_colon}} value += 10; //] } void M2(int value) { //[ // {{ServicesVSResources.Over_colon}} value = value + 10 //] } } """; private static readonly string s_preferImplicitObjectCreationWhenTypeIsApparent = $$""" using System.Collections.Generic; class Order {} //[ class Customer { // {{ServicesVSResources.Prefer_colon}} private readonly List<Order> orders = new(); // {{ServicesVSResources.Over_colon}} private readonly List<Order> orders = new List<Order>(); } //] """; private static readonly string s_preferIndexOperator = $$""" using System; class Customer { void M1(string value) { //[ // {{ServicesVSResources.Prefer_colon}} var ch = value[^1]; //] } void M2(string value) { //[ // {{ServicesVSResources.Over_colon}} var ch = value[value.Length - 1]; //] } } """; private static readonly string s_preferRangeOperator = $$""" using System; class Customer { void M1(string value) { //[ // {{ServicesVSResources.Prefer_colon}} var sub = value[1..^1]; //] } void M2(string value) { //[ // {{ServicesVSResources.Over_colon}} var sub = value.Substring(1, value.Length - 2); //] } } """; private static readonly string s_preferTupleSwap = $$""" using System; class Customer { void M1(string[] args) { //[ // {{ServicesVSResources.Prefer_colon}} (args[1], args[0]) = (args[0], args[1]); //] } void M2(string[] args) { //[ // {{ServicesVSResources.Over_colon}} var temp = args[0]; args[0] = args[1]; args[1] = temp; //] } } """; private static readonly string s_preferIsNullOverReferenceEquals = $$""" using System; class Customer { void M1(string value1, string value2) { //[ // {{ServicesVSResources.Prefer_colon}} if (value1 is null) return; if (value2 is null) return; //] } void M2(string value1, string value2) { //[ // {{ServicesVSResources.Over_colon}} if (object.ReferenceEquals(value1, null)) return; if ((object)value2 == null) return; //] } } """; private static readonly string s_preferNullcheckOverTypeCheck = $$""" using System; class Customer { void M1(string value1, string value2) { //[ // {{ServicesVSResources.Prefer_colon}} if (value1 is null) return; if (value2 is not null) return; //] } void M2(string value1, string value2) { //[ // {{ServicesVSResources.Over_colon}} if (value1 is not object) return; if (value2 is object) return; //] } } """; #region expression and block bodies private const string s_preferExpressionBodyForMethods = """ using System; //[ class Customer { private int Age; public int GetAge() => this.Age; } //] """; private const string s_preferBlockBodyForMethods = """ using System; //[ class Customer { private int Age; public int GetAge() { return this.Age; } } //] """; private const string s_preferExpressionBodyForConstructors = """ using System; //[ class Customer { private int Age; public Customer(int age) => Age = age; } //] """; private const string s_preferBlockBodyForConstructors = """ using System; //[ class Customer { private int Age; public Customer(int age) { Age = age; } } //] """; private const string s_preferExpressionBodyForOperators = """ using System; struct ComplexNumber { //[ public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2) => new ComplexNumber(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary); //] } """; private const string s_preferBlockBodyForOperators = """ using System; struct ComplexNumber { //[ public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2) { return new ComplexNumber(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary); } //] } """; private const string s_preferExpressionBodyForProperties = """ using System; //[ class Customer { private int _age; public int Age => _age; } //] """; private const string s_preferBlockBodyForProperties = """ using System; //[ class Customer { private int _age; public int Age { get { return _age; } } } //] """; private const string s_preferExpressionBodyForAccessors = """ using System; //[ class Customer { private int _age; public int Age { get => _age; set => _age = value; } } //] """; private const string s_preferBlockBodyForAccessors = """ using System; //[ class Customer { private int _age; public int Age { get { return _age; } set { _age = value; } } } //] """; private const string s_preferExpressionBodyForIndexers = """ using System; //[ class List<T> { private T[] _values; public T this[int i] => _values[i]; } //] """; private const string s_preferBlockBodyForIndexers = """ using System; //[ class List<T> { private T[] _values; public T this[int i] { get { return _values[i]; } } } //] """; private const string s_preferExpressionBodyForLambdas = """ using System; class Customer { void Method() { //[ Func<int, string> f = a => a.ToString(); //] } } """; private const string s_preferBlockBodyForLambdas = """ using System; class Customer { void Method() { //[ Func<int, string> f = a => { return a.ToString(); }; //] } } """; private const string s_preferExpressionBodyForLocalFunctions = """ using System; //[ class Customer { private int Age; public int GetAge() { return GetAgeLocal(); int GetAgeLocal() => this.Age; } } //] """; private const string s_preferBlockBodyForLocalFunctions = """ using System; //[ class Customer { private int Age; public int GetAge() { return GetAgeLocal(); int GetAgeLocal() { return this.Age; } } } //] """; private static readonly string s_preferReadonly = $$""" class Customer1 { //[ // {{ServicesVSResources.Prefer_colon}} // '_value' can only be assigned in constructor private readonly int _value = 0; //] } class Customer2 { //[ // {{ServicesVSResources.Over_colon}} // '_value' can be assigned anywhere private int _value = 0; //] } """; private static readonly string[] s_usingDirectivePlacement = [$$""" //[ namespace Namespace { // {{CSharpVSResources.Inside_namespace}} using System; using System.Linq; class Customer { } } //] """, $$""" //[ // {{CSharpEditorResources.Outside_namespace}} using System; using System.Linq; namespace Namespace { class Customer { } } //] """]; private static readonly string s_preferReadOnlyStruct = $$""" //[ // {{ServicesVSResources.Prefer_colon}} readonly struct Point { public readonly int X, Y; } //] //[ // {{ServicesVSResources.Over_colon}} struct Point { public readonly int X, Y; } //] """; private static readonly string s_preferStaticLocalFunction = $$""" class Customer1 { //[ void Method() { // {{ServicesVSResources.Prefer_colon}} static int fibonacci(int n) { return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2); } } //] } class Customer2 { //[ void Method() { // {{ServicesVSResources.Over_colon}} int fibonacci(int n) { return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2); } } //] } """; private static readonly string s_preferStaticAnonymousFunction = $$""" using System; //[ // {{ServicesVSResources.Prefer_colon}} Func<int, int> f = static i => i * i; //] //[ // {{ServicesVSResources.Over_colon}} Func<int, int> f = i => i * i; //] """; #endregion #region New Line Preferences private static readonly string s_allow_embedded_statements_on_same_line_true = $$""" class Class2 { void Method(int a, int b) { //[ // {{ServicesVSResources.Allow_colon}} if (a > b) return true; //] return false; } } """; private static readonly string s_allow_embedded_statements_on_same_line_false = $$""" class Class1 { void Method(int a, int b) { //[ // {{ServicesVSResources.Require_colon}} if (a > b) return true; //] return false; } } class Class2 { void Method(int a, int b) { //[ // {{ServicesVSResources.Over_colon}} if (a > b) return true; //] return false; } } """; private static readonly string s_allow_blank_line_between_consecutive_braces_true = $$""" class Class2 { //[ // {{ServicesVSResources.Allow_colon}} void Method() { if (true) { DoWork(); } } //] } """; private static readonly string s_allow_blank_line_between_consecutive_braces_false = $$""" class Class1 { //[ // {{ServicesVSResources.Require_colon}} void Method() { if (true) { DoWork(); } } //] } class Class2 { //[ // {{ServicesVSResources.Over_colon}} void Method() { if (true) { DoWork(); } } //] } """; private static readonly string s_allow_multiple_blank_lines_true = $$""" class Class2 { void Method() { //[ // {{ServicesVSResources.Allow_colon}} if (true) { DoWork(); } return; //] } } """; private static readonly string s_allow_multiple_blank_lines_false = $$""" class Class1 { void Method() { //[ // {{ServicesVSResources.Require_colon}} if (true) { DoWork(); } return; //] } } class Class2 { void Method() { //[ // {{ServicesVSResources.Over_colon}} if (true) { DoWork(); } return; //] } } """; private static readonly string s_allow_statement_immediately_after_block_true = $$""" class Class2 { void Method() { //[ // {{ServicesVSResources.Allow_colon}} if (true) { DoWork(); } return; //] } } """; private static readonly string s_allow_statement_immediately_after_block_false = $$""" class Class1 { void Method() { //[ // {{ServicesVSResources.Require_colon}} if (true) { DoWork(); } return; //] } } class Class2 { void Method() { //[ // {{ServicesVSResources.Over_colon}} if (true) { DoWork(); } return; //] } } """; private static readonly string s_allow_blank_line_after_colon_in_constructor_initializer_true = $$""" class Class { //[ // {{ServicesVSResources.Allow_colon}} public Class() : base() { } //] } """; private static readonly string s_allow_blank_line_after_colon_in_constructor_initializer_false = $$""" namespace NS1 { class Class { //[ // {{ServicesVSResources.Require_colon}} public Class() : base() { } //] } } namespace NS2 { class Class { //[ // {{ServicesVSResources.Over_colon}} public Class() : base() { } //] } } """; private static readonly string s_allow_blank_line_after_token_in_conditional_expression_true = $$""" class Class { //[ // {{ServicesVSResources.Allow_colon}} void Method() { var result = CheckCondition() ? WhenTrue : WhenFalse; } //] } """; private static readonly string s_allow_blank_line_after_token_in_conditional_expression_false = $$""" namespace NS1 { class Class { //[ // {{ServicesVSResources.Require_colon}} void Method() { var result = CheckCondition() ? WhenTrue : WhenFalse; } //] } } namespace NS2 { class Class { //[ // {{ServicesVSResources.Over_colon}} void Method() { var result = CheckCondition() ? WhenTrue : WhenFalse; } //] } } """; private static readonly string s_allow_blank_line_after_token_in_arrow_expression_clause_true = $$""" class Class { //[ // {{ServicesVSResources.Allow_colon}} int Method() => 1 + 1; //] } """; private static readonly string s_allow_blank_line_after_token_in_arrow_expression_clause_false = $$""" namespace NS1 { class Class { //[ // {{ServicesVSResources.Require_colon}} int Method() => 1 + 1; //] } } namespace NS2 { class Class { //[ // {{ServicesVSResources.Over_colon}} int Method() => 1 + 1; //] } } """; #endregion #region arithmetic binary parentheses private readonly string s_arithmeticBinaryAlwaysForClarity = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a + (b * c); // {{ServicesVSResources.Over_colon}} var v = a + b * c; //] } } """; private readonly string s_arithmeticBinaryNeverIfUnnecessary = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a + b * c; // {{ServicesVSResources.Over_colon}} var v = a + (b * c); //] } } """; #endregion #region relational binary parentheses private readonly string s_relationalBinaryAlwaysForClarity = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = (a < b) == (c > d); // {{ServicesVSResources.Over_colon}} var v = a < b == c > d; //] } } """; private readonly string s_relationalBinaryNeverIfUnnecessary = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a < b == c > d; // {{ServicesVSResources.Over_colon}} var v = (a < b) == (c > d); //] } } """; #endregion #region other binary parentheses private readonly string s_otherBinaryAlwaysForClarity = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a || (b && c); // {{ServicesVSResources.Over_colon}} var v = a || b && c; //] } } """; private readonly string s_otherBinaryNeverIfUnnecessary = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a || b && c; // {{ServicesVSResources.Over_colon}} var v = a || (b && c); //] } } """; #endregion #region other parentheses private readonly string s_otherParenthesesAlwaysForClarity = $$""" class C { void M() { //[ // {{ServicesVSResources.Keep_all_parentheses_in_colon}} var v = (a.b).Length; //] } } """; private readonly string s_otherParenthesesNeverIfUnnecessary = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} var v = a.b.Length; // {{ServicesVSResources.Over_colon}} var v = (a.b).Length; //] } } """; #endregion #region unused parameters private static readonly string s_avoidUnusedParametersNonPublicMethods = $$""" class C1 { //[ // {{ServicesVSResources.Prefer_colon}} private void M() { } //] } class C2 { //[ // {{ServicesVSResources.Over_colon}} private void M(int param) { } //] } """; private static readonly string s_avoidUnusedParametersAllMethods = $$""" class C1 { //[ // {{ServicesVSResources.Prefer_colon}} public void M() { } //] } class C2 { //[ // {{ServicesVSResources.Over_colon}} public void M(int param) { } //] } """; #endregion #region unused values private static readonly string s_avoidUnusedValueAssignmentUnusedLocal = $$""" class C { int M() { //[ // {{ServicesVSResources.Prefer_colon}} int unused = Computation(); // {{ServicesVSResources.Unused_value_is_explicitly_assigned_to_an_unused_local}} int x = 1; //] return x; } int Computation() => 0; } class C2 { int M() { //[ // {{ServicesVSResources.Over_colon}} int x = Computation(); // {{ServicesVSResources.Value_assigned_here_is_never_used}} x = 1; //] return x; } int Computation() => 0; } """; private static readonly string s_avoidUnusedValueAssignmentDiscard = $$""" class C { int M() { //[ // {{ServicesVSResources.Prefer_colon}} _ = Computation(); // {{ServicesVSResources.Unused_value_is_explicitly_assigned_to_discard}} int x = 1; //] return x; } int Computation() => 0; } class C2 { int M() { //[ // {{ServicesVSResources.Over_colon}} int x = Computation(); // {{ServicesVSResources.Value_assigned_here_is_never_used}} x = 1; //] return x; } int Computation() => 0; } """; private static readonly string s_avoidUnusedValueExpressionStatementUnusedLocal = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} int unused = Computation(); // {{ServicesVSResources.Unused_value_is_explicitly_assigned_to_an_unused_local}} //] } int Computation() => 0; } class C2 { void M() { //[ // {{ServicesVSResources.Over_colon}} Computation(); // {{ServicesVSResources.Value_returned_by_invocation_is_implicitly_ignored}} //] } int Computation() => 0; } """; private static readonly string s_avoidUnusedValueExpressionStatementDiscard = $$""" class C { void M() { //[ // {{ServicesVSResources.Prefer_colon}} _ = Computation(); // {{ServicesVSResources.Unused_value_is_explicitly_assigned_to_discard}} //] } int Computation() => 0; } class C2 { void M() { //[ // {{ServicesVSResources.Over_colon}} Computation(); // {{ServicesVSResources.Value_returned_by_invocation_is_implicitly_ignored}} //] } int Computation() => 0; } """; #endregion #endregion internal StyleViewModel(OptionStore optionStore, IServiceProvider serviceProvider) : base(optionStore, serviceProvider, LanguageNames.CSharp) { var collectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(CodeStyleItems); collectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(AbstractCodeStyleOptionViewModel.GroupName))); var qualifyGroupTitle = CSharpVSResources.this_preferences_colon; var predefinedTypesGroupTitle = CSharpVSResources.predefined_type_preferences_colon; var varGroupTitle = CSharpVSResources.var_preferences_colon; var nullCheckingGroupTitle = CSharpVSResources.null_checking_colon; var usingsGroupTitle = CSharpVSResources.using_preferences_colon; var modifierGroupTitle = ServicesVSResources.Modifier_preferences_colon; var codeBlockPreferencesGroupTitle = ServicesVSResources.Code_block_preferences_colon; var expressionPreferencesGroupTitle = ServicesVSResources.Expression_preferences_colon; var patternMatchingPreferencesGroupTitle = CSharpVSResources.Pattern_matching_preferences_colon; var variablePreferencesGroupTitle = ServicesVSResources.Variable_preferences_colon; var parameterPreferencesGroupTitle = ServicesVSResources.Parameter_preferences_colon; var newLinePreferencesGroupTitle = ServicesVSResources.New_line_preferences_experimental_colon; var usingDirectivePlacementPreferences = new List<CodeStylePreference> { new(CSharpVSResources.Inside_namespace, isChecked: false), new(CSharpEditorResources.Outside_namespace, isChecked: false), }; var qualifyMemberAccessPreferences = new List<CodeStylePreference> { new(CSharpVSResources.Prefer_this, isChecked: true), new(CSharpVSResources.Do_not_prefer_this, isChecked: false), }; var predefinedTypesPreferences = new List<CodeStylePreference> { new(ServicesVSResources.Prefer_predefined_type, isChecked: true), new(ServicesVSResources.Prefer_framework_type, isChecked: false), }; var typeStylePreferences = new List<CodeStylePreference> { new(CSharpVSResources.Prefer_var, isChecked: true), new(CSharpVSResources.Prefer_explicit_type, isChecked: false), }; CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.QualifyFieldAccess, CSharpVSResources.Qualify_field_access_with_this, s_fieldDeclarationPreviewTrue, s_fieldDeclarationPreviewFalse, this, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.QualifyPropertyAccess, CSharpVSResources.Qualify_property_access_with_this, s_propertyDeclarationPreviewTrue, s_propertyDeclarationPreviewFalse, this, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.QualifyMethodAccess, CSharpVSResources.Qualify_method_access_with_this, s_methodDeclarationPreviewTrue, s_methodDeclarationPreviewFalse, this, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.QualifyEventAccess, CSharpVSResources.Qualify_event_access_with_this, s_eventDeclarationPreviewTrue, s_eventDeclarationPreviewFalse, this, optionStore, qualifyGroupTitle, qualifyMemberAccessPreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInDeclaration, ServicesVSResources.For_locals_parameters_and_members, s_intrinsicPreviewDeclarationTrue, s_intrinsicPreviewDeclarationFalse, this, optionStore, predefinedTypesGroupTitle, predefinedTypesPreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ServicesVSResources.For_member_access_expressions, s_intrinsicPreviewMemberAccessTrue, s_intrinsicPreviewMemberAccessFalse, this, optionStore, predefinedTypesGroupTitle, predefinedTypesPreferences)); // Use var CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.VarForBuiltInTypes, CSharpVSResources.For_built_in_types, s_varForIntrinsicsPreviewTrue, s_varForIntrinsicsPreviewFalse, this, optionStore, varGroupTitle, typeStylePreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.VarWhenTypeIsApparent, CSharpVSResources.When_variable_type_is_apparent, s_varWhereApparentPreviewTrue, s_varWhereApparentPreviewFalse, this, optionStore, varGroupTitle, typeStylePreferences)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.VarElsewhere, CSharpVSResources.Elsewhere, s_varWherePossiblePreviewTrue, s_varWherePossiblePreviewFalse, this, optionStore, varGroupTitle, typeStylePreferences)); // Code block AddBracesOptions(optionStore, codeBlockPreferencesGroupTitle); AddNamespaceDeclarationsOptions(optionStore, codeBlockPreferencesGroupTitle); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferAutoProperties, ServicesVSResources.analyzer_Prefer_auto_properties, s_preferAutoProperties, s_preferAutoProperties, this, optionStore, codeBlockPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferSimpleUsingStatement, ServicesVSResources.Prefer_simple_using_statement, s_preferSimpleUsingStatement, s_preferSimpleUsingStatement, this, optionStore, codeBlockPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferSystemHashCode, ServicesVSResources.Prefer_System_HashCode_in_GetHashCode, s_preferSystemHashCode, s_preferSystemHashCode, this, optionStore, codeBlockPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferMethodGroupConversion, ServicesVSResources.Prefer_method_group_conversion, s_preferMethodGroupConversion, s_preferMethodGroupConversion, this, optionStore, codeBlockPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferTopLevelStatements, ServicesVSResources.Prefer_top_level_statements, s_preferTopLevelStatements, s_preferProgramMain, this, optionStore, codeBlockPreferencesGroupTitle)); AddParenthesesOptions(OptionStore); // Expression preferences CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferObjectInitializer, ServicesVSResources.Prefer_object_initializer, s_preferObjectInitializer, s_preferObjectInitializer, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferCollectionInitializer, ServicesVSResources.Prefer_collection_initializer, s_preferCollectionInitializer, s_preferCollectionInitializer, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferSimplifiedBooleanExpressions, ServicesVSResources.Prefer_simplified_boolean_expressions, s_preferSimplifiedConditionalExpression, s_preferSimplifiedConditionalExpression, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferSwitchExpression, CSharpVSResources.Prefer_switch_expression, s_preferSwitchExpression, s_preferSwitchExpression, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferConditionalExpressionOverAssignment, ServicesVSResources.Prefer_conditional_expression_over_if_with_assignments, s_preferConditionalExpressionOverIfWithAssignments, s_preferConditionalExpressionOverIfWithAssignments, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferConditionalExpressionOverReturn, ServicesVSResources.Prefer_conditional_expression_over_if_with_returns, s_preferConditionalExpressionOverIfWithReturns, s_preferConditionalExpressionOverIfWithReturns, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferExplicitTupleNames, ServicesVSResources.Prefer_explicit_tuple_name, s_preferExplicitTupleName, s_preferExplicitTupleName, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferSimpleDefaultExpression, ServicesVSResources.Prefer_simple_default_expression, s_preferSimpleDefaultExpression, s_preferSimpleDefaultExpression, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferInferredTupleNames, ServicesVSResources.Prefer_inferred_tuple_names, s_preferInferredTupleName, s_preferInferredTupleName, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferInferredAnonymousTypeMemberNames, ServicesVSResources.Prefer_inferred_anonymous_type_member_names, s_preferInferredAnonymousTypeMemberName, s_preferInferredAnonymousTypeMemberName, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferLocalOverAnonymousFunction, ServicesVSResources.Prefer_local_function_over_anonymous_function, s_preferLocalFunctionOverAnonymousFunction, s_preferLocalFunctionOverAnonymousFunction, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferCompoundAssignment, ServicesVSResources.Prefer_compound_assignments, s_preferCompoundAssignments, s_preferCompoundAssignments, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.ImplicitObjectCreationWhenTypeIsApparent, CSharpVSResources.Prefer_implicit_object_creation_when_type_is_apparent, s_preferImplicitObjectCreationWhenTypeIsApparent, s_preferImplicitObjectCreationWhenTypeIsApparent, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferIndexOperator, ServicesVSResources.Prefer_index_operator, s_preferIndexOperator, s_preferIndexOperator, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferRangeOperator, ServicesVSResources.Prefer_range_operator, s_preferRangeOperator, s_preferRangeOperator, this, optionStore, expressionPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferTupleSwap, ServicesVSResources.Prefer_tuple_swap, s_preferTupleSwap, s_preferTupleSwap, this, optionStore, expressionPreferencesGroupTitle)); AddExpressionBodyOptions(optionStore, expressionPreferencesGroupTitle); AddUnusedValueOptions(optionStore, expressionPreferencesGroupTitle); // Pattern matching CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferPatternMatching, CSharpVSResources.Prefer_pattern_matching, s_preferPatternMatching, s_preferPatternMatching, this, optionStore, patternMatchingPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferPatternMatchingOverIsWithCastCheck, CSharpVSResources.Prefer_pattern_matching_over_is_with_cast_check, s_preferPatternMatchingOverIsWithCastCheck, s_preferPatternMatchingOverIsWithCastCheck, this, optionStore, patternMatchingPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferPatternMatchingOverAsWithNullCheck, CSharpVSResources.Prefer_pattern_matching_over_as_with_null_check, s_preferPatternMatchingOverAsWithNullCheck, s_preferPatternMatchingOverAsWithNullCheck, this, optionStore, patternMatchingPreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferNotPattern, CSharpVSResources.Prefer_pattern_matching_over_mixed_type_check, s_preferPatternMatchingOverMixedTypeCheck, s_preferPatternMatchingOverMixedTypeCheck, this, optionStore, patternMatchingPreferencesGroupTitle)); // Variable preferences CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferInlinedVariableDeclaration, ServicesVSResources.Prefer_inlined_variable_declaration, s_preferInlinedVariableDeclaration, s_preferInlinedVariableDeclaration, this, optionStore, variablePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferDeconstructedVariableDeclaration, ServicesVSResources.Prefer_deconstructed_variable_declaration, s_preferDeconstructedVariableDeclaration, s_preferDeconstructedVariableDeclaration, this, optionStore, variablePreferencesGroupTitle)); // Null preferences. CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferThrowExpression, CSharpVSResources.Prefer_throw_expression, s_preferThrowExpression, s_preferThrowExpression, this, optionStore, nullCheckingGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferConditionalDelegateCall, CSharpVSResources.Prefer_conditional_delegate_call, s_preferConditionalDelegateCall, s_preferConditionalDelegateCall, this, optionStore, nullCheckingGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferCoalesceExpression, ServicesVSResources.Prefer_coalesce_expression, s_preferCoalesceExpression, s_preferCoalesceExpression, this, optionStore, nullCheckingGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferNullPropagation, ServicesVSResources.Prefer_null_propagation, s_preferNullPropagation, s_preferNullPropagation, this, optionStore, nullCheckingGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferIsNullCheckOverReferenceEqualityMethod, EditorFeaturesResources.Prefer_is_null_for_reference_equality_checks, s_preferIsNullOverReferenceEquals, s_preferIsNullOverReferenceEquals, this, optionStore, nullCheckingGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferNullCheckOverTypeCheck, CSharpAnalyzersResources.Prefer_null_check_over_type_check, s_preferNullcheckOverTypeCheck, s_preferNullcheckOverTypeCheck, this, optionStore, nullCheckingGroupTitle)); // Using directive preferences. CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<AddImportPlacement>( CSharpCodeStyleOptions.PreferredUsingDirectivePlacement, CSharpVSResources.Preferred_using_directive_placement, [AddImportPlacement.InsideNamespace, AddImportPlacement.OutsideNamespace], s_usingDirectivePlacement, this, optionStore, usingsGroupTitle, usingDirectivePlacementPreferences)); // Modifier preferences. CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.PreferReadonly, ServicesVSResources.Prefer_readonly_fields, s_preferReadonly, s_preferReadonly, this, optionStore, modifierGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferReadOnlyStruct, ServicesVSResources.Prefer_read_only_struct, s_preferReadOnlyStruct, s_preferReadOnlyStruct, this, optionStore, modifierGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferStaticLocalFunction, ServicesVSResources.Prefer_static_local_functions, s_preferStaticLocalFunction, s_preferStaticLocalFunction, this, optionStore, modifierGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.PreferStaticAnonymousFunction, ServicesVSResources.Prefer_static_anonymous_functions, s_preferStaticAnonymousFunction, s_preferStaticAnonymousFunction, this, optionStore, modifierGroupTitle)); // Parameter preferences AddParameterOptions(optionStore, parameterPreferencesGroupTitle); // New line preferences. CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.AllowMultipleBlankLines, ServicesVSResources.Allow_multiple_blank_lines, s_allow_multiple_blank_lines_true, s_allow_multiple_blank_lines_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.AllowEmbeddedStatementsOnSameLine, CSharpVSResources.Allow_embedded_statements_on_same_line, s_allow_embedded_statements_on_same_line_true, s_allow_embedded_statements_on_same_line_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.AllowBlankLinesBetweenConsecutiveBraces, CSharpVSResources.Allow_blank_lines_between_consecutive_braces, s_allow_blank_line_between_consecutive_braces_true, s_allow_blank_line_between_consecutive_braces_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CodeStyleOptions2.AllowStatementImmediatelyAfterBlock, ServicesVSResources.Allow_statement_immediately_after_block, s_allow_statement_immediately_after_block_true, s_allow_statement_immediately_after_block_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.AllowBlankLineAfterColonInConstructorInitializer, CSharpVSResources.Allow_blank_line_after_colon_in_constructor_initializer, s_allow_blank_line_after_colon_in_constructor_initializer_true, s_allow_blank_line_after_colon_in_constructor_initializer_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.AllowBlankLineAfterTokenInConditionalExpression, CSharpVSResources.Allow_blank_line_after_token_in_conditional_expression, s_allow_blank_line_after_token_in_conditional_expression_true, s_allow_blank_line_after_token_in_conditional_expression_false, this, optionStore, newLinePreferencesGroupTitle)); CodeStyleItems.Add(new BooleanCodeStyleOptionViewModel(CSharpCodeStyleOptions.AllowBlankLineAfterTokenInArrowExpressionClause, CSharpVSResources.Allow_blank_line_after_token_in_arrow_expression_clause, s_allow_blank_line_after_token_in_arrow_expression_clause_true, s_allow_blank_line_after_token_in_arrow_expression_clause_false, this, optionStore, newLinePreferencesGroupTitle)); } private void AddParenthesesOptions(OptionStore optionStore) { AddParenthesesOption( optionStore, CodeStyleOptions2.ArithmeticBinaryParentheses, CSharpVSResources.In_arithmetic_binary_operators, [s_arithmeticBinaryAlwaysForClarity, s_arithmeticBinaryNeverIfUnnecessary], defaultAddForClarity: true); AddParenthesesOption( optionStore, CodeStyleOptions2.OtherBinaryParentheses, CSharpVSResources.In_other_binary_operators, [s_otherBinaryAlwaysForClarity, s_otherBinaryNeverIfUnnecessary], defaultAddForClarity: true); AddParenthesesOption( optionStore, CodeStyleOptions2.RelationalBinaryParentheses, CSharpVSResources.In_relational_binary_operators, [s_relationalBinaryAlwaysForClarity, s_relationalBinaryNeverIfUnnecessary], defaultAddForClarity: true); AddParenthesesOption( optionStore, CodeStyleOptions2.OtherParentheses, ServicesVSResources.In_other_operators, [s_otherParenthesesAlwaysForClarity, s_otherParenthesesNeverIfUnnecessary], defaultAddForClarity: false); } private void AddBracesOptions(OptionStore optionStore, string bracesPreferenceGroupTitle) { var bracesPreferences = new List<CodeStylePreference> { new(EditorFeaturesResources.Yes, isChecked: false), new(EditorFeaturesResources.No, isChecked: false), new(CSharpVSResources.When_on_multiple_lines, isChecked: false), }; var enumValues = new[] { PreferBracesPreference.Always, PreferBracesPreference.None, PreferBracesPreference.WhenMultiline }; CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<PreferBracesPreference>( CSharpCodeStyleOptions.PreferBraces, ServicesVSResources.Prefer_braces, enumValues, [s_preferBraces, s_doNotPreferBraces, s_preferBracesWhenMultiline], this, optionStore, bracesPreferenceGroupTitle, bracesPreferences)); } private void AddNamespaceDeclarationsOptions(OptionStore optionStore, string group) { var preferences = new List<CodeStylePreference> { new(CSharpVSResources.Block_scoped, isChecked: false), new(CSharpVSResources.File_scoped, isChecked: false), }; var enumValues = new[] { NamespaceDeclarationPreference.BlockScoped, NamespaceDeclarationPreference.FileScoped }; CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<NamespaceDeclarationPreference>( CSharpCodeStyleOptions.NamespaceDeclarations, ServicesVSResources.Namespace_declarations, enumValues, [s_preferBlockNamespace, s_preferFileScopedNamespace], this, optionStore, group, preferences)); } private void AddExpressionBodyOptions(OptionStore optionStore, string expressionPreferencesGroupTitle) { var expressionBodyPreferences = new List<CodeStylePreference> { new(ServicesVSResources.Never, isChecked: false), new(CSharpVSResources.When_possible, isChecked: false), new(CSharpVSResources.When_on_single_line, isChecked: false), }; var enumValues = new[] { ExpressionBodyPreference.Never, ExpressionBodyPreference.WhenPossible, ExpressionBodyPreference.WhenOnSingleLine }; CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedMethods, ServicesVSResources.Use_expression_body_for_methods, enumValues, [s_preferBlockBodyForMethods, s_preferExpressionBodyForMethods, s_preferExpressionBodyForMethods], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedConstructors, ServicesVSResources.Use_expression_body_for_constructors, enumValues, [s_preferBlockBodyForConstructors, s_preferExpressionBodyForConstructors, s_preferExpressionBodyForConstructors], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedOperators, ServicesVSResources.Use_expression_body_for_operators, enumValues, [s_preferBlockBodyForOperators, s_preferExpressionBodyForOperators, s_preferExpressionBodyForOperators], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedProperties, ServicesVSResources.Use_expression_body_for_properties, enumValues, [s_preferBlockBodyForProperties, s_preferExpressionBodyForProperties, s_preferExpressionBodyForProperties], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedIndexers, ServicesVSResources.Use_expression_body_for_indexers, enumValues, [s_preferBlockBodyForIndexers, s_preferExpressionBodyForIndexers, s_preferExpressionBodyForIndexers], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedAccessors, ServicesVSResources.Use_expression_body_for_accessors, enumValues, [s_preferBlockBodyForAccessors, s_preferExpressionBodyForAccessors, s_preferExpressionBodyForAccessors], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedLambdas, ServicesVSResources.Use_expression_body_for_lambdas, enumValues, [s_preferBlockBodyForLambdas, s_preferExpressionBodyForLambdas, s_preferExpressionBodyForLambdas], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<ExpressionBodyPreference>( CSharpCodeStyleOptions.PreferExpressionBodiedLocalFunctions, ServicesVSResources.Use_expression_body_for_local_functions, enumValues, [s_preferBlockBodyForLocalFunctions, s_preferExpressionBodyForLocalFunctions, s_preferExpressionBodyForLocalFunctions], this, optionStore, expressionPreferencesGroupTitle, expressionBodyPreferences)); } private void AddUnusedValueOptions(OptionStore optionStore, string expressionPreferencesGroupTitle) { var unusedValuePreferences = new List<CodeStylePreference> { new(ServicesVSResources.Unused_local, isChecked: false), new(CSharpVSResources.Discard, isChecked: true), }; var enumValues = new[] { UnusedValuePreference.UnusedLocalVariable, UnusedValuePreference.DiscardVariable }; CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<UnusedValuePreference>( CSharpCodeStyleOptions.UnusedValueAssignment, ServicesVSResources.Avoid_unused_value_assignments, enumValues, [s_avoidUnusedValueAssignmentUnusedLocal, s_avoidUnusedValueAssignmentDiscard], this, optionStore, expressionPreferencesGroupTitle, unusedValuePreferences)); CodeStyleItems.Add(new EnumCodeStyleOptionViewModel<UnusedValuePreference>( CSharpCodeStyleOptions.UnusedValueExpressionStatement, ServicesVSResources.Avoid_expression_statements_that_implicitly_ignore_value, enumValues, [s_avoidUnusedValueExpressionStatementUnusedLocal, s_avoidUnusedValueExpressionStatementDiscard], this, optionStore, expressionPreferencesGroupTitle, unusedValuePreferences)); } private void AddParameterOptions(OptionStore optionStore, string parameterPreferencesGroupTitle) { var examples = new[] { s_avoidUnusedParametersNonPublicMethods, s_avoidUnusedParametersAllMethods }; AddUnusedParameterOption(optionStore, parameterPreferencesGroupTitle, examples); } }