# Rules in this file were initially inferred by Visual Studio IntelliCode from the UA-.NETStandard
# codebase based on best match to current usage at 12/15/2019
# You can modify the rules from these initially generated values to suit your own policies
# You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference

###############################
# Core EditorConfig Options   #
###############################

root = true

# All files
[*]
indent_style = space

# Code files
[*.{cs,csx,vb,vbx}]
indent_size              = 4
charset                  = utf-8
trim_trailing_whitespace = true
end_of_line              = crlf
insert_final_newline     = true
max_line_length          = 120

# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2

# Xml config files
[*.{xml,props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2

# JSON files
[*.json]
indent_size = 2

# YAML files
[*.{yml,yaml}]
indent_size = 2

###############################
# .NET Coding Conventions     #
###############################

#### C# Formatting Rules ####
[*.cs]

# Null-checking preferences
csharp_style_throw_expression                                                 = true : suggestion
csharp_style_conditional_delegate_call                                        = true : suggestion

# Modifier preferences
# require braces to be on a new line for control_blocks, types, and methods (also known as "Allman" style)
csharp_new_line_before_open_brace                                             = control_blocks, types, methods, properties, accessors, object_collection
csharp_preferred_modifier_order                                               = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async : suggestion
csharp_new_line_before_catch                                                  = true
csharp_new_line_before_else                                                   = true : suggestion
csharp_new_line_before_finally                                                = true : suggestion
csharp_new_line_before_members_in_anonymous_types                             = true
csharp_new_line_before_members_in_object_initializers                         = true
csharp_new_line_between_query_expression_clauses                              = true

# Indentation preferences
csharp_indent_block_contents                                                  = true
csharp_indent_braces                                                          = false
csharp_indent_case_contents                                                   = true
csharp_indent_case_contents_when_block                                        = false
csharp_indent_labels                                                          = one_less_than_current
csharp_indent_switch_labels                                                   = true

# Space preferences
csharp_space_after_comma                                                      = true
csharp_space_after_dot                                                        = false
csharp_space_after_semicolon_in_for_statement                                 = true
csharp_space_around_binary_operators                                          = before_and_after
csharp_space_before_comma                                                     = false
csharp_space_before_dot                                                       = false
csharp_space_before_open_square_brackets                                      = false
csharp_space_before_semicolon_in_for_statement                                = false
csharp_space_between_empty_square_brackets                                    = false
csharp_space_between_method_declaration_name_and_open_parenthesis             = false
csharp_space_between_parentheses                                              = false
csharp_space_between_square_brackets                                          = false

#Formatting - organize using options

dotnet_sort_system_directives_first                                           = true
dotnet_separate_import_directive_groups                                       = false
csharp_style_prefer_method_group_conversion                                   = true : silent
csharp_style_prefer_top_level_statements                                      = true : silent

#Formatting - spacing options

csharp_space_after_cast                                                       = false
csharp_space_after_colon_in_inheritance_clause                                = true
csharp_space_after_keywords_in_control_flow_statements                        = true
csharp_space_before_colon_in_inheritance_clause                               = true
csharp_space_between_method_call_empty_parameter_list_parentheses             = false
csharp_space_between_method_call_name_and_opening_parenthesis                 = false
csharp_space_between_method_call_parameter_list_parentheses                   = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses      = false
csharp_space_between_method_declaration_parameter_list_parentheses            = false

#Formatting - wrapping options
csharp_preserve_single_line_blocks                                            = true
csharp_preserve_single_line_statements                                        = true

#Pattern - matching preferences
csharp_style_pattern_local_over_anonymous_function                            = true : suggestion
csharp_style_pattern_matching_over_is_with_cast_check                         = true : suggestion
csharp_style_pattern_matching_over_as_with_null_check                         = true : suggestion

#Style - expression bodied member options
csharp_style_expression_bodied_operators                                      = false : silent
csharp_style_expression_bodied_indexers                                       = true : silent
csharp_style_expression_bodied_accessors                                      = true : suggestion
csharp_style_expression_bodied_constructors                                   = false : suggestion
csharp_style_expression_bodied_methods                                        = false : suggestion
csharp_style_expression_bodied_properties                                     = true : silent
csharp_style_expression_bodied_lambdas                                        = true : silent
csharp_style_expression_bodied_local_functions                                = false : silent


#Style - expression level options
csharp_prefer_braces                                                          = true : silent
csharp_style_deconstructed_variable_declaration                               = true : suggestion
csharp_prefer_simple_default_expression                                       = true : suggestion
csharp_style_inlined_variable_declaration                                     = false : suggestion
csharp_prefer_simple_using_statement                                          = false : suggestion

#Style - implicit and explicit types
csharp_style_var_for_built_in_types                                           = false : suggestion
csharp_style_var_when_type_is_apparent                                        = true : suggestion
csharp_style_var_elsewhere                                                    = false : suggestion

#Style - language keyword and framework type options

#prefer the language keyword for local variables, method parameters, and class members,
#instead of the type name, for types that have a keyword to represent them
dotnet_style_predefined_type_for_locals_parameters_members                    = true : suggestion
dotnet_style_predefined_type_for_member_access                                = true : suggestion

#Style - qualification options
dotnet_style_qualification_for_event                                          = false : suggestion
dotnet_style_qualification_for_field                                          = false : suggestion
dotnet_style_qualification_for_method                                         = false : suggestion
dotnet_style_qualification_for_property                                       = false : suggestion

#Style - Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators                       = always_for_clarity : silent
dotnet_style_parentheses_in_relational_binary_operators                       = always_for_clarity : silent
dotnet_style_parentheses_in_other_binary_operators                            = always_for_clarity : silent
dotnet_style_parentheses_in_other_operators                                   = never_if_unnecessary : silent

#Style - Modifier preferences
dotnet_style_require_accessibility_modifiers                                  = for_non_interface_members : silent
dotnet_style_readonly_field                                                   = true : suggestion

#Style - Expression-level preferences
dotnet_style_object_initializer                                               = true : suggestion
dotnet_style_collection_initializer                                           = true : suggestion
dotnet_style_explicit_tuple_names                                             = true : suggestion
dotnet_style_null_propagation                                                 = true : suggestion
dotnet_style_coalesce_expression                                              = true : suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method              = true : silent
dotnet_style_prefer_inferred_tuple_names                                      = true : suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names                      = true : suggestion
dotnet_style_prefer_auto_properties                                           = true : silent
dotnet_style_prefer_conditional_expression_over_assignment                    = true : suggestion
dotnet_style_prefer_conditional_expression_over_return                        = true : suggestion

# 'using' directive preferences
csharp_using_directive_placement                                              = outside_namespace : suggestion
csharp_style_namespace_declarations                                           = block_scoped : suggestion

# Naming rules

# Async methods should have "Async" suffix
dotnet_naming_rule.async_methods_end_in_async.severity                        = suggestion
dotnet_naming_rule.async_methods_end_in_async.symbols                         = any_async_methods
dotnet_naming_rule.async_methods_end_in_async.style                           = end_in_async

dotnet_naming_symbols.any_async_methods.applicable_kinds                      = method, interface
dotnet_naming_symbols.any_async_methods.applicable_accessibilities            = *
dotnet_naming_symbols.any_async_methods.required_modifiers                    = async

dotnet_naming_style.end_in_async.required_suffix                              = Async
dotnet_naming_style.end_in_async.capitalization                               = pascal_case

# Private Constants are PascalCase and start with k
dotnet_naming_rule.constants_private_should_start_with_k.severity             = suggestion
dotnet_naming_rule.constants_private_should_start_with_k.symbols              = constants_with_k
dotnet_naming_rule.constants_private_should_start_with_k.style                = constants_with_k_style

dotnet_naming_symbols.constants_with_k.applicable_kinds                       = field, local
dotnet_naming_symbols.constants_with_k.applicable_accessibilities             = private, protected, private_protected, protected_friend
dotnet_naming_symbols.constants_with_k.required_modifiers                     = const

dotnet_naming_style.constants_with_k_style.capitalization                     = pascal_case
dotnet_naming_style.constants_with_k_style.required_prefix                    = k

# Constants are PascalCase
dotnet_naming_rule.constants_should_be_pascal_case.severity                   = suggestion
dotnet_naming_rule.constants_should_be_pascal_case.symbols                    = constants
dotnet_naming_rule.constants_should_be_pascal_case.style                      = constant_style

dotnet_naming_symbols.constants.applicable_kinds                              = field, local
dotnet_naming_symbols.constants.applicable_accessibilities                    = public, internal, protected_internal
dotnet_naming_symbols.constants.required_modifiers                            = const

dotnet_naming_style.constant_style.capitalization                             = pascal_case

# Non-private readonly fields are PascalCase
dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.symbols  = non_private_readonly_fields
dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.style    = non_private_readonly_field_style

dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds            = field
dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities  = public, protected, internal, protected_internal, private_protected
dotnet_naming_symbols.non_private_readonly_fields.required_modifiers          = readonly

dotnet_naming_style.non_private_readonly_field_style.capitalization           = pascal_case

# Non-private static fields are PascalCase
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity   = suggestion
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols    = non_private_static_fields
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style      = non_private_static_field_style

dotnet_naming_symbols.non_private_static_fields.applicable_kinds              = field
dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities    = public, protected, internal, protected_internal, private_protected
dotnet_naming_symbols.non_private_static_fields.required_modifiers            = static

dotnet_naming_style.non_private_static_field_style.capitalization             = pascal_case

# Private static fields are camelCase and start with s_
dotnet_naming_rule.static_fields_should_be_camel_case.severity                = suggestion
dotnet_naming_rule.static_fields_should_be_camel_case.symbols                 = static_fields
dotnet_naming_rule.static_fields_should_be_camel_case.style                   = static_field_style

dotnet_naming_symbols.static_fields.applicable_kinds                          = field
dotnet_naming_symbols.static_fields.applicable_accessibilities                = private, protected, private_protected, protected_friend
dotnet_naming_symbols.static_fields.required_modifiers                        = static

dotnet_naming_style.static_field_style.capitalization                         = camel_case
dotnet_naming_style.static_field_style.required_prefix                        = s_

# Private instance fields are camelCase and start with m_
dotnet_naming_rule.instance_fields_should_be_camel_case.severity              = suggestion
dotnet_naming_rule.instance_fields_should_be_camel_case.symbols               = instance_fields
dotnet_naming_rule.instance_fields_should_be_camel_case.style                 = instance_field_style

dotnet_naming_symbols.instance_fields.applicable_kinds                        = field
dotnet_naming_symbols.instance_fields.applicable_accessibilities              = private, protected, private_protected, protected_friend

dotnet_naming_style.instance_field_style.capitalization                       = camel_case
dotnet_naming_style.instance_field_style.required_prefix                      = m_

# Private event fields are PascalCase and start with m_
dotnet_naming_rule.instance_events_should_be_pascal_case.severity             = suggestion
dotnet_naming_rule.instance_events_should_be_pascal_case.symbols              = instance_events
dotnet_naming_rule.instance_events_should_be_pascal_case.style                = instance_events_style

dotnet_naming_symbols.instance_events.applicable_kinds                        = event
dotnet_naming_symbols.instance_events.applicable_accessibilities              = private, protected, private_protected, protected_friend

dotnet_naming_style.instance_events_style.capitalization                      = pascal_case
dotnet_naming_style.instance_events_style.required_prefix                     = m_

# Locals and parameters are camelCase
dotnet_naming_rule.locals_should_be_camel_case.severity                       = suggestion
dotnet_naming_rule.locals_should_be_camel_case.symbols                        = locals_and_parameters
dotnet_naming_rule.locals_should_be_camel_case.style                          = camel_case_style

dotnet_naming_symbols.locals_and_parameters.applicable_kinds                  = parameter, local

dotnet_naming_style.camel_case_style.capitalization                           = camel_case

# Local functions are PascalCase
dotnet_naming_rule.local_functions_should_be_pascal_case.severity             = suggestion
dotnet_naming_rule.local_functions_should_be_pascal_case.symbols              = local_functions
dotnet_naming_rule.local_functions_should_be_pascal_case.style                = local_function_style

dotnet_naming_symbols.local_functions.applicable_kinds                        = local_function

dotnet_naming_style.local_function_style.capitalization                       = pascal_case

# By default, name items with PascalCase
dotnet_naming_rule.members_should_be_pascal_case.severity                     = suggestion
dotnet_naming_rule.members_should_be_pascal_case.symbols                      = all_members
dotnet_naming_rule.members_should_be_pascal_case.style                        = pascal_case_style

dotnet_naming_symbols.all_members.applicable_kinds                            = *

dotnet_naming_style.pascal_case_style.capitalization                          = pascal_case

# Diagnostic settings (windows only)
dotnet_analyzer_diagnostic.category-style.severity                            = suggestion
dotnet_analyzer_diagnostic.category-globalization.severity                    = silent
dotnet_analyzer_diagnostic.category-design.severity                           = suggestion
dotnet_analyzer_diagnostic.category-reliability.severity                      = warning
dotnet_analyzer_diagnostic.category-performance.severity                      = warning
dotnet_analyzer_diagnostic.category-security.severity                         = warning

# Suggest only non breaking warnings

# CA1805: Do not initialize unnecessarily.
dotnet_diagnostic.CA1805.severity                                             = silent
dotnet_code_quality.CA1805.api_surface                                        = private, internal

# CA1822: Mark members as static.
dotnet_diagnostic.CA1822.severity                                             = suggestion
dotnet_code_quality.CA1822.api_surface                                        = private, internal

# CA3075: Insecure DTD processing in XML
dotnet_diagnostic.CA3075.severity                                             = error
dotnet_diagnostic.CA3077.severity                                             = error

# CA2007: Do not directly await a Task
dotnet_diagnostic.CA2007.severity                                             = warning

# IDE0049: Simplify Names
dotnet_diagnostic.IDE0049.severity                                            = silent

# CA1507: Use nameof in place of string
dotnet_diagnostic.CA1507.severity                                             = warning

# CA1510: Use ArgumentNullException throw helper
dotnet_diagnostic.CA1510.severity                                             = none

# CA1711: Identifiers should not have incorrect suffix
dotnet_diagnostic.CA1711.severity                                             = silent

# IDE1005: Simplify delegate invocation
dotnet_diagnostic.IDE1005.severity                                            = warning

# CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity                                             = warning

# CA1819: Properties should not return arrays
dotnet_diagnostic.CA1819.severity                                             = silent

# CA1721: The property name is confusing given the existence of another method with the same name.
dotnet_diagnostic.CA1721.severity                                             = silent

# exclude generated code
[**/Generated/*.cs]
generated_code = true
dotnet_diagnostic.severity = none
dotnet_analyzer.severity = none

[*.{Classes,DataTypes,Constants}.cs]
generated_code = true
dotnet_diagnostic.severity = none
dotnet_analyzer.severity = none
