root = true

# Core EditorConfig rules (https://editorconfig.org/#supported-properties)

    # All file types
    [*]
    indent_style = space
    trim_trailing_whitespace = true
    # Don't specify an indent_size here; that has too many unintended consequences.

    # Markup documents
    [*.{xml,yml,yaml,template,json}]
    indent_size = 2

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

    # Web documents
    [*.{html}]
    indent_size = 4

    # MSBuild project files
    [*.{csproj,vbproj,vcxproj,vcxproj.filters}]
    indent_size = 2

    # SandCastle Help File Builder documents (all are XML-based)
    [*.{tokens,aml,content,shfbproj}]
    indent_size = 2

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

# See .NET rule categories documentation: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/categories

# COODE STYLE RULES
###################################

# Language rules: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules

# Unnecessary code rules: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/unnecessary-code-rules

# Formatting rules: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/formatting-rules

# Naming rules: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules

# Miscellaneous rules: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/miscellaneous-rules

# .NET Language conventions (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-language-conventions)

    [*.{cs,vb}]

    # Style rules (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-language-conventions#net-code-style-settings)

        # `this.` qualifiers
        dotnet_style_qualification_for_event = false:silent
        dotnet_style_qualification_for_field = false:silent
        dotnet_style_qualification_for_method = false:silent
        dotnet_style_qualification_for_property = false:silent

        # Language keywords instead of framework type names for type references
        dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
        dotnet_style_predefined_type_for_member_access = true:suggestion

        # Modifiers
        dotnet_style_require_accessibility_modifiers = for_non_interface_members:warning
        # csharp_preferred_modifier_order =     # Don't really care
        dotnet_style_readonly_field = true:warning

        # Parentheses
        dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
        dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
        dotnet_style_parentheses_in_other_operators = always_for_clarity:silent
        dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent

        # Expressions
        dotnet_style_object_initializer = true:warning
        dotnet_style_collection_initializer = true:warning
        dotnet_style_explicit_tuple_names = true:warning
        dotnet_style_prefer_inferred_tuple_names = true:warning
        dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
        dotnet_style_prefer_auto_properties = true:warning
        dotnet_style_prefer_conditional_expression_over_assignment = true:warning
        dotnet_style_prefer_conditional_expression_over_return = true:warning
        dotnet_style_prefer_compound_assignment = true:warning

        # Null checking
        dotnet_style_coalesce_expression = true:warning
        dotnet_style_null_propagation = true:warning
        dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent

    # Code quality rules (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-language-conventions#net-code-quality-settings)

        # Parameters
        dotnet_code_quality_unused_parameters = all:warning

    # C# Code style rules (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-language-conventions#c-code-style-settings)

    [*.cs]

        # Implicit and explicit types
        csharp_style_var_for_built_in_types = false:suggestion
        csharp_style_var_when_type_is_apparent = true:warning
        csharp_style_var_elsewhere = false:warning

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

        # Pattern matching
        csharp_style_pattern_matching_over_is_with_cast_check = true:warning
        csharp_style_pattern_matching_over_as_with_null_check = true:warning

        # Inlined variable declarations
        csharp_style_inlined_variable_declaration = true:warning

        # Expressions
        csharp_prefer_simple_default_expression = true:warning

        # Null-checking
        csharp_style_throw_expression = true:warning
        csharp_style_conditional_delegate_call = true:warning

        # Code blocks
        csharp_prefer_braces = false:warning

        # Unused values
        csharp_style_unused_value_expression_statement_preference = discard_variable:silent
        csharp_style_unused_value_assignment_preference = discard_variable:silent

        # Index and range
        csharp_style_prefer_index_operator = true:warning
        csharp_style_prefer_range_operator = true:warning

        # Miscellaneous
        csharp_style_deconstructed_variable_declaration = true:warning
        csharp_style_pattern_local_over_anonymous_function = true:warning
        csharp_using_directive_placement = outside_namespace:warning
        csharp_prefer_static_local_function = true:warning
        csharp_prefer_simple_using_statement = true:warning
        csharp_style_prefer_switch_expression = true:warning

# .NET Formatting conventions (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-formatting-conventions)

    [*.{cs,vb}]

    # .NET formatting rules (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-formatting-conventions#net-formatting-settings)

        # Using directives
        dotnet_sort_system_directives_first = true:suggestion
        dotnet_separate_import_directive_groups = true:suggestion

    # C# formatting rules (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-formatting-conventions#c-formatting-settings)

    [*.cs]

        # New-lines
        csharp_new_line_before_open_brace = methods, types, local_functions
        csharp_new_line_before_else = true:warning
        csharp_new_line_before_catch = true:suggestion
        csharp_new_line_before_finally = true:warning
        csharp_new_line_before_members_in_object_initializers = true:suggestion
        csharp_new_line_before_members_in_anonymous_types = true:suggestion
        csharp_new_line_between_query_expression_clauses = true:suggestion

        # Indentation
        csharp_indent_case_contents = true:warning
        csharp_indent_switch_labels = true:suggestion
        csharp_indent_labels = no_change:warning
        csharp_indent_block_contents = true:warning
        csharp_indent_braces = false:warning
        csharp_indent_case_contents_when_block = false:warning

        # Spacing
        csharp_space_after_cast = false:warning
        csharp_space_after_keywords_in_control_flow_statements = true:warning
        csharp_space_between_parentheses = none:warning
        csharp_space_before_colon_in_inheritance_clause = true:warning
        csharp_space_after_colon_in_inheritance_clause = true:warning
        csharp_space_around_binary_operators = before_and_after:suggestion
        csharp_space_between_method_declaration_parameter_list_parentheses = false:warning
        csharp_space_between_method_declaration_empty_parameter_list_parentheses = true:warning
        csharp_space_between_method_declaration_name_and_open_parenthesis = false:warning
        csharp_space_between_method_call_parameter_list_parentheses = false:warning
        csharp_space_between_method_call_empty_parameter_list_parentheses = false:warning
        csharp_space_between_method_call_name_and_opening_parenthesis = false:warning
        csharp_space_after_comma = true:suggestion
        csharp_space_before_comma = false:warning
        csharp_space_after_dot = false:warning
        csharp_space_before_dot = false:warning
        csharp_space_after_semicolon_in_for_statement = true:warning
        csharp_space_before_semicolon_in_for_statement = false:warning
        csharp_space_around_declaration_statements = false:warning
        csharp_space_before_open_square_brackets = false:warning
        csharp_space_between_empty_square_brackets = false:warning
        csharp_space_between_square_brackets = false:warning

        # Wrap
        csharp_preserve_single_line_statements = false:suggestion
        csharp_preserve_single_line_blocks = true:warning

# .NET naming conventions (https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-naming-conventions?view=vs-2019)

    [*.{cs,vb}]

    # Type naming rules
    dotnet_naming_symbols.types.applicable_kinds = namespace, class, struct, enum, event, delegate, type_parameter
    dotnet_naming_symbols.types.applicable_accessibilities = *
    dotnet_naming_rule.types.symbols = types
    dotnet_naming_rule.types.style = pascal_case
    dotnet_naming_rule.types.severity = warning

    # Variable naming rules
    dotnet_naming_symbols.parameters.applicable_kinds = parameter, local
    dotnet_naming_rule.parameters.symbols = parameters
    dotnet_naming_rule.parameters.style = camel_case
    dotnet_naming_rule.parameters.severity = warning

    # Interface naming rules
    dotnet_naming_symbols.interfaces.applicable_kinds = interface
    dotnet_naming_symbols.interfaces.applicable_accessibilities = *
    dotnet_naming_rule.interfaces.symbols = interfaces
    dotnet_naming_rule.interfaces.style = interface
    dotnet_naming_rule.interfaces.severity = warning

    # Enum naming rules
    dotnet_naming_symbols.enums.applicable_kinds = enum
    dotnet_naming_rule.enums.symbols = enums
    dotnet_naming_rule.enums.style = pascal_case
    dotnet_naming_rule.enums.severity = warning

    # Property/event naming rules
    dotnet_naming_symbols.properties_and_events.applicable_kinds = property, event
    dotnet_naming_symbols.properties_and_events.applicable_accessibilities = *
    dotnet_naming_rule.properties_and_events.symbols = properties_and_events
    dotnet_naming_rule.properties_and_events.style = pascal_case
    dotnet_naming_rule.properties_and_events.severity = warning

    # Field naming rules

    # Private/local consts
    dotnet_naming_symbols.private_consts.applicable_accessibilities = private, local
    dotnet_naming_symbols.private_consts.required_modifiers = const
    dotnet_naming_rule.private_consts.symbols = private_consts
    dotnet_naming_rule.private_consts.style = all_upper
    dotnet_naming_rule.private_consts.severity = warning

    # Non-private consts
    dotnet_naming_symbols.non_private_consts.applicable_accessibilities = private_protected, protected, protected_internal, internal, public
    dotnet_naming_symbols.non_private_consts.required_modifiers = const
    dotnet_naming_rule.non_private_consts.symbols = non_private_consts
    dotnet_naming_rule.non_private_consts.style = pascal_case
    dotnet_naming_rule.non_private_consts.severity = warning

    # Private static fields
    dotnet_naming_symbols.private_static_fields.applicable_kinds = field
    dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private
    dotnet_naming_symbols.private_static_fields.required_modifiers = static, readonly
    dotnet_naming_rule.private_static_fields.symbols = private_static_fields
    dotnet_naming_rule.private_static_fields.style = all_upper
    dotnet_naming_rule.private_static_fields.severity = warning

    # Non-private static fields
    dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field
    dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = private_protected, protected, protected_internal, internal, public
    dotnet_naming_symbols.non_private_static_fields.required_modifiers = static
    dotnet_naming_rule.non_private_static_fields.symbols = non_private_static_fields
    dotnet_naming_rule.non_private_static_fields.style = pascal_case
    dotnet_naming_rule.non_private_static_fields.severity = warning

    # Private fields
    dotnet_naming_symbols.private_fields.applicable_kinds = field
    dotnet_naming_symbols.private_fields.applicable_accessibilities = private
    dotnet_naming_rule.private_fields.symbols = private_fields
    dotnet_naming_rule.private_fields.style = underscore_camel
    dotnet_naming_rule.private_fields.severity = warning

    # Non-private fields
    dotnet_naming_symbols.non_private_fields.applicable_kinds = field
    dotnet_naming_symbols.non_private_fields.applicable_accessibilities = private_protected, protected, protected_internal, internal, public
    dotnet_naming_rule.non_private_fields.symbols = non_private_fields
    dotnet_naming_rule.non_private_fields.style = pascal_case
    dotnet_naming_rule.non_private_fields.severity = warning

    # Method naming rules

    # Private method naming rules
    dotnet_naming_symbols.private_methods.applicable_kinds = method
    dotnet_naming_symbols.private_methods.applicable_accessibilities = private
    dotnet_naming_rule.private_methods.symbols = private_methods
    dotnet_naming_rule.private_methods.style = camel_case
    dotnet_naming_rule.private_methods.severity = warning

    # Non-private method naming rules
    dotnet_naming_symbols.non_private_methods.applicable_kinds = method
    dotnet_naming_symbols.non_private_methods.applicable_accessibilities = private_protected, protected, protected_internal, internal, public
    dotnet_naming_rule.non_private_methods.symbols = non_private_methods
    dotnet_naming_rule.non_private_methods.style = pascal_case
    dotnet_naming_rule.non_private_methods.severity = warning

    # Local function naming rules
    dotnet_naming_symbols.local_functions.applicable_kinds = local_function
    dotnet_naming_rule.local_functions.symbols = local_functions
    dotnet_naming_rule.local_functions.style = camel_case
    dotnet_naming_rule.local_functions.severity = warning

    # Private async methods
    dotnet_naming_symbols.private_async.applicable_kinds = method
    dotnet_naming_symbols.private_async.applicable_accessibilities = private
    dotnet_naming_symbols.private_async.required_modifiers = async
    dotnet_naming_rule.private_async.symbols = private_async
    dotnet_naming_rule.private_async.style = async_camel
    dotnet_naming_rule.private_async.severity = warning

    # Non-private async methods
    dotnet_naming_symbols.non_private_async.applicable_kinds = method
    dotnet_naming_symbols.non_private_async.applicable_accessibilities = private_protected, protected, protected_internal, internal, public
    dotnet_naming_symbols.non_private_async.required_modifiers = async
    dotnet_naming_rule.non_private_async.symbols = non_private_async
    dotnet_naming_rule.non_private_async.style = async_pascal
    dotnet_naming_rule.non_private_async.severity = warning

    # Local function naming rules
    dotnet_naming_symbols.local_async.applicable_kinds = local_function
    dotnet_naming_symbols.local_async.required_modifiers = async
    dotnet_naming_rule.local_async.symbols = local_async
    dotnet_naming_rule.local_async.style = async_camel
    dotnet_naming_rule.local_async.severity = warning

# Naming styles

    dotnet_naming_style.pascal_case.capitalization = pascal_case

    dotnet_naming_style.camel_case.capitalization = camel_case

    dotnet_naming_style.interface.required_prefix = I
    dotnet_naming_style.interface.capitalization = pascal_case

    dotnet_naming_style.underscore_camel.required_prefix = _
    dotnet_naming_style.underscore_camel.capitalization = camel_case

    dotnet_naming_style.all_upper.capitalization = all_upper

    dotnet_naming_style.s_underscore_camel.required_prefix = s_
    dotnet_naming_style.s_underscore_camel.capitalization = camel_case

    dotnet_naming_style.async_pascal.required_suffix = Async
    dotnet_naming_style.async_pascal.capitalization = pascal_case

    dotnet_naming_style.async_camel.required_suffix = Async
    dotnet_naming_style.async_camel.capitalization = camel_case
