# To learn more about .editorconfig see https://aka.ms/editorconfigdocs

# top-most EditorConfig file
root = true

# Default settings:
# A newline ending every file
# Use 4 spaces as indentation
[*]
insert_final_newline     = true
indent_style             = space
indent_size              = 4
trim_trailing_whitespace = true

[*.json]
indent_size = 2

[*.{cs,xaml}]
charset     = utf-8
end_of_line = crlf

# C# files
[*.cs]
# New line preferences
csharp_new_line_before_open_brace                                        = all
csharp_new_line_before_else                                              = true
csharp_new_line_before_catch                                             = true
csharp_new_line_before_finally                                           = true
csharp_new_line_before_members_in_object_initializers                    = true
csharp_new_line_before_members_in_anonymous_types                        = 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                                   = true
csharp_indent_switch_labels                                              = true
csharp_indent_labels                                                     = one_less_than_current

# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators                  = never_if_unnecessary : silent
dotnet_style_parentheses_in_relational_binary_operators                  = never_if_unnecessary : silent
dotnet_style_parentheses_in_other_binary_operators                       = never_if_unnecessary : silent
dotnet_style_parentheses_in_other_operators                              = never_if_unnecessary : silent

# Modifier preferences
csharp_preferred_modifier_order                                          = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async : suggestion
dotnet_style_require_accessibility_modifiers                             = for_non_interface_members : warning

# avoid this. unless absolutely necessary
dotnet_style_qualification_for_field                                     = false : suggestion
dotnet_style_qualification_for_property                                  = false : suggestion
dotnet_style_qualification_for_method                                    = false : suggestion
dotnet_style_qualification_for_event                                     = false : suggestion

# Types: use keywords instead of BCL types, and permit var only when the type is clear
csharp_style_var_for_built_in_types                                      = false : suggestion
csharp_style_var_when_type_is_apparent                                   = false : none
csharp_style_var_elsewhere                                               = false : none
dotnet_style_predefined_type_for_locals_parameters_members               = true : suggestion
dotnet_style_predefined_type_for_member_access                           = true : suggestion

# Naming Conventions

dotnet_naming_style.pascal_case_style.capitalization                     = pascal_case

dotnet_naming_style.camel_case_underscore_style.capitalization           = camel_case
dotnet_naming_style.camel_case_underscore_style.required_prefix          = _

dotnet_naming_style.interfaces_style.capitalization                      = pascal_case
dotnet_naming_style.interfaces_style.required_prefix                     = I

# name all constant fields using PascalCase
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity        = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols         = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style           = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds                   = field
dotnet_naming_symbols.constant_fields.required_modifiers                 = const

# static fields using PascalCase
dotnet_naming_rule.static_fields_should_have_prefix.severity             = suggestion
dotnet_naming_rule.static_fields_should_have_prefix.symbols              = static_fields
dotnet_naming_rule.static_fields_should_have_prefix.style                = pascal_case_style
dotnet_naming_symbols.static_fields.applicable_kinds                     = field
dotnet_naming_symbols.static_fields.required_modifiers                   = static
dotnet_naming_symbols.static_fields.applicable_accessibilities           = private, internal, private_protected

# internal and private fields should be _camelCase
dotnet_naming_rule.camel_case_for_private_internal_fields.severity       = suggestion
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols        = private_internal_fields
dotnet_naming_rule.camel_case_for_private_internal_fields.style          = camel_case_underscore_style
dotnet_naming_symbols.private_internal_fields.applicable_kinds           = field
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal

# interfaces must have an I prefix
dotnet_naming_rule.interfaces_must_be_interfaces_style.severity          = suggestion
dotnet_naming_rule.interfaces_must_be_interfaces_style.symbols           = interfaces
dotnet_naming_rule.interfaces_must_be_interfaces_style.style             = interfaces_style
dotnet_naming_symbols.interfaces.applicable_kinds                        = interface
dotnet_naming_symbols.interfaces.applicable_accessibilities              = *

# Code style defaults
csharp_using_directive_placement                                         = outside_namespace : suggestion
dotnet_sort_system_directives_first                                      = true
csharp_prefer_braces                                                     = true : suggestion
csharp_preserve_single_line_blocks                                       = true : none
csharp_preserve_single_line_statements                                   = false : none
csharp_prefer_static_local_function                                      = true : suggestion
csharp_prefer_simple_using_statement                                     = false : none
csharp_style_prefer_switch_expression                                    = true : suggestion

# Code quality
dotnet_style_readonly_field                                              = true : suggestion
dotnet_code_quality_unused_parameters                                    = non_public : suggestion

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

# Expression-bodied members
csharp_style_expression_bodied_methods                                   = true : refactoring
csharp_style_expression_bodied_constructors                              = true : refactoring
csharp_style_expression_bodied_operators                                 = true : refactoring
csharp_style_expression_bodied_properties                                = true : refactoring
csharp_style_expression_bodied_indexers                                  = true : refactoring
csharp_style_expression_bodied_accessors                                 = true : refactoring
csharp_style_expression_bodied_lambdas                                   = true : refactoring
csharp_style_expression_bodied_local_functions                           = true : refactoring

# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check                    = true : suggestion
csharp_style_pattern_matching_over_as_with_null_check                    = true : suggestion
csharp_style_inlined_variable_declaration                                = true : suggestion

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

# Other features
csharp_style_prefer_index_operator                                       = false : none
csharp_style_prefer_range_operator                                       = false : none
csharp_style_pattern_local_over_anonymous_function                       = false : none

# Space preferences
csharp_space_after_cast                                                  = false
csharp_space_after_colon_in_inheritance_clause                           = true
csharp_space_after_comma                                                 = true
csharp_space_after_dot                                                   = false
csharp_space_after_keywords_in_control_flow_statements                   = true
csharp_space_after_semicolon_in_for_statement                            = true
csharp_space_around_binary_operators                                     = before_and_after
csharp_space_around_declaration_statements                               = do_not_ignore
csharp_space_before_colon_in_inheritance_clause                          = true
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_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_name_and_open_parenthesis        = false
csharp_space_between_method_declaration_parameter_list_parentheses       = false
csharp_space_between_parentheses                                         = false
csharp_space_between_square_brackets                                     = false

# Analyzers
dotnet_code_quality.ca1802.api_surface                                   = private, internal

# C++ Files
[*.{cpp,h,in}]
curly_bracket_next_line = true
indent_brace_style      = Allman

# Xml project files
[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
indent_size = 2

# Xml build files
[*.builds]
indent_size = 2

# Xml files
[*.{xml,stylecop,resx,ruleset}]
indent_size = 2

# Xml config files
[*.{props,targets,config,nuspec}]
indent_size = 2

# Shell scripts
[*.sh]
end_of_line = lf
[*.{cmd, bat}]
end_of_line = crlf
