# http://editorconfig.org/

root = true

[*]
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

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

[*.Build.{props,targets}]
indent_size = 2

[*.{sln}]
indent_style = tab

[*.{json,yml}]
indent_size = 2

[*.{cs,tt}]
charset = utf-8
indent_style = space
indent_size = 4
max_line_length = 100

[*.cs]
dotnet_analyzer_diagnostic.category-Style.severity = warning

# IDE0022: Use expression/block body for methods
dotnet_diagnostic.IDE0022.severity = suggestion

# IDE1006: Naming rule violation
dotnet_diagnostic.IDE1006.severity = warning

# Naming capitalization styles
dotnet_naming_style.camel_case_style.capitalization = camel_case
dotnet_naming_style.pascal_case_style.capitalization = pascal_case

# Naming rule that private instance fields must use camel case
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_rule.camel_case_private_fields.severity = warning
dotnet_naming_rule.camel_case_private_fields.symbols = private_fields
dotnet_naming_rule.camel_case_private_fields.style = camel_case_style

# Naming rule that static read-only fields must use Pascal case
dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.static_readonly_fields.applicable_accessibilities = *
dotnet_naming_symbols.static_readonly_fields.required_modifiers = readonly, static
dotnet_naming_rule.pascal_case_static_readonly_fields.severity = warning
dotnet_naming_rule.pascal_case_static_readonly_fields.symbols = static_readonly_fields
dotnet_naming_rule.pascal_case_static_readonly_fields.style = pascal_case_style

# Naming rule that const fields must use Pascal case
dotnet_naming_symbols.const_fields.applicable_kinds = field
dotnet_naming_symbols.const_fields.applicable_accessibilities = *
dotnet_naming_symbols.const_fields.required_modifiers = const
dotnet_naming_rule.pascal_case_const_fields.severity = warning
dotnet_naming_rule.pascal_case_const_fields.symbols = const_fields
dotnet_naming_rule.pascal_case_const_fields.style = pascal_case_style

# this. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = true
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false

# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true

# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = true
csharp_style_expression_bodied_constructors = true
csharp_style_expression_bodied_operators = true

# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_accessors = true

# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_inlined_variable_declaration = true
csharp_style_throw_expression = true
csharp_style_conditional_delegate_call = true
csharp_prefer_simple_default_expression = true

# Spacing
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_declaration_parameter_list_parentheses = false

# Wrapping
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true

# Indentation
csharp_indent_case_contents_when_block = false

# Modifier preferences
dotnet_style_require_accessibility_modifiers = omit_if_default

# IDE0011: Add braces
csharp_prefer_braces = when_multiline

# IDE0061: Use block body for local functions
csharp_style_expression_bodied_local_functions = true

# IDE0065: Misplaced using directive
csharp_using_directive_placement = inside_namespace

# IDE0048: Add parentheses for clarity
dotnet_diagnostic.IDE0048.severity = suggestion

# IDE0055: Fix formatting
dotnet_diagnostic.IDE0055.severity = suggestion

# IDE0046: Convert to conditional expression
dotnet_diagnostic.IDE0046.severity = suggestion

# CA1510: Use 'ArgumentNullException.ThrowIfNull' instead of explicitly throwing a new exception instance
# TODO: Remove post https://github.com/morelinq/MoreLINQ/issues/903
dotnet_diagnostic.CA1510.severity = suggestion

# CA1512: Use 'ArgumentOutOfRangeException.ThrowIfNegativeOrZero' instead of explicitly throwing a new exception instance
# TODO: Remove post https://github.com/morelinq/MoreLINQ/issues/903
dotnet_diagnostic.CA1512.severity = suggestion

# CA1513: Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
# TODO: Remove post https://github.com/morelinq/MoreLINQ/issues/903
dotnet_diagnostic.CA1513.severity = suggestion
