# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference

# top-most .editorconfig file
root = true

# don't use tabs for indentation
[*]
indent_style = space
vsspell_section_id = 41b65011239a40959ccaae2a4ec7044a
vsspell_ignored_words_41b65011239a40959ccaae2a4ec7044a = Accessor|app|clr|Edm|inline|middleware|Mvc|odata|Validator|Deconstruct

# code files
[*.{cs,csx,vb,vbx}]
indent_size = 4

# xml project files
[*.{csproj,vbproj,proj,projitems,shproj,msbuildproj}]
indent_size = 1

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

# json files
[*.json]
indent_size = 2

# whitespace handling
trim_trailing_whitespace = true:error
insert_final_newline = false

# .net code style settings:
[*.{cs,vb}]
dotnet_sort_system_directives_first = false

# avoid "this." and "me." if not necessary
dotnet_style_qualification_for_field = false:error
dotnet_style_qualification_for_property = false:error
dotnet_style_qualification_for_method = false:error
dotnet_style_qualification_for_event = false:error

# use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:error
dotnet_style_predefined_type_for_member_access = true:error

# suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion

# csharp code style settings:
[*.cs]

# prefer "var" everywhere
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion

# prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none

# prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none

# suggest more modern language features when available
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
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion

# newline settings
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 = false
csharp_new_line_before_members_in_anonymous_types = false

# space settings
csharp_space_after_cast = true
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_declaration_parameter_list_parentheses = true
csharp_space_between_method_call_parameter_list_parentheses = true
csharp_space_between_parentheses = control_flow_statements, expressions

# primary construcrtors
csharp_style_prefer_primary_constructors = false:none

# style code suppressions
dotnet_diagnostic.SA1002.severity = none
dotnet_diagnostic.SA1003.severity = none
dotnet_diagnostic.SA1008.severity = none
dotnet_diagnostic.SA1009.severity = none
dotnet_diagnostic.SA1101.severity = none
dotnet_diagnostic.SA1127.severity = none
dotnet_diagnostic.SA1128.severity = none
dotnet_diagnostic.SA1201.severity = none
dotnet_diagnostic.SA1202.severity = none
dotnet_diagnostic.SA1204.severity = none
dotnet_diagnostic.SA1205.severity = none
dotnet_diagnostic.SA1208.severity = none
dotnet_diagnostic.SA1217.severity = none
dotnet_diagnostic.SA1311.severity = none
dotnet_diagnostic.SA1502.severity = none
dotnet_diagnostic.SA1516.severity = none
dotnet_diagnostic.SA1600.severity = none

# TEMP: currently suppressed rules due to false positives
# REF: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3687
# REF: https://github.com/dotnet/aspnetcore/issues/52556
dotnet_diagnostic.SA1010.severity = none # Opening square brackets should be spaced correctly
dotnet_diagnostic.ASP0022.severity = none # Route conflict detected between route handlers
dotnet_diagnostic.ASP0023.severity = none # Route conflict detected between route handlers

# test settings

# Default severity for analyzer diagnostics with category 'Reliability'
dotnet_analyzer_diagnostic.category-Reliability.severity = error

[*{Controller,Test,Fixture,TestCollection}.cs]

# code analysis suppressions
dotnet_diagnostic.CS0618.severity = none
dotnet_diagnostic.CA1014.severity = none
dotnet_diagnostic.CA1054.severity = none
dotnet_diagnostic.CA1062.severity = none
dotnet_diagnostic.CA1305.severity = none
dotnet_diagnostic.CA1307.severity = none
dotnet_diagnostic.CA1707.severity = none
dotnet_diagnostic.CA1711.severity = none
dotnet_diagnostic.CA1716.severity = none
dotnet_diagnostic.CA1806.severity = none
dotnet_diagnostic.CA1861.severity = none
dotnet_diagnostic.CA2007.severity = none
dotnet_diagnostic.CA2234.severity = none
dotnet_code_quality.CA2000.excluded_symbol_names = HttpRequestMessage|HttpResponseMessage|HttpConfiguration|HttpRouteCollection|HostedHttpRouteCollection|HttpServer|HttpClient

# style code suppressions
dotnet_diagnostic.SA1122.severity = none
dotnet_diagnostic.SA1300.severity = none
dotnet_diagnostic.SA1507.severity = none
dotnet_diagnostic.SA1601.severity = none

# TEMP: currently suppressed rules due to false positives
# REF: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3687
# REF: https://github.com/dotnet/aspnetcore/issues/52556
dotnet_diagnostic.SA1010.severity = none # Opening square brackets should be spaced correctly
dotnet_diagnostic.ASP0022.severity = none # Route conflict detected between route handlers
dotnet_diagnostic.ASP0023.severity = none # Route conflict detected between route handlers

# test methods should use all lowercase characters
dotnet_naming_symbols.test_methods.applicable_kinds           = method
dotnet_naming_symbols.test_methods.applicable_accessibilities = public

dotnet_naming_style.test_methods.capitalization = all_lower
dotnet_naming_style.test_methods.word_separator = _

dotnet_naming_rule.test_methods.style    = test_methods
dotnet_naming_rule.test_methods.symbols  = test_methods
dotnet_naming_rule.test_methods.severity = none

# test methods using Given-When-Then (GWT) form should use all lowercase characters
# note: glob expansion syntax cannot be used because the patterns do not overlap
[when*.cs]

# code analysis suppressions
dotnet_diagnostic.CA1014.severity = none
dotnet_diagnostic.CA1054.severity = none
dotnet_diagnostic.CA1062.severity = none
dotnet_diagnostic.CA1305.severity = none
dotnet_diagnostic.CA1307.severity = none
dotnet_diagnostic.CA1707.severity = none
dotnet_diagnostic.CA1711.severity = none
dotnet_diagnostic.CA1806.severity = none
dotnet_diagnostic.CA2007.severity = none
dotnet_diagnostic.CA2234.severity = none

# style code suppressions
dotnet_diagnostic.SA1122.severity = none
dotnet_diagnostic.SA1300.severity = none
dotnet_diagnostic.SA1507.severity = none
dotnet_diagnostic.SA1601.severity = none
dotnet_diagnostic.SA1649.severity = none

dotnet_naming_symbols.test_methods.applicable_kinds           = class, method
dotnet_naming_symbols.test_methods.applicable_accessibilities = public

dotnet_naming_style.test_methods.capitalization = all_lower
dotnet_naming_style.test_methods.word_separator = _

dotnet_naming_rule.test_methods.style    = test_methods
dotnet_naming_rule.test_methods.symbols  = test_methods
dotnet_naming_rule.test_methods.severity = error
