# Top-most EditorConfig file
root = true

# All generic files should use MSDOS style endings, not Unix (lf)
[*]
end_of_line = crlf

# C# Files
[*.{cs,csx}]
indent_style = space
indent_size = 4
tab_width = 4
trim_trailing_whitespace = true

# C# Coding Conventions

# 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

# IDE0011: Add braces
csharp_prefer_braces = false

## Formatting - new line options
### Require braces to be on a new line for (also known as "Allman" style)
###   accessors, methods, object_collection, control_blocks, types, properties, lambdas
csharp_new_line_before_open_brace = all
csharp_new_line_before_catch = true
csharp_new_line_before_else = 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

## Spaces
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

dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false

dotnet_style_allow_multiple_blank_lines_experimental = false
dotnet_style_allow_statement_immediately_after_block_experimental = false

### Alt to LicenseHeader extension
# file_header_template = Copyright Xeno Innovations, Inc. 2021

## Naming Conventions
### Async methods must use "Async" suffix
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_rule.async_methods_end_in_async.severity = error
dotnet_naming_symbols.any_async_methods.applicable_kinds = method
dotnet_naming_symbols.any_async_methods.applicable_accessibilities = *
dotnet_naming_symbols.any_async_methods.required_modifiers = async
dotnet_naming_style.end_in_async.capitalization = pascal_case
dotnet_naming_style.end_in_async.required_prefix =
dotnet_naming_style.end_in_async.required_suffix = Async
dotnet_naming_style.end_in_async.word_separator =

### private fields should use prefix with an underscore
dotnet_naming_rule.private_members_with_underscore.symbols  = private_fields
dotnet_naming_rule.private_members_with_underscore.style    = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = warning
dotnet_naming_symbols.private_fields.applicable_kinds       = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _

### Constant fields must use PascalCase
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols  = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = error
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
dotnet_naming_style.pascal_case_style.capitalization = pascal_case

### Interfaces must have an I suffix
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.severity = error
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =

# Code analysis rules
# IDE0058: Expression value is never used
dotnet_diagnostic.IDE0058.severity = none
# IDEOOO8: Use of var
dotnet_diagnostic.IDE0008.severity = none
# IDE0046: Convert to conditional expression
dotnet_diagnostic.IDE0046.severity = none
# IDE0010: Add missing cases
dotnet_diagnostic.IDE0010.severity = none

## Code Analysis Rules
# CA1031: Do not catch general exception types
dotnet_diagnostic.CA1031.severity = none

## Compiler
# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = silent

## StyleCop.Analyzers
# SA1101: PrefixLocalCallsWithThis
dotnet_diagnostic.SA1101.severity = silent
# SA1200: UsingDirectivesMustBePlacedWithinNamespace
dotnet_diagnostic.SA1200.severity = silent
# SA1201: Elements should appear in the correct order
dotnet_diagnostic.SA1201.severity = error
# SA1309: FieldNamesMustNotBeginWithUnderscore
dotnet_diagnostic.SA1309.severity = none
# SA1503: Braces should not be omitted
dotnet_diagnostic.SA1503.severity = none
# SA1507: Code should not contain multiple blank lines in a row
dotnet_diagnostic.SA1507.severity = error
# SA1516: Elements should be separated by blank line
dotnet_diagnostic.SA1516.severity = error
# SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# SA1633: FileMustHaveHeader
dotnet_diagnostic.SA1633.severity = silent

# Default severity for analyzer diagnostics with category 'StyleCop.CSharp.SpacingRules'
dotnet_analyzer_diagnostic.category-StyleCop.CSharp.SpacingRules.severity = error

[*.{xml,xaml,axml,axaml}]
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.json]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.sln]
indent_size = 2

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

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

# PList Files
[*.plist]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

# YAML files
[*.{yaml,yml}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

# Powershell
[*.{ps1,psd1,psm1}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.md]
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
